aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/video_v2.cpp
diff options
context:
space:
mode:
authorSven Hesse2006-05-11 19:43:30 +0000
committerSven Hesse2006-05-11 19:43:30 +0000
commit42e03bd70720643c0866abd7d6da50529d2c1f03 (patch)
tree80aff92316136cac1222ccf01782b5c58d4d7490 /engines/gob/video_v2.cpp
parentd6af07989df23219293cf6117e6cd0ae6a63e2e9 (diff)
downloadscummvm-rg350-42e03bd70720643c0866abd7d6da50529d2c1f03.tar.gz
scummvm-rg350-42e03bd70720643c0866abd7d6da50529d2c1f03.tar.bz2
scummvm-rg350-42e03bd70720643c0866abd7d6da50529d2c1f03.zip
- Sound! Still a bit glitchy, though:
- Negative frequences?!? Maybe "SFX"? - No sound for a small part of the intro (there aren't any sndKeys covering that part either) - A rythm-instrument (hi-hat?) in the titlemusic isn't played as one - More differences in the drawing functions fleshed out - Some of the goblin handling functions written - More unnamed functions and variables, wheeee... svn-id: r22410
Diffstat (limited to 'engines/gob/video_v2.cpp')
-rw-r--r--engines/gob/video_v2.cpp149
1 files changed, 149 insertions, 0 deletions
diff --git a/engines/gob/video_v2.cpp b/engines/gob/video_v2.cpp
index 8e55154dde..cad6937c0b 100644
--- a/engines/gob/video_v2.cpp
+++ b/engines/gob/video_v2.cpp
@@ -154,4 +154,153 @@ Video::SurfaceDesc *Video_v2::initSurfDesc(int16 vidMode, int16 width, int16 hei
return descPtr;
}
+char Video_v2::spriteUncompressor(byte *sprBuf, int16 srcWidth, int16 srcHeight,
+ int16 x, int16 y, int16 transp, SurfaceDesc *destDesc) {
+ SurfaceDesc sourceDesc;
+ byte *memBuffer;
+ byte *srcPtr;
+ byte *destPtr;
+ byte *linePtr;
+ byte temp;
+ uint32 sourceLeft;
+ int16 curWidth;
+ int16 curHeight;
+ int16 offset;
+ int16 counter2;
+ uint16 cmdVar;
+ int16 bufPos;
+ int16 strLen;
+
+ if (!destDesc)
+ return 1;
+
+ if ((destDesc->vidMode & 0x7f) != 0x13)
+ error("Video::spriteUncompressor: Video mode 0x%x is not supported!",
+ destDesc->vidMode & 0x7f);
+
+ if (sprBuf[0] != 1)
+ return 0;
+
+ if (sprBuf[1] != 2)
+ return 0;
+
+ if (sprBuf[2] == 2) {
+ sourceDesc.width = srcWidth;
+ sourceDesc.height = srcHeight;
+ sourceDesc.vidMode = 0x93;
+ sourceDesc.vidPtr = sprBuf + 3;
+ Video::drawSprite(&sourceDesc, destDesc, 0, 0, srcWidth - 1,
+ srcHeight - 1, x, y, transp);
+ return 1;
+ } else if (sprBuf[2] == 1) {
+ memBuffer = new byte[4370];
+ if (memBuffer == 0)
+ return 0;
+
+ srcPtr = sprBuf + 3;
+ sourceLeft = READ_LE_UINT32(srcPtr);
+
+ // TODO: Needed until wide/scrolling surfaces are supported...
+ if ((x + srcWidth) >= destDesc->width)
+ x = 0;
+ if ((y + srcHeight) >= destDesc->height)
+ y = 0;
+
+ destPtr = destDesc->vidPtr + destDesc->width * y + x;
+
+ curWidth = 0;
+ curHeight = 0;
+
+ linePtr = destPtr;
+ srcPtr += 4;
+
+ int16 var_2E = 0;
+ int16 var_2F;
+ if ((READ_LE_UINT16(srcPtr + 2) == 0x5678) && (READ_LE_UINT16(srcPtr) != 0x1234)) {
+ srcPtr += 4;
+ bufPos = 273;
+ var_2F = 18;
+ } else {
+ var_2F = 100;
+ bufPos = 4078;
+ }
+ if (transp == 0)
+ var_2E = 300;
+ else
+ var_2E = 0;
+
+ cmdVar = 0;
+ while (1) {
+ cmdVar >>= 1;
+ if ((cmdVar & 0x100) == 0) {
+ cmdVar = *srcPtr | 0xff00;
+ srcPtr++;
+ }
+ if ((cmdVar & 1) != 0) {
+ temp = *srcPtr++;
+ if (temp != var_2E)
+ *destPtr = temp;
+ destPtr++;
+ curWidth++;
+ if (curWidth >= srcWidth) {
+ curWidth = 0;
+ linePtr += destDesc->width;
+ destPtr = linePtr;
+ curHeight++;
+ if (curHeight >= srcHeight)
+ break;
+ }
+ sourceLeft--;
+ memBuffer[bufPos] = temp;
+ bufPos++;
+ bufPos %= 4096;
+ if (sourceLeft == 0)
+ break;
+ } else {
+ offset = *srcPtr++;
+ offset |= (*srcPtr & 0xf0) << 4;
+ strLen = (*srcPtr & 0x0f) + 3;
+ *srcPtr++;
+ if (strLen == var_2F)
+ strLen = *srcPtr++ + 18;
+
+ for (counter2 = 0; counter2 < strLen;
+ counter2++) {
+ temp = memBuffer[(offset + counter2) % 4096];
+ if (temp != var_2E)
+ *destPtr = temp;
+ destPtr++;
+
+ curWidth++;
+ if (curWidth >= srcWidth) {
+ curWidth = 0;
+ linePtr += destDesc->width;
+ destPtr = linePtr;
+ curHeight++;
+ if (curHeight >= srcHeight) {
+ delete[] memBuffer;
+ return 1;
+ }
+ }
+ memBuffer[bufPos] = temp;
+ bufPos++;
+ bufPos %= 4096;
+ }
+ // loc_1D4E4
+
+ if (strLen < (int32) sourceLeft)
+ sourceLeft--;
+ else {
+ delete[] memBuffer;
+ return 1;
+ }
+ }
+ }
+ } else
+ return 0;
+
+ delete[] memBuffer;
+ return 1;
+}
+
} // End of namespace Gob