diff --git a/src/fontcache.cpp b/src/fontcache.cpp index 80defbd24b..93d56416ae 100644 --- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -138,50 +138,57 @@ void SetFont(FontSize fontsize, const std::string &font, uint size) #ifdef WITH_FREETYPE extern void LoadFreeTypeFont(FontSize fs); -extern void LoadFreeTypeFont(FontSize fs, const std::string &file_name, uint size); extern void UninitFreeType(); #elif defined(_WIN32) extern void LoadWin32Font(FontSize fs); -extern void LoadWin32Font(FontSize fs, const std::string &file_name, uint size); #elif defined(WITH_COCOA) extern void LoadCoreTextFont(FontSize fs); -extern void LoadCoreTextFont(FontSize fs, const std::string &file_name, uint size); #endif -static void TryLoadDefaultTrueTypeFont([[maybe_unused]] FontSize fs) -{ #if defined(WITH_FREETYPE) || defined(_WIN32) || defined(WITH_COCOA) - std::string font_name{}; +/** + * Get name of default font file for a given font size. + * @param fs Font size. + * @return Name of default font file. + */ +static std::string GetDefaultTruetypeFont(FontSize fs) +{ switch (fs) { - case FS_NORMAL: - font_name = "OpenTTD-Sans.ttf"; - break; - case FS_SMALL: - font_name = "OpenTTD-Small.ttf"; - break; - case FS_LARGE: - font_name = "OpenTTD-Serif.ttf"; - break; - case FS_MONO: - font_name = "OpenTTD-Mono.ttf"; - break; - + case FS_NORMAL: return "OpenTTD-Sans.ttf"; + case FS_SMALL: return "OpenTTD-Small.ttf"; + case FS_LARGE: return "OpenTTD-Serif.ttf"; + case FS_MONO: return "OpenTTD-Mono.ttf"; default: NOT_REACHED(); } - - /* Find font file. */ - std::string full_font = FioFindFullPath(BASESET_DIR, font_name); - if (!full_font.empty()) { - int size = FontCache::GetDefaultFontHeight(fs); -#ifdef WITH_FREETYPE - LoadFreeTypeFont(fs, full_font, size); -#elif defined(_WIN32) - LoadWin32Font(fs, full_font, size); -#elif defined(WITH_COCOA) - LoadCoreTextFont(fs, full_font, size); -#endif - } +} #endif /* defined(WITH_FREETYPE) || defined(_WIN32) || defined(WITH_COCOA) */ + +/** + * Get path of default font file for a given font size. + * @param fs Font size. + * @return Full path of default font file. + */ +static std::string GetDefaultTruetypeFontFile([[maybe_unused]] FontSize fs) +{ +#if defined(WITH_FREETYPE) || defined(_WIN32) || defined(WITH_COCOA) + /* Find font file. */ + return FioFindFullPath(BASESET_DIR, GetDefaultTruetypeFont(fs)); +#else + return {}; +#endif /* defined(WITH_FREETYPE) || defined(_WIN32) || defined(WITH_COCOA) */ +} + +/** + * Get font to use for a given font size. + * @param fs Font size. + * @return If configured, the font name to use, or the path of the default TrueType font if sprites are not preferred. + */ +std::string GetFontCacheFontName(FontSize fs) +{ + const FontCacheSubSetting *settings = GetFontCacheSubSetting(fs); + if (!settings->font.empty()) return settings->font; + if (_fcsettings.prefer_sprite) return {}; + return GetDefaultTruetypeFontFile(fs); } /** @@ -198,17 +205,13 @@ void InitFontCache(bool monospace) FontCache *fc = FontCache::Get(fs); if (fc->HasParent()) delete fc; - if (!_fcsettings.prefer_sprite && GetFontCacheSubSetting(fs)->font.empty()) { - TryLoadDefaultTrueTypeFont(fs); - } else { #ifdef WITH_FREETYPE - LoadFreeTypeFont(fs); + LoadFreeTypeFont(fs); #elif defined(_WIN32) - LoadWin32Font(fs); + LoadWin32Font(fs); #elif defined(WITH_COCOA) - LoadCoreTextFont(fs); + LoadCoreTextFont(fs); #endif - } } } diff --git a/src/fontcache.h b/src/fontcache.h index 769bc66ac7..8c0eef0f7a 100644 --- a/src/fontcache.h +++ b/src/fontcache.h @@ -224,6 +224,7 @@ inline FontCacheSubSetting *GetFontCacheSubSetting(FontSize fs) } } +std::string GetFontCacheFontName(FontSize fs); void InitFontCache(bool monospace); void UninitFontCache(); diff --git a/src/fontcache/freetypefontcache.cpp b/src/fontcache/freetypefontcache.cpp index e0fc7a2b61..7e83bbf48d 100644 --- a/src/fontcache/freetypefontcache.cpp +++ b/src/fontcache/freetypefontcache.cpp @@ -160,7 +160,8 @@ void LoadFreeTypeFont(FontSize fs) { FontCacheSubSetting *settings = GetFontCacheSubSetting(fs); - if (settings->font.empty()) return; + std::string font = GetFontCacheFontName(fs); + if (font.empty()) return; if (_library == nullptr) { if (FT_Init_FreeType(&_library) != FT_Err_Ok) { @@ -171,7 +172,7 @@ void LoadFreeTypeFont(FontSize fs) Debug(fontcache, 2, "Initialized"); } - const char *font_name = settings->font.c_str(); + const char *font_name = font.c_str(); FT_Face face = nullptr; /* If font is an absolute path to a ttf, try loading that first. */ @@ -200,34 +201,6 @@ void LoadFreeTypeFont(FontSize fs) } } -/** - * Load a TrueType font from a file. - * @param fs The font size to load. - * @param file_name Path to the font file. - * @param size Requested font size. - */ -void LoadFreeTypeFont(FontSize fs, const std::string &file_name, uint size) -{ - if (_library == nullptr) { - if (FT_Init_FreeType(&_library) != FT_Err_Ok) { - ShowInfo("Unable to initialize FreeType, using sprite fonts instead"); - return; - } - - Debug(fontcache, 2, "Initialized"); - } - - FT_Face face = nullptr; - int32_t index = 0; - FT_Error error = FT_New_Face(_library, file_name.c_str(), index, &face); - if (error == FT_Err_Ok) { - LoadFont(fs, face, file_name.c_str(), size); - } else { - FT_Done_Face(face); - } -} - - /** * Free everything that was allocated for this font cache. */ diff --git a/src/os/macosx/font_osx.cpp b/src/os/macosx/font_osx.cpp index 8d7987119a..c73a799a69 100644 --- a/src/os/macosx/font_osx.cpp +++ b/src/os/macosx/font_osx.cpp @@ -328,7 +328,8 @@ void LoadCoreTextFont(FontSize fs) { FontCacheSubSetting *settings = GetFontCacheSubSetting(fs); - if (settings->font.empty()) return; + std::string font = GetFontCacheFontName(fs); + if (font.empty()) return; CFAutoRelease font_ref; @@ -339,12 +340,12 @@ void LoadCoreTextFont(FontSize fs) if (!font_ref && MacOSVersionIsAtLeast(10, 6, 0)) { /* Might be a font file name, try load it. */ - font_ref.reset(LoadFontFromFile(settings->font)); - if (!font_ref) ShowInfo("Unable to load file '{}' for {} font, using default OS font selection instead", settings->font, FontSizeToName(fs)); + font_ref.reset(LoadFontFromFile(font)); + if (!font_ref) ShowInfo("Unable to load file '{}' for {} font, using default OS font selection instead", font, FontSizeToName(fs)); } if (!font_ref) { - CFAutoRelease name(CFStringCreateWithCString(kCFAllocatorDefault, settings->font.c_str(), kCFStringEncodingUTF8)); + CFAutoRelease name(CFStringCreateWithCString(kCFAllocatorDefault, font.c_str(), kCFStringEncodingUTF8)); /* Simply creating the font using CTFontCreateWithNameAndSize will *always* return * something, no matter the name. As such, we can't use it to check for existence. @@ -362,23 +363,9 @@ void LoadCoreTextFont(FontSize fs) } if (!font_ref) { - ShowInfo("Unable to use '{}' for {} font, using sprite font instead", settings->font, FontSizeToName(fs)); + ShowInfo("Unable to use '{}' for {} font, using sprite font instead", font, FontSizeToName(fs)); return; } new CoreTextFontCache(fs, std::move(font_ref), settings->size); } - -/** - * Load a TrueType font from a file. - * @param fs The font size to load. - * @param file_name Path to the font file. - * @param size Requested font size. - */ -void LoadCoreTextFont(FontSize fs, const std::string &file_name, uint size) -{ - CFAutoRelease font_ref{LoadFontFromFile(file_name)}; - if (font_ref) { - new CoreTextFontCache(fs, std::move(font_ref), size); - } -} diff --git a/src/os/macosx/font_osx.h b/src/os/macosx/font_osx.h index 3ef86fba99..d2ba5f3b3f 100644 --- a/src/os/macosx/font_osx.h +++ b/src/os/macosx/font_osx.h @@ -35,6 +35,5 @@ public: }; void LoadCoreTextFont(FontSize fs); -void LoadCoreTextFont(FontSize fs, const std::string &file_name, uint size); #endif /* FONT_OSX_H */ diff --git a/src/os/windows/font_win32.cpp b/src/os/windows/font_win32.cpp index 23a0be297c..1f4aa775bb 100644 --- a/src/os/windows/font_win32.cpp +++ b/src/os/windows/font_win32.cpp @@ -352,9 +352,10 @@ void LoadWin32Font(FontSize fs) { FontCacheSubSetting *settings = GetFontCacheSubSetting(fs); - if (settings->font.empty()) return; + std::string font = GetFontCacheFontName(fs); + if (font.empty()) return; - const char *font_name = settings->font.c_str(); + const char *font_name = font.c_str(); LOGFONT logfont; MemSetT(&logfont, 0); logfont.lfPitchAndFamily = fs == FS_MONO ? FIXED_PITCH : VARIABLE_PITCH; @@ -366,8 +367,8 @@ void LoadWin32Font(FontSize fs) logfont = *(const LOGFONT *)settings->os_handle; } else if (strchr(font_name, '.') != nullptr) { /* Might be a font file name, try load it. */ - if (!TryLoadFontFromFile(settings->font, logfont)) { - ShowInfo("Unable to load file '{}' for {} font, using default windows font selection instead", font_name, FontSizeToName(fs)); + if (!TryLoadFontFromFile(font, logfont)) { + ShowInfo("Unable to load file '{}' for {} font, using default windows font selection instead", font, FontSizeToName(fs)); } } @@ -378,23 +379,3 @@ void LoadWin32Font(FontSize fs) LoadWin32Font(fs, logfont, settings->size, font_name); } - -/** - * Load a TrueType font from a file. - * @param fs The font size to load. - * @param file_name Path to the font file. - * @param size Requested font size. - */ -void LoadWin32Font(FontSize fs, const std::string &file_name, uint size) -{ - LOGFONT logfont; - MemSetT(&logfont, 0); - logfont.lfPitchAndFamily = fs == FS_MONO ? FIXED_PITCH : VARIABLE_PITCH; - logfont.lfCharSet = DEFAULT_CHARSET; - logfont.lfOutPrecision = OUT_OUTLINE_PRECIS; - logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS; - - if (TryLoadFontFromFile(file_name, logfont)) { - LoadWin32Font(fs, logfont, size, file_name.c_str()); - } -} diff --git a/src/os/windows/font_win32.h b/src/os/windows/font_win32.h index b8f40ad74d..8aa0a42180 100644 --- a/src/os/windows/font_win32.h +++ b/src/os/windows/font_win32.h @@ -43,6 +43,5 @@ public: }; void LoadWin32Font(FontSize fs); -void LoadWin32Font(FontSize fs, const std::string &file_name, uint size); #endif /* FONT_WIN32_H */