summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/fontcache.cpp65
-rw-r--r--src/fontcache.h6
-rw-r--r--src/openttd.cpp2
-rw-r--r--src/strings.cpp4
4 files changed, 41 insertions, 36 deletions
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 <ft2build.h>
#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();
}
}