diff options
author | Travis Howell | 2005-05-05 15:19:30 +0000 |
---|---|---|
committer | Travis Howell | 2005-05-05 15:19:30 +0000 |
commit | c16cceafad7aa370cacf6598b2fac24bf8337794 (patch) | |
tree | 20c90f7d43177234e0a4bf4312aea29c9ae41c37 /scumm | |
parent | e42ea7f20c69df1944b6271345860dec0f619245 (diff) | |
download | scummvm-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.cpp | 2 | ||||
-rw-r--r-- | scumm/wiz_he.cpp | 229 |
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; } |