SHERLOCK: Simplify decompressFrame, and fix RT transparencies
This commit is contained in:
parent
bb1ebffbea
commit
fb8e745e11
1 changed files with 9 additions and 13 deletions
|
@ -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());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue