|
@@ -3563,11 +3563,22 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, Im
|
|
|
|
|
|
// Fast-forward to first visible line
|
|
|
const char* s = text_begin;
|
|
|
- if (y + line_height < clip_rect.y && !word_wrap_enabled)
|
|
|
+ if (y + line_height < clip_rect.y)
|
|
|
while (y + line_height < clip_rect.y && s < text_end)
|
|
|
{
|
|
|
- s = (const char*)memchr(s, '\n', text_end - s);
|
|
|
- s = s ? s + 1 : text_end;
|
|
|
+ const char* line_end = (const char*)memchr(s, '\n', text_end - s);
|
|
|
+ if (word_wrap_enabled)
|
|
|
+ {
|
|
|
+ // FIXME-OPT: This is not optimal as do first do a search for \n before calling CalcWordWrapPositionA().
|
|
|
+ // If the specs for CalcWordWrapPositionA() were reworked to optionally return on \n we could combine both.
|
|
|
+ // However it is still better than nothing performing the fast-forward!
|
|
|
+ s = CalcWordWrapPositionA(scale, s, line_end, wrap_width);
|
|
|
+ s = CalcWordWrapNextLineStartA(s, text_end);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ s = line_end ? line_end + 1 : text_end;
|
|
|
+ }
|
|
|
y += line_height;
|
|
|
}
|
|
|
|