Changeset - r28448:e444dae22974
[Not reviewed]
master
0 2 0
Peter Nelson - 11 months ago 2024-01-14 19:06:50
peter1138@openttd.org
Codechange: Avoid repeatedly calling virtual methods in text drawing loop. (#11774)
2 files changed with 17 insertions and 10 deletions:
0 comments (0 inline, 0 general)
src/gfx.cpp
Show inline comments
 
@@ -579,6 +579,8 @@ static int DrawLayoutLine(const Paragrap
 
	bool draw_shadow = false;
 
	for (int run_index = 0; run_index < line.CountRuns(); run_index++) {
 
		const ParagraphLayouter::VisualRun &run = line.GetVisualRun(run_index);
 
		const auto &glyphs = run.GetGlyphs();
 
		const auto &positions = run.GetPositions();
 
		const Font *f = run.GetFont();
 

	
 
		FontCache *fc = f->fc;
 
@@ -592,14 +594,14 @@ static int DrawLayoutLine(const Paragrap
 
		draw_shadow = fc->GetDrawGlyphShadow() && (colour & TC_NO_SHADE) == 0 && colour != TC_BLACK;
 

	
 
		for (int i = 0; i < run.GetGlyphCount(); i++) {
 
			GlyphID glyph = run.GetGlyphs()[i];
 
			GlyphID glyph = glyphs[i];
 

	
 
			/* Not a valid glyph (empty) */
 
			if (glyph == 0xFFFF) continue;
 

	
 
			int begin_x = (int)run.GetPositions()[i * 2]     + left - offset_x;
 
			int end_x   = (int)run.GetPositions()[i * 2 + 2] + left - offset_x  - 1;
 
			int top     = (int)run.GetPositions()[i * 2 + 1] + y;
 
			int begin_x = (int)positions[i * 2]     + left - offset_x;
 
			int end_x   = (int)positions[i * 2 + 2] + left - offset_x  - 1;
 
			int top     = (int)positions[i * 2 + 1] + y;
 

	
 
			/* Truncated away. */
 
			if (truncation && (begin_x < min_x || end_x > max_x)) continue;
src/gfx_layout.cpp
Show inline comments
 
@@ -254,11 +254,13 @@ Point Layouter::GetCharPosition(std::str
 
	/* Scan all runs until we've found our code point index. */
 
	for (int run_index = 0; run_index < line->CountRuns(); run_index++) {
 
		const ParagraphLayouter::VisualRun &run = line->GetVisualRun(run_index);
 
		const auto &positions = run.GetPositions();
 
		const auto &charmap = run.GetGlyphToCharMap();
 

	
 
		for (int i = 0; i < run.GetGlyphCount(); i++) {
 
			/* Matching glyph? Return position. */
 
			if ((size_t)run.GetGlyphToCharMap()[i] == index) {
 
				Point p = { (int)run.GetPositions()[i * 2], (int)run.GetPositions()[i * 2 + 1] };
 
			if ((size_t)charmap[i] == index) {
 
				Point p = { (int)positions[i * 2], (int)positions[i * 2 + 1] };
 
				return p;
 
			}
 
		}
 
@@ -281,17 +283,20 @@ ptrdiff_t Layouter::GetCharAtPosition(in
 

	
 
	for (int run_index = 0; run_index < line->CountRuns(); run_index++) {
 
		const ParagraphLayouter::VisualRun &run = line->GetVisualRun(run_index);
 
		const auto &glyphs = run.GetGlyphs();
 
		const auto &positions = run.GetPositions();
 
		const auto &charmap = run.GetGlyphToCharMap();
 

	
 
		for (int i = 0; i < run.GetGlyphCount(); i++) {
 
			/* Not a valid glyph (empty). */
 
			if (run.GetGlyphs()[i] == 0xFFFF) continue;
 
			if (glyphs[i] == 0xFFFF) continue;
 

	
 
			int begin_x = (int)run.GetPositions()[i * 2];
 
			int end_x   = (int)run.GetPositions()[i * 2 + 2];
 
			int begin_x = (int)positions[i * 2];
 
			int end_x   = (int)positions[i * 2 + 2];
 

	
 
			if (IsInsideMM(x, begin_x, end_x)) {
 
				/* Found our glyph, now convert to UTF-8 string index. */
 
				size_t index = run.GetGlyphToCharMap()[i];
 
				size_t index = charmap[i];
 

	
 
				size_t cur_idx = 0;
 
				for (auto str = this->string.begin(); str != this->string.end();) {
0 comments (0 inline, 0 general)