--- a/src/blitter/8bpp_base.cpp Sun Jun 17 21:31:00 2007 +0000
+++ b/src/blitter/8bpp_base.cpp Tue Jun 26 23:40:58 2007 +0000
@@ -9,7 +9,7 @@
do {
for (int i = 0; i != width; i++) *((uint8 *)dst + i) = ctab[((uint8 *)dst)[i]];
dst = (uint8 *)dst + _screen.pitch;
- } while (height--);
+ } while (--height);
}
void *Blitter_8bppBase::MoveTo(const void *video, int x, int y)
@@ -28,48 +28,156 @@
if (*dst == 0) *dst = color;
}
-void Blitter_8bppBase::SetHorizontalLine(void *video, int width, uint8 color)
+void Blitter_8bppBase::DrawRect(void *video, int width, int height, uint8 color)
{
- memset(video, color, width);
+ do {
+ memset(video, color, width);
+ video = (uint8 *)video + _screen.pitch;
+ } while (--height);
}
-void Blitter_8bppBase::CopyFromBuffer(void *video, const void *src, int width, int height, int src_pitch)
+void Blitter_8bppBase::DrawLine(void *video, int x, int y, int x2, int y2, int screen_width, int screen_height, uint8 color)
{
- int direction = (height < 0) ? -1 : 1;
- uint8 *dst = (uint8 *)video;
- uint8 *usrc = (uint8 *)src;
+ int dy;
+ int dx;
+ int stepx;
+ int stepy;
+ int frac;
- height = abs(height);
- for (; height > 0; height--) {
- memcpy(dst, usrc, width);
- usrc += src_pitch * direction;
- dst += _screen.pitch * direction;
+ 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::CopyToBuffer(const void *video, void *dst, int width, int height, int dst_pitch)
+void Blitter_8bppBase::CopyFromBuffer(void *video, const void *src, int width, int height)
{
- int direction = (height < 0) ? -1 : 1;
+ uint8 *dst = (uint8 *)video;
+ uint8 *usrc = (uint8 *)src;
+
+ for (; height > 0; height--) {
+ memcpy(dst, usrc, width * sizeof(uint8));
+ usrc += width;
+ dst += _screen.pitch;
+ }
+}
+
+void Blitter_8bppBase::CopyToBuffer(const void *video, void *dst, int width, int height)
+{
uint8 *udst = (uint8 *)dst;
uint8 *src = (uint8 *)video;
- height = abs(height);
for (; height > 0; height--) {
- memcpy(udst, src, width);
- src += _screen.pitch * direction;
- udst += dst_pitch * direction;
+ memcpy(udst, src, width * sizeof(uint8));
+ src += _screen.pitch;
+ udst += width;
}
}
-void Blitter_8bppBase::MoveBuffer(void *video_dst, const void *video_src, int width, int height)
+void Blitter_8bppBase::CopyImageToBuffer(const void *video, void *dst, int width, int height, int dst_pitch)
{
- uint8 *dst = (uint8 *)video_dst;
- uint8 *src = (uint8 *)video_src;
+ uint8 *udst = (uint8 *)dst;
+ uint8 *src = (uint8 *)video;
for (; height > 0; height--) {
- memmove(dst, src, width);
+ memcpy(udst, src, width * sizeof(uint8));
src += _screen.pitch;
- dst += _screen.pitch;
+ udst += dst_pitch;
+ }
+}
+
+void Blitter_8bppBase::ScrollBuffer(void *video, int &left, int &top, int &width, int &height, int scroll_x, int scroll_y)
+{
+ const uint8 *src;
+ uint8 *dst;
+
+ if (scroll_y > 0) {
+ /*Calculate pointers */
+ dst = (uint8 *)video + left + (top + height - 1) * _screen.pitch;
+ src = dst - scroll_y * _screen.pitch;
+
+ /* Decrease height and increase top */
+ top += scroll_y;
+ height -= scroll_y;
+ assert(height > 0);
+
+ /* Adjust left & width */
+ if (scroll_x >= 0) {
+ dst += scroll_x;
+ left += scroll_x;
+ width -= scroll_x;
+ } else {
+ src -= scroll_x;
+ width += scroll_x;
+ }
+
+ for (int h = height; h > 0; h--) {
+ memcpy(dst, src, width * sizeof(uint8));
+ src -= _screen.pitch;
+ dst -= _screen.pitch;
+ }
+ } else {
+ /* Calculate pointers */
+ dst = (uint8 *)video + left + top * _screen.pitch;
+ src = dst - scroll_y * _screen.pitch;
+
+ /* Decrese height. (scroll_y is <=0). */
+ height += scroll_y;
+ assert(height > 0);
+
+ /* Adjust left & width */
+ if (scroll_x >= 0) {
+ dst += scroll_x;
+ left += scroll_x;
+ width -= scroll_x;
+ } else {
+ src -= scroll_x;
+ width += scroll_x;
+ }
+
+ /* the y-displacement may be 0 therefore we have to use memmove,
+ * because source and destination may overlap */
+ for (int h = height; h > 0; h--) {
+ memmove(dst, src, width * sizeof(uint8));
+ src += _screen.pitch;
+ dst += _screen.pitch;
+ }
}
}
@@ -77,3 +185,13 @@
{
return width * height;
}
+
+void Blitter_8bppBase::PaletteAnimate(uint start, uint count)
+{
+ /* Video backend takes care of the palette animation */
+}
+
+Blitter::PaletteAnimation Blitter_8bppBase::UsePaletteAnimation()
+{
+ return Blitter::PALETTE_ANIMATION_VIDEO_BACKEND;
+}