diff options
author | frosch <frosch@openttd.org> | 2010-04-18 17:13:01 +0000 |
---|---|---|
committer | frosch <frosch@openttd.org> | 2010-04-18 17:13:01 +0000 |
commit | af7051178de9f4b3eccbf9a4c0bd347e12a1f9dd (patch) | |
tree | 33dd7c5f98fa5caeffe3f8c477ef3a8da1d7c667 | |
parent | 2e90f7f8b975d380c3d544995ef6db9d6c8a86d8 (diff) | |
download | openttd-af7051178de9f4b3eccbf9a4c0bd347e12a1f9dd.tar.xz |
(svn r19671) -Fix (r19670): RoundDiv() needs to deal with signed numerators.
-rw-r--r-- | src/core/math_func.hpp | 12 | ||||
-rw-r--r-- | src/gfx.cpp | 4 | ||||
-rw-r--r-- | src/terraform_gui.cpp | 4 |
3 files changed, 13 insertions, 7 deletions
diff --git a/src/core/math_func.hpp b/src/core/math_func.hpp index 8f31dd273..19f2f53d6 100644 --- a/src/core/math_func.hpp +++ b/src/core/math_func.hpp @@ -330,14 +330,20 @@ static FORCEINLINE uint CeilDiv(uint a, uint b) } /** - * Computes round(a / b) for non-negative a and b. + * Computes round(a / b) for signed a and unsigned b. * @param a Numerator * @param b Denominator * @return Quotient, rounded to nearest */ -static FORCEINLINE uint RoundDiv(uint a, uint b) +static FORCEINLINE int RoundDivSU(int a, uint b) { - return (a + b / 2) / b; + if (a > 0) { + /* 0.5 is rounded to 1 */ + return (a + (int)b / 2) / (int)b; + } else { + /* -0.5 is rounded to 0 */ + return (a - ((int)b - 1) / 2) / (int)b; + } } #endif /* MATH_FUNC_HPP */ diff --git a/src/gfx.cpp b/src/gfx.cpp index 4c5177f21..fe0171598 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -550,7 +550,7 @@ static int DrawString(int left, int right, int top, char *str, const char *last, break; case SA_CENTER: - left = RoundDiv(initial_right + 1 + initial_left - w, 2); + left = RoundDivSU(initial_right + 1 + initial_left - w, 2); /* right + 1 = left + w */ right = left + w - 1; break; @@ -823,7 +823,7 @@ int DrawStringMultiLine(int left, int right, int top, int bottom, StringID str, total_height = (num + 1) * mt; } - int y = (align == SA_CENTER) ? RoundDiv(bottom + top - total_height, 2) : top; + int y = (align == SA_CENTER) ? RoundDivSU(bottom + top - total_height, 2) : top; const char *src = buffer; for (;;) { diff --git a/src/terraform_gui.cpp b/src/terraform_gui.cpp index 019dd5616..2340ddcd9 100644 --- a/src/terraform_gui.cpp +++ b/src/terraform_gui.cpp @@ -649,8 +649,8 @@ struct ScenarioEditorLandscapeGenerationWindow : Window { { if (widget != ETTW_DOTS) return; - int center_x = RoundDiv(r.left + r.right, 2); - int center_y = RoundDiv(r.top + r.bottom, 2); + int center_x = RoundDivSU(r.left + r.right, 2); + int center_y = RoundDivSU(r.top + r.bottom, 2); int n = _terraform_size * _terraform_size; const int8 *coords = &_multi_terraform_coords[0][0]; |