diff options
| author | bruvzg <7645683+bruvzg@users.noreply.github.com> | 2024-03-11 13:42:16 +0200 |
|---|---|---|
| committer | bruvzg <7645683+bruvzg@users.noreply.github.com> | 2024-03-11 16:31:10 +0200 |
| commit | 911fa38d3a0dc71aa99ffcef474b5bae15805e8d (patch) | |
| tree | 7edc6f08566577326c2a7460ab7545a523a2e5e0 /modules | |
| parent | 810f127022ec2cbfb288e436151d1a777c7b5da7 (diff) | |
| download | redot-engine-911fa38d3a0dc71aa99ffcef474b5bae15805e8d.tar.gz | |
[Font] Add option to disable embedded bitmaps loading.
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/text_server_adv/text_server_adv.cpp | 22 | ||||
| -rw-r--r-- | modules/text_server_adv/text_server_adv.h | 10 | ||||
| -rw-r--r-- | modules/text_server_fb/text_server_fb.cpp | 22 | ||||
| -rw-r--r-- | modules/text_server_fb/text_server_fb.h | 10 |
4 files changed, 58 insertions, 6 deletions
diff --git a/modules/text_server_adv/text_server_adv.cpp b/modules/text_server_adv/text_server_adv.cpp index 3da19aaee8..5d9bc69d03 100644 --- a/modules/text_server_adv/text_server_adv.cpp +++ b/modules/text_server_adv/text_server_adv.cpp @@ -1201,7 +1201,7 @@ _FORCE_INLINE_ bool TextServerAdvanced::_ensure_glyph(FontAdvanced *p_font_data, if (p_font_data->force_autohinter) { flags |= FT_LOAD_FORCE_AUTOHINT; } - if (outline) { + if (outline || (p_font_data->disable_embedded_bitmaps && !FT_HAS_COLOR(fd->face))) { flags |= FT_LOAD_NO_BITMAP; } else if (FT_HAS_COLOR(fd->face)) { flags |= FT_LOAD_COLOR; @@ -2177,6 +2177,25 @@ TextServer::FontAntialiasing TextServerAdvanced::_font_get_antialiasing(const RI return fd->antialiasing; } +void TextServerAdvanced::_font_set_disable_embedded_bitmaps(const RID &p_font_rid, bool p_disable_embedded_bitmaps) { + FontAdvanced *fd = _get_font_data(p_font_rid); + ERR_FAIL_NULL(fd); + + MutexLock lock(fd->mutex); + if (fd->disable_embedded_bitmaps != p_disable_embedded_bitmaps) { + _font_clear_cache(fd); + fd->disable_embedded_bitmaps = p_disable_embedded_bitmaps; + } +} + +bool TextServerAdvanced::_font_get_disable_embedded_bitmaps(const RID &p_font_rid) const { + FontAdvanced *fd = _get_font_data(p_font_rid); + ERR_FAIL_NULL_V(fd, false); + + MutexLock lock(fd->mutex); + return fd->disable_embedded_bitmaps; +} + void TextServerAdvanced::_font_set_generate_mipmaps(const RID &p_font_rid, bool p_generate_mipmaps) { FontAdvanced *fd = _get_font_data(p_font_rid); ERR_FAIL_NULL(fd); @@ -4997,6 +5016,7 @@ RID TextServerAdvanced::_find_sys_font_for_text(const RID &p_fdef, const String } _font_set_antialiasing(sysf.rid, key.antialiasing); + _font_set_disable_embedded_bitmaps(sysf.rid, key.disable_embedded_bitmaps); _font_set_generate_mipmaps(sysf.rid, key.mipmaps); _font_set_multichannel_signed_distance_field(sysf.rid, key.msdf); _font_set_msdf_pixel_range(sysf.rid, key.msdf_range); diff --git a/modules/text_server_adv/text_server_adv.h b/modules/text_server_adv/text_server_adv.h index 3f04c17d9c..a43ea1e7da 100644 --- a/modules/text_server_adv/text_server_adv.h +++ b/modules/text_server_adv/text_server_adv.h @@ -303,6 +303,7 @@ class TextServerAdvanced : public TextServerExtension { Mutex mutex; TextServer::FontAntialiasing antialiasing = TextServer::FONT_ANTIALIASING_GRAY; + bool disable_embedded_bitmaps = true; bool mipmaps = false; bool msdf = false; int msdf_range = 14; @@ -559,6 +560,7 @@ class TextServerAdvanced : public TextServerExtension { struct SystemFontKey { String font_name; TextServer::FontAntialiasing antialiasing = TextServer::FONT_ANTIALIASING_GRAY; + bool disable_embedded_bitmaps = true; bool italic = false; bool mipmaps = false; bool msdf = false; @@ -578,7 +580,7 @@ class TextServerAdvanced : public TextServerExtension { float baseline_offset = 0.0; bool operator==(const SystemFontKey &p_b) const { - return (font_name == p_b.font_name) && (antialiasing == p_b.antialiasing) && (italic == p_b.italic) && (mipmaps == p_b.mipmaps) && (msdf == p_b.msdf) && (force_autohinter == p_b.force_autohinter) && (weight == p_b.weight) && (stretch == p_b.stretch) && (msdf_range == p_b.msdf_range) && (msdf_source_size == p_b.msdf_source_size) && (fixed_size == p_b.fixed_size) && (hinting == p_b.hinting) && (subpixel_positioning == p_b.subpixel_positioning) && (variation_coordinates == p_b.variation_coordinates) && (oversampling == p_b.oversampling) && (embolden == p_b.embolden) && (transform == p_b.transform) && (extra_spacing[SPACING_TOP] == p_b.extra_spacing[SPACING_TOP]) && (extra_spacing[SPACING_BOTTOM] == p_b.extra_spacing[SPACING_BOTTOM]) && (extra_spacing[SPACING_SPACE] == p_b.extra_spacing[SPACING_SPACE]) && (extra_spacing[SPACING_GLYPH] == p_b.extra_spacing[SPACING_GLYPH]) && (baseline_offset == p_b.baseline_offset); + return (font_name == p_b.font_name) && (antialiasing == p_b.antialiasing) && (italic == p_b.italic) && (disable_embedded_bitmaps == p_b.disable_embedded_bitmaps) && (mipmaps == p_b.mipmaps) && (msdf == p_b.msdf) && (force_autohinter == p_b.force_autohinter) && (weight == p_b.weight) && (stretch == p_b.stretch) && (msdf_range == p_b.msdf_range) && (msdf_source_size == p_b.msdf_source_size) && (fixed_size == p_b.fixed_size) && (hinting == p_b.hinting) && (subpixel_positioning == p_b.subpixel_positioning) && (variation_coordinates == p_b.variation_coordinates) && (oversampling == p_b.oversampling) && (embolden == p_b.embolden) && (transform == p_b.transform) && (extra_spacing[SPACING_TOP] == p_b.extra_spacing[SPACING_TOP]) && (extra_spacing[SPACING_BOTTOM] == p_b.extra_spacing[SPACING_BOTTOM]) && (extra_spacing[SPACING_SPACE] == p_b.extra_spacing[SPACING_SPACE]) && (extra_spacing[SPACING_GLYPH] == p_b.extra_spacing[SPACING_GLYPH]) && (baseline_offset == p_b.baseline_offset); } SystemFontKey(const String &p_font_name, bool p_italic, int p_weight, int p_stretch, RID p_font, const TextServerAdvanced *p_fb) { @@ -587,6 +589,7 @@ class TextServerAdvanced : public TextServerExtension { weight = p_weight; stretch = p_stretch; antialiasing = p_fb->_font_get_antialiasing(p_font); + disable_embedded_bitmaps = p_fb->_font_get_disable_embedded_bitmaps(p_font); mipmaps = p_fb->_font_get_generate_mipmaps(p_font); msdf = p_fb->_font_is_multichannel_signed_distance_field(p_font); msdf_range = p_fb->_font_get_msdf_pixel_range(p_font); @@ -637,7 +640,7 @@ class TextServerAdvanced : public TextServerExtension { hash = hash_murmur3_one_32(p_a.extra_spacing[SPACING_SPACE], hash); hash = hash_murmur3_one_32(p_a.extra_spacing[SPACING_GLYPH], hash); hash = hash_murmur3_one_double(p_a.baseline_offset, hash); - return hash_fmix32(hash_murmur3_one_32(((int)p_a.mipmaps) | ((int)p_a.msdf << 1) | ((int)p_a.italic << 2) | ((int)p_a.force_autohinter << 3) | ((int)p_a.hinting << 4) | ((int)p_a.subpixel_positioning << 8) | ((int)p_a.antialiasing << 12), hash)); + return hash_fmix32(hash_murmur3_one_32(((int)p_a.mipmaps) | ((int)p_a.msdf << 1) | ((int)p_a.italic << 2) | ((int)p_a.force_autohinter << 3) | ((int)p_a.hinting << 4) | ((int)p_a.subpixel_positioning << 8) | ((int)p_a.antialiasing << 12) | ((int)p_a.disable_embedded_bitmaps << 14), hash)); } }; mutable HashMap<SystemFontKey, SystemFontCache, SystemFontKeyHasher> system_fonts; @@ -751,6 +754,9 @@ public: MODBIND2(font_set_antialiasing, const RID &, TextServer::FontAntialiasing); MODBIND1RC(TextServer::FontAntialiasing, font_get_antialiasing, const RID &); + MODBIND2(font_set_disable_embedded_bitmaps, const RID &, bool); + MODBIND1RC(bool, font_get_disable_embedded_bitmaps, const RID &); + MODBIND2(font_set_generate_mipmaps, const RID &, bool); MODBIND1RC(bool, font_get_generate_mipmaps, const RID &); diff --git a/modules/text_server_fb/text_server_fb.cpp b/modules/text_server_fb/text_server_fb.cpp index 7e34de0bbc..75374ecab4 100644 --- a/modules/text_server_fb/text_server_fb.cpp +++ b/modules/text_server_fb/text_server_fb.cpp @@ -636,7 +636,7 @@ _FORCE_INLINE_ bool TextServerFallback::_ensure_glyph(FontFallback *p_font_data, if (p_font_data->force_autohinter) { flags |= FT_LOAD_FORCE_AUTOHINT; } - if (outline) { + if (outline || (p_font_data->disable_embedded_bitmaps && !FT_HAS_COLOR(fd->face))) { flags |= FT_LOAD_NO_BITMAP; } else if (FT_HAS_COLOR(fd->face)) { flags |= FT_LOAD_COLOR; @@ -1170,6 +1170,25 @@ TextServer::FontAntialiasing TextServerFallback::_font_get_antialiasing(const RI return fd->antialiasing; } +void TextServerFallback::_font_set_disable_embedded_bitmaps(const RID &p_font_rid, bool p_disable_embedded_bitmaps) { + FontFallback *fd = _get_font_data(p_font_rid); + ERR_FAIL_NULL(fd); + + MutexLock lock(fd->mutex); + if (fd->disable_embedded_bitmaps != p_disable_embedded_bitmaps) { + _font_clear_cache(fd); + fd->disable_embedded_bitmaps = p_disable_embedded_bitmaps; + } +} + +bool TextServerFallback::_font_get_disable_embedded_bitmaps(const RID &p_font_rid) const { + FontFallback *fd = _get_font_data(p_font_rid); + ERR_FAIL_NULL_V(fd, false); + + MutexLock lock(fd->mutex); + return fd->disable_embedded_bitmaps; +} + void TextServerFallback::_font_set_generate_mipmaps(const RID &p_font_rid, bool p_generate_mipmaps) { FontFallback *fd = _get_font_data(p_font_rid); ERR_FAIL_NULL(fd); @@ -3805,6 +3824,7 @@ RID TextServerFallback::_find_sys_font_for_text(const RID &p_fdef, const String } _font_set_antialiasing(sysf.rid, key.antialiasing); + _font_set_disable_embedded_bitmaps(sysf.rid, key.disable_embedded_bitmaps); _font_set_generate_mipmaps(sysf.rid, key.mipmaps); _font_set_multichannel_signed_distance_field(sysf.rid, key.msdf); _font_set_msdf_pixel_range(sysf.rid, key.msdf_range); diff --git a/modules/text_server_fb/text_server_fb.h b/modules/text_server_fb/text_server_fb.h index 9cdf20f3fa..54a2a949f0 100644 --- a/modules/text_server_fb/text_server_fb.h +++ b/modules/text_server_fb/text_server_fb.h @@ -254,6 +254,7 @@ class TextServerFallback : public TextServerExtension { Mutex mutex; TextServer::FontAntialiasing antialiasing = TextServer::FONT_ANTIALIASING_GRAY; + bool disable_embedded_bitmaps = true; bool mipmaps = false; bool msdf = false; FixedSizeScaleMode fixed_size_scale_mode = FIXED_SIZE_SCALE_DISABLE; @@ -475,6 +476,7 @@ class TextServerFallback : public TextServerExtension { struct SystemFontKey { String font_name; TextServer::FontAntialiasing antialiasing = TextServer::FONT_ANTIALIASING_GRAY; + bool disable_embedded_bitmaps = true; bool italic = false; bool mipmaps = false; bool msdf = false; @@ -494,7 +496,7 @@ class TextServerFallback : public TextServerExtension { float baseline_offset = 0.0; bool operator==(const SystemFontKey &p_b) const { - return (font_name == p_b.font_name) && (antialiasing == p_b.antialiasing) && (italic == p_b.italic) && (mipmaps == p_b.mipmaps) && (msdf == p_b.msdf) && (force_autohinter == p_b.force_autohinter) && (weight == p_b.weight) && (stretch == p_b.stretch) && (msdf_range == p_b.msdf_range) && (msdf_source_size == p_b.msdf_source_size) && (fixed_size == p_b.fixed_size) && (hinting == p_b.hinting) && (subpixel_positioning == p_b.subpixel_positioning) && (variation_coordinates == p_b.variation_coordinates) && (oversampling == p_b.oversampling) && (embolden == p_b.embolden) && (transform == p_b.transform) && (extra_spacing[SPACING_TOP] == p_b.extra_spacing[SPACING_TOP]) && (extra_spacing[SPACING_BOTTOM] == p_b.extra_spacing[SPACING_BOTTOM]) && (extra_spacing[SPACING_SPACE] == p_b.extra_spacing[SPACING_SPACE]) && (extra_spacing[SPACING_GLYPH] == p_b.extra_spacing[SPACING_GLYPH]) && (baseline_offset == p_b.baseline_offset); + return (font_name == p_b.font_name) && (antialiasing == p_b.antialiasing) && (italic == p_b.italic) && (disable_embedded_bitmaps == p_b.disable_embedded_bitmaps) && (mipmaps == p_b.mipmaps) && (msdf == p_b.msdf) && (force_autohinter == p_b.force_autohinter) && (weight == p_b.weight) && (stretch == p_b.stretch) && (msdf_range == p_b.msdf_range) && (msdf_source_size == p_b.msdf_source_size) && (fixed_size == p_b.fixed_size) && (hinting == p_b.hinting) && (subpixel_positioning == p_b.subpixel_positioning) && (variation_coordinates == p_b.variation_coordinates) && (oversampling == p_b.oversampling) && (embolden == p_b.embolden) && (transform == p_b.transform) && (extra_spacing[SPACING_TOP] == p_b.extra_spacing[SPACING_TOP]) && (extra_spacing[SPACING_BOTTOM] == p_b.extra_spacing[SPACING_BOTTOM]) && (extra_spacing[SPACING_SPACE] == p_b.extra_spacing[SPACING_SPACE]) && (extra_spacing[SPACING_GLYPH] == p_b.extra_spacing[SPACING_GLYPH]) && (baseline_offset == p_b.baseline_offset); } SystemFontKey(const String &p_font_name, bool p_italic, int p_weight, int p_stretch, RID p_font, const TextServerFallback *p_fb) { @@ -503,6 +505,7 @@ class TextServerFallback : public TextServerExtension { weight = p_weight; stretch = p_stretch; antialiasing = p_fb->_font_get_antialiasing(p_font); + disable_embedded_bitmaps = p_fb->_font_get_disable_embedded_bitmaps(p_font); mipmaps = p_fb->_font_get_generate_mipmaps(p_font); msdf = p_fb->_font_is_multichannel_signed_distance_field(p_font); msdf_range = p_fb->_font_get_msdf_pixel_range(p_font); @@ -553,7 +556,7 @@ class TextServerFallback : public TextServerExtension { hash = hash_murmur3_one_32(p_a.extra_spacing[SPACING_SPACE], hash); hash = hash_murmur3_one_32(p_a.extra_spacing[SPACING_GLYPH], hash); hash = hash_murmur3_one_double(p_a.baseline_offset, hash); - return hash_fmix32(hash_murmur3_one_32(((int)p_a.mipmaps) | ((int)p_a.msdf << 1) | ((int)p_a.italic << 2) | ((int)p_a.force_autohinter << 3) | ((int)p_a.hinting << 4) | ((int)p_a.subpixel_positioning << 8) | ((int)p_a.antialiasing << 12), hash)); + return hash_fmix32(hash_murmur3_one_32(((int)p_a.mipmaps) | ((int)p_a.msdf << 1) | ((int)p_a.italic << 2) | ((int)p_a.force_autohinter << 3) | ((int)p_a.hinting << 4) | ((int)p_a.subpixel_positioning << 8) | ((int)p_a.antialiasing << 12) | ((int)p_a.disable_embedded_bitmaps << 14), hash)); } }; mutable HashMap<SystemFontKey, SystemFontCache, SystemFontKeyHasher> system_fonts; @@ -619,6 +622,9 @@ public: MODBIND2(font_set_antialiasing, const RID &, TextServer::FontAntialiasing); MODBIND1RC(TextServer::FontAntialiasing, font_get_antialiasing, const RID &); + MODBIND2(font_set_disable_embedded_bitmaps, const RID &, bool); + MODBIND1RC(bool, font_get_disable_embedded_bitmaps, const RID &); + MODBIND2(font_set_generate_mipmaps, const RID &, bool); MODBIND1RC(bool, font_get_generate_mipmaps, const RID &); |
