From 542c61397cc3ad6a56e70221a7a0901bb755a8bd Mon Sep 17 00:00:00 2001 From: rubidium Date: Sun, 20 Nov 2011 08:08:13 +0000 Subject: (svn r23271) -Codechange: don't repeatedly initialise and free the freetype library --- src/fontcache.cpp | 65 +++++++++++++++++++++++++++++++------------------------ src/fontcache.h | 6 ++--- src/openttd.cpp | 2 ++ src/strings.cpp | 4 ---- 4 files changed, 41 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/fontcache.cpp b/src/fontcache.cpp index ec63b1614..a86792db0 100644 --- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -23,6 +23,14 @@ static const int ASCII_LETTERSTART = 32; ///< First printable ASCII letter. /** Semi-constant for the height of the different sizes of fonts. */ int _font_height[FS_END]; +/** Reset the font sizes to the defaults of the sprite based fonts. */ +void ResetFontSizes() +{ + _font_height[FS_SMALL] = 6; + _font_height[FS_NORMAL] = 10; + _font_height[FS_LARGE] = 18; +} + #ifdef WITH_FREETYPE #include #include FT_FREETYPE_H @@ -809,21 +817,45 @@ static void LoadFreeTypeFont(const char *font_name, FT_Face *face, const char *t } +static void ResetGlyphCache(); + +/** + * Unload a face and set it to NULL. + * @param face the face to unload + */ +static void UnloadFace(FT_Face *face) +{ + if (*face == NULL) return; + + FT_Done_Face(*face); + *face = NULL; +} + +/** + * (Re)initialize the freetype related things, i.e. load the non-sprite fonts. + */ void InitFreeType() { ResetFontSizes(); + ResetGlyphCache(); + + UnloadFace(&_face_small); + UnloadFace(&_face_medium); + UnloadFace(&_face_large); if (StrEmpty(_freetype.small_font) && StrEmpty(_freetype.medium_font) && StrEmpty(_freetype.large_font)) { DEBUG(freetype, 1, "No font faces specified, using sprite fonts instead"); return; } - if (FT_Init_FreeType(&_library) != FT_Err_Ok) { - ShowInfoF("Unable to initialize FreeType, using sprite fonts instead"); - return; - } + if (_library == NULL) { + if (FT_Init_FreeType(&_library) != FT_Err_Ok) { + ShowInfoF("Unable to initialize FreeType, using sprite fonts instead"); + return; + } - DEBUG(freetype, 2, "Initialized"); + DEBUG(freetype, 2, "Initialized"); + } /* Load each font */ LoadFreeTypeFont(_freetype.small_font, &_face_small, "small"); @@ -842,26 +874,11 @@ void InitFreeType() } } -static void ResetGlyphCache(); - -/** - * Unload a face and set it to NULL. - * @param face the face to unload - */ -static void UnloadFace(FT_Face *face) -{ - if (*face == NULL) return; - - FT_Done_Face(*face); - *face = NULL; -} - /** * Free everything allocated w.r.t. fonts. */ void UninitFreeType() { - ResetFontSizes(); ResetGlyphCache(); UnloadFace(&_face_small); @@ -1109,14 +1126,6 @@ uint GetGlyphWidth(FontSize size, WChar key) #endif /* WITH_FREETYPE */ -/** Reset the font sizes to the defaults of the sprite based fonts. */ -void ResetFontSizes() -{ - _font_height[FS_SMALL] = 6; - _font_height[FS_NORMAL] = 10; - _font_height[FS_LARGE] = 18; -} - /* Sprite based glyph mapping */ #include "table/unicode.h" diff --git a/src/fontcache.h b/src/fontcache.h index 3445a09ce..a3cceace1 100644 --- a/src/fontcache.h +++ b/src/fontcache.h @@ -23,8 +23,6 @@ void SetUnicodeGlyph(FontSize size, uint32 key, SpriteID sprite); /** Initialize the glyph map */ void InitializeUnicodeGlyphMap(); -void ResetFontSizes(); - #ifdef WITH_FREETYPE struct FreeTypeSettings { @@ -62,8 +60,8 @@ bool SetFallbackFont(FreeTypeSettings *settings, const char *language_isocode, i #else /* Stub for initializiation */ -static inline void InitFreeType() { ResetFontSizes(); } -static inline void UninitFreeType() { ResetFontSizes(); } +static inline void InitFreeType() { extern void ResetFontSizes(); ResetFontSizes(); } +static inline void UninitFreeType() {} /** Get the Sprite for a glyph */ static inline const Sprite *GetGlyph(FontSize size, uint32 key) diff --git a/src/openttd.cpp b/src/openttd.cpp index c9dbb6d82..28fb91d7a 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -303,6 +303,8 @@ static void ShutdownGame() /* Close all and any open filehandles */ FioCloseAll(); + + UninitFreeType(); } /** diff --git a/src/strings.cpp b/src/strings.cpp index cfa38bf3f..3054dcdaf 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -1750,10 +1750,7 @@ const char *GetCurrentLanguageIsoCode() */ bool MissingGlyphSearcher::FindMissingGlyphs(const char **str) { -#ifdef WITH_FREETYPE - UninitFreeType(); InitFreeType(); -#endif const Sprite *question_mark[FS_END]; for (FontSize size = FS_BEGIN; size < FS_END; size++) { @@ -1856,7 +1853,6 @@ void CheckForMissingGlyphsInLoadedLanguagePack(bool base_font) /* Our fallback font does miss characters too, so keep the * user chosen font as that is more likely to be any good than * the wild guess we made */ - UninitFreeType(); InitFreeType(); } } -- cgit v1.2.3-54-g00ecf