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