- nvgTextBreakLines: wordMinX was relative to rowStartX, which caused problems when rowStartX change on line break, but wordMinX was still relative to the previous rowStartX - fixed font size on perf graphs - made demo to use row minx/maxx instead of row->width - fixed demo hover distanceshared-context
| @@ -25,7 +25,7 @@ | |||
| #define ICON_TRASH 0xE729 | |||
| //static float minf(float a, float b) { return a < b ? a : b; } | |||
| static float maxf(float a, float b) { return a > b ? a : b; } | |||
| //static float maxf(float a, float b) { return a > b ? a : b; } | |||
| //static float absf(float a) { return a >= 0.0f ? a : -a; } | |||
| static float clampf(float a, float mn, float mx) { return a < mn ? mn : (a > mx ? mx : a); } | |||
| @@ -868,8 +868,10 @@ void drawParagraph(NVGcontext* vg, float x, float y, float width, float height, | |||
| float caretx, px; | |||
| float bounds[4]; | |||
| float a; | |||
| const char* hoverText = "Hover your mouse over the text to see calculated caret position."; | |||
| float gx,gy; | |||
| int gutter = 0; | |||
| const char* boxText = "Testing\nsome multiline\ntext."; | |||
| NVG_NOTUSED(height); | |||
| nvgSave(vg); | |||
| @@ -891,7 +893,7 @@ void drawParagraph(NVGcontext* vg, float x, float y, float width, float height, | |||
| nvgBeginPath(vg); | |||
| nvgFillColor(vg, nvgRGBA(255,255,255,hit?64:16)); | |||
| nvgRect(vg, x, y, row->width, lineh); | |||
| nvgRect(vg, x + row->minx, y, row->maxx - row->minx, lineh); | |||
| nvgFill(vg); | |||
| nvgFillColor(vg, nvgRGBA(255,255,255,255)); | |||
| @@ -948,12 +950,12 @@ void drawParagraph(NVGcontext* vg, float x, float y, float width, float height, | |||
| nvgTextAlign(vg, NVG_ALIGN_LEFT|NVG_ALIGN_TOP); | |||
| nvgTextLineHeight(vg, 1.2f); | |||
| nvgTextBoxBounds(vg, x,y, 150, "Hover your mouse over the text to see calculated caret position.", NULL, bounds); | |||
| nvgTextBoxBounds(vg, x,y, 150, hoverText, NULL, bounds); | |||
| // Fade the tooltip out when close to it. | |||
| gx = fabsf((mx - (bounds[0]+bounds[2])*0.5f) / (bounds[0] - bounds[2])); | |||
| gy = fabsf((my - (bounds[1]+bounds[3])*0.5f) / (bounds[1] - bounds[3])); | |||
| a = maxf(gx, gy) - 0.5f; | |||
| gx = clampf(mx, bounds[0], bounds[2]) - mx; | |||
| gy = clampf(my, bounds[1], bounds[3]) - my; | |||
| a = sqrtf(gx*gx + gy*gy) / 30.0f; | |||
| a = clampf(a, 0, 1); | |||
| nvgGlobalAlpha(vg, a); | |||
| @@ -967,7 +969,7 @@ void drawParagraph(NVGcontext* vg, float x, float y, float width, float height, | |||
| nvgFill(vg); | |||
| nvgFillColor(vg, nvgRGBA(0,0,0,220)); | |||
| nvgTextBox(vg, x,y, 150, "Hover your mouse over the text to see calculated caret position.", NULL); | |||
| nvgTextBox(vg, x,y, 150, hoverText, NULL); | |||
| nvgRestore(vg); | |||
| } | |||
| @@ -151,36 +151,36 @@ void renderGraph(NVGcontext* vg, float x, float y, PerfGraph* fps) | |||
| nvgFontFace(vg, "sans"); | |||
| if (fps->name[0] != '\0') { | |||
| nvgFontSize(vg, 14.0f); | |||
| nvgFontSize(vg, 12.0f); | |||
| nvgTextAlign(vg, NVG_ALIGN_LEFT|NVG_ALIGN_TOP); | |||
| nvgFillColor(vg, nvgRGBA(240,240,240,192)); | |||
| nvgText(vg, x+3,y+1, fps->name, NULL); | |||
| nvgText(vg, x+3,y+3, fps->name, NULL); | |||
| } | |||
| if (fps->style == GRAPH_RENDER_FPS) { | |||
| nvgFontSize(vg, 18.0f); | |||
| nvgFontSize(vg, 15.0f); | |||
| nvgTextAlign(vg,NVG_ALIGN_RIGHT|NVG_ALIGN_TOP); | |||
| nvgFillColor(vg, nvgRGBA(240,240,240,255)); | |||
| sprintf(str, "%.2f FPS", 1.0f / avg); | |||
| nvgText(vg, x+w-3,y+1, str, NULL); | |||
| nvgText(vg, x+w-3,y+3, str, NULL); | |||
| nvgFontSize(vg, 15.0f); | |||
| nvgTextAlign(vg,NVG_ALIGN_RIGHT|NVG_ALIGN_BOTTOM); | |||
| nvgFontSize(vg, 13.0f); | |||
| nvgTextAlign(vg,NVG_ALIGN_RIGHT|NVG_ALIGN_BASELINE); | |||
| nvgFillColor(vg, nvgRGBA(240,240,240,160)); | |||
| sprintf(str, "%.2f ms", avg * 1000.0f); | |||
| nvgText(vg, x+w-3,y+h-1, str, NULL); | |||
| nvgText(vg, x+w-3,y+h-3, str, NULL); | |||
| } | |||
| else if (fps->style == GRAPH_RENDER_PERCENT) { | |||
| nvgFontSize(vg, 18.0f); | |||
| nvgFontSize(vg, 15.0f); | |||
| nvgTextAlign(vg,NVG_ALIGN_RIGHT|NVG_ALIGN_TOP); | |||
| nvgFillColor(vg, nvgRGBA(240,240,240,255)); | |||
| sprintf(str, "%.1f %%", avg * 1.0f); | |||
| nvgText(vg, x+w-3,y+1, str, NULL); | |||
| nvgText(vg, x+w-3,y+3, str, NULL); | |||
| } else { | |||
| nvgFontSize(vg, 18.0f); | |||
| nvgFontSize(vg, 15.0f); | |||
| nvgTextAlign(vg,NVG_ALIGN_RIGHT|NVG_ALIGN_TOP); | |||
| nvgFillColor(vg, nvgRGBA(240,240,240,255)); | |||
| sprintf(str, "%.2f ms", avg * 1000.0f); | |||
| nvgText(vg, x+w-3,y+1, str, NULL); | |||
| nvgText(vg, x+w-3,y+3, str, NULL); | |||
| } | |||
| } | |||
| @@ -2704,7 +2704,7 @@ int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, floa | |||
| rowStartX = iter.x; | |||
| rowStart = iter.str; | |||
| rowEnd = iter.next; | |||
| rowWidth = iter.nextx - rowStartX; // q.x1 - rowStartX; | |||
| rowWidth = iter.nextx - rowStartX; | |||
| rowMinX = q.x0 - rowStartX; | |||
| rowMaxX = q.x1 - rowStartX; | |||
| wordStart = iter.str; | |||
| @@ -2734,7 +2734,7 @@ int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, floa | |||
| if ((ptype == NVG_SPACE && (type == NVG_CHAR || type == NVG_CJK_CHAR)) || type == NVG_CJK_CHAR) { | |||
| wordStart = iter.str; | |||
| wordStartX = iter.x; | |||
| wordMinX = q.x0 - rowStartX; | |||
| wordMinX = q.x0; | |||
| } | |||
| // Break to new line when a character is beyond break width. | |||
| @@ -2771,13 +2771,13 @@ int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, floa | |||
| nrows++; | |||
| if (nrows >= maxRows) | |||
| return nrows; | |||
| // Update row | |||
| rowStartX = wordStartX; | |||
| rowStart = wordStart; | |||
| rowEnd = iter.next; | |||
| rowWidth = iter.nextx - rowStartX; | |||
| rowMinX = wordMinX; | |||
| rowMinX = wordMinX - rowStartX; | |||
| rowMaxX = q.x1 - rowStartX; | |||
| // No change to the word start | |||
| } | |||
| // Set null break point | |||
| breakEnd = rowStart; | |||