Changeset - r18419:79e272adb960
[Not reviewed]
master
0 4 0
rubidium - 13 years ago 2011-11-20 08:08:13
rubidium@openttd.org
(svn r23271) -Codechange: don't repeatedly initialise and free the freetype library
4 files changed with 41 insertions and 36 deletions:
0 comments (0 inline, 0 general)
src/fontcache.cpp
Show inline comments
 
@@ -23,6 +23,14 @@ static const int ASCII_LETTERSTART = 32;
 
/** 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 LoadFreeTypeFont(const char 
 
}
 

	
 

	
 
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 @@ 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 
 

	
 
#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"
src/fontcache.h
Show inline comments
 
@@ -23,8 +23,6 @@ void SetUnicodeGlyph(FontSize size, uint
 
/** Initialize the glyph map */
 
void InitializeUnicodeGlyphMap();
 

	
 
void ResetFontSizes();
 

	
 
#ifdef WITH_FREETYPE
 

	
 
struct FreeTypeSettings {
 
@@ -62,8 +60,8 @@ bool SetFallbackFont(FreeTypeSettings *s
 
#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)
src/openttd.cpp
Show inline comments
 
@@ -303,6 +303,8 @@ static void ShutdownGame()
 

	
 
	/* Close all and any open filehandles */
 
	FioCloseAll();
 

	
 
	UninitFreeType();
 
}
 

	
 
/**
src/strings.cpp
Show inline comments
 
@@ -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 CheckForMissingGlyphsInLoadedLangua
 
			/* 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();
 
		}
 
	}
0 comments (0 inline, 0 general)