From 8b14137c07bceda262e5423aadea830c761dc2bc Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 11 Nov 2010 19:22:56 +0000 Subject: 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 --- engines/sci/console.cpp | 33 +++------------------------------ engines/sci/engine/kvideo.cpp | 10 ++++++---- engines/sci/graphics/screen.cpp | 41 +++++++++++++++++++++++++++++++---------- 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); -- cgit v1.2.3