Changeset - r6948:a40a825a4044
[Not reviewed]
master
0 7 0
truelight - 17 years ago 2007-06-18 19:38:23
truelight@openttd.org
(svn r10203) -Codechange: more moving things to blitter-layer: DrawLine
7 files changed with 127 insertions and 68 deletions:
0 comments (0 inline, 0 general)
src/blitter/32bpp_base.cpp
Show inline comments
 
@@ -32,6 +32,55 @@ void Blitter_32bppBase::DrawRect(void *v
 
	} 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;
src/blitter/32bpp_base.hpp
Show inline comments
 
@@ -17,6 +17,7 @@ public:
 
	/* 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);
src/blitter/8bpp_base.cpp
Show inline comments
 
@@ -36,6 +36,56 @@ void Blitter_8bppBase::DrawRect(void *vi
 
	} 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;
src/blitter/8bpp_base.hpp
Show inline comments
 
@@ -17,6 +17,7 @@ public:
 
	/* 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);
src/blitter/base.hpp
Show inline comments
 
@@ -97,6 +97,19 @@ public:
 
	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.
src/blitter/null.hpp
Show inline comments
 
@@ -18,6 +18,7 @@ public:
 
	/* 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) {};
src/gfx.cpp
Show inline comments
 
@@ -161,79 +161,23 @@ void GfxFillRect(int left, int top, int 
 
	}
 
}
 

	
 
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;
 
	Blitter *blitter = BlitterFactoryBase::GetCurrentBlitter();
 
	DrawPixelInfo *dpi = _cur_dpi;
 

	
 
		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;
 
	}
 
	x -= dpi->left;
 
	x2 -= dpi->left;
 
	y -= dpi->top;
 
	y2 -= dpi->top;
 

	
 
	dx = (x2 - x) * 2;
 
	if (dx < 0) {
 
		dx = -dx;
 
		stepx = -1;
 
	} else {
 
		stepx = 1;
 
	}
 
	/* 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;
 

	
 
	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);
 
		}
 
	}
 
	blitter->DrawLine(dpi->dst_ptr, x, y, x2, y2, dpi->width, dpi->height, color);
 
}
 

	
 

	
0 comments (0 inline, 0 general)