From 8465559488fce68c76b265b220aed58e1c8683fc Mon Sep 17 00:00:00 2001 From: PeterN Date: Tue, 27 Jun 2023 12:30:46 +0100 Subject: [PATCH] Codechange: Pass face index as font os_handle for FreeType fonts. (#11073) This allows fallback font detection to test the specific face within the font rather instead of only the first. --- src/fontcache/freetypefontcache.cpp | 4 +++- src/os/unix/font_unix.cpp | 15 +++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/fontcache/freetypefontcache.cpp b/src/fontcache/freetypefontcache.cpp index 65b1185435..7fbf52e97c 100644 --- a/src/fontcache/freetypefontcache.cpp +++ b/src/fontcache/freetypefontcache.cpp @@ -141,7 +141,9 @@ void LoadFreeTypeFont(FontSize fs) FT_Face face = nullptr; /* If font is an absolute path to a ttf, try loading that first. */ - FT_Error error = FT_New_Face(_library, font_name, 0, &face); + int32_t index = 0; + if (settings->os_handle != nullptr) index = *static_cast(settings->os_handle); + FT_Error error = FT_New_Face(_library, font_name, index, &face); if (error != FT_Err_Ok) { /* Check if font is a relative filename in one of our search-paths. */ diff --git a/src/os/unix/font_unix.cpp b/src/os/unix/font_unix.cpp index 9b58e6d8a4..9e08aecdb7 100644 --- a/src/os/unix/font_unix.cpp +++ b/src/os/unix/font_unix.cpp @@ -111,8 +111,8 @@ bool SetFallbackFont(FontCacheSettings *settings, const std::string &language_is /* First create a pattern to match the wanted language. */ FcPattern *pat = FcNameParse((const FcChar8 *)lang.c_str()); - /* We only want to know the filename. */ - FcObjectSet *os = FcObjectSetBuild(FC_FILE, FC_SPACING, FC_SLANT, FC_WEIGHT, nullptr); + /* We only want to know these attributes. */ + FcObjectSet *os = FcObjectSetBuild(FC_FILE, FC_INDEX, FC_SPACING, FC_SLANT, FC_WEIGHT, nullptr); /* Get the list of filenames matching the wanted language. */ FcFontSet *fs = FcFontList(nullptr, pat, os); @@ -123,6 +123,7 @@ bool SetFallbackFont(FontCacheSettings *settings, const std::string &language_is if (fs != nullptr) { int best_weight = -1; const char *best_font = nullptr; + int best_index = 0; for (int i = 0; i < fs->nfont; i++) { FcPattern *font = fs->fonts[i]; @@ -146,7 +147,12 @@ bool SetFallbackFont(FontCacheSettings *settings, const std::string &language_is FcPatternGetInteger(font, FC_WEIGHT, 0, &value); if (value <= best_weight) continue; - callback->SetFontNames(settings, (const char *)file); + /* Possible match based on attributes, get index. */ + int32_t index; + res = FcPatternGetInteger(font, FC_INDEX, 0, &index); + if (res != FcResultMatch) continue; + + callback->SetFontNames(settings, (const char *)file, &index); bool missing = callback->FindMissingGlyphs(); Debug(fontcache, 1, "Font \"{}\" misses{} glyphs", (char *)file, missing ? "" : " no"); @@ -154,12 +160,13 @@ bool SetFallbackFont(FontCacheSettings *settings, const std::string &language_is if (!missing) { best_weight = value; best_font = (const char *)file; + best_index = index; } } if (best_font != nullptr) { ret = true; - callback->SetFontNames(settings, best_font); + callback->SetFontNames(settings, best_font, &best_index); InitFontCache(callback->Monospace()); }