From 82b8cd105c36796e2ea9c5c7544d43fc46b76285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pa=CC=84vels=20Nadtoc=CC=8Cajevs?= <7645683+bruvzg@users.noreply.github.com> Date: Sun, 7 Sep 2025 21:00:55 +0300 Subject: [PATCH] [TextServer] Check if texture cache is valid when loading glyph. --- modules/text_server_adv/text_server_adv.cpp | 18 ++++++++++++++++-- modules/text_server_fb/text_server_fb.cpp | 18 ++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/modules/text_server_adv/text_server_adv.cpp b/modules/text_server_adv/text_server_adv.cpp index 567bd73d3f7..3de4d9d12d9 100644 --- a/modules/text_server_adv/text_server_adv.cpp +++ b/modules/text_server_adv/text_server_adv.cpp @@ -1222,8 +1222,22 @@ bool TextServerAdvanced::_ensure_glyph(FontAdvanced *p_font_data, const Vector2i HashMap::Iterator E = fd->glyph_map.find(p_glyph); if (E) { - r_glyph = E->value; - return E->value.found; + bool tx_valid = true; + if (E->value.texture_idx >= 0) { + if (E->value.texture_idx < fd->textures.size()) { + tx_valid = fd->textures[E->value.texture_idx].image.is_valid(); + } else { + tx_valid = false; + } + } + if (tx_valid) { + r_glyph = E->value; + return E->value.found; +#ifdef DEBUG_ENABLED + } else { + WARN_PRINT(vformat("Invalid texture cache for glyph %x in font %s, glyph will be re-rendered. Re-import this font to regenerate textures.", glyph_index, p_font_data->font_name)); +#endif + } } if (glyph_index == 0) { // Non graphical or invalid glyph, do not render. diff --git a/modules/text_server_fb/text_server_fb.cpp b/modules/text_server_fb/text_server_fb.cpp index 466141f1fb2..916738abbb1 100644 --- a/modules/text_server_fb/text_server_fb.cpp +++ b/modules/text_server_fb/text_server_fb.cpp @@ -643,8 +643,22 @@ bool TextServerFallback::_ensure_glyph(FontFallback *p_font_data, const Vector2i HashMap::Iterator E = fd->glyph_map.find(p_glyph); if (E) { - r_glyph = E->value; - return E->value.found; + bool tx_valid = true; + if (E->value.texture_idx >= 0) { + if (E->value.texture_idx < fd->textures.size()) { + tx_valid = fd->textures[E->value.texture_idx].image.is_valid(); + } else { + tx_valid = false; + } + } + if (tx_valid) { + r_glyph = E->value; + return E->value.found; +#ifdef DEBUG_ENABLED + } else { + WARN_PRINT(vformat("Invalid texture cache for glyph %x in font %s, glyph will be re-rendered. Re-import this font to regenerate textures.", glyph_index, p_font_data->font_name)); +#endif + } } if (glyph_index == 0) { // Non graphical or invalid glyph, do not render.