diff options
Diffstat (limited to 'src/blitter/32bpp_base.cpp')
-rw-r--r-- | src/blitter/32bpp_base.cpp | 49 |
1 files changed, 49 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; |