diff options
Diffstat (limited to 'src/blitter')
-rw-r--r-- | src/blitter/32bpp_base.cpp | 49 | ||||
-rw-r--r-- | src/blitter/32bpp_base.hpp | 1 | ||||
-rw-r--r-- | src/blitter/8bpp_base.cpp | 50 | ||||
-rw-r--r-- | src/blitter/8bpp_base.hpp | 1 | ||||
-rw-r--r-- | src/blitter/base.hpp | 13 | ||||
-rw-r--r-- | src/blitter/null.hpp | 1 |
6 files changed, 115 insertions, 0 deletions
diff --git a/src/blitter/32bpp_base.cpp b/src/blitter/32bpp_base.cpp index 6862e2907..adfc0fbef 100644 --- a/src/blitter/32bpp_base.cpp +++ b/src/blitter/32bpp_base.cpp @@ -32,6 +32,55 @@ void Blitter_32bppBase::DrawRect(void *video, int width, int height, uint8 color } 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 index aaa68ef38..df593247c 100644 --- 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 index 486d7a190..65de3b195 100644 --- a/src/blitter/8bpp_base.cpp +++ b/src/blitter/8bpp_base.cpp @@ -36,6 +36,56 @@ void Blitter_8bppBase::DrawRect(void *video, int width, int height, uint8 color) } 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 index 63b28d200..3e93885c7 100644 --- 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 index 79a0895f9..6e59f4e2e 100644 --- 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 index b3bbe2212..61c4f222d 100644 --- 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) {}; |