changeset 20169:910a7d90396f draft

(svn r25118) -Codechange: Deduplicate basic line clipping code. (fonsinchen)
author frosch <frosch@openttd.org>
date Sun, 24 Mar 2013 11:20:37 +0000
parents d820a29f4d78
children 975d7172af5a
files src/gfx.cpp
diffstat 1 files changed, 35 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/src/gfx.cpp
+++ b/src/gfx.cpp
@@ -191,6 +191,32 @@
 	}
 }
 
+/**
+ * Align parameters of a line to the given DPI and check simple clipping.
+ * @param dpi Screen parameters to align with.
+ * @param x X coordinate of first point.
+ * @param y Y coordinate of first point.
+ * @param x2 X coordinate of second point.
+ * @param y2 Y coordinate of second point.
+ * @param width Width of the line.
+ * @return True if the line is likely to be visible, false if it's certainly
+ *         invisible.
+ */
+static inline bool GfxPreprocessLine(DrawPixelInfo *dpi, int &x, int &y, int &x2, int &y2, int width)
+{
+	x -= dpi->left;
+	x2 -= dpi->left;
+	y -= dpi->top;
+	y2 -= dpi->top;
+
+	/* Check simple clipping */
+	if (x + width / 2 < 0           && x2 + width / 2 < 0          ) return false;
+	if (y + width / 2 < 0           && y2 + width / 2 < 0          ) return false;
+	if (x - width / 2 > dpi->width  && x2 - width / 2 > dpi->width ) return false;
+	if (y - width / 2 > dpi->height && y2 - width / 2 > dpi->height) return false;
+	return true;
+}
+
 void GfxDrawLine(int x, int y, int x2, int y2, int colour, int width)
 {
 	Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
@@ -198,18 +224,9 @@
 
 	assert(width > 0);
 
-	x -= dpi->left;
-	x2 -= dpi->left;
-	y -= dpi->top;
-	y2 -= dpi->top;
-
-	/* Check clipping */
-	if (x + width / 2 < 0           && x2 + width / 2 < 0          ) return;
-	if (y + width / 2 < 0           && y2 + width / 2 < 0          ) return;
-	if (x - width / 2 > dpi->width  && x2 - width / 2 > dpi->width ) return;
-	if (y - width / 2 > dpi->height && y2 - width / 2 > dpi->height) return;
-
-	blitter->DrawLine(dpi->dst_ptr, x, y, x2, y2, dpi->width, dpi->height, colour, width);
+	if (GfxPreprocessLine(dpi, x, y, x2, y2, width)) {
+		blitter->DrawLine(dpi->dst_ptr, x, y, x2, y2, dpi->width, dpi->height, colour, width);
+	}
 }
 
 void GfxDrawLineUnscaled(int x, int y, int x2, int y2, int colour)
@@ -217,20 +234,12 @@
 	Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
 	DrawPixelInfo *dpi = _cur_dpi;
 
-	x -= dpi->left;
-	x2 -= dpi->left;
-	y -= dpi->top;
-	y2 -= dpi->top;
-
-	/* Check clipping */
-	if (x < 0 && x2 < 0) return;
-	if (y < 0 && y2 < 0) return;
-	if (x > dpi->width  && x2 > dpi->width)  return;
-	if (y > dpi->height && y2 > dpi->height) return;
-
-	blitter->DrawLine(dpi->dst_ptr, UnScaleByZoom(x, dpi->zoom), UnScaleByZoom(y, dpi->zoom),
-			UnScaleByZoom(x2, dpi->zoom), UnScaleByZoom(y2, dpi->zoom),
-			UnScaleByZoom(dpi->width, dpi->zoom), UnScaleByZoom(dpi->height, dpi->zoom), colour, 1);
+	if (GfxPreprocessLine(dpi, x, y, x2, y2, 1)) {
+		blitter->DrawLine(dpi->dst_ptr,
+				UnScaleByZoom(x, dpi->zoom), UnScaleByZoom(y, dpi->zoom),
+				UnScaleByZoom(x2, dpi->zoom), UnScaleByZoom(y2, dpi->zoom),
+				UnScaleByZoom(dpi->width, dpi->zoom), UnScaleByZoom(dpi->height, dpi->zoom), colour, 1);
+	}
 }
 
 /**