Changeset - r27657:0b6cf1e99420
[Not reviewed]
master
0 2 0
PeterN - 13 months ago 2023-06-27 11:30:46
peter1138@openttd.org
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.
2 files changed with 14 insertions and 5 deletions:
0 comments (0 inline, 0 general)
src/fontcache/freetypefontcache.cpp
Show inline comments
 
@@ -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<const int32_t *>(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. */
src/os/unix/font_unix.cpp
Show inline comments
 
@@ -111,8 +111,8 @@ bool SetFallbackFont(FontCacheSettings *
 

	
 
	/* 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 *
 
	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 *
 
			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 *
 
			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());
 
		}
 

	
0 comments (0 inline, 0 general)