mirror of
https://github.com/godotengine/godot.git
synced 2025-10-19 16:03:29 +00:00
Apply fix_alpha_edges for both theme icons and font glyphs.
Only apply fix_alpha_edges for SVG glyphs.
Allow modulate for svg glyphs.
(cherry picked from commit 70a8421c30
)
This commit is contained in:
parent
b5de7da80d
commit
9628fce2f3
5 changed files with 38 additions and 6 deletions
|
@ -1318,11 +1318,12 @@ _FORCE_INLINE_ bool TextServerAdvanced::_ensure_glyph(FontAdvanced *p_font_data,
|
||||||
} break;
|
} 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 (!outline) {
|
||||||
if (!p_font_data->msdf) {
|
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 (!error) {
|
||||||
if (p_font_data->msdf) {
|
if (p_font_data->msdf) {
|
||||||
#ifdef MODULE_MSDFGEN_ENABLED
|
#ifdef MODULE_MSDFGEN_ENABLED
|
||||||
|
@ -1363,6 +1364,7 @@ _FORCE_INLINE_ bool TextServerAdvanced::_ensure_glyph(FontAdvanced *p_font_data,
|
||||||
cleanup_stroker:
|
cleanup_stroker:
|
||||||
FT_Stroker_Done(stroker);
|
FT_Stroker_Done(stroker);
|
||||||
}
|
}
|
||||||
|
gl.from_svg = from_svg;
|
||||||
E = fd->glyph_map.insert(p_glyph, gl);
|
E = fd->glyph_map.insert(p_glyph, gl);
|
||||||
r_glyph = E->value;
|
r_glyph = E->value;
|
||||||
return gl.found;
|
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) {
|
if (ffsd->textures[fgl.texture_idx].dirty) {
|
||||||
ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx];
|
ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx];
|
||||||
Ref<Image> img = tex.image;
|
Ref<Image> 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()) {
|
if (fd->mipmaps && !img->has_mipmaps()) {
|
||||||
img = tex.image->duplicate();
|
img = tex.image->duplicate();
|
||||||
img->generate_mipmaps();
|
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) {
|
if (ffsd->textures[fgl.texture_idx].dirty) {
|
||||||
ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx];
|
ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx];
|
||||||
Ref<Image> img = tex.image;
|
Ref<Image> 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()) {
|
if (fd->mipmaps && !img->has_mipmaps()) {
|
||||||
img = tex.image->duplicate();
|
img = tex.image->duplicate();
|
||||||
img->generate_mipmaps();
|
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) {
|
if (fgl.texture_idx != -1) {
|
||||||
Color modulate = p_color;
|
Color modulate = p_color;
|
||||||
#ifdef MODULE_FREETYPE_ENABLED
|
#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;
|
modulate.r = modulate.g = modulate.b = 1.0;
|
||||||
}
|
}
|
||||||
#endif
|
#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) {
|
if (ffsd->textures[fgl.texture_idx].dirty) {
|
||||||
ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx];
|
ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx];
|
||||||
Ref<Image> img = tex.image;
|
Ref<Image> 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()) {
|
if (fd->mipmaps && !img->has_mipmaps()) {
|
||||||
img = tex.image->duplicate();
|
img = tex.image->duplicate();
|
||||||
img->generate_mipmaps();
|
img->generate_mipmaps();
|
||||||
|
|
|
@ -272,6 +272,7 @@ class TextServerAdvanced : public TextServerExtension {
|
||||||
Rect2 rect;
|
Rect2 rect;
|
||||||
Rect2 uv_rect;
|
Rect2 uv_rect;
|
||||||
Vector2 advance;
|
Vector2 advance;
|
||||||
|
bool from_svg = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FontForSizeAdvanced {
|
struct FontForSizeAdvanced {
|
||||||
|
|
|
@ -741,11 +741,12 @@ _FORCE_INLINE_ bool TextServerFallback::_ensure_glyph(FontFallback *p_font_data,
|
||||||
} break;
|
} 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 (!outline) {
|
||||||
if (!p_font_data->msdf) {
|
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 (!error) {
|
||||||
if (p_font_data->msdf) {
|
if (p_font_data->msdf) {
|
||||||
#ifdef MODULE_MSDFGEN_ENABLED
|
#ifdef MODULE_MSDFGEN_ENABLED
|
||||||
|
@ -786,6 +787,7 @@ _FORCE_INLINE_ bool TextServerFallback::_ensure_glyph(FontFallback *p_font_data,
|
||||||
cleanup_stroker:
|
cleanup_stroker:
|
||||||
FT_Stroker_Done(stroker);
|
FT_Stroker_Done(stroker);
|
||||||
}
|
}
|
||||||
|
gl.from_svg = from_svg;
|
||||||
E = fd->glyph_map.insert(p_glyph, gl);
|
E = fd->glyph_map.insert(p_glyph, gl);
|
||||||
r_glyph = E->value;
|
r_glyph = E->value;
|
||||||
return gl.found;
|
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) {
|
if (ffsd->textures[fgl.texture_idx].dirty) {
|
||||||
ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx];
|
ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx];
|
||||||
Ref<Image> img = tex.image;
|
Ref<Image> 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()) {
|
if (fd->mipmaps && !img->has_mipmaps()) {
|
||||||
img = tex.image->duplicate();
|
img = tex.image->duplicate();
|
||||||
img->generate_mipmaps();
|
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) {
|
if (ffsd->textures[fgl.texture_idx].dirty) {
|
||||||
ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx];
|
ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx];
|
||||||
Ref<Image> img = tex.image;
|
Ref<Image> 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()) {
|
if (fd->mipmaps && !img->has_mipmaps()) {
|
||||||
img = tex.image->duplicate();
|
img = tex.image->duplicate();
|
||||||
img->generate_mipmaps();
|
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) {
|
if (fgl.texture_idx != -1) {
|
||||||
Color modulate = p_color;
|
Color modulate = p_color;
|
||||||
#ifdef MODULE_FREETYPE_ENABLED
|
#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;
|
modulate.r = modulate.g = modulate.b = 1.0;
|
||||||
}
|
}
|
||||||
#endif
|
#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) {
|
if (ffsd->textures[fgl.texture_idx].dirty) {
|
||||||
ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx];
|
ShelfPackTexture &tex = ffsd->textures.write[fgl.texture_idx];
|
||||||
Ref<Image> img = tex.image;
|
Ref<Image> 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()) {
|
if (fd->mipmaps && !img->has_mipmaps()) {
|
||||||
img = tex.image->duplicate();
|
img = tex.image->duplicate();
|
||||||
img->generate_mipmaps();
|
img->generate_mipmaps();
|
||||||
|
|
|
@ -219,6 +219,7 @@ class TextServerFallback : public TextServerExtension {
|
||||||
Rect2 rect;
|
Rect2 rect;
|
||||||
Rect2 uv_rect;
|
Rect2 uv_rect;
|
||||||
Vector2 advance;
|
Vector2 advance;
|
||||||
|
bool from_svg = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FontForSizeFallback {
|
struct FontForSizeFallback {
|
||||||
|
|
|
@ -91,6 +91,8 @@ static Ref<ImageTexture> generate_icon(int p_index) {
|
||||||
|
|
||||||
Error err = ImageLoaderSVG::create_image_from_string(img, default_theme_icons_sources[p_index], scale, upsample, HashMap<Color, Color>());
|
Error err = ImageLoaderSVG::create_image_from_string(img, default_theme_icons_sources[p_index], scale, upsample, HashMap<Color, Color>());
|
||||||
ERR_FAIL_COND_V_MSG(err != OK, Ref<ImageTexture>(), "Failed generating icon, unsupported or invalid SVG data in default theme.");
|
ERR_FAIL_COND_V_MSG(err != OK, Ref<ImageTexture>(), "Failed generating icon, unsupported or invalid SVG data in default theme.");
|
||||||
|
|
||||||
|
img->fix_alpha_edges();
|
||||||
#else
|
#else
|
||||||
// If the SVG module is disabled, we can't really display the UI well, but at least we won't crash.
|
// 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.
|
// 16 pixels is used as it's the most common base size for Godot icons.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue