From e356a4bd01fb2d7baebbc64a36fb04b1e2f1d200 Mon Sep 17 00:00:00 2001 From: blukai <20866892+blukai@users.noreply.github.com> Date: Wed, 21 May 2025 02:55:15 +0200 Subject: [PATCH] LibGfx: Rely on fontconfig(if enabled) for font directory resolution this commit also introduces GlobalFontConfig class that is now responsible for fontconfig initialization. it seems sane, even thought FcInit's docs state that if the default configuration has already been loaded, this routine does nothing. --- Libraries/LibGfx/CMakeLists.txt | 4 +++ Libraries/LibGfx/Font/FontDatabase.cpp | 15 +++++++- Libraries/LibGfx/Font/GlobalFontConfig.cpp | 38 +++++++++++++++++++++ Libraries/LibGfx/Font/GlobalFontConfig.h | 28 +++++++++++++++ Libraries/LibWebView/Plugins/FontPlugin.cpp | 11 ++---- 5 files changed, 86 insertions(+), 10 deletions(-) create mode 100644 Libraries/LibGfx/Font/GlobalFontConfig.cpp create mode 100644 Libraries/LibGfx/Font/GlobalFontConfig.h diff --git a/Libraries/LibGfx/CMakeLists.txt b/Libraries/LibGfx/CMakeLists.txt index aa736e7b98..7cd9beba6d 100644 --- a/Libraries/LibGfx/CMakeLists.txt +++ b/Libraries/LibGfx/CMakeLists.txt @@ -72,6 +72,10 @@ if (HAS_VULKAN) list(APPEND SOURCES VulkanContext.cpp) endif() +if (HAS_FONTCONFIG) + list(APPEND SOURCES Font/GlobalFontConfig.cpp) +endif() + serenity_lib(LibGfx gfx) target_link_libraries(LibGfx PRIVATE LibCompress LibCore LibCrypto LibFileSystem LibRIFF LibTextCodec LibIPC LibUnicode LibURL) diff --git a/Libraries/LibGfx/Font/FontDatabase.cpp b/Libraries/LibGfx/Font/FontDatabase.cpp index df94d26949..b8bfc71e8c 100644 --- a/Libraries/LibGfx/Font/FontDatabase.cpp +++ b/Libraries/LibGfx/Font/FontDatabase.cpp @@ -13,6 +13,10 @@ # include #endif +#ifdef USE_FONTCONFIG +# include +#endif + namespace Gfx { // Key function for SystemFontProvider to emit the vtable here @@ -51,7 +55,16 @@ void FontDatabase::for_each_typeface_with_family_name(FlyString const& family_na ErrorOr> FontDatabase::font_directories() { -#if defined(AK_OS_HAIKU) +#if defined(USE_FONTCONFIG) + Vector paths; + FcConfig* config = Gfx::GlobalFontConfig::the().get(); + FcStrList* dirs = FcConfigGetFontDirs(config); + while (FcChar8* dir = FcStrListNext(dirs)) { + char const* dir_cstring = reinterpret_cast(dir); + paths.append(TRY(String::from_utf8(StringView { dir_cstring, strlen(dir_cstring) }))); + } + return paths; +#elif defined(AK_OS_HAIKU) Vector paths_vector; char** paths; size_t paths_count; diff --git a/Libraries/LibGfx/Font/GlobalFontConfig.cpp b/Libraries/LibGfx/Font/GlobalFontConfig.cpp new file mode 100644 index 0000000000..85c27dbe51 --- /dev/null +++ b/Libraries/LibGfx/Font/GlobalFontConfig.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2025, blukai + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Gfx { + +GlobalFontConfig::GlobalFontConfig() +{ + FcBool inited = FcInit(); + VERIFY(inited); + + m_config = FcConfigGetCurrent(); + FcConfigReference(m_config); +} + +GlobalFontConfig::~GlobalFontConfig() +{ + FcConfigDestroy(m_config); +} + +GlobalFontConfig& GlobalFontConfig::the() +{ + static GlobalFontConfig s_the; + return s_the; +} + +FcConfig* GlobalFontConfig::get() +{ + return m_config; +} + +} diff --git a/Libraries/LibGfx/Font/GlobalFontConfig.h b/Libraries/LibGfx/Font/GlobalFontConfig.h new file mode 100644 index 0000000000..4b69207156 --- /dev/null +++ b/Libraries/LibGfx/Font/GlobalFontConfig.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2025, blukai + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Gfx { + +class GlobalFontConfig { +public: + static GlobalFontConfig& the(); + FcConfig* get(); + +private: + GlobalFontConfig(); + ~GlobalFontConfig(); + + GlobalFontConfig(GlobalFontConfig const&) = delete; + GlobalFontConfig& operator=(GlobalFontConfig const&) = delete; + + FcConfig* m_config; +}; + +} diff --git a/Libraries/LibWebView/Plugins/FontPlugin.cpp b/Libraries/LibWebView/Plugins/FontPlugin.cpp index 44deb519d7..33f47516d0 100644 --- a/Libraries/LibWebView/Plugins/FontPlugin.cpp +++ b/Libraries/LibWebView/Plugins/FontPlugin.cpp @@ -16,7 +16,7 @@ #include #ifdef USE_FONTCONFIG -# include +# include #endif namespace WebView { @@ -24,13 +24,6 @@ namespace WebView { FontPlugin::FontPlugin(bool is_layout_test_mode, Gfx::SystemFontProvider* font_provider) : m_is_layout_test_mode(is_layout_test_mode) { -#ifdef USE_FONTCONFIG - { - auto fontconfig_initialized = FcInit(); - VERIFY(fontconfig_initialized); - } -#endif - if (!font_provider) font_provider = &static_cast(Gfx::FontDatabase::the().install_system_font_provider(make())); if (is(*font_provider)) { @@ -114,7 +107,7 @@ static Optional query_fontconfig_for_generic_family(Web::Platform::Gener VERIFY_NOT_REACHED(); } - auto* config = FcConfigGetCurrent(); + auto* config = Gfx::GlobalFontConfig::the().get(); VERIFY(config); FcPattern* pattern = FcNameParse(reinterpret_cast(pattern_string));