From 2cdd50f40ebc6300f651f90ccc705b125c771b2b Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 20 Jul 2025 14:30:18 +0100 Subject: [PATCH] Fix 03f5f7145f: Wrong colour used when string POP_COLOURs back to initial colour. (#14468) Fixing ellipsis colour broke the PUSH_COLOUR/POP_COLOUR system, reverting to the last used colour instead of the initial colour. --- src/gfx.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/gfx.cpp b/src/gfx.cpp index 762a5c47d2..2b57d657c8 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -580,10 +580,11 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left, const uint shadow_offset = ScaleGUITrad(1); - auto draw_line = [&](const ParagraphLayouter::Line &line, bool do_shadow, int left, int min_x, int max_x, bool truncation, TextColour &last_colour) { + auto draw_line = [&](const ParagraphLayouter::Line &line, bool do_shadow, int left, int min_x, int max_x, bool truncation, TextColour initial_colour) { const DrawPixelInfo *dpi = _cur_dpi; int dpi_left = dpi->left; int dpi_right = dpi->left + dpi->width - 1; + TextColour last_colour = initial_colour; for (int run_index = 0; run_index < line.CountRuns(); run_index++) { const ParagraphLayouter::VisualRun &run = line.GetVisualRun(run_index); @@ -593,13 +594,10 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left, FontCache *fc = f->fc; TextColour colour = f->colour; - if (colour == TC_INVALID || HasFlag(last_colour, TC_FORCED)) { - colour = last_colour; - } else { - /* Update the last colour for the truncation ellipsis. */ - last_colour = colour; - } + if (colour == TC_INVALID || HasFlag(initial_colour, TC_FORCED)) colour = initial_colour; bool colour_has_shadow = (colour & TC_NO_SHADE) == 0 && colour != TC_BLACK; + /* Update the last colour for the truncation ellipsis. */ + last_colour = colour; if (do_shadow && (!fc->GetDrawGlyphShadow() || !colour_has_shadow)) continue; SetColourRemap(do_shadow ? TC_BLACK : colour); @@ -625,16 +623,16 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left, GfxMainBlitter(sprite, begin_x + (do_shadow ? shadow_offset : 0), top + (do_shadow ? shadow_offset : 0), BlitterMode::ColourRemap); } } + return last_colour; }; /* Draw shadow, then foreground */ for (bool do_shadow : {true, false}) { - TextColour last_colour = default_colour; - draw_line(line, do_shadow, left - offset_x, min_x, max_x, truncation, last_colour); + TextColour colour = draw_line(line, do_shadow, left - offset_x, min_x, max_x, truncation, default_colour); if (truncation) { int x = (_current_text_dir == TD_RTL) ? left : (right - truncation_width); - draw_line(*truncation_layout->front(), do_shadow, x, INT32_MIN, INT32_MAX, false, last_colour); + draw_line(*truncation_layout->front(), do_shadow, x, INT32_MIN, INT32_MAX, false, colour); } }