From 73ca0533d04962a1b4598f7a31968e92c37b0a24 Mon Sep 17 00:00:00 2001 From: Haoyu Qiu Date: Wed, 27 Oct 2021 13:43:25 +0800 Subject: [PATCH] Fix RichTextLabel underline appearance when inside fill tag (cherry picked from commit 23c64fc43c19ca9bc17e6cfd98a4045c4b53fa62) --- scene/gui/rich_text_label.cpp | 38 +++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index cecfdfd78ad..c57a65126b9 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -448,11 +448,18 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & line_descent = MAX(line_descent, descent); fh = line_ascent + line_descent; + float align_spacing = 0.0f; + bool is_at_line_wrap = false; if (end && c[end - 1] == ' ') { if (align == ALIGN_FILL && p_mode != PROCESS_CACHE) { int ln = MIN(l.offset_caches.size() - 1, line); if (l.space_caches[ln]) { - align_ofs = spaces * l.offset_caches[ln] / l.space_caches[ln]; + align_spacing = l.offset_caches[ln] / l.space_caches[ln]; + align_ofs = spaces * align_spacing; + + if (l.space_caches[ln] == spaces) { + is_at_line_wrap = true; + } } } spaces++; @@ -613,24 +620,25 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & } } - if (underline) { + if (underline || strikethrough) { Color uc = color; uc.a *= 0.5; - int uy = y + lh - line_descent + 2; - float underline_width = 1.0; + + int line_y = y + lh; + if (underline) { + line_y -= line_descent - 2; + } else { + line_y -= (line_ascent + line_descent) / 2; + } + const Point2 from = p_ofs + Point2(align_ofs + wofs, line_y); + const Point2 to = from + Point2(w + (is_at_line_wrap ? 0 : align_spacing), 0); + + float line_width = 1.0f; #ifdef TOOLS_ENABLED - underline_width *= EDSCALE; + line_width *= EDSCALE; #endif - VS::get_singleton()->canvas_item_add_line(ci, p_ofs + Point2(align_ofs + wofs, uy), p_ofs + Point2(align_ofs + wofs + w, uy), uc, underline_width); - } else if (strikethrough) { - Color uc = color; - uc.a *= 0.5; - int uy = y + lh - (line_ascent + line_descent) / 2; - float strikethrough_width = 1.0; -#ifdef TOOLS_ENABLED - strikethrough_width *= EDSCALE; -#endif - VS::get_singleton()->canvas_item_add_line(ci, p_ofs + Point2(align_ofs + wofs, uy), p_ofs + Point2(align_ofs + wofs + w, uy), uc, strikethrough_width); + + VS::get_singleton()->canvas_item_add_line(ci, from, to, uc, line_width); } }