diff options
| -rw-r--r-- | scumm/gfx.cpp | 45 | 
1 files changed, 35 insertions, 10 deletions
diff --git a/scumm/gfx.cpp b/scumm/gfx.cpp index 349a239f51..7322099552 100644 --- a/scumm/gfx.cpp +++ b/scumm/gfx.cpp @@ -66,7 +66,7 @@ struct TransitionEffect {  #ifdef __PALM_OS__  static const TransitionEffect *transitionEffects;  #else -static const TransitionEffect transitionEffects[4] = { +static const TransitionEffect transitionEffects[5] = {  	// Iris effect (looks like an opening/closing camera iris)  	{  		13,		// Number of iterations @@ -100,7 +100,23 @@ static const TransitionEffect transitionEffects[4] = {  		  255,  0,  0,  0  		}  	}, -	 + +	// Inverse iris effect, specially tailored for V2 games +	{ +		8,		// Number of iterations +		{ +			-1, -1,  1, -1, +			-1,  1,  1,  1, +			-1, -1, -1,  1, +			 1, -1,  1,  1 +		}, +		{ +			 7, 7, 32, 7, +			 7, 8, 32, 8, +			 7, 8,  7, 8, +			32, 7, 32, 8 +		} +	},  	// Box wipe (a box expands from the lower-right corner to the upper-left corner)  	{ @@ -1153,7 +1169,7 @@ void Gdi::drawBitmap(const byte *ptr, VirtScreen *vs, int x, int y, const int wi  		if (_vm->_features & GF_AFTER_V1) {  			mask_ptr = _vm->getResourceAddress(rtBuffer, 9) + y * _numStrips + x + _imgBufOffs[1]; -//			drawStripC64Mask(mask_ptr, stripnr, height); +			drawStripC64Mask(mask_ptr, stripnr, height);  		} else if (_vm->_features & GF_AFTER_V2) {  			// Do nothing here for V2 games - zplane was handled already.  		} else if (flag & dbDrawMaskOnAll) { @@ -1352,7 +1368,7 @@ void Gdi::drawStripC64Background(byte *dst, int stripnr, int height) {  }  void Gdi::drawStripC64Mask(byte *dst, int stripnr, int height) { -	for(int y = 0; y < (height / 8); y++) { +	for(int y = 0; y < (height >> 3); y++) {  		for(int i = 0; i < 8; i++) {  			for(int j = 7; j >= 0; j--) {  				*(dst + (7 - j) + stripnr * 8 + (y * 8 + i) * _vm->_screenWidth) = @@ -2129,7 +2145,15 @@ void Scumm::fadeIn(int effect) {  	case 2:  	case 3:  	case 4: -		transitionEffect(effect - 1); +	case 5: +					// Some of the transition effects won't work properly unless +					// the screen is marked as clean first. At first I thought I +					// could safely do this every time fadeIn() was called, but +					// that broke the FOA intro. Probably other things as well. +					// +					// Hopefully it's safe to do it at this point, at least. +		virtscr[0].setDirtyRange(0, 0); + 		transitionEffect(effect - 1);  		break;  	case 128:  		unkScreenEffect6(); @@ -2173,6 +2197,7 @@ void Scumm::fadeOut(int effect) {  		case 2:  		case 3:  		case 4: +		case 5:  			transitionEffect(effect - 1);  			break;  		case 128: @@ -2246,7 +2271,9 @@ void Scumm::transitionEffect(int a) {  					continue;  				if (b > bottom)  					b = bottom; -				virtscr[0].tdirty[l] = t << 3; +				if (t < 0) +					t = 0; + 				virtscr[0].tdirty[l] = t << 3;  				virtscr[0].bdirty[l] = (b + 1) << 3;  			}  			updateDirtyScreen(0); @@ -2973,8 +3000,7 @@ void Scumm::darkenPalette(int redScale, int greenScale, int blueScale, int start  	}  } -static double value(double n1, double n2, double hue) -{ +static double value(double n1, double n2, double hue) {  	if (hue > 360.0)  		hue = hue - 360.0;  	else if (hue < 0.0) @@ -2999,8 +3025,7 @@ static double value(double n1, double n2, double hue)   *    * @todo Rewrite desaturatePalette using integer arithmetics only?   */ -void Scumm::desaturatePalette(int hueScale, int satScale, int lightScale, int startColor, int endColor) -{ +void Scumm::desaturatePalette(int hueScale, int satScale, int lightScale, int startColor, int endColor) {  	if (startColor <= endColor) {  		const byte *cptr;  | 
