diff options
| author | Jordi Vilalta Prat | 2009-06-17 22:34:44 +0000 | 
|---|---|---|
| committer | Jordi Vilalta Prat | 2009-06-17 22:34:44 +0000 | 
| commit | e1c93e7342770f052bc0aecf4aab760e7008bb65 (patch) | |
| tree | e32a9bdc309fe544e76fb248d6c9c4be9c5b9656 | |
| parent | a9755e25475f55c8831c901396ffa78b6f86d971 (diff) | |
| download | scummvm-rg350-e1c93e7342770f052bc0aecf4aab760e7008bb65.tar.gz scummvm-rg350-e1c93e7342770f052bc0aecf4aab760e7008bb65.tar.bz2 scummvm-rg350-e1c93e7342770f052bc0aecf4aab760e7008bb65.zip  | |
Groovie: Initial support for 16bit screen surfaces
svn-id: r41615
| -rw-r--r-- | engines/groovie/groovie.cpp | 12 | ||||
| -rw-r--r-- | engines/groovie/groovie.h | 3 | ||||
| -rw-r--r-- | engines/groovie/roq.cpp | 53 | 
3 files changed, 62 insertions, 6 deletions
diff --git a/engines/groovie/groovie.cpp b/engines/groovie/groovie.cpp index 6e18b86062..5d89799648 100644 --- a/engines/groovie/groovie.cpp +++ b/engines/groovie/groovie.cpp @@ -70,7 +70,17 @@ GroovieEngine::~GroovieEngine() {  Common::Error GroovieEngine::run() {  	// Initialize the graphics -	initGraphics(640, 480, true); +	switch (_gameDescription->version) { +	case kGroovieV2: +#ifdef ENABLE_16BIT +		_pixelFormat = _system->getBestFormat(); +		initGraphics(640, 480, true, _pixelFormat); +		break; +#endif +	case kGroovieT7G: +		initGraphics(640, 480, true); +		break; +	}  	// Create debugger. It requires GFX to be initialized  	_debugger = new Debugger(this); diff --git a/engines/groovie/groovie.h b/engines/groovie/groovie.h index a137193adf..adc6986a87 100644 --- a/engines/groovie/groovie.h +++ b/engines/groovie/groovie.h @@ -85,6 +85,9 @@ protected:  public:  	void waitForInput(); +#ifdef ENABLE_16BIT +	Graphics::PixelFormat _pixelFormat; +#endif  	Script _script;  	ResMan *_resMan;  	GrvCursorMan *_grvCursorMan; diff --git a/engines/groovie/roq.cpp b/engines/groovie/roq.cpp index 28d0d23fc1..95acb64f6a 100644 --- a/engines/groovie/roq.cpp +++ b/engines/groovie/roq.cpp @@ -29,6 +29,10 @@  #include "groovie/groovie.h"  #include "groovie/roq.h" +#ifdef ENABLE_16BIT +// Required for the YUV to RGB conversion +#include "graphics/dither.h" +#endif  #include "sound/mixer.h"  namespace Groovie { @@ -43,6 +47,7 @@ ROQPlayer::ROQPlayer(GroovieEngine *vm) :  	_currBuf = new Graphics::Surface();  	_prevBuf = new Graphics::Surface(); +#ifndef ENABLE_16BIT  	byte pal[256 * 4];  #ifdef DITHER  	byte pal3[256 * 3]; @@ -77,16 +82,17 @@ ROQPlayer::ROQPlayer(GroovieEngine *vm) :  		pal[(i * 4) + 1] = pal3[(i * 3) + 1];  		pal[(i * 4) + 2] = pal3[(i * 3) + 2];  	} -#else +#else // !DITHER  	// Set a grayscale palette  	for (int i = 0; i < 256; i++) {  		pal[(i * 4) + 0] = i;  		pal[(i * 4) + 1] = i;  		pal[(i * 4) + 2] = i;  	} -#endif +#endif // DITHER  	_syst->setPalette(pal, 0, 256); +#endif // !ENABLE_16BIT  }  ROQPlayer::~ROQPlayer() { @@ -154,13 +160,26 @@ void ROQPlayer::buildShowBuf() {  		byte *out = (byte *)_showBuf.getBasePtr(0, line);  		byte *in = (byte *)_prevBuf->getBasePtr(0, line / _scaleY);  		for (int x = 0; x < _showBuf.w; x++) { +#ifdef ENABLE_16BIT +			// Do the format conversion (YUV -> RGB -> Screen format) +			byte r, g, b; +			Graphics::PaletteLUT::YUV2RGB(*in, *(in + 1), *(in + 2), r, g, b); +			// FIXME: this is fixed to 16bit +			*(uint16 *)out = (uint16)_vm->_pixelFormat.RGBToColor(r, g, b); +			 +			// Skip to the next pixel +			out += _vm->_pixelFormat.bytesPerPixel; +#else // !ENABLE_16BIT  #ifdef DITHER  			*out = _dither->dither(*in, *(in + 1), *(in + 2), x);  #else  			// Just use the luminancy component  			*out = *in; -#endif +#endif // DITHER +			// Skip to the next pixel  			out++; +#endif // ENABLE_16BIT +  			if (!(x % _scaleX))  				in += _prevBuf->bytesPerPixel;  		} @@ -189,7 +208,7 @@ bool ROQPlayer::playFrameInternal() {  	if (_dirty) {  		// Update the screen -		_syst->copyRectToScreen((byte *)_showBuf.getBasePtr(0, 0), _showBuf.w, 0, (_syst->getHeight() - _showBuf.h) / 2, _showBuf.pitch, _showBuf.h); +		_syst->copyRectToScreen((byte *)_showBuf.getBasePtr(0, 0), _showBuf.pitch, 0, (_syst->getHeight() - _showBuf.h) / 2, _showBuf.w, _showBuf.h);  		_syst->updateScreen();  		// Clear the dirty flag @@ -316,7 +335,23 @@ bool ROQPlayer::processBlockInfo(ROQBlockHeader &blockHeader) {  		// Allocate new buffers  		_currBuf->create(width, height, 3);  		_prevBuf->create(width, height, 3); +#ifdef ENABLE_16BIT +		_showBuf.create(width * _scaleX, height * _scaleY, _vm->_pixelFormat.bytesPerPixel); +#else  		_showBuf.create(width * _scaleX, height * _scaleY, 1); +#endif + +		// Clear the buffers with black YUV values +		byte *ptr1 = (byte *)_currBuf->getBasePtr(0, 0); +		byte *ptr2 = (byte *)_prevBuf->getBasePtr(0, 0); +		for (int i = 0; i < width * height; i++) { +			*ptr1++ = 0; +			*ptr1++ = 128; +			*ptr1++ = 128; +			*ptr2++ = 0; +			*ptr2++ = 128; +			*ptr2++ = 128; +		}  #ifdef DITHER  		// Reset the dithering algorithm with the new width @@ -456,7 +491,15 @@ bool ROQPlayer::processBlockStill(ROQBlockHeader &blockHeader) {  	debugC(5, kGroovieDebugVideo | kGroovieDebugAll, "Groovie::ROQ: Processing still (JPEG) block");  	warning("Groovie::ROQ: JPEG frame (unimplemented)"); -	memset(_prevBuf->getBasePtr(0, 0), 0, _prevBuf->w * _prevBuf->h * _prevBuf->bytesPerPixel); + +	// HACK: Initialize to a black frame +	//memset(_prevBuf->getBasePtr(0, 0), 0, _prevBuf->w * _prevBuf->h * _prevBuf->bytesPerPixel); +	byte *ptr = (byte *)_prevBuf->getBasePtr(0, 0); +	for (int i = 0; i < _prevBuf->w * _prevBuf->h; i++) { +		*ptr++ = 0; +		*ptr++ = 128; +		*ptr++ = 128; +	}  	_file->skip(blockHeader.size);  	return true;  | 
