aboutsummaryrefslogtreecommitdiff
path: root/scumm/gfx.cpp
diff options
context:
space:
mode:
authorEugene Sandulenko2004-02-24 04:45:50 +0000
committerEugene Sandulenko2004-02-24 04:45:50 +0000
commit4117781522f0786329c58271233e137246a7b49a (patch)
treec76597d08d058c9e8cf9fe461a4d1a436b7977f4 /scumm/gfx.cpp
parente5392aa12c1a03f79eebd6fd65fdb8e01f7f5c49 (diff)
downloadscummvm-rg350-4117781522f0786329c58271233e137246a7b49a.tar.gz
scummvm-rg350-4117781522f0786329c58271233e137246a7b49a.tar.bz2
scummvm-rg350-4117781522f0786329c58271233e137246a7b49a.zip
Graphics decoders for 3DO HE titles. Preliminary implementation, don't
blame me :) After testing I'll convert it to C. svn-id: r13014
Diffstat (limited to 'scumm/gfx.cpp')
-rw-r--r--scumm/gfx.cpp166
1 files changed, 164 insertions, 2 deletions
diff --git a/scumm/gfx.cpp b/scumm/gfx.cpp
index c9c05c0e19..1311b58277 100644
--- a/scumm/gfx.cpp
+++ b/scumm/gfx.cpp
@@ -1485,11 +1485,16 @@ bool Gdi::decompressBitmap(byte *bgbak_ptr, const byte *src, int numLinesToProce
case 7:
unkDecode11(bgbak_ptr, src, numLinesToProcess); /* Ender - Zak256/Indy256 */
break;
- // FIXME implement these codecs...
+
// 8/9 used in 3do version of puttputt joins the parade maybe others
case 8:
+ unkDecode12(bgbak_ptr, src, numLinesToProcess);
+ break;
+
case 9:
- error("decompressBitmap: Graphics codec %d not yet supported\n", code);
+ unkDecode13(bgbak_ptr, src, numLinesToProcess);
+ break;
+
// used in amiga version of Monkey Island
case 10:
decodeStripEGA(bgbak_ptr, src, numLinesToProcess);
@@ -2125,6 +2130,163 @@ void Gdi::unkDecode11(byte *dst, const byte *src, int height) {
} while (--x);
}
+
+// TODO: C'ify it
+void Gdi::unkDecode12(byte *dst, const byte *src, int height) {
+ int var_8, di, var_6;
+ const byte *bx;
+ byte si, var_4;
+
+ var_8 = 0;
+
+ di = height << 3;
+
+ if (!height)
+ return;
+
+ _cont1:
+ bx = src;
+ src++;
+ si = *bx;
+
+ if (!(si & 1)) {
+ si >>= 1;
+ si++;
+ di -= si;
+ if (di < 0)
+ si += di;
+
+ var_6 = di;
+ di = var_8;
+
+ do {
+ bx = src;
+ src++;
+
+ if (*bx != _transparentColor)
+ *dst = *bx;
+
+ dst++;
+ di++;
+ if (!(di & 7))
+ dst += 312;
+
+ si--;
+ } while (si);
+ var_8 = di;
+ if (var_6 > 0) {
+ di = var_6;
+ goto _cont1;
+ }
+ return;
+ } else {
+ si >>= 1;
+ bx = src;
+ src++;
+ var_4 = *bx;
+ si++;
+ di -= si;
+ if (di < 0)
+ si += di;
+ var_6 = di;
+ di = var_8;
+
+ do {
+ if (var_4 != _transparentColor)
+ *dst = var_4;
+ dst++;
+ di++;
+ if (!(di & 7))
+ dst += 312;
+ si--;
+ } while (si);
+ var_8 = di;
+ if (var_6 > 0) {
+ di = var_6;
+ goto _cont1;
+ }
+ return;
+ }
+}
+
+
+// TODO: C'ify it
+void Gdi::unkDecode13(byte *dst, const byte *src, int height) {
+ int var_8, di, var_6;
+ const byte *bx;
+ byte si, var_4;
+
+ var_8 = 0;
+
+ di = height << 3;
+
+ if (!height)
+ return;
+
+ _cont1:
+ bx = src;
+ src++;
+ si = *bx;
+
+ if (!(si & 1)) {
+ si >>= 1;
+ si++;
+ di -= si;
+ if (di < 0)
+ si += di;
+
+ var_6 = di;
+ di = var_8;
+
+ do {
+ bx = src;
+ src++;
+
+ *dst = *bx;
+
+ dst++;
+ di++;
+ if (!(di & 7))
+ dst += 312;
+
+ si--;
+ } while (si);
+ var_8 = di;
+ if (var_6 > 0) {
+ di = var_6;
+ goto _cont1;
+ }
+ return;
+ } else {
+ si >>= 1;
+ bx = src;
+ src++;
+ var_4 = *bx;
+ si++;
+ di -= si;
+ if (di < 0)
+ si += di;
+ var_6 = di;
+ di = var_8;
+
+ do {
+ *dst = var_4;
+ dst++;
+ di++;
+ if (!(di & 7))
+ dst += 312;
+ si--;
+ } while (si);
+ var_8 = di;
+ if (var_6 > 0) {
+ di = var_6;
+ goto _cont1;
+ }
+ return;
+ }
+}
+
+
#undef NEXT_ROW
#undef READ_256BIT