changeset 20359:5a8c31508189 draft

(svn r25314) -Fix (r25313): If '0' is the broadest digit, 0 * sum(10^i, i=0..(n-1)) is not the broadest n-digit number. -Fix [FS#5562]: Proper size-estimation for numbers with n digits.
author frosch <frosch@openttd.org>
date Sat, 01 Jun 2013 15:10:32 +0000
parents f2ffce21bb13
children 1630fa4b9ffd
files src/gfx.cpp src/gfx_func.h src/strings.cpp
diffstat 3 files changed, 14 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/gfx.cpp
+++ b/src/gfx.cpp
@@ -1690,22 +1690,22 @@
 }
 
 /**
- * Return the digit with the biggest width.
+ * Determine the broadest digits for guessing the maximum width of a n-digit number.
+ * @param [out] front Broadest digit, which is not 0. (Use this digit as first digit for numbers with more than one digit.)
+ * @param [out] next Broadest digit, including 0. (Use this digit for all digits, except the first one; or for numbers with only one digit.)
  * @param size  Font of the digit
- * @return Broadest digit.
  */
-uint GetBroadestDigit(FontSize size)
+void GetBroadestDigit(uint *front, uint *next, FontSize size)
 {
-	uint digit = 0;
-	byte width = 0;
-	for (char c = '0'; c <= '9'; c++) {
-		byte w = GetCharacterWidth(size, c);
+	int width = -1;
+	for (char c = '9'; c >= '0'; c--) {
+		int w = GetCharacterWidth(size, c);
 		if (w > width) {
 			width = w;
-			digit = c - '0';
+			*next = c - '0';
+			if (c != '0') *front = c - '0';
 		}
 	}
-	return digit;
 }
 
 void ScreenSizeChanged()
--- a/src/gfx_func.h
+++ b/src/gfx_func.h
@@ -150,7 +150,7 @@
 /* gfx.cpp */
 byte GetCharacterWidth(FontSize size, uint32 key);
 byte GetDigitWidth(FontSize size = FS_NORMAL);
-uint GetBroadestDigit(FontSize size = FS_NORMAL);
+void GetBroadestDigit(uint *front, uint *next, FontSize size = FS_NORMAL);
 
 /**
  * Get height of a character for a given font size.
--- a/src/strings.cpp
+++ b/src/strings.cpp
@@ -116,10 +116,11 @@
  */
 void SetDParamMaxDigits(uint n, uint count, FontSize size)
 {
-	uint biggest_digit = GetBroadestDigit(size);
-	uint64 val = biggest_digit;
+	uint front, next;
+	GetBroadestDigit(&front, &next, size);
+	uint64 val = count > 1 ? front : next;
 	for (; count > 1; count--) {
-		val = 10 * val + biggest_digit;
+		val = 10 * val + next;
 	}
 	SetDParam(n, val);
 }