diff options
| author | Gregory Montoir | 2007-05-17 22:13:31 +0000 | 
|---|---|---|
| committer | Gregory Montoir | 2007-05-17 22:13:31 +0000 | 
| commit | e9827d0884318822b20d13dbe6465c78194e5ea2 (patch) | |
| tree | 27ad533e46001d04bd81045b088ce34ddf873fab | |
| parent | edaadd692feecd478f1b27df8aa35a68978e5c57 (diff) | |
| download | scummvm-rg350-e9827d0884318822b20d13dbe6465c78194e5ea2.tar.gz scummvm-rg350-e9827d0884318822b20d13dbe6465c78194e5ea2.tar.bz2 scummvm-rg350-e9827d0884318822b20d13dbe6465c78194e5ea2.zip  | |
added code for gfxSpriteFunc1 and gfxSpriteFunc2, which are used for sprite masking (see also bug #1624797)
svn-id: r26861
| -rw-r--r-- | engines/cine/gfx.cpp | 78 | ||||
| -rw-r--r-- | engines/cine/gfx.h | 6 | ||||
| -rw-r--r-- | engines/cine/various.cpp | 26 | 
3 files changed, 94 insertions, 16 deletions
diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp index b5cdecd7de..4abd25c65d 100644 --- a/engines/cine/gfx.cpp +++ b/engines/cine/gfx.cpp @@ -189,6 +189,84 @@ void gfxFillSprite(byte *spritePtr, uint16 width, uint16 height, byte *page, int  	}  } +// gfxDrawMaskedSprite +void gfxSpriteFunc1(byte *spritePtr, byte *maskPtr, uint16 width, uint16 height, byte *page, int16 x, int16 y) { +	int16 i, j; + +	for (i = 0; i < height; i++) { +		byte *destPtr = page + x + y * 320; +		destPtr += i * 320; + +		for (j = 0; j < width * 8; j++) { +			if (x + j >= 0 && x + j < 320 && i + y >= 0 && i + y < 200 && *maskPtr == 0) { +				*destPtr = *spritePtr; +			} +			++destPtr; +			++spritePtr; +			++maskPtr; +		} +	} +} + +// gfxUpdateSpriteMask +void gfxSpriteFunc2(byte *spritePtr, byte *spriteMskPtr, int16 width, int16 height, byte *maskPtr, +    int16 maskWidth, int16 maskHeight, byte *bufferSprPtr, byte *bufferMskPtr, int16 xs, int16 ys, int16 xm, int16 ym, byte maskIdx) { +    int16 i, j, d, spritePitch, maskPitch; +         +    width *= 8; +    maskWidth *= 8; + +    spritePitch = width; +    maskPitch = maskWidth; + +    if (maskIdx == 0) { +    	memcpy(bufferSprPtr, spritePtr, spritePitch * height); +    	memcpy(bufferMskPtr, spriteMskPtr, spritePitch * height); +    } +     +    if (ys > ym) { +    	d = ys - ym; +    	maskPtr += d * maskPitch; +    	maskHeight -= d; +    } +    if (maskHeight <= 0) { +    	return; +    } +    if (xs > xm) { +    	d = xs - xm; +    	maskPtr += d; +    	maskWidth -= d; +    } +    if (maskWidth <= 0) { +    	return; +    } +    if (ys < ym) { +    	d = ym - ys; +    	spriteMskPtr += d * spritePitch; +    	bufferMskPtr += d * spritePitch; +    	height -= d; +    } +    if (height <= 0) { +    	return; +    } +	if (xs < xm) { +    	d = xm - xs; +    	spriteMskPtr += d; +    	bufferMskPtr += d; +    	width -= d; +    } +    if (width <= 0) { +    	return; +    } +	for (j = 0; j < height; ++j) { +		for (i = 0; i < width; ++i) { +			bufferMskPtr[i] |= maskPtr[i] ^ 1; +		} +		bufferMskPtr += spritePitch; +		maskPtr += maskPitch; +	} +} +  void gfxDrawLine(int16 x1, int16 y1, int16 x2, int16 y2, byte color, byte *page) {  	if (x1 == x2) {  		if (y1 > y2) { diff --git a/engines/cine/gfx.h b/engines/cine/gfx.h index 08f7bae640..a993568281 100644 --- a/engines/cine/gfx.h +++ b/engines/cine/gfx.h @@ -45,11 +45,11 @@ void gfxCopyPage(byte *source, byte *dest);  void transformPaletteRange(byte startColor, byte numColor, int8 r, int8 g, int8 b);  void gfxFlipPage(void); -void gfxSpriteFunc1(byte *ptr, uint16 width, uint16 height, byte *page, int16 x, int16 y); +void gfxSpriteFunc1(byte *ptr, byte *msk, uint16 width, uint16 height, byte *page, int16 x, int16 y);  void gfxFillSprite(byte *src4, uint16 sw, uint16 sh, byte *dst4, int16 sx, int16 sy); -void gfxSpriteFunc2(byte *spritePtr, int16 width, int16 height, byte *maskPtr, -    int16 maskWidth, int16 maskHeight, byte *bufferPtr, int16 x, int16 y, byte maskIdx); +void gfxSpriteFunc2(byte *spritePtr, byte *spriteMskPtr, int16 width, int16 height, byte *maskPtr, +    int16 maskWidth, int16 maskHeight, byte *bufferSprPtr, byte *bufferMskPtr, int16 xs, int16 ys, int16 xm, int16 ym, byte maskIdx);  void gfxDrawLine(int16 x1, int16 y1, int16 x2, int16 y2, byte color, byte *page);  void gfxDrawPlainBox(int16 x1, int16 y1, int16 x2, int16 y2, byte color); diff --git a/engines/cine/various.cpp b/engines/cine/various.cpp index 92a38f969b..5479625eb1 100644 --- a/engines/cine/various.cpp +++ b/engines/cine/various.cpp @@ -2188,13 +2188,18 @@ uint16 executePlayerInput(void) {  void drawSprite(overlayHeadElement *currentOverlay, byte *spritePtr,  				byte *maskPtr, uint16 width, uint16 height, byte *page, int16 x, int16 y) { -#if 0  	byte *ptr = NULL; +	byte *msk = NULL;  	byte i = 0;  	uint16 si = 0;  	overlayHeadElement *pCurrentOverlay = currentOverlay; -	while (pCurrentOverlay) { // unfinished, probably for mask handling.. +	if (g_cine->getGameType() == Cine::GType_OS) { +		drawSpriteRaw2(spritePtr, objectTable[currentOverlay->objIdx].part, width, height, page, x, y); +		return; +	} + +	while (pCurrentOverlay) {  		if (pCurrentOverlay->type == 5) {  			int16 maskX;  			int16 maskY; @@ -2203,7 +2208,8 @@ void drawSprite(overlayHeadElement *currentOverlay, byte *spritePtr,  			uint16 maskSpriteIdx;  			if (!si) { -				ptr = (byte *)malloc(width * height); +				ptr = (byte *)malloc(width * 8 * height); +				msk = (byte *)malloc(width * 8 * height);  				si = 1;  			} @@ -2214,25 +2220,19 @@ void drawSprite(overlayHeadElement *currentOverlay, byte *spritePtr,  			maskWidth = animDataTable[maskSpriteIdx].width / 2;  			maskHeight = animDataTable[maskSpriteIdx].height; -	  -			gfxSpriteFunc2(spritePtr, width, height, animDataTable[maskSpriteIdx].ptr1, maskWidth, maskHeight, ptr, maskX - x,maskY - y, i++); +			gfxSpriteFunc2(spritePtr, maskPtr, width, height, animDataTable[maskSpriteIdx].ptr1, maskWidth, maskHeight, ptr, msk, x, y, maskX, maskY, i++);  		}  		pCurrentOverlay = pCurrentOverlay->next;  	}   	if (si) { -		gfxSpriteFunc1(ptr, width, height, page, x, y); +		gfxSpriteFunc1(ptr, msk, width, height, page, x, y);  		free(ptr); -	} else -#endif - -	if (g_cine->getGameType() == Cine::GType_OS) { -		drawSpriteRaw2(spritePtr, objectTable[currentOverlay->objIdx].part, width, height, page, x, y); +		free(msk);  	} else { -		drawSpriteRaw(spritePtr, maskPtr, width, height, page, x, y); +		gfxSpriteFunc1(spritePtr, maskPtr, width, height, page, x, y);  	} -  }  int16 additionalBgVScroll = 0;  | 
