diff options
| author | Travis Howell | 2006-10-13 02:22:33 +0000 | 
|---|---|---|
| committer | Travis Howell | 2006-10-13 02:22:33 +0000 | 
| commit | 1ab09fd79becbdc07ee0313a6e82c3d5124a3c83 (patch) | |
| tree | 0bf4a8ff719b6485597b7c69a60ee716293df1db | |
| parent | 929375ae21f92ef1b56908aba92ac6ca4563526f (diff) | |
| download | scummvm-rg350-1ab09fd79becbdc07ee0313a6e82c3d5124a3c83.tar.gz scummvm-rg350-1ab09fd79becbdc07ee0313a6e82c3d5124a3c83.tar.bz2 scummvm-rg350-1ab09fd79becbdc07ee0313a6e82c3d5124a3c83.zip | |
Fix display of icons in Elvira 1
svn-id: r24284
| -rw-r--r-- | engines/agos/agos.cpp | 24 | ||||
| -rw-r--r-- | engines/agos/icons.cpp | 67 | ||||
| -rw-r--r-- | engines/agos/window.cpp | 4 | 
3 files changed, 57 insertions, 38 deletions
| diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp index df1f07b3de..e85172f9ff 100644 --- a/engines/agos/agos.cpp +++ b/engines/agos/agos.cpp @@ -800,7 +800,7 @@ int AGOSEngine::getUserFlag(Item *item, int a) {  	if (subUserFlag == NULL)  		return 0; -	if (a < 0 || a > 3) +	if (a < 0 || a > 7)  		return 0;  	return	subUserFlag->userFlags[a]; @@ -814,8 +814,10 @@ void AGOSEngine::setUserFlag(Item *item, int a, int b) {  		subUserFlag = (SubUserFlag *) allocateChildBlock(item, 9, sizeof(SubUserFlag));  	} -	if (a >= 0 && a <= 3) -		subUserFlag->userFlags[a] = b; +	if (a < 0 || a > 7) +		return; + +	subUserFlag->userFlags[a] = b;  }  int AGOSEngine::getUserItem(Item *item, int n) { @@ -1300,14 +1302,18 @@ bool AGOSEngine::has_item_childflag_0x10(Item *item) {  }  uint AGOSEngine::itemGetIconNumber(Item *item) { -	SubObject *child = (SubObject *)findChildOfType(item, 2); -	uint offs; +	if (getGameType() == GType_ELVIRA1) { +		return getUserFlag(item, 7); +	} else { +		SubObject *child = (SubObject *)findChildOfType(item, 2); +		uint offs; -	if (child == NULL || !(child->objectFlags & kOFIcon)) -		return 0; +		if (child == NULL || !(child->objectFlags & kOFIcon)) +			return 0; -	offs = getOffsetOfChild2Param(child, 0x10); -	return child->objectFlagValue[offs]; +		offs = getOffsetOfChild2Param(child, 0x10); +		return child->objectFlagValue[offs]; +	}  }  void AGOSEngine::hitarea_stuff() { diff --git a/engines/agos/icons.cpp b/engines/agos/icons.cpp index a25f968b7b..eeee459af3 100644 --- a/engines/agos/icons.cpp +++ b/engines/agos/icons.cpp @@ -63,40 +63,44 @@ void AGOSEngine::loadIconData() {  // Thanks to Stuart Caie for providing the original  // C conversion upon which this function is based. -void decompressIconAmiga (byte *dst, byte *src, byte base, uint pitch) { +static void decompressIconAmiga(byte *dst, byte *src, byte base, uint pitch, bool decompress = true) {  	byte icon_pln[288]; -	byte *i, *o, x, y; - -	// Decode RLE planar icon data -	i = src; -	o = icon_pln; -	while (o < &icon_pln[288]) { -		x = *i++; -		if (x < 128) { -			do { -				*o++ = *i++; -				*o++ = *i++; -				*o++ = *i++; -			} while (x-- > 0); -		} else { -			x = 256 - x; -			do { -				*o++ = i[0]; -				*o++ = i[1]; -				*o++ = i[2]; -			} while (x-- > 0); -			i += 3; +	byte *i, *o, *srcPtr, x, y; + +	srcPtr = src; +	if (decompress) { +		// Decode RLE planar icon data +		i = src; +		o = icon_pln; +		while (o < &icon_pln[288]) { +			x = *i++; +			if (x < 128) { +				do { +					*o++ = *i++; +					*o++ = *i++; +					*o++ = *i++; +				} while (x-- > 0); +			} else { +				x = 256 - x; +				do { +					*o++ = i[0]; +					*o++ = i[1]; +					*o++ = i[2]; +				} while (x-- > 0); +				i += 3; +			}  		} +		srcPtr = icon_pln;  	}  	// Translate planar data to chunky (very slow method)  	for (y = 0; y < 24; y++) {  		for (x = 0; x < 24; x++) {  			byte pixel = -				  (icon_pln[((     y) * 3) + (x >> 3)] & (1 << (7 - (x & 7))) ? 1 : 0) -				| (icon_pln[((24 + y) * 3) + (x >> 3)] & (1 << (7 - (x & 7))) ? 2 : 0) -				| (icon_pln[((48 + y) * 3) + (x >> 3)] & (1 << (7 - (x & 7))) ? 4 : 0) -				| (icon_pln[((72 + y) * 3) + (x >> 3)] & (1 << (7 - (x & 7))) ? 8 : 0); +				  (srcPtr[((     y) * 3) + (x >> 3)] & (1 << (7 - (x & 7))) ? 1 : 0) +				| (srcPtr[((24 + y) * 3) + (x >> 3)] & (1 << (7 - (x & 7))) ? 2 : 0) +				| (srcPtr[((48 + y) * 3) + (x >> 3)] & (1 << (7 - (x & 7))) ? 4 : 0) +				| (srcPtr[((72 + y) * 3) + (x >> 3)] & (1 << (7 - (x & 7))) ? 8 : 0);  			if (pixel)  				dst[x] = pixel | base;  		} @@ -171,7 +175,6 @@ void AGOSEngine::draw_icon_c(WindowBlock *window, uint icon, uint x, uint y) {  	dst = getFrontBuf();  	if (getGameType() == GType_SIMON2) { -		// Simon 2  		dst += 110;  		dst += x;  		dst += (y + window->y) * _dxSurfacePitch; @@ -184,19 +187,25 @@ void AGOSEngine::draw_icon_c(WindowBlock *window, uint icon, uint x, uint y) {  		src += READ_LE_UINT16(&((uint16 *)src)[icon * 2 + 1]);  		decompressIcon(dst, src, 20, 10, 208, _dxSurfacePitch);  	} else if (getGameType() == GType_SIMON1) { -		// Simon 1  		dst += (x + window->x) * 8;  		dst += (y * 25 + window->y) * _dxSurfacePitch;  		if (getPlatform() == Common::kPlatformAmiga) {  			src = _iconFilePtr;  			src += READ_BE_UINT32(&((uint32 *)src)[icon]); -			decompressIconAmiga (dst, src, 16, _dxSurfacePitch); +			decompressIconAmiga(dst, src, 16, _dxSurfacePitch);  		} else {  			src = _iconFilePtr;  			src += READ_LE_UINT16(&((uint16 *)src)[icon]);  			decompressIcon(dst, src, 24, 12, 224, _dxSurfacePitch);  		} +	} else if (getGameType() == GType_ELVIRA1) { +		dst += (x + window->x) * 8; +		dst += (y * 8 + window->y) * _dxSurfacePitch; + +		src = _iconFilePtr; +		src += icon * 288; +		decompressIconAmiga(dst, src, 16, _dxSurfacePitch, false);  	} else {  		// TODO  	} diff --git a/engines/agos/window.cpp b/engines/agos/window.cpp index c863d59cdf..9bdec84b74 100644 --- a/engines/agos/window.cpp +++ b/engines/agos/window.cpp @@ -59,6 +59,10 @@ WindowBlock *AGOSEngine::openWindow(uint x, uint y, uint w, uint h, uint flags,  	window->textColumnOffset = 0;  	window->textMaxLength = window->width * 8 / 6; // characters are 6 pixels  	window->scrollY = 0; + +	if (getGameType() == GType_ELVIRA1) +		clearWindow(window); +  	return window;  } | 
