changeset 18209:1eb94d68ccd4 draft

(svn r23038) -Fix: Check that the selected font size is valid the font face in use and choose the nearest size to that selected if not. Font metrics should then just work.
author peter1138 <peter1138@openttd.org>
date Tue, 18 Oct 2011 17:57:42 +0000
parents a17695194926
children 4ecf4b94f891
files src/fontcache.cpp
diffstat 1 files changed, 17 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/fontcache.cpp
+++ b/src/fontcache.cpp
@@ -746,18 +746,25 @@
 
 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;
+	FT_Error err = FT_Set_Pixel_Sizes(face, 0, pixels);
+	if (err == FT_Err_Invalid_Pixel_Size) {
 
-		_ascender[size] = asc;
-		_font_height[size] = asc - dec;
-	} else {
-		_ascender[size] = pixels;
-		_font_height[size] = pixels;
+		/* Find nearest size to that requested */
+		FT_Bitmap_Size *bs = face->available_sizes;
+		int i = face->num_fixed_sizes;
+		int n = bs->height;
+		for (; --i; bs++) {
+			if (abs(pixels - bs->height) < abs(pixels - n)) n = bs->height;
+		}
+
+		FT_Set_Pixel_Sizes(face, 0, n);
 	}
+
+	int asc = face->size->metrics.ascender >> 6;
+	int dec = face->size->metrics.descender >> 6;
+
+	_ascender[size] = asc;
+	_font_height[size] = asc - dec;
 }
 
 /**