Merge pull request #87335 from bruvzg/ts_round
[TextServer] Fix precision loss in the string drawing methods.
This commit is contained in:
commit
b6577ec5c7
1 changed files with 18 additions and 17 deletions
|
@ -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);
|
int v_size = shaped_text_get_glyph_count(p_shaped);
|
||||||
const Glyph *glyphs = shaped_text_get_glyphs(p_shaped);
|
const Glyph *glyphs = shaped_text_get_glyphs(p_shaped);
|
||||||
|
|
||||||
Vector2 ofs = p_pos;
|
Vector2 ofs;
|
||||||
// Draw RTL ellipsis string when needed.
|
// Draw RTL ellipsis string when needed.
|
||||||
if (rtl && ellipsis_pos >= 0) {
|
if (rtl && ellipsis_pos >= 0) {
|
||||||
for (int i = ellipsis_gl_size - 1; i >= 0; i--) {
|
for (int i = ellipsis_gl_size - 1; i >= 0; i--) {
|
||||||
for (int j = 0; j < ellipsis_glyphs[i].repeat; j++) {
|
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) {
|
if (orientation == ORIENTATION_HORIZONTAL) {
|
||||||
ofs.x += ellipsis_glyphs[i].advance;
|
ofs.x += ellipsis_glyphs[i].advance;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1544,11 +1544,11 @@ void TextServer::shaped_text_draw(const RID &p_shaped, const RID &p_canvas, cons
|
||||||
if (p_clip_r > 0) {
|
if (p_clip_r > 0) {
|
||||||
// Clip right / bottom.
|
// Clip right / bottom.
|
||||||
if (orientation == ORIENTATION_HORIZONTAL) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (ofs.y - p_pos.y + glyphs[i].advance > p_clip_r) {
|
if (ofs.y + glyphs[i].advance > p_clip_r) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1556,12 +1556,12 @@ void TextServer::shaped_text_draw(const RID &p_shaped, const RID &p_canvas, cons
|
||||||
if (p_clip_l > 0) {
|
if (p_clip_l > 0) {
|
||||||
// Clip left / top.
|
// Clip left / top.
|
||||||
if (orientation == ORIENTATION_HORIZONTAL) {
|
if (orientation == ORIENTATION_HORIZONTAL) {
|
||||||
if (ofs.x - p_pos.x < p_clip_l) {
|
if (ofs.x < p_clip_l) {
|
||||||
ofs.x += glyphs[i].advance;
|
ofs.x += glyphs[i].advance;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (ofs.y - p_pos.y < p_clip_l) {
|
if (ofs.y < p_clip_l) {
|
||||||
ofs.y += glyphs[i].advance;
|
ofs.y += glyphs[i].advance;
|
||||||
continue;
|
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()) {
|
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)) {
|
} 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) {
|
if (orientation == ORIENTATION_HORIZONTAL) {
|
||||||
ofs.x += glyphs[i].advance;
|
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) {
|
if (!rtl && ellipsis_pos >= 0) {
|
||||||
for (int i = 0; i < ellipsis_gl_size; i++) {
|
for (int i = 0; i < ellipsis_gl_size; i++) {
|
||||||
for (int j = 0; j < ellipsis_glyphs[i].repeat; j++) {
|
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) {
|
if (orientation == ORIENTATION_HORIZONTAL) {
|
||||||
ofs.x += ellipsis_glyphs[i].advance;
|
ofs.x += ellipsis_glyphs[i].advance;
|
||||||
} else {
|
} 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);
|
int v_size = shaped_text_get_glyph_count(p_shaped);
|
||||||
const Glyph *glyphs = shaped_text_get_glyphs(p_shaped);
|
const Glyph *glyphs = shaped_text_get_glyphs(p_shaped);
|
||||||
Vector2 ofs = p_pos;
|
|
||||||
|
Vector2 ofs;
|
||||||
// Draw RTL ellipsis string when needed.
|
// Draw RTL ellipsis string when needed.
|
||||||
if (rtl && ellipsis_pos >= 0) {
|
if (rtl && ellipsis_pos >= 0) {
|
||||||
for (int i = ellipsis_gl_size - 1; i >= 0; i--) {
|
for (int i = ellipsis_gl_size - 1; i >= 0; i--) {
|
||||||
for (int j = 0; j < ellipsis_glyphs[i].repeat; j++) {
|
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) {
|
if (orientation == ORIENTATION_HORIZONTAL) {
|
||||||
ofs.x += ellipsis_glyphs[i].advance;
|
ofs.x += ellipsis_glyphs[i].advance;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1639,11 +1640,11 @@ void TextServer::shaped_text_draw_outline(const RID &p_shaped, const RID &p_canv
|
||||||
if (p_clip_r > 0) {
|
if (p_clip_r > 0) {
|
||||||
// Clip right / bottom.
|
// Clip right / bottom.
|
||||||
if (orientation == ORIENTATION_HORIZONTAL) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (ofs.y - p_pos.y + glyphs[i].advance > p_clip_r) {
|
if (ofs.y + glyphs[i].advance > p_clip_r) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1651,19 +1652,19 @@ void TextServer::shaped_text_draw_outline(const RID &p_shaped, const RID &p_canv
|
||||||
if (p_clip_l > 0) {
|
if (p_clip_l > 0) {
|
||||||
// Clip left / top.
|
// Clip left / top.
|
||||||
if (orientation == ORIENTATION_HORIZONTAL) {
|
if (orientation == ORIENTATION_HORIZONTAL) {
|
||||||
if (ofs.x - p_pos.x < p_clip_l) {
|
if (ofs.x < p_clip_l) {
|
||||||
ofs.x += glyphs[i].advance;
|
ofs.x += glyphs[i].advance;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (ofs.y - p_pos.y < p_clip_l) {
|
if (ofs.y < p_clip_l) {
|
||||||
ofs.y += glyphs[i].advance;
|
ofs.y += glyphs[i].advance;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (glyphs[i].font_rid != RID()) {
|
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) {
|
if (orientation == ORIENTATION_HORIZONTAL) {
|
||||||
ofs.x += glyphs[i].advance;
|
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) {
|
if (!rtl && ellipsis_pos >= 0) {
|
||||||
for (int i = 0; i < ellipsis_gl_size; i++) {
|
for (int i = 0; i < ellipsis_gl_size; i++) {
|
||||||
for (int j = 0; j < ellipsis_glyphs[i].repeat; j++) {
|
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) {
|
if (orientation == ORIENTATION_HORIZONTAL) {
|
||||||
ofs.x += ellipsis_glyphs[i].advance;
|
ofs.x += ellipsis_glyphs[i].advance;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue