aboutsummaryrefslogtreecommitdiff
path: root/sword2/resman.cpp
diff options
context:
space:
mode:
authorMax Horn2003-09-13 01:06:41 +0000
committerMax Horn2003-09-13 01:06:41 +0000
commitc96ce86cab7e5c0b7d3ddb90893e31332bfdbe91 (patch)
treea6253a481e67ce81f11c64dd0db268fff45a0147 /sword2/resman.cpp
parent01fc842d917abc69f94d97043e3d51d004584c82 (diff)
downloadscummvm-rg350-c96ce86cab7e5c0b7d3ddb90893e31332bfdbe91.tar.gz
scummvm-rg350-c96ce86cab7e5c0b7d3ddb90893e31332bfdbe91.tar.bz2
scummvm-rg350-c96ce86cab7e5c0b7d3ddb90893e31332bfdbe91.zip
<joostp> *Fingolfin does +5 damage to endian bug.
svn-id: r10199
Diffstat (limited to 'sword2/resman.cpp')
-rw-r--r--sword2/resman.cpp34
1 files changed, 19 insertions, 15 deletions
diff --git a/sword2/resman.cpp b/sword2/resman.cpp
index b8ac5bd8c6..d202200372 100644
--- a/sword2/resman.cpp
+++ b/sword2/resman.cpp
@@ -276,16 +276,22 @@ static void convertEndian(uint8 *file, uint32 len) {
animHead->feetEndY = SWAP_BYTES_16(animHead->feetEndY);
animHead->blend = SWAP_BYTES_16(animHead->blend);
- for (i = 0; i < animHead->noAnimFrames; i++) {
- _cdtEntry *cdtEntry = (_cdtEntry *) ( (uint8 *)animHead + sizeof(_animHeader) + i * sizeof(_cdtEntry) );
+ _cdtEntry *cdtEntry = (_cdtEntry *) (file + sizeof(_animHeader));
+ for (i = 0; i < animHead->noAnimFrames; i++, cdtEntry++) {
cdtEntry->x = (int16)SWAP_BYTES_16(cdtEntry->x);
cdtEntry->y = (int16)SWAP_BYTES_16(cdtEntry->y);
cdtEntry->frameOffset = SWAP_BYTES_32(cdtEntry->frameOffset);
_frameHeader *frameHeader = (_frameHeader *) (file + cdtEntry->frameOffset);
- frameHeader->compSize = SWAP_BYTES_32(frameHeader->compSize);
- frameHeader->width = SWAP_BYTES_16(frameHeader->width);
- frameHeader->height = SWAP_BYTES_16(frameHeader->height);
+ // Quick trick to prevent us from incorrectly applying the endian
+ // fixes multiple times. This assumes that frames are less than 1 MB
+ // (which seems reasonable) and also that their (swapped) sizes are
+ // not a multiple of 4096 (which also seems reasonable).
+ if (frameHeader->compSize & 0xFFF00000) {
+ frameHeader->compSize = SWAP_BYTES_32(frameHeader->compSize);
+ frameHeader->width = SWAP_BYTES_16(frameHeader->width);
+ frameHeader->height = SWAP_BYTES_16(frameHeader->height);
+ }
}
break;
}
@@ -303,17 +309,15 @@ static void convertEndian(uint8 *file, uint32 len) {
mscreenHeader->maskOffset = SWAP_BYTES_32(mscreenHeader->maskOffset);
// screenHeader
- _screenHeader *screenHeader = (_screenHeader*) ((uint8 *) mscreenHeader + mscreenHeader->screen);
+ _screenHeader *screenHeader = (_screenHeader*) (file + mscreenHeader->screen);
screenHeader->width = SWAP_BYTES_16(screenHeader->width);
screenHeader->height = SWAP_BYTES_16(screenHeader->height);
screenHeader->noLayers = SWAP_BYTES_16(screenHeader->noLayers);
// layerHeader
- _layerHeader *layerHeader;
- for (i = 0; i < screenHeader->noLayers; i++) {
- layerHeader = (_layerHeader *) ((uint8 *) mscreenHeader + mscreenHeader->layers + (i * sizeof(_layerHeader)));
-
+ _layerHeader *layerHeader = (_layerHeader *) (file + mscreenHeader->layers);
+ for (i = 0; i < screenHeader->noLayers; i++, layerHeader++) {
layerHeader->x = SWAP_BYTES_16(layerHeader->x);
layerHeader->y = SWAP_BYTES_16(layerHeader->y);
layerHeader->width = SWAP_BYTES_16(layerHeader->width);
@@ -327,14 +331,14 @@ static void convertEndian(uint8 *file, uint32 len) {
int offset;
offset = mscreenHeader->bg_parallax[0];
if (offset > 0) {
- parallax = (_parallax *) ((uint8 *) mscreenHeader + offset);
+ parallax = (_parallax *) (file + offset);
parallax->w = SWAP_BYTES_16(parallax->w);
parallax->h = SWAP_BYTES_16(parallax->h);
}
offset = mscreenHeader->bg_parallax[1];
if (offset > 0) {
- parallax = (_parallax *) ((uint8 *) mscreenHeader + offset);
+ parallax = (_parallax *) (file + offset);
parallax->w = SWAP_BYTES_16(parallax->w);
parallax->h = SWAP_BYTES_16(parallax->h);
}
@@ -342,7 +346,7 @@ static void convertEndian(uint8 *file, uint32 len) {
// backgroundLayer
offset = mscreenHeader->screen + sizeof(_screenHeader);
if (offset > 0) {
- parallax = (_parallax *) ((uint8 *) mscreenHeader + offset);
+ parallax = (_parallax *) (file + offset);
parallax->w = SWAP_BYTES_16(parallax->w);
parallax->h = SWAP_BYTES_16(parallax->h);
}
@@ -350,14 +354,14 @@ static void convertEndian(uint8 *file, uint32 len) {
// foregroundParallaxLayer
offset = mscreenHeader->fg_parallax[0];
if (offset > 0) {
- parallax = (_parallax *) ((uint8 *) mscreenHeader + offset);
+ parallax = (_parallax *) (file + offset);
parallax->w = SWAP_BYTES_16(parallax->w);
parallax->h = SWAP_BYTES_16(parallax->h);
}
offset = mscreenHeader->fg_parallax[1];
if (offset > 0) {
- parallax = (_parallax *) ((uint8 *) mscreenHeader + offset);
+ parallax = (_parallax *) (file + offset);
parallax->w = SWAP_BYTES_16(parallax->w);
parallax->h = SWAP_BYTES_16(parallax->h);
}