(svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
authortruelight
Mon, 18 Jun 2007 19:38:23 +0000
changeset 6948 d7d326482813
parent 6947 2e14760f63f9
child 6949 5de26c8fe2ef
(svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
src/blitter/32bpp_base.cpp
src/blitter/32bpp_base.hpp
src/blitter/8bpp_base.cpp
src/blitter/8bpp_base.hpp
src/blitter/base.hpp
src/blitter/null.hpp
src/gfx.cpp
--- a/src/blitter/32bpp_base.cpp	Mon Jun 18 18:45:12 2007 +0000
+++ b/src/blitter/32bpp_base.cpp	Mon Jun 18 19:38:23 2007 +0000
@@ -32,6 +32,55 @@
 	} while (--height);
 }
 
+void Blitter_32bppBase::DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 color)
+{
+	int dy;
+	int dx;
+	int stepx;
+	int stepy;
+	int frac;
+
+	dy = (y2 - y) * 2;
+	if (dy < 0) {
+		dy = -dy;
+		stepy = -1;
+	} else {
+		stepy = 1;
+	}
+
+	dx = (x2 - x) * 2;
+	if (dx < 0) {
+		dx = -dx;
+		stepx = -1;
+	} else {
+		stepx = 1;
+	}
+
+	this->SetPixel(video, x, y, color);
+	if (dx > dy) {
+		frac = dy - (dx / 2);
+		while (x != x2) {
+			if (frac >= 0) {
+				y += stepy;
+				frac -= dx;
+			}
+			x += stepx;
+			frac += dy;
+			if (x > 0 && y > 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
+		}
+	} else {
+		frac = dx - (dy / 2);
+		while (y != y2) {
+			if (frac >= 0) {
+				x += stepx;
+				frac -= dy;
+			}
+			y += stepy;
+			frac += dx;
+			if (x > 0 && y > 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
+		}
+	}
+}
 void Blitter_32bppBase::CopyFromBuffer(void *video, const void *src, int width, int height, int src_pitch)
 {
 	int direction = (height < 0) ? -1 : 1;
--- a/src/blitter/32bpp_base.hpp	Mon Jun 18 18:45:12 2007 +0000
+++ b/src/blitter/32bpp_base.hpp	Mon Jun 18 19:38:23 2007 +0000
@@ -17,6 +17,7 @@
 	/* virtual */ void SetPixel(void *video, int x, int y, uint8 color);
 	/* virtual */ void SetPixelIfEmpty(void *video, int x, int y, uint8 color);
 	/* virtual */ void DrawRect(void *video, int width, int height, uint8 color);
+	/* virtual */ void DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 color);
 	/* virtual */ void CopyFromBuffer(void *video, const void *src, int width, int height, int src_pitch);
 	/* virtual */ void CopyToBuffer(const void *video, void *dst, int width, int height, int dst_pitch);
 	/* virtual */ void MoveBuffer(void *video_dst, const void *video_src, int width, int height);
--- a/src/blitter/8bpp_base.cpp	Mon Jun 18 18:45:12 2007 +0000
+++ b/src/blitter/8bpp_base.cpp	Mon Jun 18 19:38:23 2007 +0000
@@ -36,6 +36,56 @@
 	} while (--height);
 }
 
+void Blitter_8bppBase::DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 color)
+{
+	int dy;
+	int dx;
+	int stepx;
+	int stepy;
+	int frac;
+
+	dy = (y2 - y) * 2;
+	if (dy < 0) {
+		dy = -dy;
+		stepy = -1;
+	} else {
+		stepy = 1;
+	}
+
+	dx = (x2 - x) * 2;
+	if (dx < 0) {
+		dx = -dx;
+		stepx = -1;
+	} else {
+		stepx = 1;
+	}
+
+	this->SetPixel(video, x, y, color);
+	if (dx > dy) {
+		frac = dy - (dx / 2);
+		while (x != x2) {
+			if (frac >= 0) {
+				y += stepy;
+				frac -= dx;
+			}
+			x += stepx;
+			frac += dy;
+			if (x > 0 && y > 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
+		}
+	} else {
+		frac = dx - (dy / 2);
+		while (y != y2) {
+			if (frac >= 0) {
+				x += stepx;
+				frac -= dy;
+			}
+			y += stepy;
+			frac += dx;
+			if (x > 0 && y > 0 && x < screen_width && y < screen_height) this->SetPixel(video, x, y, color);
+		}
+	}
+}
+
 void Blitter_8bppBase::CopyFromBuffer(void *video, const void *src, int width, int height, int src_pitch)
 {
 	int direction = (height < 0) ? -1 : 1;
--- a/src/blitter/8bpp_base.hpp	Mon Jun 18 18:45:12 2007 +0000
+++ b/src/blitter/8bpp_base.hpp	Mon Jun 18 19:38:23 2007 +0000
@@ -17,6 +17,7 @@
 	/* virtual */ void SetPixel(void *video, int x, int y, uint8 color);
 	/* virtual */ void SetPixelIfEmpty(void *video, int x, int y, uint8 color);
 	/* virtual */ void DrawRect(void *video, int width, int height, uint8 color);
+	/* virtual */ void DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 color);
 	/* virtual */ void CopyFromBuffer(void *video, const void *src, int width, int height, int src_pitch);
 	/* virtual */ void CopyToBuffer(const void *video, void *dst, int width, int height, int dst_pitch);
 	/* virtual */ void MoveBuffer(void *video_dst, const void *video_src, int width, int height);
--- a/src/blitter/base.hpp	Mon Jun 18 18:45:12 2007 +0000
+++ b/src/blitter/base.hpp	Mon Jun 18 19:38:23 2007 +0000
@@ -97,6 +97,19 @@
 	virtual void DrawRect(void *video, int width, int height, uint8 color) = 0;
 
 	/**
+	 * Draw a line with a given color.
+	 * @param video The destination pointer (video-buffer).
+	 * @param x The x coordinate from where the line starts.
+	 * @param y The y coordinate from where the line starts.
+	 * @param x2 The x coordinate to where the line goes.
+	 * @param y2 The y coordinate to where the lines goes.
+	 * @param screen_width The width of the screen you are drawing in (to avoid buffer-overflows).
+	 * @param screen_height The height of the screen you are drawing in (to avoid buffer-overflows).
+	 * @param color A 8bpp mapping color.
+	 */
+	virtual void DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 color) = 0;
+
+	/**
 	 * Copy from a buffer to the screen.
 	 * @param video The destionation pointer (video-buffer).
 	 * @param src The buffer from which the data will be read.
--- a/src/blitter/null.hpp	Mon Jun 18 18:45:12 2007 +0000
+++ b/src/blitter/null.hpp	Mon Jun 18 19:38:23 2007 +0000
@@ -18,6 +18,7 @@
 	/* virtual */ void SetPixel(void *video, int x, int y, uint8 color) {};
 	/* virtual */ void SetPixelIfEmpty(void *video, int x, int y, uint8 color) {};
 	/* virtual */ void DrawRect(void *video, int width, int height, uint8 color) {};
+	/* virtual */ void DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 color) {};
 	/* virtual */ void CopyFromBuffer(void *video, const void *src, int width, int height, int src_pitch) {};
 	/* virtual */ void CopyToBuffer(const void *video, void *dst, int width, int height, int dst_pitch) {};
 	/* virtual */ void MoveBuffer(void *video_dst, const void *video_src, int width, int height) {};
--- a/src/gfx.cpp	Mon Jun 18 18:45:12 2007 +0000
+++ b/src/gfx.cpp	Mon Jun 18 19:38:23 2007 +0000
@@ -161,79 +161,23 @@
 	}
 }
 
-static void GfxSetPixel(int x, int y, int color)
-{
-	Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
-	const DrawPixelInfo *dpi = _cur_dpi;
-
-	if ((x -= dpi->left) < 0 || x >= dpi->width || (y -= dpi->top) < 0 || y >= dpi->height) return;
-	blitter->SetPixel(dpi->dst_ptr, x, y, color);
-}
-
 void GfxDrawLine(int x, int y, int x2, int y2, int color)
 {
-	int dy;
-	int dx;
-	int stepx;
-	int stepy;
-	int frac;
-
-	/* Check clipping first */
-	{
-		DrawPixelInfo *dpi = _cur_dpi;
-		int t;
-
-		if (x < dpi->left && x2 < dpi->left) return;
-
-		if (y < dpi->top && y2 < dpi->top) return;
-
-		t = dpi->left + dpi->width;
-		if (x > t && x2 > t) return;
-
-		t = dpi->top + dpi->height;
-		if (y > t && y2 > t) return;
-	}
-
-	dy = (y2 - y) * 2;
-	if (dy < 0) {
-		dy = -dy;
-		stepy = -1;
-	} else {
-		stepy = 1;
-	}
+	Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
+	DrawPixelInfo *dpi = _cur_dpi;
 
-	dx = (x2 - x) * 2;
-	if (dx < 0) {
-		dx = -dx;
-		stepx = -1;
-	} else {
-		stepx = 1;
-	}
+	x -= dpi->left;
+	x2 -= dpi->left;
+	y -= dpi->top;
+	y2 -= dpi->top;
 
-	GfxSetPixel(x, y, color);
-	if (dx > dy) {
-		frac = dy - (dx >> 1);
-		while (x != x2) {
-			if (frac >= 0) {
-				y += stepy;
-				frac -= dx;
-			}
-			x += stepx;
-			frac += dy;
-			GfxSetPixel(x, y, color);
-		}
-	} else {
-		frac = dx - (dy >> 1);
-		while (y != y2) {
-			if (frac >= 0) {
-				x += stepx;
-				frac -= dy;
-			}
-			y += stepy;
-			frac += dx;
-			GfxSetPixel(x, y, color);
-		}
-	}
+	/* 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, x, y, x2, y2, dpi->width, dpi->height, color);
 }