LibCore+LibGfx: Move font_directories from LibCore to LibGfx

the goal is to rely on fontconfig for font directory resolution. it
doesn't seem like it would be appropritate to call to fontconfig funcs
from within the LibCore.

i'm not 100% confident that FontDatabase is the correct place.. seems
okay?
This commit is contained in:
blukai 2025-05-21 02:40:06 +02:00 committed by Andrew Kaster
commit 4b3691ff39
Notes: github-actions[bot] 2025-05-26 18:15:38 +00:00
5 changed files with 53 additions and 51 deletions

View file

@ -5,9 +5,14 @@
*/
#include <AK/FlyString.h>
#include <LibCore/StandardPaths.h>
#include <LibGfx/Font/Font.h>
#include <LibGfx/Font/FontDatabase.h>
#if defined(AK_OS_HAIKU)
# include <FindDirectory.h>
#endif
namespace Gfx {
// Key function for SystemFontProvider to emit the vtable here
@ -44,4 +49,49 @@ void FontDatabase::for_each_typeface_with_family_name(FlyString const& family_na
m_system_font_provider->for_each_typeface_with_family_name(family_name, move(callback));
}
ErrorOr<Vector<String>> FontDatabase::font_directories()
{
#if defined(AK_OS_HAIKU)
Vector<String> paths_vector;
char** paths;
size_t paths_count;
if (find_paths(B_FIND_PATH_FONTS_DIRECTORY, NULL, &paths, &paths_count) == B_OK) {
for (size_t i = 0; i < paths_count; ++i) {
StringBuilder builder;
builder.append(paths[i], strlen(paths[i]));
paths_vector.append(TRY(builder.to_string()));
}
}
return paths_vector;
#else
auto paths = Vector { {
# if defined(AK_OS_SERENITY)
"/res/fonts"_string,
# elif defined(AK_OS_MACOS)
"/System/Library/Fonts"_string,
"/Library/Fonts"_string,
TRY(String::formatted("{}/Library/Fonts"sv, Core::StandardPaths::home_directory())),
# elif defined(AK_OS_ANDROID)
// FIXME: We should be using the ASystemFontIterator NDK API here.
// There is no guarantee that this will continue to exist on future versions of Android.
"/system/fonts"_string,
# elif defined(AK_OS_WINDOWS)
TRY(String::formatted(R"({}\Fonts)"sv, getenv("WINDIR"))),
TRY(String::formatted(R"({}\Microsoft\Windows\Fonts)"sv, getenv("LOCALAPPDATA"))),
# else
TRY(String::formatted("{}/fonts", Core::StandardPaths::user_data_directory())),
TRY(String::formatted("{}/X11/fonts", Core::StandardPaths::user_data_directory())),
# endif
} };
# if !(defined(AK_OS_SERENITY) || defined(AK_OS_MACOS) || defined(AK_OS_WINDOWS))
auto data_directories = Core::StandardPaths::system_data_directories();
for (auto& data_directory : data_directories) {
paths.append(TRY(String::formatted("{}/fonts", data_directory)));
paths.append(TRY(String::formatted("{}/X11/fonts", data_directory)));
}
# endif
return paths;
#endif
}
}