aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gob/driver_vga.cpp37
1 files changed, 36 insertions, 1 deletions
diff --git a/gob/driver_vga.cpp b/gob/driver_vga.cpp
index 12add0bf9f..30eb8f2dad 100644
--- a/gob/driver_vga.cpp
+++ b/gob/driver_vga.cpp
@@ -106,7 +106,42 @@ void VGAVideoDriver::drawLine(SurfaceDesc *dest, int16 x0, int16 y0, int16 x1, i
}
void VGAVideoDriver::drawPackedSprite(byte *sprBuf, int16 width, int16 height, int16 x, int16 y, byte transp, SurfaceDesc *dest) {
- STUB_FUNC;
+ int destRight = x + width;
+ int destBottom = y + height;
+
+ byte* dst = dest->vidPtr + x + dest->width * y;
+
+ int curx = x;
+ int cury = y;
+
+ while (1) {
+ uint8 val = *sprBuf++;
+ unsigned int repeat = val & 7;
+ val &= 0xF8;
+ if (!(val & 8)) {
+ repeat <<= 8;
+ repeat |= *sprBuf++;
+ }
+ repeat++;
+ val >>= 4;
+
+ for (unsigned int i = 0; i < repeat; ++i) {
+ if (curx < dest->width && cury < dest->height)
+ if (!transp || val)
+ *dst = val;
+
+ dst++;
+ curx++;
+ if (curx == destRight) {
+ dst += dest->width + x - curx;
+ curx = x;
+ cury++;
+ if (cury == destBottom)
+ return;
+ }
+ }
+ }
+
}
}