From a4a3bed6d53b7938b8c1b4514833a5eda405b042 Mon Sep 17 00:00:00 2001 From: Mounir Tohami <53877170+WhalesState@users.noreply.github.com> Date: Mon, 2 Dec 2024 00:46:32 +0200 Subject: [PATCH] Add TextServer set/get lcd subpixel layout. --- doc/classes/FontFile.xml | 3 + doc/classes/SystemFont.xml | 3 + doc/classes/TextServer.xml | 15 ++++ doc/classes/TextServerExtension.xml | 15 ++++ .../import/dynamic_font_import_settings.cpp | 5 ++ modules/text_server_adv/text_server_adv.cpp | 75 ++++++++++--------- modules/text_server_adv/text_server_adv.h | 4 + modules/text_server_fb/text_server_fb.cpp | 70 +++++++++-------- modules/text_server_fb/text_server_fb.h | 4 + scene/resources/font.cpp | 55 ++++++++++++-- scene/resources/font.h | 10 ++- scene/theme/default_theme.cpp | 3 +- scene/theme/default_theme.h | 2 +- scene/theme/theme_db.cpp | 6 +- servers/text/text_server_extension.cpp | 13 ++++ servers/text/text_server_extension.h | 5 ++ servers/text_server.cpp | 3 + servers/text_server.h | 3 + 18 files changed, 215 insertions(+), 79 deletions(-) diff --git a/doc/classes/FontFile.xml b/doc/classes/FontFile.xml index 1b8fa0077285..12072ac56463 100644 --- a/doc/classes/FontFile.xml +++ b/doc/classes/FontFile.xml @@ -631,6 +631,9 @@ Font hinting mode. Used by dynamic fonts only. + + LCD subpixel layout used for font anti-aliasing. See [enum TextServer.FontLCDSubpixelLayout]. + The width of the range around the shape between the minimum and maximum representable signed distance. If using font outlines, [member msdf_pixel_range] must be set to at least [i]twice[/i] the size of the largest font outline. The default [member msdf_pixel_range] value of [code]16[/code] allows outline sizes up to [code]8[/code] to look correct. diff --git a/doc/classes/SystemFont.xml b/doc/classes/SystemFont.xml index 38d6e27c8565..d43a727f97ed 100644 --- a/doc/classes/SystemFont.xml +++ b/doc/classes/SystemFont.xml @@ -43,6 +43,9 @@ Font hinting mode. + + LCD subpixel layout used for font anti-aliasing. See [enum TextServer.FontLCDSubpixelLayout]. + The width of the range around the shape between the minimum and maximum representable signed distance. If using font outlines, [member msdf_pixel_range] must be set to at least [i]twice[/i] the size of the largest font outline. The default [member msdf_pixel_range] value of [code]16[/code] allows outline sizes up to [code]8[/code] to look correct. diff --git a/doc/classes/TextServer.xml b/doc/classes/TextServer.xml index 4fa9700f9cfc..be51f8df4db0 100644 --- a/doc/classes/TextServer.xml +++ b/doc/classes/TextServer.xml @@ -344,6 +344,13 @@ Returns list of language support overrides. + + + + + Returns the LCD subpixel layout used for font anti-aliasing. See [enum TextServer.FontLCDSubpixelLayout]. + + @@ -831,6 +838,14 @@ Adds override for [method font_is_language_supported]. + + + + + + Sets the LCD subpixel layout used for font anti-aliasing. See [enum TextServer.FontLCDSubpixelLayout]. + + diff --git a/doc/classes/TextServerExtension.xml b/doc/classes/TextServerExtension.xml index c148cdad528d..f12424903b1b 100644 --- a/doc/classes/TextServerExtension.xml +++ b/doc/classes/TextServerExtension.xml @@ -365,6 +365,13 @@ Returns list of language support overrides. + + + + + LCD subpixel layout used for font anti-aliasing. See [enum TextServer.FontLCDSubpixelLayout]. + + @@ -917,6 +924,14 @@ Adds override for [method _font_is_language_supported]. + + + + + + LCD subpixel layout used for font anti-aliasing. See [enum TextServer.FontLCDSubpixelLayout]. + + diff --git a/editor/import/dynamic_font_import_settings.cpp b/editor/import/dynamic_font_import_settings.cpp index b0f7e7cfb438..3627b34581ed 100644 --- a/editor/import/dynamic_font_import_settings.cpp +++ b/editor/import/dynamic_font_import_settings.cpp @@ -490,6 +490,8 @@ void DynamicFontImportSettingsDialog::_main_prop_changed(const String &p_edited_ font_preview->set_hinting((TextServer::Hinting)import_settings_data->get("hinting").operator int()); } else if (p_edited_property == "subpixel_positioning") { font_preview->set_subpixel_positioning((TextServer::SubpixelPositioning)import_settings_data->get("subpixel_positioning").operator int()); + } else if (p_edited_property == "lcd_subpixel_layout") { + font_preview->set_lcd_subpixel_layout((TextServer::FontLCDSubpixelLayout)import_settings_data->get("lcd_subpixel_layout").operator int()); } else if (p_edited_property == "oversampling") { font_preview->set_oversampling(import_settings_data->get("oversampling")); } @@ -956,6 +958,7 @@ void DynamicFontImportSettingsDialog::_re_import() { main_settings["force_autohinter"] = import_settings_data->get("force_autohinter"); main_settings["hinting"] = import_settings_data->get("hinting"); main_settings["subpixel_positioning"] = import_settings_data->get("subpixel_positioning"); + main_settings["lcd_subpixel_layout"] = import_settings_data->get("lcd_subpixel_layout"); main_settings["oversampling"] = import_settings_data->get("oversampling"); main_settings["fallbacks"] = import_settings_data->get("fallbacks"); main_settings["compress"] = import_settings_data->get("compress"); @@ -1232,6 +1235,7 @@ void DynamicFontImportSettingsDialog::open_settings(const String &p_path) { font_preview->set_force_autohinter(import_settings_data->get("force_autohinter")); font_preview->set_hinting((TextServer::Hinting)import_settings_data->get("hinting").operator int()); font_preview->set_subpixel_positioning((TextServer::SubpixelPositioning)import_settings_data->get("subpixel_positioning").operator int()); + font_preview->set_lcd_subpixel_layout((TextServer::FontLCDSubpixelLayout)import_settings_data->get("lcd_subpixel_layout").operator int()); font_preview->set_oversampling(import_settings_data->get("oversampling")); } font_preview_label->add_theme_font_override(SceneStringName(font), font_preview); @@ -1264,6 +1268,7 @@ DynamicFontImportSettingsDialog::DynamicFontImportSettingsDialog() { options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::BOOL, "force_autohinter"), false)); options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::INT, "hinting", PROPERTY_HINT_ENUM, "None,Light,Normal"), 1)); options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::INT, "subpixel_positioning", PROPERTY_HINT_ENUM, "Disabled,Auto,One Half of a Pixel,One Quarter of a Pixel"), 1)); + options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::INT, "lcd_subpixel_layout", PROPERTY_HINT_ENUM, "Disabled,Horizontal RGB,Horizontal BGR,Vertical RGB,Vertical BGR"), 1)); options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::FLOAT, "oversampling", PROPERTY_HINT_RANGE, "0,10,0.1"), 0.0)); options_general.push_back(ResourceImporter::ImportOption(PropertyInfo(Variant::NIL, "Metadata Overrides", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_GROUP), Variant())); diff --git a/modules/text_server_adv/text_server_adv.cpp b/modules/text_server_adv/text_server_adv.cpp index 499ddb703b0f..6acd2ccbc7e7 100644 --- a/modules/text_server_adv/text_server_adv.cpp +++ b/modules/text_server_adv/text_server_adv.cpp @@ -35,19 +35,15 @@ #include #include -#include #include #include #include using namespace godot; -#define GLOBAL_GET(m_var) ProjectSettings::get_singleton()->get_setting_with_override(m_var) - #elif defined(GODOT_MODULE) // Headers for building as built-in module. -#include "core/config/project_settings.h" #include "core/error/error_macros.h" #include "core/object/worker_thread_pool.h" #include "core/string/print_string.h" @@ -2215,6 +2211,27 @@ TextServer::FontAntialiasing TextServerAdvanced::_font_get_antialiasing(const RI return fd->antialiasing; } +void TextServerAdvanced::_font_set_lcd_subpixel_layout(const RID &p_font_rid, TextServer::FontLCDSubpixelLayout p_lcd_subpixel_layout) { + FontAdvanced *fd = _get_font_data(p_font_rid); + ERR_FAIL_NULL(fd); + + MutexLock lock(fd->mutex); + if (fd->lcd_subpixel_layout != p_lcd_subpixel_layout) { + if (fd->antialiasing == TextServer::FONT_ANTIALIASING_LCD) { + _font_clear_cache(fd); + } + fd->lcd_subpixel_layout = p_lcd_subpixel_layout; + } +} + +TextServer::FontLCDSubpixelLayout TextServerAdvanced::_font_get_lcd_subpixel_layout(const RID &p_font_rid) const { + FontAdvanced *fd = _get_font_data(p_font_rid); + ERR_FAIL_NULL_V(fd, TextServer::FontLCDSubpixelLayout::FONT_LCD_SUBPIXEL_LAYOUT_NONE); + + MutexLock lock(fd->mutex); + return fd->lcd_subpixel_layout; +} + 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); @@ -2944,9 +2961,8 @@ Vector2 TextServerAdvanced::_font_get_glyph_advance(const RID &p_font_rid, int64 int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { - mod = (layout << 24); + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + mod = (fd->lcd_subpixel_layout << 24); } } @@ -3003,9 +3019,8 @@ Vector2 TextServerAdvanced::_font_get_glyph_offset(const RID &p_font_rid, const int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { - mod = (layout << 24); + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + mod = (fd->lcd_subpixel_layout << 24); } } @@ -3054,9 +3069,8 @@ Vector2 TextServerAdvanced::_font_get_glyph_size(const RID &p_font_rid, const Ve int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { - mod = (layout << 24); + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + mod = (fd->lcd_subpixel_layout << 24); } } @@ -3105,9 +3119,8 @@ Rect2 TextServerAdvanced::_font_get_glyph_uv_rect(const RID &p_font_rid, const V int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { - mod = (layout << 24); + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + mod = (fd->lcd_subpixel_layout << 24); } } @@ -3145,9 +3158,8 @@ int64_t TextServerAdvanced::_font_get_glyph_texture_idx(const RID &p_font_rid, c int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { - mod = (layout << 24); + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + mod = (fd->lcd_subpixel_layout << 24); } } @@ -3185,9 +3197,8 @@ RID TextServerAdvanced::_font_get_glyph_texture_rid(const RID &p_font_rid, const int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { - mod = (layout << 24); + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + mod = (fd->lcd_subpixel_layout << 24); } } @@ -3232,9 +3243,8 @@ Size2 TextServerAdvanced::_font_get_glyph_texture_size(const RID &p_font_rid, co int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { - mod = (layout << 24); + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + mod = (fd->lcd_subpixel_layout << 24); } } @@ -3612,10 +3622,9 @@ void TextServerAdvanced::_font_draw_glyph(const RID &p_font_rid, const RID &p_ca if (!fd->msdf && fd->cache[size]->face) { // LCD layout, bits 24, 25, 26 if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { lcd_aa = true; - index = index | (layout << 24); + index = index | (fd->lcd_subpixel_layout << 24); } } // Subpixel X-shift, bits 27, 28 @@ -3720,10 +3729,9 @@ void TextServerAdvanced::_font_draw_glyph_outline(const RID &p_font_rid, const R if (!fd->msdf && fd->cache[size]->face) { // LCD layout, bits 24, 25, 26 if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { lcd_aa = true; - index = index | (layout << 24); + index = index | (fd->lcd_subpixel_layout << 24); } } // Subpixel X-shift, bits 27, 28 @@ -6037,9 +6045,8 @@ void TextServerAdvanced::_shape_run(ShapedTextDataAdvanced *p_sd, int64_t p_star int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { - mod = (layout << 24); + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + mod = (fd->lcd_subpixel_layout << 24); } } diff --git a/modules/text_server_adv/text_server_adv.h b/modules/text_server_adv/text_server_adv.h index 92bdb93bcf17..a3eed6710a5a 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; + TextServer::FontLCDSubpixelLayout lcd_subpixel_layout = TextServer::FontLCDSubpixelLayout::FONT_LCD_SUBPIXEL_LAYOUT_NONE; bool disable_embedded_bitmaps = true; bool mipmaps = false; bool msdf = false; @@ -755,6 +756,9 @@ class TextServerAdvanced : public TextServerExtension { MODBIND2(font_set_antialiasing, const RID &, TextServer::FontAntialiasing); MODBIND1RC(TextServer::FontAntialiasing, font_get_antialiasing, const RID &); + MODBIND2(font_set_lcd_subpixel_layout, const RID &, TextServer::FontLCDSubpixelLayout); + MODBIND1RC(TextServer::FontLCDSubpixelLayout, font_get_lcd_subpixel_layout, const RID &); + MODBIND2(font_set_disable_embedded_bitmaps, const RID &, bool); MODBIND1RC(bool, font_get_disable_embedded_bitmaps, const RID &); diff --git a/modules/text_server_fb/text_server_fb.cpp b/modules/text_server_fb/text_server_fb.cpp index b45c004011a1..b390aa79aa04 100644 --- a/modules/text_server_fb/text_server_fb.cpp +++ b/modules/text_server_fb/text_server_fb.cpp @@ -35,7 +35,6 @@ #include #include -#include #include #include #include @@ -44,12 +43,9 @@ using namespace godot; -#define GLOBAL_GET(m_var) ProjectSettings::get_singleton()->get_setting_with_override(m_var) - #elif defined(GODOT_MODULE) // Headers for building as built-in module. -#include "core/config/project_settings.h" #include "core/error/error_macros.h" #include "core/string/print_string.h" #include "core/string/translation.h" @@ -1222,6 +1218,27 @@ TextServer::FontAntialiasing TextServerFallback::_font_get_antialiasing(const RI return fd->antialiasing; } +void TextServerFallback::_font_set_lcd_subpixel_layout(const RID &p_font_rid, TextServer::FontLCDSubpixelLayout p_lcd_subpixel_layout) { + FontFallback *fd = _get_font_data(p_font_rid); + ERR_FAIL_NULL(fd); + + MutexLock lock(fd->mutex); + if (fd->lcd_subpixel_layout != p_lcd_subpixel_layout) { + if (fd->antialiasing == TextServer::FONT_ANTIALIASING_LCD) { + _font_clear_cache(fd); + } + fd->lcd_subpixel_layout = p_lcd_subpixel_layout; + } +} + +TextServer::FontLCDSubpixelLayout TextServerFallback::_font_get_lcd_subpixel_layout(const RID &p_font_rid) const { + FontFallback *fd = _get_font_data(p_font_rid); + ERR_FAIL_NULL_V(fd, TextServer::FontLCDSubpixelLayout::FONT_LCD_SUBPIXEL_LAYOUT_NONE); + + MutexLock lock(fd->mutex); + return fd->lcd_subpixel_layout; +} + 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); @@ -1938,9 +1955,8 @@ Vector2 TextServerFallback::_font_get_glyph_advance(const RID &p_font_rid, int64 int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { - mod = (layout << 24); + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + mod = (fd->lcd_subpixel_layout << 24); } } @@ -1997,9 +2013,8 @@ Vector2 TextServerFallback::_font_get_glyph_offset(const RID &p_font_rid, const int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { - mod = (layout << 24); + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + mod = (fd->lcd_subpixel_layout << 24); } } @@ -2048,9 +2063,8 @@ Vector2 TextServerFallback::_font_get_glyph_size(const RID &p_font_rid, const Ve int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { - mod = (layout << 24); + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + mod = (fd->lcd_subpixel_layout << 24); } } @@ -2099,9 +2113,8 @@ Rect2 TextServerFallback::_font_get_glyph_uv_rect(const RID &p_font_rid, const V int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { - mod = (layout << 24); + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + mod = (fd->lcd_subpixel_layout << 24); } } @@ -2139,9 +2152,8 @@ int64_t TextServerFallback::_font_get_glyph_texture_idx(const RID &p_font_rid, c int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { - mod = (layout << 24); + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + mod = (fd->lcd_subpixel_layout << 24); } } @@ -2179,9 +2191,8 @@ RID TextServerFallback::_font_get_glyph_texture_rid(const RID &p_font_rid, const int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { - mod = (layout << 24); + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + mod = (fd->lcd_subpixel_layout << 24); } } @@ -2226,9 +2237,8 @@ Size2 TextServerFallback::_font_get_glyph_texture_size(const RID &p_font_rid, co int mod = 0; if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { - mod = (layout << 24); + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + mod = (fd->lcd_subpixel_layout << 24); } } @@ -2561,10 +2571,9 @@ void TextServerFallback::_font_draw_glyph(const RID &p_font_rid, const RID &p_ca if (!fd->msdf && fd->cache[size]->face) { // LCD layout, bits 24, 25, 26 if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { lcd_aa = true; - index = index | (layout << 24); + index = index | (fd->lcd_subpixel_layout << 24); } } // Subpixel X-shift, bits 27, 28 @@ -2669,10 +2678,9 @@ void TextServerFallback::_font_draw_glyph_outline(const RID &p_font_rid, const R if (!fd->msdf && fd->cache[size]->face) { // LCD layout, bits 24, 25, 26 if (fd->antialiasing == FONT_ANTIALIASING_LCD) { - TextServer::FontLCDSubpixelLayout layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_GET("gui/theme/lcd_subpixel_layout"); - if (layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { + if (fd->lcd_subpixel_layout != FONT_LCD_SUBPIXEL_LAYOUT_NONE) { lcd_aa = true; - index = index | (layout << 24); + index = index | (fd->lcd_subpixel_layout << 24); } } // Subpixel X-shift, bits 27, 28 diff --git a/modules/text_server_fb/text_server_fb.h b/modules/text_server_fb/text_server_fb.h index 2235247b31a0..4bb21db3f056 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; + TextServer::FontLCDSubpixelLayout lcd_subpixel_layout = TextServer::FontLCDSubpixelLayout::FONT_LCD_SUBPIXEL_LAYOUT_NONE; bool disable_embedded_bitmaps = true; bool mipmaps = false; bool msdf = false; @@ -623,6 +624,9 @@ class TextServerFallback : public TextServerExtension { MODBIND2(font_set_antialiasing, const RID &, TextServer::FontAntialiasing); MODBIND1RC(TextServer::FontAntialiasing, font_get_antialiasing, const RID &); + MODBIND2(font_set_lcd_subpixel_layout, const RID &, TextServer::FontLCDSubpixelLayout); + MODBIND1RC(TextServer::FontLCDSubpixelLayout, font_get_lcd_subpixel_layout, const RID &); + MODBIND2(font_set_disable_embedded_bitmaps, const RID &, bool); MODBIND1RC(bool, font_get_disable_embedded_bitmaps, const RID &); diff --git a/scene/resources/font.cpp b/scene/resources/font.cpp index 6b65ea4cfb97..3d9344a23661 100644 --- a/scene/resources/font.cpp +++ b/scene/resources/font.cpp @@ -605,6 +605,7 @@ _FORCE_INLINE_ void FontFile::_ensure_rid(int p_cache_index, int p_make_linked_f TS->font_set_allow_system_fallback(cache[p_cache_index], allow_system_fallback); TS->font_set_hinting(cache[p_cache_index], hinting); TS->font_set_subpixel_positioning(cache[p_cache_index], subpixel_positioning); + TS->font_set_lcd_subpixel_layout(cache[p_cache_index], lcd_subpixel_layout); TS->font_set_oversampling(cache[p_cache_index], oversampling); } } @@ -934,6 +935,9 @@ void FontFile::_bind_methods() { ClassDB::bind_method(D_METHOD("set_subpixel_positioning", "subpixel_positioning"), &FontFile::set_subpixel_positioning); ClassDB::bind_method(D_METHOD("get_subpixel_positioning"), &FontFile::get_subpixel_positioning); + ClassDB::bind_method(D_METHOD("set_lcd_subpixel_layout", "subpixel_layout"), &FontFile::set_lcd_subpixel_layout); + ClassDB::bind_method(D_METHOD("get_lcd_subpixel_layout"), &FontFile::get_lcd_subpixel_layout); + ClassDB::bind_method(D_METHOD("set_oversampling", "oversampling"), &FontFile::set_oversampling); ClassDB::bind_method(D_METHOD("get_oversampling"), &FontFile::get_oversampling); @@ -1044,6 +1048,7 @@ void FontFile::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "font_stretch", PROPERTY_HINT_RANGE, "50,200,25", PROPERTY_USAGE_STORAGE), "set_font_stretch", "get_font_stretch"); ADD_PROPERTY(PropertyInfo(Variant::INT, "subpixel_positioning", PROPERTY_HINT_ENUM, "Disabled,Auto,One Half of a Pixel,One Quarter of a Pixel", PROPERTY_USAGE_STORAGE), "set_subpixel_positioning", "get_subpixel_positioning"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "lcd_subpixel_layout", PROPERTY_HINT_ENUM, "Disabled,Horizontal RGB,Horizontal BGR,Vertical RGB,Vertical BGR", PROPERTY_USAGE_STORAGE), "set_lcd_subpixel_layout", "get_lcd_subpixel_layout"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "multichannel_signed_distance_field", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_multichannel_signed_distance_field", "is_multichannel_signed_distance_field"); ADD_PROPERTY(PropertyInfo(Variant::INT, "msdf_pixel_range", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_msdf_pixel_range", "get_msdf_pixel_range"); ADD_PROPERTY(PropertyInfo(Variant::INT, "msdf_size", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "set_msdf_size", "get_msdf_size"); @@ -1411,6 +1416,7 @@ void FontFile::reset_state() { allow_system_fallback = true; hinting = TextServer::HINTING_LIGHT; subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_DISABLED; + lcd_subpixel_layout = TextServer::FONT_LCD_SUBPIXEL_LAYOUT_NONE; msdf_pixel_range = 14; msdf_size = 128; fixed_size = 0; @@ -2281,9 +2287,9 @@ TextServer::Hinting FontFile::get_hinting() const { return hinting; } -void FontFile::set_subpixel_positioning(TextServer::SubpixelPositioning p_subpixel) { - if (subpixel_positioning != p_subpixel) { - subpixel_positioning = p_subpixel; +void FontFile::set_subpixel_positioning(TextServer::SubpixelPositioning p_subpixel_positioning) { + if (subpixel_positioning != p_subpixel_positioning) { + subpixel_positioning = p_subpixel_positioning; for (int i = 0; i < cache.size(); i++) { _ensure_rid(i); TS->font_set_subpixel_positioning(cache[i], subpixel_positioning); @@ -2296,6 +2302,21 @@ TextServer::SubpixelPositioning FontFile::get_subpixel_positioning() const { return subpixel_positioning; } +void FontFile::set_lcd_subpixel_layout(TextServer::FontLCDSubpixelLayout p_subpixel_layout) { + if (lcd_subpixel_layout != p_subpixel_layout) { + lcd_subpixel_layout = p_subpixel_layout; + for (int i = 0; i < cache.size(); i++) { + _ensure_rid(i); + TS->font_set_lcd_subpixel_layout(cache[i], lcd_subpixel_layout); + } + emit_changed(); + } +} + +TextServer::FontLCDSubpixelLayout FontFile::get_lcd_subpixel_layout() const { + return lcd_subpixel_layout; +} + void FontFile::set_oversampling(real_t p_oversampling) { if (oversampling != p_oversampling) { oversampling = p_oversampling; @@ -3085,6 +3106,9 @@ void SystemFont::_bind_methods() { ClassDB::bind_method(D_METHOD("set_subpixel_positioning", "subpixel_positioning"), &SystemFont::set_subpixel_positioning); ClassDB::bind_method(D_METHOD("get_subpixel_positioning"), &SystemFont::get_subpixel_positioning); + ClassDB::bind_method(D_METHOD("set_lcd_subpixel_layout", "subpixel_layout"), &SystemFont::set_lcd_subpixel_layout); + ClassDB::bind_method(D_METHOD("get_lcd_subpixel_layout"), &SystemFont::get_lcd_subpixel_layout); + ClassDB::bind_method(D_METHOD("set_multichannel_signed_distance_field", "msdf"), &SystemFont::set_multichannel_signed_distance_field); ClassDB::bind_method(D_METHOD("is_multichannel_signed_distance_field"), &SystemFont::is_multichannel_signed_distance_field); @@ -3109,13 +3133,14 @@ void SystemFont::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "font_italic"), "set_font_italic", "get_font_italic"); ADD_PROPERTY(PropertyInfo(Variant::INT, "font_weight", PROPERTY_HINT_RANGE, "100,999,25"), "set_font_weight", "get_font_weight"); ADD_PROPERTY(PropertyInfo(Variant::INT, "font_stretch", PROPERTY_HINT_RANGE, "50,200,25"), "set_font_stretch", "get_font_stretch"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "antialiasing", PROPERTY_HINT_ENUM, "None,Grayscale,LCD Subpixel", PROPERTY_USAGE_STORAGE), "set_antialiasing", "get_antialiasing"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "antialiasing", PROPERTY_HINT_ENUM, "None,Grayscale,LCD Subpixel"), "set_antialiasing", "get_antialiasing"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "generate_mipmaps"), "set_generate_mipmaps", "get_generate_mipmaps"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "disable_embedded_bitmaps"), "set_disable_embedded_bitmaps", "get_disable_embedded_bitmaps"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "allow_system_fallback"), "set_allow_system_fallback", "is_allow_system_fallback"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "force_autohinter"), "set_force_autohinter", "is_force_autohinter"); ADD_PROPERTY(PropertyInfo(Variant::INT, "hinting", PROPERTY_HINT_ENUM, "None,Light,Normal"), "set_hinting", "get_hinting"); ADD_PROPERTY(PropertyInfo(Variant::INT, "subpixel_positioning", PROPERTY_HINT_ENUM, "Disabled,Auto,One Half of a Pixel,One Quarter of a Pixel"), "set_subpixel_positioning", "get_subpixel_positioning"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "lcd_subpixel_layout", PROPERTY_HINT_ENUM, "Disabled,Horizontal RGB,Horizontal BGR,Vertical RGB,Vertical BGR"), "set_lcd_subpixel_layout", "get_lcd_subpixel_layout"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "multichannel_signed_distance_field"), "set_multichannel_signed_distance_field", "is_multichannel_signed_distance_field"); ADD_PROPERTY(PropertyInfo(Variant::INT, "msdf_pixel_range"), "set_msdf_pixel_range", "get_msdf_pixel_range"); ADD_PROPERTY(PropertyInfo(Variant::INT, "msdf_size"), "set_msdf_size", "get_msdf_size"); @@ -3220,6 +3245,7 @@ void SystemFont::_update_base_font() { file->set_allow_system_fallback(allow_system_fallback); file->set_hinting(hinting); file->set_subpixel_positioning(subpixel_positioning); + file->set_lcd_subpixel_layout(lcd_subpixel_layout); file->set_multichannel_signed_distance_field(msdf); file->set_msdf_pixel_range(msdf_pixel_range); file->set_msdf_size(msdf_size); @@ -3263,6 +3289,7 @@ void SystemFont::reset_state() { allow_system_fallback = true; hinting = TextServer::HINTING_LIGHT; subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_DISABLED; + lcd_subpixel_layout = TextServer::FONT_LCD_SUBPIXEL_LAYOUT_NONE; oversampling = 0.f; msdf = false; @@ -3402,9 +3429,9 @@ TextServer::Hinting SystemFont::get_hinting() const { return hinting; } -void SystemFont::set_subpixel_positioning(TextServer::SubpixelPositioning p_subpixel) { - if (subpixel_positioning != p_subpixel) { - subpixel_positioning = p_subpixel; +void SystemFont::set_subpixel_positioning(TextServer::SubpixelPositioning p_subpixel_positioning) { + if (subpixel_positioning != p_subpixel_positioning) { + subpixel_positioning = p_subpixel_positioning; if (base_font.is_valid()) { base_font->set_subpixel_positioning(subpixel_positioning); } @@ -3416,6 +3443,20 @@ TextServer::SubpixelPositioning SystemFont::get_subpixel_positioning() const { return subpixel_positioning; } +void SystemFont::set_lcd_subpixel_layout(TextServer::FontLCDSubpixelLayout p_subpixel_layout) { + if (lcd_subpixel_layout != p_subpixel_layout) { + lcd_subpixel_layout = p_subpixel_layout; + if (base_font.is_valid()) { + base_font->set_lcd_subpixel_layout(lcd_subpixel_layout); + } + emit_changed(); + } +} + +TextServer::FontLCDSubpixelLayout SystemFont::get_lcd_subpixel_layout() const { + return lcd_subpixel_layout; +} + void SystemFont::set_multichannel_signed_distance_field(bool p_msdf) { if (msdf != p_msdf) { msdf = p_msdf; diff --git a/scene/resources/font.h b/scene/resources/font.h index 68c391c35e4e..3a8949b4174a 100644 --- a/scene/resources/font.h +++ b/scene/resources/font.h @@ -197,6 +197,7 @@ class FontFile : public Font { bool allow_system_fallback = true; TextServer::Hinting hinting = TextServer::HINTING_LIGHT; TextServer::SubpixelPositioning subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_AUTO; + TextServer::FontLCDSubpixelLayout lcd_subpixel_layout = TextServer::FONT_LCD_SUBPIXEL_LAYOUT_HRGB; real_t oversampling = 0.f; #ifndef DISABLE_DEPRECATED @@ -280,6 +281,9 @@ class FontFile : public Font { virtual void set_subpixel_positioning(TextServer::SubpixelPositioning p_subpixel); virtual TextServer::SubpixelPositioning get_subpixel_positioning() const; + virtual void set_lcd_subpixel_layout(TextServer::FontLCDSubpixelLayout p_subpixel_layout); + virtual TextServer::FontLCDSubpixelLayout get_lcd_subpixel_layout() const; + virtual void set_oversampling(real_t p_oversampling); virtual real_t get_oversampling() const; @@ -480,6 +484,7 @@ class SystemFont : public Font { bool allow_system_fallback = true; TextServer::Hinting hinting = TextServer::HINTING_LIGHT; TextServer::SubpixelPositioning subpixel_positioning = TextServer::SUBPIXEL_POSITIONING_AUTO; + TextServer::FontLCDSubpixelLayout lcd_subpixel_layout = TextServer::FONT_LCD_SUBPIXEL_LAYOUT_HRGB; real_t oversampling = 0.f; bool msdf = false; int msdf_pixel_range = 16; @@ -515,9 +520,12 @@ class SystemFont : public Font { virtual void set_hinting(TextServer::Hinting p_hinting); virtual TextServer::Hinting get_hinting() const; - virtual void set_subpixel_positioning(TextServer::SubpixelPositioning p_subpixel); + virtual void set_subpixel_positioning(TextServer::SubpixelPositioning p_subpixel_positioning); virtual TextServer::SubpixelPositioning get_subpixel_positioning() const; + virtual void set_lcd_subpixel_layout(TextServer::FontLCDSubpixelLayout p_subpixel_layout); + virtual TextServer::FontLCDSubpixelLayout get_lcd_subpixel_layout() const; + virtual void set_oversampling(real_t p_oversampling); virtual real_t get_oversampling() const; diff --git a/scene/theme/default_theme.cpp b/scene/theme/default_theme.cpp index 11549a54de5a..d1de19a90c9a 100644 --- a/scene/theme/default_theme.cpp +++ b/scene/theme/default_theme.cpp @@ -1250,7 +1250,7 @@ void fill_default_theme(Ref &theme, const Ref &default_font, const default_style = make_flat_stylebox(Color(1, 0.365, 0.365), 4, 4, 4, 4, 0, false, 2); } -void make_default_theme(float p_scale, Ref p_font, TextServer::SubpixelPositioning p_font_subpixel, TextServer::Hinting p_font_hinting, TextServer::FontAntialiasing p_font_antialiasing, bool p_font_msdf, bool p_font_generate_mipmaps) { +void make_default_theme(float p_scale, Ref p_font, TextServer::SubpixelPositioning p_font_subpixel, TextServer::Hinting p_font_hinting, TextServer::FontAntialiasing p_font_antialiasing, TextServer::FontLCDSubpixelLayout p_lcd_subpixel_layout, bool p_font_msdf, bool p_font_generate_mipmaps) { Ref t; t.instantiate(); @@ -1275,6 +1275,7 @@ void make_default_theme(float p_scale, Ref p_font, TextServer::SubpixelPos dynamic_font->set_subpixel_positioning(p_font_subpixel); dynamic_font->set_hinting(p_font_hinting); dynamic_font->set_antialiasing(p_font_antialiasing); + dynamic_font->set_lcd_subpixel_layout(p_lcd_subpixel_layout); dynamic_font->set_multichannel_signed_distance_field(p_font_msdf); dynamic_font->set_generate_mipmaps(p_font_generate_mipmaps); diff --git a/scene/theme/default_theme.h b/scene/theme/default_theme.h index 55fc32a3d3f1..50723a5ddefd 100644 --- a/scene/theme/default_theme.h +++ b/scene/theme/default_theme.h @@ -34,6 +34,6 @@ #include "scene/resources/theme.h" void fill_default_theme(Ref &theme, const Ref &default_font, const Ref &bold_font, const Ref &bold_italics_font, const Ref &italics_font, Ref &default_icon, Ref &default_style, float p_scale); -void make_default_theme(float p_scale, Ref p_font, TextServer::SubpixelPositioning p_font_subpixel = TextServer::SUBPIXEL_POSITIONING_AUTO, TextServer::Hinting p_font_hinting = TextServer::HINTING_LIGHT, TextServer::FontAntialiasing p_font_antialiased = TextServer::FONT_ANTIALIASING_GRAY, bool p_font_msdf = false, bool p_font_generate_mipmaps = false); +void make_default_theme(float p_scale, Ref p_font, TextServer::SubpixelPositioning p_font_subpixel = TextServer::SUBPIXEL_POSITIONING_AUTO, TextServer::Hinting p_font_hinting = TextServer::HINTING_LIGHT, TextServer::FontAntialiasing p_font_antialiased = TextServer::FONT_ANTIALIASING_GRAY, TextServer::FontLCDSubpixelLayout p_lcd_subpixel_layout = TextServer::FONT_LCD_SUBPIXEL_LAYOUT_HRGB, bool p_font_msdf = false, bool p_font_generate_mipmaps = false); #endif // DEFAULT_THEME_H diff --git a/scene/theme/theme_db.cpp b/scene/theme/theme_db.cpp index 7249fd7ba82b..1a487fe3e356 100644 --- a/scene/theme/theme_db.cpp +++ b/scene/theme/theme_db.cpp @@ -55,13 +55,11 @@ void ThemeDB::initialize_theme() { TextServer::FontAntialiasing font_antialiasing = (TextServer::FontAntialiasing)(int)GLOBAL_DEF_RST(PropertyInfo(Variant::INT, "gui/theme/default_font_antialiasing", PROPERTY_HINT_ENUM, "None,Grayscale,LCD Subpixel", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED), 1); TextServer::Hinting font_hinting = (TextServer::Hinting)(int)GLOBAL_DEF_RST(PropertyInfo(Variant::INT, "gui/theme/default_font_hinting", PROPERTY_HINT_ENUM, "None,Light,Normal", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED), TextServer::HINTING_LIGHT); TextServer::SubpixelPositioning font_subpixel_positioning = (TextServer::SubpixelPositioning)(int)GLOBAL_DEF_RST(PropertyInfo(Variant::INT, "gui/theme/default_font_subpixel_positioning", PROPERTY_HINT_ENUM, "Disabled,Auto,One Half of a Pixel,One Quarter of a Pixel", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED), TextServer::SUBPIXEL_POSITIONING_AUTO); + TextServer::FontLCDSubpixelLayout lcd_subpixel_layout = (TextServer::FontLCDSubpixelLayout)(int)GLOBAL_DEF_RST(PropertyInfo(Variant::INT, "gui/theme/lcd_subpixel_layout", PROPERTY_HINT_ENUM, "Disabled,Horizontal RGB,Horizontal BGR,Vertical RGB,Vertical BGR"), 1); const bool font_msdf = GLOBAL_DEF_RST("gui/theme/default_font_multichannel_signed_distance_field", false); const bool font_generate_mipmaps = GLOBAL_DEF_RST("gui/theme/default_font_generate_mipmaps", false); - GLOBAL_DEF_RST(PropertyInfo(Variant::INT, "gui/theme/lcd_subpixel_layout", PROPERTY_HINT_ENUM, "Disabled,Horizontal RGB,Horizontal BGR,Vertical RGB,Vertical BGR"), 1); - ProjectSettings::get_singleton()->set_restart_if_changed("gui/theme/lcd_subpixel_layout", false); - // Attempt to load custom project theme and font. if (!project_theme_path.is_empty()) { @@ -86,7 +84,7 @@ void ThemeDB::initialize_theme() { // Always generate the default theme to serve as a fallback for all required theme definitions. if (RenderingServer::get_singleton()) { - make_default_theme(default_theme_scale, project_font, font_subpixel_positioning, font_hinting, font_antialiasing, font_msdf, font_generate_mipmaps); + make_default_theme(default_theme_scale, project_font, font_subpixel_positioning, font_hinting, font_antialiasing, lcd_subpixel_layout, font_msdf, font_generate_mipmaps); } _init_default_theme_context(); diff --git a/servers/text/text_server_extension.cpp b/servers/text/text_server_extension.cpp index 509d49a1e42a..6a56d21b6eb6 100644 --- a/servers/text/text_server_extension.cpp +++ b/servers/text/text_server_extension.cpp @@ -80,6 +80,9 @@ void TextServerExtension::_bind_methods() { GDVIRTUAL_BIND(_font_set_antialiasing, "font_rid", "antialiasing"); GDVIRTUAL_BIND(_font_get_antialiasing, "font_rid"); + GDVIRTUAL_BIND(_font_set_lcd_subpixel_layout, "font_rid", "subpixel_layout") + GDVIRTUAL_BIND(_font_get_lcd_subpixel_layout, "font_rid") + GDVIRTUAL_BIND(_font_set_disable_embedded_bitmaps, "font_rid", "disable_embedded_bitmaps"); GDVIRTUAL_BIND(_font_get_disable_embedded_bitmaps, "font_rid"); @@ -529,6 +532,16 @@ TextServer::FontAntialiasing TextServerExtension::font_get_antialiasing(const RI return ret; } +void TextServerExtension::font_set_lcd_subpixel_layout(const RID &p_font_rid, TextServer::FontLCDSubpixelLayout p_lcd_subpixel_layout) { + GDVIRTUAL_CALL(_font_set_lcd_subpixel_layout, p_font_rid, p_lcd_subpixel_layout); +} + +TextServer::FontLCDSubpixelLayout TextServerExtension::font_get_lcd_subpixel_layout(const RID &p_font_rid) const { + TextServer::FontLCDSubpixelLayout ret = TextServer::FontLCDSubpixelLayout::FONT_LCD_SUBPIXEL_LAYOUT_NONE; + GDVIRTUAL_CALL(_font_get_lcd_subpixel_layout, p_font_rid, ret); + return ret; +} + void TextServerExtension::font_set_disable_embedded_bitmaps(const RID &p_font_rid, bool p_disable_embedded_bitmaps) { GDVIRTUAL_CALL(_font_set_disable_embedded_bitmaps, p_font_rid, p_disable_embedded_bitmaps); } diff --git a/servers/text/text_server_extension.h b/servers/text/text_server_extension.h index 16a03b65928b..7d59be65af03 100644 --- a/servers/text/text_server_extension.h +++ b/servers/text/text_server_extension.h @@ -128,6 +128,11 @@ class TextServerExtension : public TextServer { GDVIRTUAL2(_font_set_antialiasing, RID, TextServer::FontAntialiasing); GDVIRTUAL1RC(TextServer::FontAntialiasing, _font_get_antialiasing, RID); + virtual void font_set_lcd_subpixel_layout(const RID &p_font_rid, TextServer::FontLCDSubpixelLayout p_lcd_subpixel_layout) override; + virtual TextServer::FontLCDSubpixelLayout font_get_lcd_subpixel_layout(const RID &p_font_rid) const override; + GDVIRTUAL2(_font_set_lcd_subpixel_layout, RID, TextServer::FontLCDSubpixelLayout); + GDVIRTUAL1RC(TextServer::FontLCDSubpixelLayout, _font_get_lcd_subpixel_layout, RID); + virtual void font_set_disable_embedded_bitmaps(const RID &p_font_rid, bool p_disable_embedded_bitmaps) override; virtual bool font_get_disable_embedded_bitmaps(const RID &p_font_rid) const override; GDVIRTUAL2(_font_set_disable_embedded_bitmaps, RID, bool); diff --git a/servers/text_server.cpp b/servers/text_server.cpp index 7b1e37a6cc3d..a526481282ec 100644 --- a/servers/text_server.cpp +++ b/servers/text_server.cpp @@ -236,6 +236,9 @@ void TextServer::_bind_methods() { ClassDB::bind_method(D_METHOD("font_set_antialiasing", "font_rid", "antialiasing"), &TextServer::font_set_antialiasing); ClassDB::bind_method(D_METHOD("font_get_antialiasing", "font_rid"), &TextServer::font_get_antialiasing); + ClassDB::bind_method(D_METHOD("font_set_lcd_subpixel_layout", "font_rid", "lcd_subpixel_layout"), &TextServer::font_set_lcd_subpixel_layout); + ClassDB::bind_method(D_METHOD("font_get_lcd_subpixel_layout", "font_rid"), &TextServer::font_get_lcd_subpixel_layout); + ClassDB::bind_method(D_METHOD("font_set_disable_embedded_bitmaps", "font_rid", "disable_embedded_bitmaps"), &TextServer::font_set_disable_embedded_bitmaps); ClassDB::bind_method(D_METHOD("font_get_disable_embedded_bitmaps", "font_rid"), &TextServer::font_get_disable_embedded_bitmaps); diff --git a/servers/text_server.h b/servers/text_server.h index a77953e6f2a5..0ff1153e9365 100644 --- a/servers/text_server.h +++ b/servers/text_server.h @@ -281,6 +281,9 @@ class TextServer : public RefCounted { virtual void font_set_antialiasing(const RID &p_font_rid, FontAntialiasing p_antialiasing) = 0; virtual FontAntialiasing font_get_antialiasing(const RID &p_font_rid) const = 0; + virtual void font_set_lcd_subpixel_layout(const RID &p_font_rid, FontLCDSubpixelLayout p_lcd_subpixel_layout) = 0; + virtual FontLCDSubpixelLayout font_get_lcd_subpixel_layout(const RID &p_font_rid) const = 0; + virtual void font_set_disable_embedded_bitmaps(const RID &p_font_rid, bool p_disable_embedded_bitmaps) = 0; virtual bool font_get_disable_embedded_bitmaps(const RID &p_font_rid) const = 0;