diff options
| author | James Brown | 2002-10-11 11:50:06 +0000 | 
|---|---|---|
| committer | James Brown | 2002-10-11 11:50:06 +0000 | 
| commit | 2d22cc45673e965ebbd70ce4acb5ed5e458701f1 (patch) | |
| tree | e27ba91948bdf9729889a0c08c0438dba6f213f6 | |
| parent | 4cf42ae9a8fbd122f268e8eb9dcce088ee0522be (diff) | |
| download | scummvm-rg350-2d22cc45673e965ebbd70ce4acb5ed5e458701f1.tar.gz scummvm-rg350-2d22cc45673e965ebbd70ce4acb5ed5e458701f1.tar.bz2 scummvm-rg350-2d22cc45673e965ebbd70ce4acb5ed5e458701f1.zip | |
Patch 621733: drawBomp() masking
svn-id: r5128
| -rw-r--r-- | scumm/gfx.cpp | 20 | ||||
| -rw-r--r-- | scumm/object.cpp | 36 | 
2 files changed, 50 insertions, 6 deletions
| diff --git a/scumm/gfx.cpp b/scumm/gfx.cpp index c8fee3c146..ed341641f2 100644 --- a/scumm/gfx.cpp +++ b/scumm/gfx.cpp @@ -1838,8 +1838,8 @@ void Scumm::updateDirtyRect(int virt, int left, int right, int top, int bottom,  		lp = (left >> 3) + _screenStartStrip;  		if (lp < 0)  			lp = 0; -		if (rp >= _realHeight) -			rp = _realHeight; +		if (rp >= 200) +			rp = 200;  		if (lp <= rp) {  			num = rp - lp + 1;  			sp = &gfxUsageBits[lp]; @@ -3194,6 +3194,7 @@ void Scumm::drawBomp(BompDrawData *bd, int param1, byte *dataPtr, int param2, in  	int src_x, src_y, dst_x, dst_y;  	uint scaled_width, scaled_height;  	int h = bd->srcheight; +	byte *mask = NULL;  	uint i;  	if (h == 0 || bd->srcwidth == 0) @@ -3217,6 +3218,11 @@ void Scumm::drawBomp(BompDrawData *bd, int param1, byte *dataPtr, int param2, in  		}  	} +	// We take charset masking into consideration, because otherwise the +	// inventory window in The Dig may overwrite text. + +	mask = getResourceAddress(rtBuffer, 9) + _screenStartStrip; +	  	// Select which rows and columns from the original to show in the  	// scaled version of the image. This is a pretty stupid way of scaling  	// images, but it will have to do for now. @@ -3267,8 +3273,11 @@ void Scumm::drawBomp(BompDrawData *bd, int param1, byte *dataPtr, int param2, in  				color = *src++;  				for (i = 0; i < num; i++) {  					if (bd->scale_x == 255 || scale_cols[src_x]) { -						if (dst_x >= 0 && dst_x < bd->outwidth) -							*d = blend(_currentPalette, color, *d); +						if (dst_x >= 0 && dst_x < bd->outwidth) { +							if (!(*(mask + dst_y * 40 + (dst_x >> 3)) & revBitMask[dst_x & 7])) +							 +								*d = blend(_currentPalette, color, *d); +						}  						d++;  						dst_x++;  					} @@ -3278,7 +3287,8 @@ void Scumm::drawBomp(BompDrawData *bd, int param1, byte *dataPtr, int param2, in  				for (i = 0; i < num; i++) {  					if (bd->scale_x == 255 || scale_cols[src_x]) {  						if (dst_x >= 0 && dst_x < bd->outwidth) -							*d = blend(_currentPalette, src[i], *d); +							if (!(*(mask + dst_y * 40 + (dst_x >> 3)) & revBitMask[dst_x & 7])) +								*d = blend(_currentPalette, src[i], *d);  						d++;  						dst_x++;  					} diff --git a/scumm/object.cpp b/scumm/object.cpp index 40896990a7..1a48d8e3a4 100644 --- a/scumm/object.cpp +++ b/scumm/object.cpp @@ -1268,7 +1268,41 @@ void Scumm::removeBlastObjects()  void Scumm::removeBlastObject(BlastObject *eo)  { -	restoreBG(eo->posX, eo->posY, eo->posX + eo->width, eo->posY + eo->height); +	VirtScreen *vs = &virtscr[0]; + +	int top, bottom, left, right; +	int left_strip, right_strip; +	int i; + +	top = eo->posY; +	bottom = eo->posY + eo->height; +	left = eo->posX; +	right = eo->posX + eo->width; + +	if (bottom < 0 || right < 0 || top > vs->height || left > vs->width) +		return; + +	if (top < 0) +		top = 0; +	if (bottom > vs->height) +		bottom = vs->height; +	if (left < 0) +		left = 0; +	if (right > vs->width) +		right = vs->width; + +	left_strip = left >> 3; +	right_strip = (right >> 3) + 1; + +	if (left_strip < 0) +		left_strip = 0; +	if (right_strip >= 200) +		right_strip = 200; + +	for (i = left_strip; i <= right_strip; i++) +		gdi.resetBackground(top, bottom, i); + +	updateDirtyRect(0, left, right, top, bottom, 0x40000000);  }  int Scumm::findFlObjectSlot() | 
