From 476331eef3498a88cb3421d411df45e1a88290fc Mon Sep 17 00:00:00 2001 From: bruvzg <7645683+bruvzg@users.noreply.github.com> Date: Thu, 18 Jan 2024 15:31:48 +0200 Subject: [PATCH] [TextServer] Fix precision loss in the string drawing methods. --- servers/text_server.cpp | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/servers/text_server.cpp b/servers/text_server.cpp index b282c517d35..e05d55787a6 100644 --- a/servers/text_server.cpp +++ b/servers/text_server.cpp @@ -1513,12 +1513,12 @@ void TextServer::shaped_text_draw(const RID &p_shaped, const RID &p_canvas, cons int v_size = shaped_text_get_glyph_count(p_shaped); const Glyph *glyphs = shaped_text_get_glyphs(p_shaped); - Vector2 ofs = p_pos; + Vector2 ofs; // Draw RTL ellipsis string when needed. if (rtl && ellipsis_pos >= 0) { for (int i = ellipsis_gl_size - 1; i >= 0; i--) { for (int j = 0; j < ellipsis_glyphs[i].repeat; j++) { - font_draw_glyph(ellipsis_glyphs[i].font_rid, p_canvas, ellipsis_glyphs[i].font_size, ofs + Vector2(ellipsis_glyphs[i].x_off, ellipsis_glyphs[i].y_off), ellipsis_glyphs[i].index, p_color); + font_draw_glyph(ellipsis_glyphs[i].font_rid, p_canvas, ellipsis_glyphs[i].font_size, ofs + p_pos + Vector2(ellipsis_glyphs[i].x_off, ellipsis_glyphs[i].y_off), ellipsis_glyphs[i].index, p_color); if (orientation == ORIENTATION_HORIZONTAL) { ofs.x += ellipsis_glyphs[i].advance; } else { @@ -1544,11 +1544,11 @@ void TextServer::shaped_text_draw(const RID &p_shaped, const RID &p_canvas, cons if (p_clip_r > 0) { // Clip right / bottom. if (orientation == ORIENTATION_HORIZONTAL) { - if (ofs.x - p_pos.x + glyphs[i].advance > p_clip_r) { + if (ofs.x + glyphs[i].advance > p_clip_r) { return; } } else { - if (ofs.y - p_pos.y + glyphs[i].advance > p_clip_r) { + if (ofs.y + glyphs[i].advance > p_clip_r) { return; } } @@ -1556,12 +1556,12 @@ void TextServer::shaped_text_draw(const RID &p_shaped, const RID &p_canvas, cons if (p_clip_l > 0) { // Clip left / top. if (orientation == ORIENTATION_HORIZONTAL) { - if (ofs.x - p_pos.x < p_clip_l) { + if (ofs.x < p_clip_l) { ofs.x += glyphs[i].advance; continue; } } else { - if (ofs.y - p_pos.y < p_clip_l) { + if (ofs.y < p_clip_l) { ofs.y += glyphs[i].advance; continue; } @@ -1569,9 +1569,9 @@ void TextServer::shaped_text_draw(const RID &p_shaped, const RID &p_canvas, cons } if (glyphs[i].font_rid != RID()) { - font_draw_glyph(glyphs[i].font_rid, p_canvas, glyphs[i].font_size, ofs + Vector2(glyphs[i].x_off, glyphs[i].y_off), glyphs[i].index, p_color); + font_draw_glyph(glyphs[i].font_rid, p_canvas, glyphs[i].font_size, ofs + p_pos + Vector2(glyphs[i].x_off, glyphs[i].y_off), glyphs[i].index, p_color); } else if (hex_codes && ((glyphs[i].flags & GRAPHEME_IS_VIRTUAL) != GRAPHEME_IS_VIRTUAL) && ((glyphs[i].flags & GRAPHEME_IS_EMBEDDED_OBJECT) != GRAPHEME_IS_EMBEDDED_OBJECT)) { - TextServer::draw_hex_code_box(p_canvas, glyphs[i].font_size, ofs + Vector2(glyphs[i].x_off, glyphs[i].y_off), glyphs[i].index, p_color); + TextServer::draw_hex_code_box(p_canvas, glyphs[i].font_size, ofs + p_pos + Vector2(glyphs[i].x_off, glyphs[i].y_off), glyphs[i].index, p_color); } if (orientation == ORIENTATION_HORIZONTAL) { ofs.x += glyphs[i].advance; @@ -1584,7 +1584,7 @@ void TextServer::shaped_text_draw(const RID &p_shaped, const RID &p_canvas, cons if (!rtl && ellipsis_pos >= 0) { for (int i = 0; i < ellipsis_gl_size; i++) { for (int j = 0; j < ellipsis_glyphs[i].repeat; j++) { - font_draw_glyph(ellipsis_glyphs[i].font_rid, p_canvas, ellipsis_glyphs[i].font_size, ofs + Vector2(ellipsis_glyphs[i].x_off, ellipsis_glyphs[i].y_off), ellipsis_glyphs[i].index, p_color); + font_draw_glyph(ellipsis_glyphs[i].font_rid, p_canvas, ellipsis_glyphs[i].font_size, ofs + p_pos + Vector2(ellipsis_glyphs[i].x_off, ellipsis_glyphs[i].y_off), ellipsis_glyphs[i].index, p_color); if (orientation == ORIENTATION_HORIZONTAL) { ofs.x += ellipsis_glyphs[i].advance; } else { @@ -1608,12 +1608,13 @@ void TextServer::shaped_text_draw_outline(const RID &p_shaped, const RID &p_canv int v_size = shaped_text_get_glyph_count(p_shaped); const Glyph *glyphs = shaped_text_get_glyphs(p_shaped); - Vector2 ofs = p_pos; + + Vector2 ofs; // Draw RTL ellipsis string when needed. if (rtl && ellipsis_pos >= 0) { for (int i = ellipsis_gl_size - 1; i >= 0; i--) { for (int j = 0; j < ellipsis_glyphs[i].repeat; j++) { - font_draw_glyph_outline(ellipsis_glyphs[i].font_rid, p_canvas, ellipsis_glyphs[i].font_size, p_outline_size, ofs + Vector2(ellipsis_glyphs[i].x_off, ellipsis_glyphs[i].y_off), ellipsis_glyphs[i].index, p_color); + font_draw_glyph_outline(ellipsis_glyphs[i].font_rid, p_canvas, ellipsis_glyphs[i].font_size, p_outline_size, ofs + p_pos + Vector2(ellipsis_glyphs[i].x_off, ellipsis_glyphs[i].y_off), ellipsis_glyphs[i].index, p_color); if (orientation == ORIENTATION_HORIZONTAL) { ofs.x += ellipsis_glyphs[i].advance; } else { @@ -1639,11 +1640,11 @@ void TextServer::shaped_text_draw_outline(const RID &p_shaped, const RID &p_canv if (p_clip_r > 0) { // Clip right / bottom. if (orientation == ORIENTATION_HORIZONTAL) { - if (ofs.x - p_pos.x + glyphs[i].advance > p_clip_r) { + if (ofs.x + glyphs[i].advance > p_clip_r) { return; } } else { - if (ofs.y - p_pos.y + glyphs[i].advance > p_clip_r) { + if (ofs.y + glyphs[i].advance > p_clip_r) { return; } } @@ -1651,19 +1652,19 @@ void TextServer::shaped_text_draw_outline(const RID &p_shaped, const RID &p_canv if (p_clip_l > 0) { // Clip left / top. if (orientation == ORIENTATION_HORIZONTAL) { - if (ofs.x - p_pos.x < p_clip_l) { + if (ofs.x < p_clip_l) { ofs.x += glyphs[i].advance; continue; } } else { - if (ofs.y - p_pos.y < p_clip_l) { + if (ofs.y < p_clip_l) { ofs.y += glyphs[i].advance; continue; } } } if (glyphs[i].font_rid != RID()) { - font_draw_glyph_outline(glyphs[i].font_rid, p_canvas, glyphs[i].font_size, p_outline_size, ofs + Vector2(glyphs[i].x_off, glyphs[i].y_off), glyphs[i].index, p_color); + font_draw_glyph_outline(glyphs[i].font_rid, p_canvas, glyphs[i].font_size, p_outline_size, ofs + p_pos + Vector2(glyphs[i].x_off, glyphs[i].y_off), glyphs[i].index, p_color); } if (orientation == ORIENTATION_HORIZONTAL) { ofs.x += glyphs[i].advance; @@ -1676,7 +1677,7 @@ void TextServer::shaped_text_draw_outline(const RID &p_shaped, const RID &p_canv if (!rtl && ellipsis_pos >= 0) { for (int i = 0; i < ellipsis_gl_size; i++) { for (int j = 0; j < ellipsis_glyphs[i].repeat; j++) { - font_draw_glyph_outline(ellipsis_glyphs[i].font_rid, p_canvas, ellipsis_glyphs[i].font_size, p_outline_size, ofs + Vector2(ellipsis_glyphs[i].x_off, ellipsis_glyphs[i].y_off), ellipsis_glyphs[i].index, p_color); + font_draw_glyph_outline(ellipsis_glyphs[i].font_rid, p_canvas, ellipsis_glyphs[i].font_size, p_outline_size, ofs + p_pos + Vector2(ellipsis_glyphs[i].x_off, ellipsis_glyphs[i].y_off), ellipsis_glyphs[i].index, p_color); if (orientation == ORIENTATION_HORIZONTAL) { ofs.x += ellipsis_glyphs[i].advance; } else {