Skip to content

Commit 024d47e

Browse files
authoredApr 1, 2021
CGUITTFont optimizations (#11136)
1 parent 34888a9 commit 024d47e

File tree

4 files changed

+27
-23
lines changed

4 files changed

+27
-23
lines changed
 

‎src/gui/guiChatConsole.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,6 @@ void GUIChatConsole::drawText()
326326
tmp->draw(
327327
fragment.text,
328328
destrect,
329-
video::SColor(255, 255, 255, 255),
330329
false,
331330
false,
332331
&AbsoluteClippingRect);

‎src/irrlicht_changes/CGUITTFont.cpp

+24-15
Original file line numberDiff line numberDiff line change
@@ -547,12 +547,12 @@ void CGUITTFont::setFontHinting(const bool enable, const bool enable_auto_hintin
547547

548548
void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position, video::SColor color, bool hcenter, bool vcenter, const core::rect<s32>* clip)
549549
{
550-
draw(EnrichedString(std::wstring(text.c_str()), color), position, color, hcenter, vcenter, clip);
550+
draw(EnrichedString(std::wstring(text.c_str()), color), position, hcenter, vcenter, clip);
551551
}
552552

553-
void CGUITTFont::draw(const EnrichedString &text, const core::rect<s32>& position, video::SColor color, bool hcenter, bool vcenter, const core::rect<s32>* clip)
553+
void CGUITTFont::draw(const EnrichedString &text, const core::rect<s32>& position, bool hcenter, bool vcenter, const core::rect<s32>* clip)
554554
{
555-
std::vector<video::SColor> colors = text.getColors();
555+
const std::vector<video::SColor> &colors = text.getColors();
556556

557557
if (!Driver)
558558
return;
@@ -562,6 +562,7 @@ void CGUITTFont::draw(const EnrichedString &text, const core::rect<s32>& positio
562562
{
563563
Glyph_Pages[i]->render_positions.clear();
564564
Glyph_Pages[i]->render_source_rects.clear();
565+
Glyph_Pages[i]->render_colors.clear();
565566
}
566567

567568
// Set up some variables.
@@ -590,7 +591,6 @@ void CGUITTFont::draw(const EnrichedString &text, const core::rect<s32>& positio
590591
u32 n;
591592
uchar32_t previousChar = 0;
592593
core::ustring::const_iterator iter(utext);
593-
std::vector<video::SColor> applied_colors;
594594
while (!iter.atEnd())
595595
{
596596
uchar32_t currentChar = *iter;
@@ -636,10 +636,11 @@ void CGUITTFont::draw(const EnrichedString &text, const core::rect<s32>& positio
636636
CGUITTGlyphPage* const page = Glyph_Pages[glyph.glyph_page];
637637
page->render_positions.push_back(core::position2di(offset.X + offx, offset.Y + offy));
638638
page->render_source_rects.push_back(glyph.source_rect);
639+
if (iter.getPos() < colors.size())
640+
page->render_colors.push_back(colors[iter.getPos()]);
641+
else
642+
page->render_colors.push_back(video::SColor(255,255,255,255));
639643
Render_Map.set(glyph.glyph_page, page);
640-
u32 current_color = iter.getPos();
641-
if (current_color < colors.size())
642-
applied_colors.push_back(colors[current_color]);
643644
}
644645
if (n > 0)
645646
{
@@ -688,16 +689,24 @@ void CGUITTFont::draw(const EnrichedString &text, const core::rect<s32>& positio
688689
for (size_t i = 0; i < page->render_positions.size(); ++i)
689690
page->render_positions[i] -= core::vector2di(shadow_offset, shadow_offset);
690691
}
692+
// render runs of matching color in batch
693+
size_t ibegin;
694+
video::SColor colprev;
691695
for (size_t i = 0; i < page->render_positions.size(); ++i) {
692-
irr::video::SColor col;
693-
if (!applied_colors.empty()) {
694-
col = applied_colors[i < applied_colors.size() ? i : 0];
695-
} else {
696-
col = irr::video::SColor(255, 255, 255, 255);
697-
}
696+
ibegin = i;
697+
colprev = page->render_colors[i];
698+
do
699+
++i;
700+
while (i < page->render_positions.size() && page->render_colors[i] == colprev);
701+
core::array<core::vector2di> tmp_positions;
702+
core::array<core::recti> tmp_source_rects;
703+
tmp_positions.set_pointer(&page->render_positions[ibegin], i - ibegin, false, false); // no copy
704+
tmp_source_rects.set_pointer(&page->render_source_rects[ibegin], i - ibegin, false, false);
705+
--i;
706+
698707
if (!use_transparency)
699-
col.color |= 0xff000000;
700-
Driver->draw2DImage(page->texture, page->render_positions[i], page->render_source_rects[i], clip, col, true);
708+
colprev.color |= 0xff000000;
709+
Driver->draw2DImageBatch(page->texture, tmp_positions, tmp_source_rects, clip, colprev, true);
701710
}
702711
}
703712
}

‎src/irrlicht_changes/CGUITTFont.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ namespace gui
199199

200200
core::array<core::vector2di> render_positions;
201201
core::array<core::recti> render_source_rects;
202+
core::array<video::SColor> render_colors;
202203

203204
private:
204205
core::array<const SGUITTGlyph*> glyph_to_be_paged;
@@ -270,7 +271,7 @@ namespace gui
270271
const core::rect<s32>* clip=0);
271272

272273
void draw(const EnrichedString& text, const core::rect<s32>& position,
273-
video::SColor color, bool hcenter=false, bool vcenter=false,
274+
bool hcenter=false, bool vcenter=false,
274275
const core::rect<s32>* clip=0);
275276

276277
//! Returns the dimension of a character produced by this font.

‎src/irrlicht_changes/static_text.cpp

+1-6
Original file line numberDiff line numberDiff line change
@@ -108,16 +108,11 @@ void StaticText::draw()
108108
font->getDimension(str.c_str()).Width;
109109
}
110110

111-
//str = colorizeText(BrokenText[i].c_str(), colors, previous_color);
112-
//if (!colors.empty())
113-
// previous_color = colors[colors.size() - 1];
114-
115111
#if USE_FREETYPE
116112
if (font->getType() == irr::gui::EGFT_CUSTOM) {
117113
irr::gui::CGUITTFont *tmp = static_cast<irr::gui::CGUITTFont*>(font);
118114
tmp->draw(str,
119-
r, previous_color, // FIXME
120-
HAlign == EGUIA_CENTER, VAlign == EGUIA_CENTER,
115+
r, HAlign == EGUIA_CENTER, VAlign == EGUIA_CENTER,
121116
(RestrainTextInside ? &AbsoluteClippingRect : NULL));
122117
} else
123118
#endif

0 commit comments

Comments
 (0)
Please sign in to comment.