diff --git a/Libraries/LibGfx/CMakeLists.txt b/Libraries/LibGfx/CMakeLists.txt index aa736e7b98d..7cd9beba6db 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 df94d269492..b8bfc71e8c3 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 00000000000..85c27dbe518 --- /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 00000000000..4b692071565 --- /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 44deb519d78..33f47516d01 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));