diff --git a/scene/resources/font.cpp b/scene/resources/font.cpp index 37d9d577220..104187775d6 100644 --- a/scene/resources/font.cpp +++ b/scene/resources/font.cpp @@ -149,6 +149,25 @@ bool Font::_is_cyclic(const Ref &p_f, int p_depth) const { return false; } +bool Font::_is_base_cyclic(const Ref &p_f, int p_depth) const { + ERR_FAIL_COND_V(p_depth > MAX_FALLBACK_DEPTH, true); + if (p_f.is_null()) { + return false; + } + if (p_f == this) { + return true; + } + Ref fv = p_f; + if (fv.is_valid()) { + return _is_base_cyclic(fv->get_base_font(), p_depth + 1); + } + Ref fs = p_f; + if (fs.is_valid()) { + return _is_base_cyclic(fs->get_base_font(), p_depth + 1); + } + return false; +} + void Font::reset_state() { _invalidate_rids(); } @@ -2910,7 +2929,7 @@ Ref FontVariation::_get_base_font_or_default() const { } Ref f = theme->get_font(theme_name, E); - if (f == this) { + if (_is_base_cyclic(f, 0)) { continue; } if (f.is_valid()) { @@ -2922,7 +2941,7 @@ Ref FontVariation::_get_base_font_or_default() const { } Ref f = global_context->get_fallback_theme()->get_font(theme_name, StringName()); - if (f != this) { + if (!_is_base_cyclic(f, 0)) { if (f.is_valid()) { theme_font = f; theme_font->connect_changed(callable_mp(reinterpret_cast(const_cast(this)), &Font::_invalidate_rids), CONNECT_REFERENCE_COUNTED); @@ -3273,7 +3292,7 @@ Ref SystemFont::_get_base_font_or_default() const { } Ref f = theme->get_font(theme_name, E); - if (f == this) { + if (_is_base_cyclic(f, 0)) { continue; } if (f.is_valid()) { @@ -3285,7 +3304,7 @@ Ref SystemFont::_get_base_font_or_default() const { } Ref f = global_context->get_fallback_theme()->get_font(theme_name, StringName()); - if (f != this) { + if (!_is_base_cyclic(f, 0)) { if (f.is_valid()) { theme_font = f; theme_font->connect_changed(callable_mp(reinterpret_cast(const_cast(this)), &Font::_invalidate_rids), CONNECT_REFERENCE_COUNTED); diff --git a/scene/resources/font.h b/scene/resources/font.h index 1878539a3ff..68c391c35e4 100644 --- a/scene/resources/font.h +++ b/scene/resources/font.h @@ -99,8 +99,6 @@ protected: virtual void _update_rids_fb(const Ref &p_f, int p_depth) const; virtual void _update_rids() const; - virtual bool _is_cyclic(const Ref &p_f, int p_depth) const; - virtual void reset_state() override; #ifndef DISABLE_DEPRECATED @@ -110,6 +108,8 @@ protected: #endif public: + virtual bool _is_cyclic(const Ref &p_f, int p_depth) const; + virtual bool _is_base_cyclic(const Ref &p_f, int p_depth) const; virtual void _invalidate_rids(); static constexpr int DEFAULT_FONT_SIZE = 16; @@ -494,6 +494,7 @@ protected: virtual void reset_state() override; public: + virtual Ref get_base_font() const { return base_font; } virtual Ref _get_base_font_or_default() const; virtual void set_antialiasing(TextServer::FontAntialiasing p_antialiasing);