SCI: Fix bug #3614914 - "SCI: Castle of Dr Brain Spanish crashes after Computer Room"

Ignore the unused x/y displacement fields of cels embedded in pics.
Dr. Brain Spanish, pic 261 contains garbage in these fields (probably
left overs)
This commit is contained in:
Filippos Karapetis 2013-08-19 06:30:19 +03:00
parent cc35c422cb
commit 0885a003c5

View File

@ -236,7 +236,9 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos
byte *ptr = NULL;
byte *headerPtr = inbuffer + headerPos;
byte *rlePtr = inbuffer + rlePos;
int16 displaceX, displaceY;
// displaceX, displaceY fields are ignored, and may contain garbage
// (e.g. pic 261 in Dr. Brain 1 Spanish - bug #3614914)
//int16 displaceX, displaceY;
byte priority = _addToFlag ? _priority : 0;
byte clearColor;
bool compression = true;
@ -251,8 +253,8 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos
// Width/height here are always LE, even in Mac versions
width = READ_LE_UINT16(headerPtr + 0);
height = READ_LE_UINT16(headerPtr + 2);
displaceX = (signed char)headerPtr[4];
displaceY = (unsigned char)headerPtr[5];
//displaceX = (signed char)headerPtr[4];
//displaceY = (unsigned char)headerPtr[5];
if (_resourceType == SCI_PICTURE_TYPE_SCI11)
// SCI1.1 uses hardcoded clearcolor for pictures, even if cel header specifies otherwise
clearColor = _screen->getColorWhite();
@ -262,16 +264,16 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos
} else {
width = READ_SCI11ENDIAN_UINT16(headerPtr + 0);
height = READ_SCI11ENDIAN_UINT16(headerPtr + 2);
displaceX = READ_SCI11ENDIAN_UINT16(headerPtr + 4); // probably signed?!?
displaceY = READ_SCI11ENDIAN_UINT16(headerPtr + 6); // probably signed?!?
//displaceX = READ_SCI11ENDIAN_UINT16(headerPtr + 4); // probably signed?!?
//displaceY = READ_SCI11ENDIAN_UINT16(headerPtr + 6); // probably signed?!?
clearColor = headerPtr[8];
if (headerPtr[9] == 0)
compression = false;
}
#endif
if (displaceX || displaceY)
error("unsupported embedded cel-data in picture");
//if (displaceX || displaceY)
// error("unsupported embedded cel-data in picture");
// We will unpack cel-data into a temporary buffer and then plot it to screen
// That needs to be done cause a mirrored picture may be requested