Fix text shadow outline draw batching.
This commit is contained in:
parent
15ff450680
commit
7397e33cc9
4 changed files with 40 additions and 28 deletions
|
|
@ -392,14 +392,15 @@ inline void draw_glyph(const Glyph &p_gl, const RID &p_canvas, const Color &p_fo
|
|||
}
|
||||
}
|
||||
|
||||
inline void draw_glyph_shadow(const Glyph &p_gl, const RID &p_canvas, const Color &p_font_shadow_color, int p_shadow_outline_size, const Vector2 &p_ofs, const Vector2 &shadow_ofs) {
|
||||
inline void draw_glyph_shadow(const Glyph &p_gl, const RID &p_canvas, const Color &p_font_shadow_color, const Vector2 &p_ofs, const Vector2 &shadow_ofs) {
|
||||
if (p_gl.font_rid != RID()) {
|
||||
if (p_font_shadow_color.a > 0) {
|
||||
TS->font_draw_glyph(p_gl.font_rid, p_canvas, p_gl.font_size, p_ofs + Vector2(p_gl.x_off, p_gl.y_off) + shadow_ofs, p_gl.index, p_font_shadow_color);
|
||||
}
|
||||
if (p_font_shadow_color.a > 0 && p_shadow_outline_size > 0) {
|
||||
TS->font_draw_glyph_outline(p_gl.font_rid, p_canvas, p_gl.font_size, p_shadow_outline_size, p_ofs + Vector2(p_gl.x_off, p_gl.y_off) + shadow_ofs, p_gl.index, p_font_shadow_color);
|
||||
}
|
||||
TS->font_draw_glyph(p_gl.font_rid, p_canvas, p_gl.font_size, p_ofs + Vector2(p_gl.x_off, p_gl.y_off) + shadow_ofs, p_gl.index, p_font_shadow_color);
|
||||
}
|
||||
}
|
||||
|
||||
inline void draw_glyph_shadow_outline(const Glyph &p_gl, const RID &p_canvas, const Color &p_font_shadow_color, int p_shadow_outline_size, const Vector2 &p_ofs, const Vector2 &shadow_ofs) {
|
||||
if (p_gl.font_rid != RID()) {
|
||||
TS->font_draw_glyph_outline(p_gl.font_rid, p_canvas, p_gl.font_size, p_shadow_outline_size, p_ofs + Vector2(p_gl.x_off, p_gl.y_off) + shadow_ofs, p_gl.index, p_font_shadow_color);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -768,7 +769,10 @@ void Label::_notification(int p_what) {
|
|||
|
||||
// Draw shadow, outline and text. Note: Do not merge this into the single loop iteration, to prevent overlaps.
|
||||
int processed_glyphs_step = 0;
|
||||
for (int step = DRAW_STEP_SHADOW; step < DRAW_STEP_MAX; step++) {
|
||||
for (int step = DRAW_STEP_SHADOW_OUTLINE; step < DRAW_STEP_MAX; step++) {
|
||||
if (step == DRAW_STEP_SHADOW_OUTLINE && (font_shadow_color.a == 0 || shadow_outline_size <= 0)) {
|
||||
continue;
|
||||
}
|
||||
if (step == DRAW_STEP_SHADOW && (font_shadow_color.a == 0)) {
|
||||
continue;
|
||||
}
|
||||
|
|
@ -784,8 +788,10 @@ void Label::_notification(int p_what) {
|
|||
for (int j = 0; j < ellipsis_glyphs[gl_idx].repeat; j++) {
|
||||
bool skip = (trim_chars && ellipsis_glyphs[gl_idx].end + para.start > visible_chars) || (trim_glyphs_ltr && (processed_glyphs_step >= visible_glyphs)) || (trim_glyphs_rtl && (processed_glyphs_step < total_glyphs - visible_glyphs));
|
||||
if (!skip) {
|
||||
if (step == DRAW_STEP_SHADOW) {
|
||||
draw_glyph_shadow(ellipsis_glyphs[gl_idx], ci, font_shadow_color, shadow_outline_size, offset_step, shadow_ofs);
|
||||
if (step == DRAW_STEP_SHADOW_OUTLINE) {
|
||||
draw_glyph_shadow_outline(ellipsis_glyphs[gl_idx], ci, font_shadow_color, shadow_outline_size, offset_step, shadow_ofs);
|
||||
} else if (step == DRAW_STEP_SHADOW) {
|
||||
draw_glyph_shadow(ellipsis_glyphs[gl_idx], ci, font_shadow_color, offset_step, shadow_ofs);
|
||||
} else if (step == DRAW_STEP_OUTLINE) {
|
||||
draw_glyph_outline(ellipsis_glyphs[gl_idx], ci, font_outline_color, outline_size, offset_step);
|
||||
} else if (step == DRAW_STEP_TEXT) {
|
||||
|
|
@ -814,8 +820,10 @@ void Label::_notification(int p_what) {
|
|||
for (int k = 0; k < glyphs[j].repeat; k++) {
|
||||
bool skip = (trim_chars && glyphs[j].end + para.start > visible_chars) || (trim_glyphs_ltr && (processed_glyphs_step >= visible_glyphs)) || (trim_glyphs_rtl && (processed_glyphs_step < total_glyphs - visible_glyphs));
|
||||
if (!skip) {
|
||||
if (step == DRAW_STEP_SHADOW) {
|
||||
draw_glyph_shadow(glyphs[j], ci, font_shadow_color, shadow_outline_size, offset_step, shadow_ofs);
|
||||
if (step == DRAW_STEP_SHADOW_OUTLINE) {
|
||||
draw_glyph_shadow_outline(glyphs[j], ci, font_shadow_color, shadow_outline_size, offset_step, shadow_ofs);
|
||||
} else if (step == DRAW_STEP_SHADOW) {
|
||||
draw_glyph_shadow(glyphs[j], ci, font_shadow_color, offset_step, shadow_ofs);
|
||||
} else if (step == DRAW_STEP_OUTLINE) {
|
||||
draw_glyph_outline(glyphs[j], ci, font_outline_color, outline_size, offset_step);
|
||||
} else if (step == DRAW_STEP_TEXT) {
|
||||
|
|
@ -832,8 +840,10 @@ void Label::_notification(int p_what) {
|
|||
for (int j = 0; j < ellipsis_glyphs[gl_idx].repeat; j++) {
|
||||
bool skip = (trim_chars && ellipsis_glyphs[gl_idx].end + para.start > visible_chars) || (trim_glyphs_ltr && (processed_glyphs_step >= visible_glyphs)) || (trim_glyphs_rtl && (processed_glyphs_step < total_glyphs - visible_glyphs));
|
||||
if (!skip) {
|
||||
if (step == DRAW_STEP_SHADOW) {
|
||||
draw_glyph_shadow(ellipsis_glyphs[gl_idx], ci, font_shadow_color, shadow_outline_size, offset_step, shadow_ofs);
|
||||
if (step == DRAW_STEP_SHADOW_OUTLINE) {
|
||||
draw_glyph_shadow_outline(ellipsis_glyphs[gl_idx], ci, font_shadow_color, shadow_outline_size, offset_step, shadow_ofs);
|
||||
} else if (step == DRAW_STEP_SHADOW) {
|
||||
draw_glyph_shadow(ellipsis_glyphs[gl_idx], ci, font_shadow_color, offset_step, shadow_ofs);
|
||||
} else if (step == DRAW_STEP_OUTLINE) {
|
||||
draw_glyph_outline(ellipsis_glyphs[gl_idx], ci, font_outline_color, outline_size, offset_step);
|
||||
} else if (step == DRAW_STEP_TEXT) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue