diff --git a/imgui_draw.cpp b/imgui_draw.cpp index 77c3c006b..49ca2cc4f 100644 --- a/imgui_draw.cpp +++ b/imgui_draw.cpp @@ -3837,6 +3837,15 @@ ImFontGlyph* ImFont::BuildLoadGlyph(ImWchar codepoint) return glyph; } +// The point of this indirection is to not be inlined in debug mode in order to not bloat inner loop.b +IM_MSVC_RUNTIME_CHECKS_OFF +static float BuildLoadGlyphGetAdvanceOrFallback(ImFont* font, unsigned int codepoint) +{ + ImFontGlyph* glyph = font->BuildLoadGlyph((ImWchar)codepoint); + return glyph ? glyph->AdvanceX : font->FallbackAdvanceX; +} +IM_MSVC_RUNTIME_CHECKS_RESTORE + #ifndef IMGUI_DISABLE_DEBUG_TOOLS void ImFontAtlasDebugLogTextureRequests(ImFontAtlas* atlas) { @@ -4549,18 +4558,23 @@ bool ImFont::IsGlyphInFont(ImWchar c) return false; } +// This is manually inlined in CalcTextSizeA() and CalcWordWrapPositionA(), with a non-inline call to BuildLoadGlyphGetAdvanceOrFallback(). +IM_MSVC_RUNTIME_CHECKS_OFF float ImFont::GetCharAdvance(ImWchar c) { - if (c < (size_t)IndexAdvanceX.Size) + if ((int)c < IndexAdvanceX.Size) { // Missing glyphs fitting inside index will have stored FallbackAdvanceX already. const float x = IndexAdvanceX.Data[c]; if (x >= 0.0f) return x; } + + // Same as BuildLoadGlyphGetAdvanceOrFallback(): const ImFontGlyph* glyph = BuildLoadGlyph(c); return glyph ? glyph->AdvanceX : FallbackAdvanceX; } +IM_MSVC_RUNTIME_CHECKS_RESTORE // Trim trailing space and find beginning of next line static inline const char* CalcWordWrapNextLineStartA(const char* text, const char* text_end) @@ -4572,8 +4586,6 @@ static inline const char* CalcWordWrapNextLineStartA(const char* text, const cha return text; } -#define ImFontGetCharAdvanceX(_FONT, _CH) ((int)(_CH) < (_FONT)->IndexAdvanceX.Size ? (_FONT)->IndexAdvanceX.Data[_CH] : (_FONT)->FallbackAdvanceX) - // Simple word-wrapping for English, not full-featured. Please submit failing cases! // This will return the next location to wrap from. If no wrapping if necessary, this will fast-forward to e.g. text_end. // FIXME: Much possible improvements (don't cut things like "word !", "word!!!" but cut within "word,,,,", more sensible support for punctuations, support for Unicode punctuations, etc.) @@ -4626,9 +4638,11 @@ const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const c } } - // FIXME-NEWATLAS-V1: Measure perf, inline etc. - //const float char_width = ImFontGetCharAdvanceX(this, c); - const float char_width = GetCharAdvance((ImWchar)c); // ((int)c < IndexAdvanceX.Size ? IndexAdvanceX.Data[c] : FallbackAdvanceX); + // Optimized inline version of 'float char_width = GetCharAdvance((ImWchar)c);' + float char_width = (c < (unsigned int)IndexAdvanceX.Size) ? IndexAdvanceX.Data[c] : -1.0f; + if (char_width < 0.0f) + char_width = BuildLoadGlyphGetAdvanceOrFallback(this, c); + if (ImCharIsBlankW(c)) { if (inside_word) @@ -4733,9 +4747,12 @@ ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, cons continue; } - // FIXME-NEWATLAS-V1: Measure perf, inline etc. - //const float char_width = ImFontGetCharAdvanceX(this, c) * scale; - const float char_width = GetCharAdvance((ImWchar)c) /* (int)c < IndexAdvanceX.Size ? IndexAdvanceX.Data[c] : FallbackAdvanceX)*/ * scale; + // Optimized inline version of 'float char_width = GetCharAdvance((ImWchar)c);' + float char_width = (c < (unsigned int)IndexAdvanceX.Size) ? IndexAdvanceX.Data[c] : -1.0f; + if (char_width < 0.0f) + char_width = BuildLoadGlyphGetAdvanceOrFallback(this, c); + char_width *= scale; + if (line_width + char_width >= max_width) { s = prev_s; diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp index 8e794ab94..f7e5e253e 100644 --- a/imgui_widgets.cpp +++ b/imgui_widgets.cpp @@ -3949,9 +3949,7 @@ static ImVec2 InputTextCalcTextSize(ImGuiContext* ctx, const char* text_begin, c if (c == '\r') continue; - // FIXME-NEWATLAS-V1: Measure perf, inline etc. - const float char_width = font->GetCharAdvance((ImWchar)c) * scale;// ((int)c < font->IndexAdvanceX.Size ? font->IndexAdvanceX.Data[c] : font->FallbackAdvanceX)* scale; - line_width += char_width; + line_width += font->GetCharAdvance((ImWchar)c) * scale; } if (text_size.x < line_width)