summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2013-03-24 11:20:37 +0000
committerfrosch <frosch@openttd.org>2013-03-24 11:20:37 +0000
commit166513bbd4347b78a1f6b891188ebcee6f174814 (patch)
treea37e561974ee8846034b52900c87fd70d3166c20
parent5046922f61077791803c699e075a9c4065af9c1f (diff)
downloadopenttd-166513bbd4347b78a1f6b891188ebcee6f174814.tar.xz
(svn r25118) -Codechange: Deduplicate basic line clipping code. (fonsinchen)
-rw-r--r--src/gfx.cpp61
1 files changed, 35 insertions, 26 deletions
diff --git a/src/gfx.cpp b/src/gfx.cpp
index 27f0b9022..116e9ad7d 100644
--- a/src/gfx.cpp
+++ b/src/gfx.cpp
@@ -191,46 +191,55 @@ void GfxFillRect(int left, int top, int right, int bottom, int colour, FillRectM
}
}
-void GfxDrawLine(int x, int y, int x2, int y2, int colour, int width)
+/**
+ * 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)
{
- Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
- DrawPixelInfo *dpi = _cur_dpi;
-
- 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);
+ /* 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 GfxDrawLineUnscaled(int x, int y, int x2, int y2, int colour)
+void GfxDrawLine(int x, int y, int x2, int y2, int colour, int width)
{
Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
DrawPixelInfo *dpi = _cur_dpi;
- x -= dpi->left;
- x2 -= dpi->left;
- y -= dpi->top;
- y2 -= dpi->top;
+ assert(width > 0);
+
+ if (GfxPreprocessLine(dpi, x, y, x2, y2, width)) {
+ blitter->DrawLine(dpi->dst_ptr, x, y, x2, y2, dpi->width, dpi->height, colour, width);
+ }
+}
- /* 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;
+void GfxDrawLineUnscaled(int x, int y, int x2, int y2, int colour)
+{
+ Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
+ DrawPixelInfo *dpi = _cur_dpi;
- 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);
+ }
}
/**