From eb54676e0f8590369caffd1a8fa87708ff511a19 Mon Sep 17 00:00:00 2001 From: bruvzg <7645683+bruvzg@users.noreply.github.com> Date: Wed, 8 Dec 2021 11:19:31 +0200 Subject: [PATCH] Add DynamicFontData oversampling override property. --- doc/classes/DynamicFontData.xml | 3 +++ scene/resources/dynamic_font.cpp | 27 +++++++++++++++++++++++++-- scene/resources/dynamic_font.h | 4 ++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/doc/classes/DynamicFontData.xml b/doc/classes/DynamicFontData.xml index 666be90e30c..69cc4f6420f 100644 --- a/doc/classes/DynamicFontData.xml +++ b/doc/classes/DynamicFontData.xml @@ -21,6 +21,9 @@ The font hinting mode used by FreeType. See [enum Hinting] for options. + + If set to a value greater than [code]0.0[/code], it will override default font oversampling, ignoring [member SceneTree.use_font_oversampling] value and viewport stretch mode. + diff --git a/scene/resources/dynamic_font.cpp b/scene/resources/dynamic_font.cpp index b0fda110ee7..cc59ff3f22c 100644 --- a/scene/resources/dynamic_font.cpp +++ b/scene/resources/dynamic_font.cpp @@ -55,6 +55,7 @@ Ref DynamicFontData::_get_dynamic_font_at_size(CacheID p_cach dfas.instance(); dfas->font = Ref(this); + dfas->oversampling = (override_oversampling > 0) ? override_oversampling : DynamicFontAtSize::font_oversampling; size_cache[p_cache_id] = dfas.ptr(); dfas->id = p_cache_id; @@ -80,6 +81,19 @@ void DynamicFontData::set_force_autohinter(bool p_force) { force_autohinter = p_force; } +float DynamicFontData::get_override_oversampling() const { + return override_oversampling; +} + +void DynamicFontData::set_override_oversampling(float p_oversampling) { + if (override_oversampling == p_oversampling) { + return; + } + + override_oversampling = p_oversampling; + DynamicFont::update_oversampling(); +} + void DynamicFontData::_bind_methods() { ClassDB::bind_method(D_METHOD("set_antialiased", "antialiased"), &DynamicFontData::set_antialiased); ClassDB::bind_method(D_METHOD("is_antialiased"), &DynamicFontData::is_antialiased); @@ -88,8 +102,12 @@ void DynamicFontData::_bind_methods() { ClassDB::bind_method(D_METHOD("set_hinting", "mode"), &DynamicFontData::set_hinting); ClassDB::bind_method(D_METHOD("get_hinting"), &DynamicFontData::get_hinting); + ClassDB::bind_method(D_METHOD("get_override_oversampling"), &DynamicFontData::get_override_oversampling); + ClassDB::bind_method(D_METHOD("set_override_oversampling", "oversampling"), &DynamicFontData::set_override_oversampling); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "antialiased"), "set_antialiased", "is_antialiased"); ADD_PROPERTY(PropertyInfo(Variant::INT, "hinting", PROPERTY_HINT_ENUM, "None,Light,Normal"), "set_hinting", "get_hinting"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "override_oversampling"), "set_override_oversampling", "get_override_oversampling"); BIND_ENUM_CONSTANT(HINTING_NONE); BIND_ENUM_CONSTANT(HINTING_LIGHT); @@ -105,6 +123,7 @@ DynamicFontData::DynamicFontData() { hinting = DynamicFontData::HINTING_NORMAL; font_mem = nullptr; font_mem_size = 0; + override_oversampling = 0.0; } DynamicFontData::~DynamicFontData() { @@ -662,14 +681,18 @@ void DynamicFontAtSize::_update_char(int32_t p_char) { } void DynamicFontAtSize::update_oversampling() { - if (oversampling == font_oversampling || !valid) { + if (!valid) { + return; + } + float new_oversampling = (font.is_valid() && font->override_oversampling > 0) ? font->override_oversampling : font_oversampling; + if (oversampling == new_oversampling) { return; } FT_Done_FreeType(library); textures.clear(); char_map.clear(); - oversampling = font_oversampling; + oversampling = new_oversampling; valid = false; _load(); } diff --git a/scene/resources/dynamic_font.h b/scene/resources/dynamic_font.h index cbce68ce938..257ea5b3e99 100644 --- a/scene/resources/dynamic_font.h +++ b/scene/resources/dynamic_font.h @@ -85,6 +85,7 @@ private: bool force_autohinter; Hinting hinting; Vector _fontdata; + float override_oversampling; String font_path; Map size_cache; @@ -104,6 +105,9 @@ public: String get_font_path() const; void set_force_autohinter(bool p_force); + float get_override_oversampling() const; + void set_override_oversampling(float p_oversampling); + DynamicFontData(); ~DynamicFontData(); };