changeset 13574:2bef074a26bf draft

(svn r18096) -Fix (r5079/r7158??): Use free type ascender/descender metrics to position font offset correctly.
author peter1138 <peter1138@openttd.org>
date Sun, 15 Nov 2009 14:39:37 +0000
parents 1def3f539a9b
children b229beb1618e
files src/fontcache.cpp
diffstat 1 files changed, 21 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/fontcache.cpp
+++ b/src/fontcache.cpp
@@ -36,6 +36,7 @@
 static FT_Face _face_small = NULL;
 static FT_Face _face_medium = NULL;
 static FT_Face _face_large = NULL;
+static int _ascender[FS_END];
 
 FreeTypeSettings _freetype;
 
@@ -707,6 +708,22 @@
 bool SetFallbackFont(FreeTypeSettings *settings, const char *language_isocode, int winlangid, const char *str) { return false; }
 #endif /* WITH_FONTCONFIG */
 
+static void SetFontGeometry(FT_Face face, FontSize size, int pixels)
+{
+	FT_Set_Pixel_Sizes(face, 0, pixels);
+
+	if (FT_IS_SCALABLE(face)) {
+		int asc = face->ascender * pixels / face->units_per_EM;
+		int dec = face->descender * pixels / face->units_per_EM;
+
+		_ascender[size] = asc;
+		_font_height[size] = asc - dec;
+	} else {
+		_ascender[size] = pixels;
+		_font_height[size] = pixels;
+	}
+}
+
 /**
  * Loads the freetype font.
  * First type to load the fontname as if it were a path. If that fails,
@@ -781,16 +798,13 @@
 
 	/* Set each font size */
 	if (_face_small != NULL) {
-		FT_Set_Pixel_Sizes(_face_small, 0, _freetype.small_size);
-		_font_height[FS_SMALL] = _freetype.small_size;
+		SetFontGeometry(_face_small, FS_SMALL, _freetype.small_size);
 	}
 	if (_face_medium != NULL) {
-		FT_Set_Pixel_Sizes(_face_medium, 0, _freetype.medium_size);
-		_font_height[FS_NORMAL] = _freetype.medium_size;
+		SetFontGeometry(_face_medium, FS_NORMAL, _freetype.medium_size);
 	}
 	if (_face_large != NULL) {
-		FT_Set_Pixel_Sizes(_face_large, 0, _freetype.large_size);
-		_font_height[FS_LARGE] = _freetype.large_size;
+		SetFontGeometry(_face_large, FS_LARGE, _freetype.large_size);
 	}
 }
 
@@ -934,7 +948,6 @@
 	int height;
 	int x;
 	int y;
-	int y_adj;
 
 	assert(IsPrintable(key));
 
@@ -968,9 +981,7 @@
 	sprite.width = width;
 	sprite.height = height;
 	sprite.x_offs = slot->bitmap_left;
-	/* XXX 2 should be determined somehow... it's right for the normal face */
-	y_adj = (size == FS_NORMAL) ? 2 : 0;
-	sprite.y_offs = GetCharacterHeight(size) - slot->bitmap_top - y_adj;
+	sprite.y_offs = _ascender[size] - slot->bitmap_top;
 
 	/* Draw shadow for medium size */
 	if (size == FS_NORMAL) {