diff --git a/modules/text_server_adv/text_server_adv.cpp b/modules/text_server_adv/text_server_adv.cpp index 52a61cd9244..71bded1ff1d 100644 --- a/modules/text_server_adv/text_server_adv.cpp +++ b/modules/text_server_adv/text_server_adv.cpp @@ -1318,11 +1318,12 @@ _FORCE_INLINE_ bool TextServerAdvanced::_ensure_glyph(FontAdvanced *p_font_data, } break; } + FT_GlyphSlot slot = fd->face->glyph; + bool from_svg = (slot->format == FT_GLYPH_FORMAT_SVG); // Need to check before FT_Render_Glyph as it will change format to bitmap. if (!outline) { if (!p_font_data->msdf) { - error = FT_Render_Glyph(fd->face->glyph, aa_mode); + error = FT_Render_Glyph(slot, aa_mode); } - FT_GlyphSlot slot = fd->face->glyph; if (!error) { if (p_font_data->msdf) { #ifdef MODULE_MSDFGEN_ENABLED @@ -1363,6 +1364,7 @@ _FORCE_INLINE_ bool TextServerAdvanced::_ensure_glyph(FontAdvanced *p_font_data, cleanup_stroker: FT_Stroker_Done(stroker); } + gl.from_svg = from_svg; E = fd->glyph_map.insert(p_glyph, gl); r_glyph = E->value; return gl.found; @@ -3312,6 +3314,10 @@ RID TextServerAdvanced::_font_get_glyph_texture_rid(const RID &p_font_rid, const if (ffsd->textures[fgl.texture_idx].dirty) { ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx]; Ref img = tex.image; + if (fgl.from_svg) { + // Same as the "fix alpha border" process option when importing SVGs + img->fix_alpha_edges(); + } if (fd->mipmaps && !img->has_mipmaps()) { img = tex.image->duplicate(); img->generate_mipmaps(); @@ -3360,6 +3366,10 @@ Size2 TextServerAdvanced::_font_get_glyph_texture_size(const RID &p_font_rid, co if (ffsd->textures[fgl.texture_idx].dirty) { ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx]; Ref img = tex.image; + if (fgl.from_svg) { + // Same as the "fix alpha border" process option when importing SVGs + img->fix_alpha_edges(); + } if (fd->mipmaps && !img->has_mipmaps()) { img = tex.image->duplicate(); img->generate_mipmaps(); @@ -3798,7 +3808,7 @@ void TextServerAdvanced::_font_draw_glyph(const RID &p_font_rid, const RID &p_ca if (fgl.texture_idx != -1) { Color modulate = p_color; #ifdef MODULE_FREETYPE_ENABLED - if (ffsd->face && ffsd->textures[fgl.texture_idx].image.is_valid() && (ffsd->textures[fgl.texture_idx].image->get_format() == Image::FORMAT_RGBA8) && !lcd_aa && !fd->msdf) { + if (!fgl.from_svg && ffsd->face && ffsd->textures[fgl.texture_idx].image.is_valid() && (ffsd->textures[fgl.texture_idx].image->get_format() == Image::FORMAT_RGBA8) && !lcd_aa && !fd->msdf) { modulate.r = modulate.g = modulate.b = 1.0; } #endif @@ -3806,6 +3816,10 @@ void TextServerAdvanced::_font_draw_glyph(const RID &p_font_rid, const RID &p_ca if (ffsd->textures[fgl.texture_idx].dirty) { ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx]; Ref img = tex.image; + if (fgl.from_svg) { + // Same as the "fix alpha border" process option when importing SVGs + img->fix_alpha_edges(); + } if (fd->mipmaps && !img->has_mipmaps()) { img = tex.image->duplicate(); img->generate_mipmaps(); diff --git a/modules/text_server_adv/text_server_adv.h b/modules/text_server_adv/text_server_adv.h index 6561667e80e..981cb277f70 100644 --- a/modules/text_server_adv/text_server_adv.h +++ b/modules/text_server_adv/text_server_adv.h @@ -272,6 +272,7 @@ class TextServerAdvanced : public TextServerExtension { Rect2 rect; Rect2 uv_rect; Vector2 advance; + bool from_svg = false; }; struct FontForSizeAdvanced { diff --git a/modules/text_server_fb/text_server_fb.cpp b/modules/text_server_fb/text_server_fb.cpp index 8ca81368436..c70f5e00d11 100644 --- a/modules/text_server_fb/text_server_fb.cpp +++ b/modules/text_server_fb/text_server_fb.cpp @@ -741,11 +741,12 @@ _FORCE_INLINE_ bool TextServerFallback::_ensure_glyph(FontFallback *p_font_data, } break; } + FT_GlyphSlot slot = fd->face->glyph; + bool from_svg = (slot->format == FT_GLYPH_FORMAT_SVG); // Need to check before FT_Render_Glyph as it will change format to bitmap. if (!outline) { if (!p_font_data->msdf) { - error = FT_Render_Glyph(fd->face->glyph, aa_mode); + error = FT_Render_Glyph(slot, aa_mode); } - FT_GlyphSlot slot = fd->face->glyph; if (!error) { if (p_font_data->msdf) { #ifdef MODULE_MSDFGEN_ENABLED @@ -786,6 +787,7 @@ _FORCE_INLINE_ bool TextServerFallback::_ensure_glyph(FontFallback *p_font_data, cleanup_stroker: FT_Stroker_Done(stroker); } + gl.from_svg = from_svg; E = fd->glyph_map.insert(p_glyph, gl); r_glyph = E->value; return gl.found; @@ -2290,6 +2292,10 @@ RID TextServerFallback::_font_get_glyph_texture_rid(const RID &p_font_rid, const if (ffsd->textures[fgl.texture_idx].dirty) { ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx]; Ref img = tex.image; + if (fgl.from_svg) { + // Same as the "fix alpha border" process option when importing SVGs + img->fix_alpha_edges(); + } if (fd->mipmaps && !img->has_mipmaps()) { img = tex.image->duplicate(); img->generate_mipmaps(); @@ -2338,6 +2344,10 @@ Size2 TextServerFallback::_font_get_glyph_texture_size(const RID &p_font_rid, co if (ffsd->textures[fgl.texture_idx].dirty) { ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx]; Ref img = tex.image; + if (fgl.from_svg) { + // Same as the "fix alpha border" process option when importing SVGs + img->fix_alpha_edges(); + } if (fd->mipmaps && !img->has_mipmaps()) { img = tex.image->duplicate(); img->generate_mipmaps(); @@ -2729,7 +2739,7 @@ void TextServerFallback::_font_draw_glyph(const RID &p_font_rid, const RID &p_ca if (fgl.texture_idx != -1) { Color modulate = p_color; #ifdef MODULE_FREETYPE_ENABLED - if (ffsd->face && ffsd->textures[fgl.texture_idx].image.is_valid() && (ffsd->textures[fgl.texture_idx].image->get_format() == Image::FORMAT_RGBA8) && !lcd_aa && !fd->msdf) { + if (!fgl.from_svg && ffsd->face && ffsd->textures[fgl.texture_idx].image.is_valid() && (ffsd->textures[fgl.texture_idx].image->get_format() == Image::FORMAT_RGBA8) && !lcd_aa && !fd->msdf) { modulate.r = modulate.g = modulate.b = 1.0; } #endif @@ -2737,6 +2747,10 @@ void TextServerFallback::_font_draw_glyph(const RID &p_font_rid, const RID &p_ca if (ffsd->textures[fgl.texture_idx].dirty) { ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx]; Ref img = tex.image; + if (fgl.from_svg) { + // Same as the "fix alpha border" process option when importing SVGs + img->fix_alpha_edges(); + } if (fd->mipmaps && !img->has_mipmaps()) { img = tex.image->duplicate(); img->generate_mipmaps(); diff --git a/modules/text_server_fb/text_server_fb.h b/modules/text_server_fb/text_server_fb.h index b66f7189bee..3338a8a62b1 100644 --- a/modules/text_server_fb/text_server_fb.h +++ b/modules/text_server_fb/text_server_fb.h @@ -219,6 +219,7 @@ class TextServerFallback : public TextServerExtension { Rect2 rect; Rect2 uv_rect; Vector2 advance; + bool from_svg = false; }; struct FontForSizeFallback { diff --git a/scene/theme/default_theme.cpp b/scene/theme/default_theme.cpp index 5ae1e9baa37..06fe298668f 100644 --- a/scene/theme/default_theme.cpp +++ b/scene/theme/default_theme.cpp @@ -91,6 +91,8 @@ static Ref generate_icon(int p_index) { Error err = ImageLoaderSVG::create_image_from_string(img, default_theme_icons_sources[p_index], scale, upsample, HashMap()); ERR_FAIL_COND_V_MSG(err != OK, Ref(), "Failed generating icon, unsupported or invalid SVG data in default theme."); + + img->fix_alpha_edges(); #else // If the SVG module is disabled, we can't really display the UI well, but at least we won't crash. // 16 pixels is used as it's the most common base size for Godot icons.