Windows: Load fonts.conf that ships w/ Tux Paint

Plus more comments & FIXMEs!
This commit is contained in:
Bill Kendrick 2025-02-22 02:52:05 -08:00
parent 96b91b9fba
commit 653f1a20c5
2 changed files with 33 additions and 10 deletions

View file

@ -34,11 +34,15 @@ https://tuxpaint.org/
+ WIP Checking for fonts in any locations specified by "<dir>"
entries found in system-wide and user-level FontConfig config files.
This allows more fonts, and user-specific fonts, to be found & loaded.
- TODO - Looks in $FONTCONFIG_PATH/fonts.conf on macOS/iOS,
`/boot/system/settings/fonts/fonts.conf` on Haiku, otherwise
the Un*x-specific `/etc/fonts/fonts.conf` and
`~/.config/fontconfig/fonts.conf`. Should look in the correct
places on other platforms.
- It looks for:
- FIXME: <system fonts.conf> (Windows)
- `./etc/fonts/fonts.conf` (ships with Tux Paint) (Windows)
- `$FONTCONFIG_PATH/fonts.conf` (macOS/iOS, Linux/Unix)
- or `/etc/fonts/fonts.conf` (Linux/Unix)
- `$XDG_CONFIG_HOME/fontconfig/fonts.conf` (Linux/Unix)
- or `$HOME/.config/fontconfig/fonts.conf`
- `/boot/system/settings/fonts/fonts.conf` (Haiku)
- FIXME: ??? (ships with Tux Paint) (macOS)
- Note: This adds a build dependency on `libxml-2.0`.
Bill Kendrick <bill@newbreedsoftware.com>
h/t Mark Kim & Luc Schrijvers

View file

@ -1103,24 +1103,34 @@ char * * malloc_fontconfig_config_paths(int num_to_malloc, int * num_actually_ma
/* See what dirs fontconfig configuration files point to,
and try loading fonts from those locations */
/* FIXME: We do not currently understand "<dir prefix=...>" -bjk 2025.02.22 */
#if defined(__APPLE__)
/* Apple: Look for fonts.conf in $FONTCONFIG_PATH */
fontconfig_config_paths = malloc_fontconfig_config_paths(1, &num_fontconfig_config_paths);
if (fontconfig_config_paths != NULL)
{
/* Apple: Look for fonts.conf in $FONTCONFIG_PATH */
fontconfig_config_paths[0] = malloc(1024);
snprintf(fontconfig_config_paths[0], 1024, "%s/fonts.conf", getenv("FONTCONFIG_PATH"));
/* FIXME: Apple: Look for the fonts.conf that we ship with Tux Paint for macOS */
}
#elif defined(__HAIKU__)
/* Haiku: Look for fonts.conf in a known system directory */
fontconfig_config_paths = malloc_fontconfig_config_paths(1, &num_fontconfig_config_paths);
if (fontconfig_config_paths != NULL)
{
/* Haiku: Look for fonts.conf in a known system directory */
fontconfig_config_paths[0] = malloc(1024);
snprintf(fontconfig_config_paths[0], 1024, "/boot/system/settings/fonts/fonts.conf");
}
#elif defined(WIN32)
fontconfig_config_paths = malloc_fontconfig_config_paths(1 /* FIXME */, &num_fontconfig_config_paths);
if (fontconfig_config_paths != NULL)
{
/* FIXME: Windows: Look for fonts.conf ??? in some system directory/ies ??? */
/* Windows: Look for the fonts.conf that we ship with Tux Paint for Windows */
fontconfig_config_paths[0 /* FIXME */] = malloc(1024);
snprintf(fontconfig_config_paths[0 /* FIXME */], 1024, "etc/fonts/fonts.conf");
}
#else
/* Others [e.g. Linux]: Look for fonts.conf in $FONTCONFIG_PATH (fallback to "/etc/fonts")
and $XDG_CONFIG_HOME (fallback to "$HOME/.config") */
@ -1167,7 +1177,7 @@ char * * malloc_fontconfig_config_paths(int num_to_malloc, int * num_actually_ma
if (config_home != NULL)
{
fontconfig_config_paths[1] = malloc(1024);
snprintf(fontconfig_config_paths[1], 1024, "%s/.config/fontconfig/fonts.conf", config_home);
snprintf(fontconfig_config_paths[1], 1024, "%s/fontconfig/fonts.conf", config_home);
free(config_home);
}
else
@ -1215,6 +1225,15 @@ char * * malloc_fontconfig_config_paths(int num_to_malloc, int * num_actually_ma
xmlChar * path;
char * path_str;
/* FIXME: We do not currently understand "<dir prefix=...>" -bjk 2025.02.22
(prefix may be one of "cwd"/"default", "xdg", or "relative";
see https://www.freedesktop.org/software/fontconfig/fontconfig-user.html */
/* Note: As we already look for both system and user fonts on Windows,
we'll just ignore "WINDOWSUSERFONTDIR" and "WINDOWSFONTDIR" magic paths;
also ignoring "APPSHAREFONTDIR" and "CUSTOMFONTDIR".
See https://gitlab.freedesktop.org/fontconfig/fontconfig/-/blob/main/src/fcxml.c */
path = xmlNodeGetContent(cur);
if (path != NULL)