aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--image/pict.cpp26
-rw-r--r--image/pict.h1
2 files changed, 23 insertions, 4 deletions
diff --git a/image/pict.cpp b/image/pict.cpp
index 1a1d03d7de..a82bba034e 100644
--- a/image/pict.cpp
+++ b/image/pict.cpp
@@ -75,6 +75,7 @@ void PICTDecoder::setupOpcodesCommon() {
void PICTDecoder::setupOpcodesNormal() {
setupOpcodesCommon();
+ OPCODE(0x0090, on_bitsRect, "BitsRect");
OPCODE(0x0098, on_packBitsRect, "PackBitsRect");
OPCODE(0x009A, on_directBitsRect, "DirectBitsRect");
OPCODE(0x8200, on_compressedQuickTime, "CompressedQuickTime");
@@ -165,6 +166,11 @@ void PICTDecoder::o_headerOp(Common::SeekableReadStream &stream) {
stream.readUint32BE(); // Reserved
}
+void PICTDecoder::on_bitsRect(Common::SeekableReadStream &stream) {
+ // Copy unpacked data with clipped rectangle (8bpp or lower)
+ unpackBitsRect(stream, true);
+}
+
void PICTDecoder::on_packBitsRect(Common::SeekableReadStream &stream) {
// Unpack data (8bpp or lower)
unpackBitsRect(stream, true);
@@ -344,13 +350,25 @@ void PICTDecoder::unpackBitsRect(Common::SeekableReadStream &stream, bool withPa
// Read in amount of data per row
for (uint16 i = 0; i < packBitsData.pixMap.bounds.height(); i++) {
- // NOTE: Compression 0 is "default". The format in SCI games is packed when 0.
- // In the future, we may need to have something to set the "default" packing
+ // NOTE: Compression 0 is "default". The format in SCI games is packed when 0
+ // unless rowBytes is less than 8 in which case the pict can't be packed,
+ // such as the shovel inventory icon in FPFP Mac. (bug #7059)
+ // In the future, we may need to have something to set the "default" packing
// format, but this is good for now.
if (packBitsData.pixMap.packType == 1 || packBitsData.pixMap.rowBytes < 8) { // Unpacked, Pad-Byte (on 24-bit)
- // TODO: Finish this. Hasn't been needed (yet).
- error("Unpacked DirectBitsRect data (padded)");
+ // only support 1 bpp for now as there is currently only one known
+ // SCI pict that requires any unpacked support.
+ if (bytesPerPixel == 1 && packBitsData.pixMap.pixelSize == 8) {
+ stream.read(&buffer[i * width], width);
+ if (width < packBitsData.pixMap.rowBytes) {
+ // skip padding and/or clipped bytes
+ stream.seek(packBitsData.pixMap.rowBytes - width, SEEK_CUR);
+ }
+ } else {
+ // TODO: Finish this. Hasn't been needed (yet).
+ error("Unpacked DirectBitsRect data (padded) with bytes per pixel: %d and pixel size: %d", bytesPerPixel, packBitsData.pixMap.pixelSize);
+ }
} else if (packBitsData.pixMap.packType == 2) { // Unpacked, No Pad-Byte (on 24-bit)
// TODO: Finish this. Hasn't been needed (yet).
error("Unpacked DirectBitsRect data (not padded)");
diff --git a/image/pict.h b/image/pict.h
index 77b450f4a2..7fd65c6052 100644
--- a/image/pict.h
+++ b/image/pict.h
@@ -123,6 +123,7 @@ private:
// Regular-mode Opcodes
void setupOpcodesNormal();
+ DECLARE_OPCODE(on_bitsRect);
DECLARE_OPCODE(on_packBitsRect);
DECLARE_OPCODE(on_directBitsRect);
DECLARE_OPCODE(on_compressedQuickTime);