Mercurial > hg > openttd
changeset 18429:39887e0daae5 draft
(svn r23271) -Codechange: don't repeatedly initialise and free the freetype library
author | rubidium <rubidium@openttd.org> |
---|---|
date | Sun, 20 Nov 2011 08:08:13 +0000 |
parents | 188e971c2781 |
children | c537badd5588 |
files | src/fontcache.cpp src/fontcache.h src/openttd.cpp src/strings.cpp |
diffstat | 4 files changed, 41 insertions(+), 36 deletions(-) [+] |
line wrap: on
line diff
--- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -23,6 +23,14 @@ /** 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 <ft2build.h> #include FT_FREETYPE_H @@ -809,22 +817,46 @@ } +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"); LoadFreeTypeFont(_freetype.medium_font, &_face_medium, "medium"); @@ -842,26 +874,11 @@ } } -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 @@ #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"
--- a/src/fontcache.h +++ b/src/fontcache.h @@ -23,8 +23,6 @@ /** Initialize the glyph map */ void InitializeUnicodeGlyphMap(); -void ResetFontSizes(); - #ifdef WITH_FREETYPE struct FreeTypeSettings { @@ -62,8 +60,8 @@ #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)
--- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -303,6 +303,8 @@ /* Close all and any open filehandles */ FioCloseAll(); + + UninitFreeType(); } /**
--- a/src/strings.cpp +++ b/src/strings.cpp @@ -1750,10 +1750,7 @@ */ 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 @@ /* 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(); } }