changeset 15051:11b01bb094e0 draft

(svn r19671) -Fix (r19670): RoundDiv() needs to deal with signed numerators.
author frosch <frosch@openttd.org>
date Sun, 18 Apr 2010 17:13:01 +0000
parents 73f4e0e490b7
children f0686cdc3f45
files src/core/math_func.hpp src/gfx.cpp src/terraform_gui.cpp
diffstat 3 files changed, 13 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/math_func.hpp
+++ b/src/core/math_func.hpp
@@ -330,14 +330,20 @@
 }
 
 /**
- * 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 */
--- a/src/gfx.cpp
+++ b/src/gfx.cpp
@@ -550,7 +550,7 @@
 				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 @@
 		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 (;;) {
--- a/src/terraform_gui.cpp
+++ b/src/terraform_gui.cpp
@@ -649,8 +649,8 @@
 	{
 		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];