mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-13 07:14:59 +00:00
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:
parent
cc35c422cb
commit
0885a003c5
@ -236,7 +236,9 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos
|
|||||||
byte *ptr = NULL;
|
byte *ptr = NULL;
|
||||||
byte *headerPtr = inbuffer + headerPos;
|
byte *headerPtr = inbuffer + headerPos;
|
||||||
byte *rlePtr = inbuffer + rlePos;
|
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 priority = _addToFlag ? _priority : 0;
|
||||||
byte clearColor;
|
byte clearColor;
|
||||||
bool compression = true;
|
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/height here are always LE, even in Mac versions
|
||||||
width = READ_LE_UINT16(headerPtr + 0);
|
width = READ_LE_UINT16(headerPtr + 0);
|
||||||
height = READ_LE_UINT16(headerPtr + 2);
|
height = READ_LE_UINT16(headerPtr + 2);
|
||||||
displaceX = (signed char)headerPtr[4];
|
//displaceX = (signed char)headerPtr[4];
|
||||||
displaceY = (unsigned char)headerPtr[5];
|
//displaceY = (unsigned char)headerPtr[5];
|
||||||
if (_resourceType == SCI_PICTURE_TYPE_SCI11)
|
if (_resourceType == SCI_PICTURE_TYPE_SCI11)
|
||||||
// SCI1.1 uses hardcoded clearcolor for pictures, even if cel header specifies otherwise
|
// SCI1.1 uses hardcoded clearcolor for pictures, even if cel header specifies otherwise
|
||||||
clearColor = _screen->getColorWhite();
|
clearColor = _screen->getColorWhite();
|
||||||
@ -262,16 +264,16 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos
|
|||||||
} else {
|
} else {
|
||||||
width = READ_SCI11ENDIAN_UINT16(headerPtr + 0);
|
width = READ_SCI11ENDIAN_UINT16(headerPtr + 0);
|
||||||
height = READ_SCI11ENDIAN_UINT16(headerPtr + 2);
|
height = READ_SCI11ENDIAN_UINT16(headerPtr + 2);
|
||||||
displaceX = READ_SCI11ENDIAN_UINT16(headerPtr + 4); // probably signed?!?
|
//displaceX = READ_SCI11ENDIAN_UINT16(headerPtr + 4); // probably signed?!?
|
||||||
displaceY = READ_SCI11ENDIAN_UINT16(headerPtr + 6); // probably signed?!?
|
//displaceY = READ_SCI11ENDIAN_UINT16(headerPtr + 6); // probably signed?!?
|
||||||
clearColor = headerPtr[8];
|
clearColor = headerPtr[8];
|
||||||
if (headerPtr[9] == 0)
|
if (headerPtr[9] == 0)
|
||||||
compression = false;
|
compression = false;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (displaceX || displaceY)
|
//if (displaceX || displaceY)
|
||||||
error("unsupported embedded cel-data in picture");
|
// error("unsupported embedded cel-data in picture");
|
||||||
|
|
||||||
// We will unpack cel-data into a temporary buffer and then plot it to screen
|
// 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
|
// That needs to be done cause a mirrored picture may be requested
|
||||||
|
Loading…
x
Reference in New Issue
Block a user