summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2010-04-18 17:13:01 +0000
committerfrosch <frosch@openttd.org>2010-04-18 17:13:01 +0000
commitaf7051178de9f4b3eccbf9a4c0bd347e12a1f9dd (patch)
tree33dd7c5f98fa5caeffe3f8c477ef3a8da1d7c667 /src
parent2e90f7f8b975d380c3d544995ef6db9d6c8a86d8 (diff)
downloadopenttd-af7051178de9f4b3eccbf9a4c0bd347e12a1f9dd.tar.xz
(svn r19671) -Fix (r19670): RoundDiv() needs to deal with signed numerators.
Diffstat (limited to 'src')
-rw-r--r--src/core/math_func.hpp12
-rw-r--r--src/gfx.cpp4
-rw-r--r--src/terraform_gui.cpp4
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];