# HG changeset patch # User truelight # Date 2007-06-18 19:38:23 # Node ID a40a825a40446a7af90f96380996b7b6051997d0 # Parent c5e531edca927a373da4eb93ca62981ba5da8c58 (svn r10203) -Codechange: more moving things to blitter-layer: DrawLine diff --git a/src/blitter/32bpp_base.cpp b/src/blitter/32bpp_base.cpp --- a/src/blitter/32bpp_base.cpp +++ b/src/blitter/32bpp_base.cpp @@ -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; diff --git a/src/blitter/32bpp_base.hpp b/src/blitter/32bpp_base.hpp --- a/src/blitter/32bpp_base.hpp +++ b/src/blitter/32bpp_base.hpp @@ -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); diff --git a/src/blitter/8bpp_base.cpp b/src/blitter/8bpp_base.cpp --- a/src/blitter/8bpp_base.cpp +++ b/src/blitter/8bpp_base.cpp @@ -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; diff --git a/src/blitter/8bpp_base.hpp b/src/blitter/8bpp_base.hpp --- a/src/blitter/8bpp_base.hpp +++ b/src/blitter/8bpp_base.hpp @@ -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); diff --git a/src/blitter/base.hpp b/src/blitter/base.hpp --- a/src/blitter/base.hpp +++ b/src/blitter/base.hpp @@ -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. diff --git a/src/blitter/null.hpp b/src/blitter/null.hpp --- a/src/blitter/null.hpp +++ b/src/blitter/null.hpp @@ -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) {}; diff --git a/src/gfx.cpp b/src/gfx.cpp --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -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); }