diff --git a/src/gfx.cpp b/src/gfx.cpp index 9ba985e971..762a5c47d2 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -580,7 +580,7 @@ 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) { + auto draw_line = [&](const ParagraphLayouter::Line &line, bool do_shadow, int left, int min_x, int max_x, bool truncation, TextColour &last_colour) { const DrawPixelInfo *dpi = _cur_dpi; int dpi_left = dpi->left; int dpi_right = dpi->left + dpi->width - 1; @@ -593,10 +593,15 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left, FontCache *fc = f->fc; TextColour colour = f->colour; - if (colour == TC_INVALID || HasFlag(default_colour, TC_FORCED)) colour = default_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; + } bool colour_has_shadow = (colour & TC_NO_SHADE) == 0 && colour != TC_BLACK; - SetColourRemap(do_shadow ? TC_BLACK : colour); // the last run also sets the colour for the truncation dots if (do_shadow && (!fc->GetDrawGlyphShadow() || !colour_has_shadow)) continue; + SetColourRemap(do_shadow ? TC_BLACK : colour); for (int i = 0; i < run.GetGlyphCount(); i++) { GlyphID glyph = glyphs[i]; @@ -624,11 +629,12 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left, /* Draw shadow, then foreground */ for (bool do_shadow : {true, false}) { - draw_line(line, do_shadow, left - offset_x, min_x, max_x, truncation); + TextColour last_colour = default_colour; + draw_line(line, do_shadow, left - offset_x, min_x, max_x, truncation, last_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); + draw_line(*truncation_layout->front(), do_shadow, x, INT32_MIN, INT32_MAX, false, last_colour); } }