diff options
| author | Filippos Karapetis | 2010-11-11 19:22:56 +0000 | 
|---|---|---|
| committer | Filippos Karapetis | 2010-11-11 19:22:56 +0000 | 
| commit | 8b14137c07bceda262e5423aadea830c761dc2bc (patch) | |
| tree | e3feefa96d9fd5a55b6ac765dadc024a17edd33d /engines/sci | |
| parent | c624202c39215ea4b555567ee45abe01cac92133 (diff) | |
| download | scummvm-rg350-8b14137c07bceda262e5423aadea830c761dc2bc.tar.gz scummvm-rg350-8b14137c07bceda262e5423aadea830c761dc2bc.tar.bz2 scummvm-rg350-8b14137c07bceda262e5423aadea830c761dc2bc.zip  | |
SCI: Some video related changes
- Now playVideo() is used when playing videos from the console (reducing
code duplication)
- Added support for 16bpp scaling in scale2x, so that the 16-bit color
Duck videos are scaled correctly
svn-id: r54210
Diffstat (limited to 'engines/sci')
| -rw-r--r-- | engines/sci/console.cpp | 33 | ||||
| -rw-r--r-- | engines/sci/engine/kvideo.cpp | 10 | ||||
| -rw-r--r-- | engines/sci/graphics/screen.cpp | 41 | ||||
| -rw-r--r-- | engines/sci/graphics/screen.h | 2 | 
4 files changed, 41 insertions, 45 deletions
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index c5b8d2ae0d..6ddc1afe0a 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -226,6 +226,8 @@ void Console::preEnter() {  	_engine->pauseEngine(true);  } +extern void playVideo(Graphics::VideoDecoder *videoDecoder); +  void Console::postEnter() {  	if (!_videoFile.empty()) {  		Graphics::VideoDecoder *videoDecoder = 0; @@ -270,36 +272,7 @@ void Console::postEnter() {  			}  #endif -			uint16 x = (g_system->getWidth() - videoDecoder->getWidth()) / 2; -			uint16 y = (g_system->getHeight() - videoDecoder->getHeight()) / 2; -			bool skipVideo = false; - -			if (videoDecoder->hasDirtyPalette()) -				videoDecoder->setSystemPalette(); - -			while (!g_engine->shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) { -				if (videoDecoder->needsUpdate()) { -					Graphics::Surface *frame = videoDecoder->decodeNextFrame(); -					if (frame) { -						g_system->copyRectToScreen((byte *)frame->pixels, frame->pitch, x, y, frame->w, frame->h); - -						if (videoDecoder->hasDirtyPalette()) -							videoDecoder->setSystemPalette(); - -						g_system->updateScreen(); -					} -				} - -				Common::Event event; -				while (g_system->getEventManager()->pollEvent(event)) { -					if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) || event.type == Common::EVENT_LBUTTONUP) -						skipVideo = true; -				} - -				g_system->delayMillis(10); -			} -		 -			delete videoDecoder; +			playVideo(videoDecoder);  #ifdef ENABLE_SCI32  			// Switch back to 8bpp if we played a duck video diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp index 49b5e39eeb..9245572bbf 100644 --- a/engines/sci/engine/kvideo.cpp +++ b/engines/sci/engine/kvideo.cpp @@ -44,16 +44,18 @@ void playVideo(Graphics::VideoDecoder *videoDecoder) {  		return;  	byte *scaleBuffer = 0; +	byte bytesPerPixel = videoDecoder->getPixelFormat().bytesPerPixel;  	uint16 width = videoDecoder->getWidth();  	uint16 height = videoDecoder->getHeight(); +	uint16 pitch = videoDecoder->getWidth() * bytesPerPixel;  	uint16 screenWidth = g_system->getWidth();  	uint16 screenHeight = g_system->getHeight();  	if (screenWidth == 640 && width <= 320 && height <= 240) { -		assert(videoDecoder->getPixelFormat().bytesPerPixel == 1);  		width *= 2;  		height *= 2; -		scaleBuffer = new byte[width * height]; +		pitch *= 2; +		scaleBuffer = new byte[width * height * bytesPerPixel];  	}  	uint16 x = (screenWidth - width) / 2; @@ -69,8 +71,8 @@ void playVideo(Graphics::VideoDecoder *videoDecoder) {  			if (frame) {  				if (scaleBuffer) {  					// TODO: Probably should do aspect ratio correction in e.g. GK1 Windows  -					g_sci->_gfxScreen->scale2x((byte *)frame->pixels, scaleBuffer, videoDecoder->getWidth(), videoDecoder->getHeight()); -					g_system->copyRectToScreen(scaleBuffer, width, x, y, width, height); +					g_sci->_gfxScreen->scale2x((byte *)frame->pixels, scaleBuffer, videoDecoder->getWidth(), videoDecoder->getHeight(), bytesPerPixel); +					g_system->copyRectToScreen(scaleBuffer, pitch, x, y, width, height);  				} else  					g_system->copyRectToScreen((byte *)frame->pixels, frame->pitch, x, y, width, height); diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp index f8dc3118b5..5a96a3167f 100644 --- a/engines/sci/graphics/screen.cpp +++ b/engines/sci/graphics/screen.cpp @@ -654,20 +654,41 @@ void GfxScreen::debugShowMap(int mapNo) {  	copyToScreen();  } -void GfxScreen::scale2x(const byte *src, byte *dst, int16 srcWidth, int16 srcHeight) { +void GfxScreen::scale2x(const byte *src, byte *dst, int16 srcWidth, int16 srcHeight, byte bytesPerPixel) { +	assert(bytesPerPixel == 1 || bytesPerPixel == 2);  	const int newWidth = srcWidth * 2; +	const int pitch = newWidth * bytesPerPixel;  	const byte *srcPtr = src; -	for (int y = 0; y < srcHeight; y++) { -		for (int x = 0; x < srcWidth; x++) { -			const byte color = *srcPtr++; -			dst[0] = color; -			dst[1] = color; -			dst[newWidth] = color; -			dst[newWidth + 1] = color; -			dst += 2; +	if (bytesPerPixel == 1) { +		for (int y = 0; y < srcHeight; y++) { +			for (int x = 0; x < srcWidth; x++) { +				const byte color = *srcPtr++; +				dst[0] = color; +				dst[1] = color; +				dst[newWidth] = color; +				dst[newWidth + 1] = color; +				dst += 2; +			} +			dst += newWidth; +		} +	} else if (bytesPerPixel == 2) { +		for (int y = 0; y < srcHeight; y++) { +			for (int x = 0; x < srcWidth; x++) { +				const byte color = *srcPtr++; +				const byte color2 = *srcPtr++; +				dst[0] = color; +				dst[1] = color2; +				dst[2] = color; +				dst[3] = color2; +				dst[pitch] = color; +				dst[pitch + 1] = color2; +				dst[pitch + 2] = color; +				dst[pitch + 3] = color2; +				dst += 4; +			} +			dst += pitch;  		} -		dst += newWidth;  	}  } diff --git a/engines/sci/graphics/screen.h b/engines/sci/graphics/screen.h index 44746ae00b..dfc7a65311 100644 --- a/engines/sci/graphics/screen.h +++ b/engines/sci/graphics/screen.h @@ -109,7 +109,7 @@ public:  	void getPalette(Palette *pal);  	void setPalette(Palette *pal); -	void scale2x(const byte *src, byte *dst, int16 srcWidth, int16 srcHeight); +	void scale2x(const byte *src, byte *dst, int16 srcWidth, int16 srcHeight, byte bytesPerPixel = 1);  	void adjustToUpscaledCoordinates(int16 &y, int16 &x);  	void adjustBackUpscaledCoordinates(int16 &y, int16 &x);  | 
