aboutsummaryrefslogtreecommitdiff
path: root/scumm
diff options
context:
space:
mode:
authorTravis Howell2005-05-05 15:19:30 +0000
committerTravis Howell2005-05-05 15:19:30 +0000
commitc16cceafad7aa370cacf6598b2fac24bf8337794 (patch)
tree20c90f7d43177234e0a4bf4312aea29c9ae41c37 /scumm
parente42ea7f20c69df1944b6271345860dec0f619245 (diff)
downloadscummvm-rg350-c16cceafad7aa370cacf6598b2fac24bf8337794.tar.gz
scummvm-rg350-c16cceafad7aa370cacf6598b2fac24bf8337794.tar.bz2
scummvm-rg350-c16cceafad7aa370cacf6598b2fac24bf8337794.zip
Get XMAP from correct resource.
Avoid regression. svn-id: r17922
Diffstat (limited to 'scumm')
-rw-r--r--scumm/resource_v7he.cpp2
-rw-r--r--scumm/wiz_he.cpp229
2 files changed, 121 insertions, 110 deletions
diff --git a/scumm/resource_v7he.cpp b/scumm/resource_v7he.cpp
index 5ec64c8e02..9e0be4efa9 100644
--- a/scumm/resource_v7he.cpp
+++ b/scumm/resource_v7he.cpp
@@ -1682,7 +1682,7 @@ void ScummEngine_v99he::readMAXS(int blockSize) {
_numImages = _fileHandle->readUint16LE();
_numSprites = _fileHandle->readUint16LE();
_numLocalScripts = _fileHandle->readUint16LE();
- _HEHeapSize = _fileHandle->readUint16LE(); // heap related
+ _HEHeapSize = _fileHandle->readUint16LE();
_numPalettes = _fileHandle->readUint16LE();
_numUnk = _fileHandle->readUint16LE();
_numTalkies = _fileHandle->readUint16LE();
diff --git a/scumm/wiz_he.cpp b/scumm/wiz_he.cpp
index cf02734300..756d7cea01 100644
--- a/scumm/wiz_he.cpp
+++ b/scumm/wiz_he.cpp
@@ -961,6 +961,7 @@ void ScummEngine_v72he::displayWizImage(WizImage *pwi) {
uint8 *ScummEngine_v72he::drawWizImage(int resNum, int state, int x1, int y1, int zorder, int xmapNum, int field_390, const Common::Rect *clipBox, int flags, int dstResNum, int paletteNum) {
debug(2, "drawWizImage(resNum %d, x1 %d y1 %d flags 0x%X zorder %d xmapNum %d field_390 %d dstResNum %d paletteNum %d)", resNum, x1, y1, flags, zorder, xmapNum, field_390, dstResNum, paletteNum);
uint8 *dst = NULL;
+
const uint8 *palPtr = NULL;
if (_heversion >= 99) {
if (paletteNum) {
@@ -969,131 +970,141 @@ uint8 *ScummEngine_v72he::drawWizImage(int resNum, int state, int x1, int y1, in
palPtr = _hePalettes + 1792;
}
}
+
+ const uint8 *xmap = NULL;
+ if (xmapNum) {
+ byte *xmapPtr = getResourceAddress(rtImage, xmapNum);
+ xmap = findResourceData(MKID('XMAP'), xmapPtr);
+ }
+
uint8 *dataPtr = getResourceAddress(rtImage, resNum);
- if (dataPtr) {
- uint8 *rmap = NULL;
- uint8 *xmap = findWrappedBlock(MKID('XMAP'), dataPtr, state, 0);
-
- uint8 *wizh = findWrappedBlock(MKID('WIZH'), dataPtr, state, 0);
- assert(wizh);
- uint32 comp = READ_LE_UINT32(wizh + 0x0);
- uint32 width = READ_LE_UINT32(wizh + 0x4);
- uint32 height = READ_LE_UINT32(wizh + 0x8);
- debug(2, "wiz_header.comp = %d wiz_header.w = %d wiz_header.h = %d", comp, width, height);
-
- uint8 *wizd = findWrappedBlock(MKID('WIZD'), dataPtr, state, 0);
- assert(wizd);
- if (flags & kWIFHasPalette) {
- uint8 *pal = findWrappedBlock(MKID('RGBS'), dataPtr, state, 0);
- assert(pal);
- setPaletteFromPtr(pal, 256);
- }
- if (flags & kWIFRemapPalette) {
- rmap = findWrappedBlock(MKID('RMAP'), dataPtr, state, 0);
- assert(rmap);
- if (_heversion <= 80 || READ_BE_UINT32(rmap) != 0x01234567) {
- uint8 *rgbs = findWrappedBlock(MKID('RGBS'), dataPtr, state, 0);
- assert(rgbs);
- remapHEPalette(rgbs, rmap + 4);
- }
- }
- if (flags & kWIFPrint) {
- warning("WizImage printing is unimplemented");
- return NULL;
- }
+ assert(dataPtr);
+ uint8 *wizh = findWrappedBlock(MKID('WIZH'), dataPtr, state, 0);
+ assert(wizh);
+ uint32 comp = READ_LE_UINT32(wizh + 0x0);
+ uint32 width = READ_LE_UINT32(wizh + 0x4);
+ uint32 height = READ_LE_UINT32(wizh + 0x8);
+ debug(2, "wiz_header.comp = %d wiz_header.w = %d wiz_header.h = %d", comp, width, height);
+
+ uint8 *wizd = findWrappedBlock(MKID('WIZD'), dataPtr, state, 0);
+ assert(wizd);
- int32 cw, ch;
- if (flags & kWIFBlitToMemBuffer) {
- dst = (uint8 *)malloc(width * height);
- int color = 255; // FIXME: should be (VAR_WIZ_TCOLOR != 0xFF) ? VAR(VAR_WIZ_TCOLOR) : 5;
- memset(dst, color, width * height);
- cw = width;
- ch = height;
- } else {
- if (dstResNum) {
- uint8 *dstPtr = getResourceAddress(rtImage, dstResNum);
- assert(dstPtr);
- dst = findWrappedBlock(MKID('WIZD'), dstPtr, 0, 0);
- assert(dst);
+ if (flags & kWIFHasPalette) {
+ uint8 *pal = findWrappedBlock(MKID('RGBS'), dataPtr, state, 0);
+ assert(pal);
+ setPaletteFromPtr(pal, 256);
+ }
- getWizImageDim(dstResNum, 0, cw, ch);
- } else {
- VirtScreen *pvs = &virtscr[kMainVirtScreen];
- if (flags & kWIFMarkBufferDirty) {
- dst = pvs->getPixels(0, pvs->topline);
- } else {
- dst = pvs->getBackPixels(0, pvs->topline);
- }
- cw = pvs->w;
- ch = pvs->h;
- }
+ uint8 *rmap = NULL;
+ if (flags & kWIFRemapPalette) {
+ rmap = findWrappedBlock(MKID('RMAP'), dataPtr, state, 0);
+ assert(rmap);
+ if (_heversion <= 80 || READ_BE_UINT32(rmap) != 0x01234567) {
+ uint8 *rgbs = findWrappedBlock(MKID('RGBS'), dataPtr, state, 0);
+ assert(rgbs);
+ remapHEPalette(rgbs, rmap + 4);
}
- Common::Rect rScreen(cw, ch);
- if (clipBox) {
- Common::Rect clip(clipBox->left, clipBox->top, clipBox->right, clipBox->bottom);
- if (rScreen.intersects(clip)) {
- rScreen.clip(clip);
- } else {
- return 0;
- }
- } else if (_wiz._rectOverrideEnabled) {
- if (rScreen.intersects(_wiz._rectOverride)) {
- rScreen.clip(_wiz._rectOverride);
+ }
+
+ if (flags & kWIFPrint) {
+ error("WizImage printing is unimplemented");
+ }
+
+ int32 cw, ch;
+ if (flags & kWIFBlitToMemBuffer) {
+ dst = (uint8 *)malloc(width * height);
+ int color = 255; // FIXME: should be (VAR_WIZ_TCOLOR != 0xFF) ? VAR(VAR_WIZ_TCOLOR) : 5;
+ memset(dst, color, width * height);
+ cw = width;
+ ch = height;
+ } else {
+ if (dstResNum) {
+ uint8 *dstPtr = getResourceAddress(rtImage, dstResNum);
+ assert(dstPtr);
+ dst = findWrappedBlock(MKID('WIZD'), dstPtr, 0, 0);
+ assert(dst);
+
+ getWizImageDim(dstResNum, 0, cw, ch);
+ } else {
+ VirtScreen *pvs = &virtscr[kMainVirtScreen];
+ if (flags & kWIFMarkBufferDirty) {
+ dst = pvs->getPixels(0, pvs->topline);
} else {
- return 0;
+ dst = pvs->getBackPixels(0, pvs->topline);
}
+ cw = pvs->w;
+ ch = pvs->h;
}
+ }
- // XXX handle 'XMAP' data
- if (xmap) {
- palPtr = xmap;
+ Common::Rect rScreen(cw, ch);
+ if (clipBox) {
+ Common::Rect clip(clipBox->left, clipBox->top, clipBox->right, clipBox->bottom);
+ if (rScreen.intersects(clip)) {
+ rScreen.clip(clip);
+ } else {
+ return 0;
}
- if (flags & kWIFRemapPalette) {
- palPtr = rmap + 4;
+ } else if (_wiz._rectOverrideEnabled) {
+ if (rScreen.intersects(_wiz._rectOverride)) {
+ rScreen.clip(_wiz._rectOverride);
+ } else {
+ return 0;
}
+ }
- uint8 *trns = findWrappedBlock(MKID('TRNS'), dataPtr, state, 0);
- int color = (trns == NULL) ? VAR(VAR_WIZ_TCOLOR) : -1;
+ // XXX handle 'XMAP' data
+ if (xmap) {
+ palPtr = xmap;
+ }
+ if (flags & kWIFRemapPalette) {
+ palPtr = rmap + 4;
+ }
- switch (comp) {
- case 0:
- _wiz.copyRawWizImage(dst, wizd, cw, ch, x1, y1, width, height, &rScreen, flags, palPtr, color);
- break;
- case 1:
- // TODO Adding masking for flags 0x80 and 0x100
- if (flags & 0x80) {
- // Used in maze
- warning("drawWizImage: Unhandled flag 0x80");
- } else if (flags & 0x100) {
- // Used in readdemo
- warning("drawWizImage: Unhandled flag 0x100");
- }
- _wiz.copyWizImage(dst, wizd, cw, ch, x1, y1, width, height, &rScreen, palPtr);
- break;
- case 2:
- _wiz.copyRaw16BitWizImage(dst, wizd, cw, ch, x1, y1, width, height, &rScreen, flags, palPtr, color);
- break;
- case 5:
- // Used in Moonbase Commander
- warning("drawWizImage: Unhandled wiz compression type %d", comp);
- break;
- default:
- error("drawWizImage: Unhandled wiz compression type %d", comp);
- }
+ int color;
+ uint8 *trns = findWrappedBlock(MKID('TRNS'), dataPtr, state, 0);
- if (!(flags & kWIFBlitToMemBuffer) && dstResNum == 0) {
- Common::Rect rImage(x1, y1, x1 + width, y1 + height);
- if (rImage.intersects(rScreen)) {
- rImage.clip(rScreen);
- if (!(flags & kWIFBlitToFrontVideoBuffer) && (flags & (kWIFBlitToFrontVideoBuffer | kWIFMarkBufferDirty))) {
- ++rImage.bottom;
- markRectAsDirty(kMainVirtScreen, rImage);
- } else {
- gdi.copyVirtScreenBuffers(rImage);
- }
+ switch (comp) {
+ case 0:
+ color = (trns == NULL) ? VAR(VAR_WIZ_TCOLOR) : -1;
+ _wiz.copyRawWizImage(dst, wizd, cw, ch, x1, y1, width, height, &rScreen, flags, palPtr, color);
+ break;
+ case 1:
+ // TODO Adding masking for flags 0x80 and 0x100
+ if (flags & 0x80) {
+ // Used in maze
+ warning("drawWizImage: Unhandled flag 0x80");
+ } else if (flags & 0x100) {
+ // Used in readdemo
+ warning("drawWizImage: Unhandled flag 0x100");
+ }
+ _wiz.copyWizImage(dst, wizd, cw, ch, x1, y1, width, height, &rScreen, palPtr);
+ break;
+ case 2:
+ color = (trns == NULL) ? VAR(VAR_WIZ_TCOLOR) : -1;
+ _wiz.copyRaw16BitWizImage(dst, wizd, cw, ch, x1, y1, width, height, &rScreen, flags, palPtr, color);
+ break;
+ case 5:
+ // Used in Moonbase Commander
+ warning("drawWizImage: Unhandled wiz compression type %d", comp);
+ break;
+ default:
+ error("drawWizImage: Unhandled wiz compression type %d", comp);
+ }
+
+ if (!(flags & kWIFBlitToMemBuffer) && dstResNum == 0) {
+ Common::Rect rImage(x1, y1, x1 + width, y1 + height);
+ if (rImage.intersects(rScreen)) {
+ rImage.clip(rScreen);
+ if (!(flags & kWIFBlitToFrontVideoBuffer) && (flags & (kWIFBlitToFrontVideoBuffer | kWIFMarkBufferDirty))) {
+ ++rImage.bottom;
+ markRectAsDirty(kMainVirtScreen, rImage);
+ } else {
+ gdi.copyVirtScreenBuffers(rImage);
}
}
}
+
return dst;
}