aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippos Karapetis2010-11-11 19:22:56 +0000
committerFilippos Karapetis2010-11-11 19:22:56 +0000
commit8b14137c07bceda262e5423aadea830c761dc2bc (patch)
treee3feefa96d9fd5a55b6ac765dadc024a17edd33d
parentc624202c39215ea4b555567ee45abe01cac92133 (diff)
downloadscummvm-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
-rw-r--r--engines/sci/console.cpp33
-rw-r--r--engines/sci/engine/kvideo.cpp10
-rw-r--r--engines/sci/graphics/screen.cpp41
-rw-r--r--engines/sci/graphics/screen.h2
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);