SHERLOCK: Simplify decompressFrame, and fix RT transparencies

This commit is contained in:
Paul Gilbert 2015-06-04 22:06:05 -04:00
parent bb1ebffbea
commit fb8e745e11

View file

@ -456,24 +456,23 @@ void ImageFile::loadPalette(Common::SeekableReadStream &stream) {
void ImageFile::decompressFrame(ImageFrame &frame, const byte *src) { void ImageFile::decompressFrame(ImageFrame &frame, const byte *src) {
frame._frame.create(frame._width, frame._height, Graphics::PixelFormat::createFormatCLUT8()); frame._frame.create(frame._width, frame._height, Graphics::PixelFormat::createFormatCLUT8());
byte *dest = (byte *)frame._frame.getPixels();
Common::fill(dest, dest + frame._width * frame._height, 0xff);
if (frame._paletteBase) { if (frame._paletteBase) {
// Nibble-packed // Nibble-packed
byte *pDest = (byte *)frame._frame.getPixels();
for (uint idx = 0; idx < frame._size; ++idx, ++src) { for (uint idx = 0; idx < frame._size; ++idx, ++src) {
*pDest++ = *src & 0xF; *dest++ = *src & 0xF;
*pDest++ = (*src >> 4); *dest++ = (*src >> 4);
} }
} else if (frame._rleEncoded && _vm->getGameID() == GType_RoseTattoo) { } else if (frame._rleEncoded && _vm->getGameID() == GType_RoseTattoo) {
// Rose Tattoo run length encoding doesn't use the RLE marker byte // 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) { for (int yp = 0; yp < frame._height; ++yp) {
int xSize = frame._width; int xSize = frame._width;
while (xSize > 0) { while (xSize > 0) {
// Skip a given number of pixels // Skip a given number of pixels
byte skip = *src++; byte skip = *src++;
dst += skip; dest += skip;
xSize -= skip; xSize -= skip;
if (!xSize) if (!xSize)
break; break;
@ -482,14 +481,12 @@ void ImageFile::decompressFrame(ImageFrame &frame, const byte *src) {
int rleCount = *src++; int rleCount = *src++;
xSize -= rleCount; xSize -= rleCount;
while (rleCount-- > 0) while (rleCount-- > 0)
*dst++ = *src++; *dest++ = *src++;
} }
assert(xSize == 0); assert(xSize == 0);
} }
} else if (frame._rleEncoded) { } else if (frame._rleEncoded) {
// RLE encoded // RLE encoded
byte *dst = (byte *)frame._frame.getPixels();
int frameSize = frame._width * frame._height; int frameSize = frame._width * frame._height;
while (frameSize > 0) { while (frameSize > 0) {
if (*src == frame._rleMarker) { if (*src == frame._rleMarker) {
@ -498,17 +495,16 @@ void ImageFile::decompressFrame(ImageFrame &frame, const byte *src) {
src += 3; src += 3;
frameSize -= rleCount; frameSize -= rleCount;
while (rleCount--) while (rleCount--)
*dst++ = rleColor; *dest++ = rleColor;
} else { } else {
*dst++ = *src++; *dest++ = *src++;
--frameSize; --frameSize;
} }
} }
assert(frameSize == 0); assert(frameSize == 0);
} else { } else {
// Uncompressed frame // Uncompressed frame
Common::copy(src, src + frame._width * frame._height, Common::copy(src, src + frame._width * frame._height, dest);
(byte *)frame._frame.getPixels());
} }
} }