From 738dd2fd101ee0d0aa32314ed5bc4529abc6017a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pa=CC=84vels=20Nadtoc=CC=8Cajevs?= <7645683+bruvzg@users.noreply.github.com> Date: Thu, 31 Jul 2025 09:40:10 +0300 Subject: [PATCH] Use non-MSDF fallback for MSDF fonts if fallback is a color or non-scalable font. --- modules/text_server_adv/text_server_adv.cpp | 17 ++++++++++++++++- modules/text_server_fb/text_server_fb.cpp | 17 ++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/modules/text_server_adv/text_server_adv.cpp b/modules/text_server_adv/text_server_adv.cpp index 1e0ad96bcb..2ceac08cff 100644 --- a/modules/text_server_adv/text_server_adv.cpp +++ b/modules/text_server_adv/text_server_adv.cpp @@ -5710,10 +5710,25 @@ RID TextServerAdvanced::_find_sys_font_for_text(const RID &p_fdef, const String } } + bool fb_use_msdf = key.msdf; + if (fb_use_msdf) { + FontAdvanced *fd = _get_font_data(sysf.rid); + if (fd) { + MutexLock lock(fd->mutex); + Vector2i size = _get_size(fd, 16); + FontForSizeAdvanced *ffsd = nullptr; + if (_ensure_cache_for_size(fd, size, ffsd)) { + if (ffsd && (FT_HAS_COLOR(ffsd->face) || !FT_IS_SCALABLE(ffsd->face))) { + fb_use_msdf = false; + } + } + } + } + _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_multichannel_signed_distance_field(sysf.rid, fb_use_msdf); _font_set_msdf_pixel_range(sysf.rid, key.msdf_range); _font_set_msdf_size(sysf.rid, key.msdf_source_size); _font_set_fixed_size(sysf.rid, key.fixed_size); diff --git a/modules/text_server_fb/text_server_fb.cpp b/modules/text_server_fb/text_server_fb.cpp index 29aca7168a..cef9835538 100644 --- a/modules/text_server_fb/text_server_fb.cpp +++ b/modules/text_server_fb/text_server_fb.cpp @@ -4461,10 +4461,25 @@ RID TextServerFallback::_find_sys_font_for_text(const RID &p_fdef, const String } } + bool fb_use_msdf = key.msdf; + if (fb_use_msdf) { + FontFallback *fd = _get_font_data(sysf.rid); + if (fd) { + MutexLock lock(fd->mutex); + Vector2i size = _get_size(fd, 16); + FontForSizeFallback *ffsd = nullptr; + if (_ensure_cache_for_size(fd, size, ffsd)) { + if (ffsd && (FT_HAS_COLOR(ffsd->face) || !FT_IS_SCALABLE(ffsd->face))) { + fb_use_msdf = false; + } + } + } + } + _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_multichannel_signed_distance_field(sysf.rid, fb_use_msdf); _font_set_msdf_pixel_range(sysf.rid, key.msdf_range); _font_set_msdf_size(sysf.rid, key.msdf_source_size); _font_set_fixed_size(sysf.rid, key.fixed_size);