diff options
author | Paul Gilbert | 2015-05-16 22:27:36 -0400 |
---|---|---|
committer | Paul Gilbert | 2015-05-16 22:27:36 -0400 |
commit | 7aa804b5ccd3489c852bbde01362bd2ce91d6cf8 (patch) | |
tree | 52f73b150df7299d444d437356b07c409d836c6d /engines/sherlock/resources.cpp | |
parent | 7963c64c06e5765c5ca96917a8b4a2c7258c6f37 (diff) | |
download | scummvm-rg350-7aa804b5ccd3489c852bbde01362bd2ce91d6cf8.tar.gz scummvm-rg350-7aa804b5ccd3489c852bbde01362bd2ce91d6cf8.tar.bz2 scummvm-rg350-7aa804b5ccd3489c852bbde01362bd2ce91d6cf8.zip |
SHERLOCK: Implement Tattoo version of image RLE compression
Diffstat (limited to 'engines/sherlock/resources.cpp')
-rw-r--r-- | engines/sherlock/resources.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/engines/sherlock/resources.cpp b/engines/sherlock/resources.cpp index 1c154a3a5f..24fef3f235 100644 --- a/engines/sherlock/resources.cpp +++ b/engines/sherlock/resources.cpp @@ -383,6 +383,28 @@ void ImageFile::decompressFrame(ImageFrame &frame, const byte *src) { *pDest++ = *src & 0xF; *pDest++ = (*src >> 4); } + } else if (frame._rleEncoded && _vm->getGameID() == GType_RoseTattoo) { + // Rose Tattoo run length encoding doesn't use the RLE marker byte + byte *dst = (byte *)frame._frame.getPixels(); + + for (int yp = 0; yp < frame._height; ++yp) { + int xSize = frame._width; + while (xSize > 0) { + // Skip a given number of pixels + byte skip = *src++; + dst += skip; + xSize -= skip; + if (!xSize) + break; + + // Get a run length, and copy the following number of pixels + int rleCount = *src++; + xSize -= rleCount; + while (rleCount-- > 0) + *dst++ = *src++; + } + assert(xSize == 0); + } } else if (frame._rleEncoded) { // RLE encoded byte *dst = (byte *)frame._frame.getPixels(); |