diff options
| -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;  } | 
