Changeset - r20304:8660c225f9a8
[Not reviewed]
master
0 3 0
frosch - 11 years ago 2013-06-01 15:10:32
frosch@openttd.org
(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.
3 files changed with 14 insertions and 13 deletions:
0 comments (0 inline, 0 general)
src/gfx.cpp
Show inline comments
 
@@ -1690,22 +1690,22 @@ byte GetDigitWidth(FontSize size)
 
}
 

	
 
/**
 
 * 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()
src/gfx_func.h
Show inline comments
 
@@ -150,7 +150,7 @@ bool ToggleFullScreen(bool fs);
 
/* 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.
src/strings.cpp
Show inline comments
 
@@ -116,10 +116,11 @@ void SetDParamMaxValue(uint n, uint64 ma
 
 */
 
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);
 
}
0 comments (0 inline, 0 general)