diff options
author | Sven Hesse | 2009-08-22 13:11:30 +0000 |
---|---|---|
committer | Sven Hesse | 2009-08-22 13:11:30 +0000 |
commit | 401e54825f986b8287acd3f9b2d8002327ccef27 (patch) | |
tree | a5f35cb2c8a5fb9f2df6b9e28f4faf62806bc271 | |
parent | 529dc3e3f89b9a73307659f53a9322a957bbbb12 (diff) | |
download | scummvm-rg350-401e54825f986b8287acd3f9b2d8002327ccef27.tar.gz scummvm-rg350-401e54825f986b8287acd3f9b2d8002327ccef27.tar.bz2 scummvm-rg350-401e54825f986b8287acd3f9b2d8002327ccef27.zip |
Hooking up the v2 spriteUncompressor into the v6 one
svn-id: r43642
-rw-r--r-- | engines/gob/video_v2.cpp | 49 | ||||
-rw-r--r-- | engines/gob/video_v6.cpp | 19 |
2 files changed, 47 insertions, 21 deletions
diff --git a/engines/gob/video_v2.cpp b/engines/gob/video_v2.cpp index b526b63a37..98cf4a5d4f 100644 --- a/engines/gob/video_v2.cpp +++ b/engines/gob/video_v2.cpp @@ -64,12 +64,15 @@ char Video_v2::spriteUncompressor(byte *sprBuf, int16 srcWidth, int16 srcHeight, memBuffer = new byte[4370]; assert(memBuffer); + memset(memBuffer, 0, 4370); + srcPtr = sprBuf + 3; + sourceLeft = READ_LE_UINT32(srcPtr); destPtr = destDesc.getVidMem() + destDesc.getWidth() * y + x; - curWidth = 0; + curWidth = 0; curHeight = 0; linePtr = destPtr; @@ -89,58 +92,64 @@ char Video_v2::spriteUncompressor(byte *sprBuf, int16 srcWidth, int16 srcHeight, cmdVar = 0; while (1) { cmdVar >>= 1; - if ((cmdVar & 0x100) == 0) { - cmdVar = *srcPtr | 0xFF00; - srcPtr++; - } + if ((cmdVar & 0x100) == 0) + cmdVar = *srcPtr++ | 0xFF00; + if ((cmdVar & 1) != 0) { temp = *srcPtr++; + if ((temp != 0) || (transp == 0)) *destPtr = temp; + destPtr++; curWidth++; + if (curWidth >= srcWidth) { curWidth = 0; linePtr += destDesc.getWidth(); destPtr = linePtr; - curHeight++; - if (curHeight >= srcHeight) + if (++curHeight >= srcHeight) break; } - sourceLeft--; + memBuffer[bufPos] = temp; - bufPos++; - bufPos %= 4096; - if (sourceLeft == 0) + + bufPos = (bufPos + 1) % 4096; + + if (--sourceLeft == 0) break; + } else { offset = *srcPtr++; - offset |= (*srcPtr & 0xF0) << 4; - strLen = (*srcPtr & 0x0F) + 3; - *srcPtr++; + temp = *srcPtr++; + + offset |= (temp & 0xF0) << 4; + strLen = (temp & 0x0F) + 3; + if (strLen == lenCmd) strLen = *srcPtr++ + 18; for (counter2 = 0; counter2 < strLen; counter2++) { temp = memBuffer[(offset + counter2) % 4096]; + if ((temp != 0) || (transp == 0)) *destPtr = temp; - destPtr++; + destPtr++; curWidth++; + if (curWidth >= srcWidth) { curWidth = 0; linePtr += destDesc.getWidth(); destPtr = linePtr; - curHeight++; - if (curHeight >= srcHeight) { + if (++curHeight >= srcHeight) { delete[] memBuffer; return 1; } } + memBuffer[bufPos] = temp; - bufPos++; - bufPos %= 4096; + bufPos = (bufPos + 1) % 4096; } if (strLen >= ((int32) sourceLeft)) { @@ -148,7 +157,9 @@ char Video_v2::spriteUncompressor(byte *sprBuf, int16 srcWidth, int16 srcHeight, return 1; } else sourceLeft--; + } + } } else return 0; diff --git a/engines/gob/video_v6.cpp b/engines/gob/video_v6.cpp index c51b027bad..6f39edb588 100644 --- a/engines/gob/video_v6.cpp +++ b/engines/gob/video_v6.cpp @@ -84,8 +84,23 @@ char Video_v6::spriteUncompressor(byte *sprBuf, int16 srcWidth, int16 srcHeight, return 1; } - warning("Urban Stub: spriteUncompressor(), sprBuf[0,1] = %d,%d", - sprBuf[0], sprBuf[1]); + if (srcWidth & 0xC000) { + warning("Playtoons Stub: srcWidth & 0xC000 == %04X", srcWidth & 0xC000); + srcWidth &= 0x3FFF; + } + + if ((sprBuf[0] == 1) && (sprBuf[1] == 2)) { + if (Video_v2::spriteUncompressor(sprBuf, srcWidth, srcHeight, x, y, transp, destDesc)) + return 1; + + _vm->validateVideoMode(destDesc._vidMode); + + _videoDriver->drawPackedSprite(sprBuf, srcWidth, srcHeight, x, y, transp, destDesc); + return 1; + } + + warning("Urban Stub: spriteUncompressor(), sprBuf[0,1,2] = %d,%d,%d", + sprBuf[0], sprBuf[1], sprBuf[2]); return 1; } |