aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/zvision/video.cpp79
-rw-r--r--engines/zvision/zvision.cpp10
-rw-r--r--engines/zvision/zvision.h5
3 files changed, 44 insertions, 50 deletions
diff --git a/engines/zvision/video.cpp b/engines/zvision/video.cpp
index 8f77554619..5e27e3ada1 100644
--- a/engines/zvision/video.cpp
+++ b/engines/zvision/video.cpp
@@ -21,16 +21,14 @@
*/
#include "common/scummsys.h"
+
#include "common/system.h"
+#include "engines/util.h"
-#include "engines/engine.h"
-#include "graphics/decoders/tga.h"
+#include "graphics/surface.h"
-#include "zvision/zork_avi_decoder.h"
-#include "zvision/zork_raw.h"
+#include "zvision/zvision.h"
-#include "common/events.h"
-#include "common/file.h"
namespace ZVision {
@@ -73,63 +71,50 @@ void scale2x(const byte *src, byte *dst, int16 srcWidth, int16 srcHeight, byte b
}
}
-void playVideo(Video::VideoDecoder *videoDecoder /*, VideoState videoState*/) {
+void ZVision::startVideo(Video::VideoDecoder *videoDecoder) {
if (!videoDecoder)
return;
- videoDecoder->start();
+ _currentVideo = videoDecoder;
- byte *scaleBuffer = 0;
- byte bytesPerPixel = videoDecoder->getPixelFormat().bytesPerPixel;
- uint16 width = videoDecoder->getWidth();
- uint16 height = videoDecoder->getHeight();
- uint16 pitch = videoDecoder->getWidth() * bytesPerPixel;
- uint16 screenWidth = 640;//g_sci->_gfxScreen->getDisplayWidth();
- uint16 screenHeight = 480;//g_sci->_gfxScreen->getDisplayHeight();
+ Common::List<Graphics::PixelFormat> formats;
+ formats.push_back(videoDecoder->getPixelFormat());
+ initGraphics(640, 480, true, formats);
+ _currentVideo->start();
- bool zoom2x = true;
+ continueVideo();
+}
- if (zoom2x) {
- width *= 2;
- height *= 2;
- pitch *= 2;
- scaleBuffer = new byte[width * height * bytesPerPixel];
+void ZVision::continueVideo() {
+ if (_currentVideo == 0) {
+ warning("No video loaded. Nothing to continue");
+ return;
}
- uint16 x, y;
-
- x = (screenWidth - width) / 2;
- y = (screenHeight - height) / 2;
+ byte bytesPerPixel = _currentVideo->getPixelFormat().bytesPerPixel;
+ uint16 width = _currentVideo->getWidth();
+ uint16 height = _currentVideo->getHeight();
+ uint16 pitch = _currentVideo->getWidth() * bytesPerPixel;
- bool skipVideo = false;
+ uint16 x = (_system->getWidth() - width) / 2;
+ uint16 y = (_system->getWidth() - height) / 2;
- while (!g_engine->shouldQuit() && !videoDecoder->endOfVideo() && !skipVideo) {
- if (videoDecoder->needsUpdate()) {
- const Graphics::Surface *frame = videoDecoder->decodeNextFrame();
+ if (!_currentVideo->endOfVideo()) {
+ if (_currentVideo->needsUpdate()) {
+ const Graphics::Surface *frame = _currentVideo->decodeNextFrame();
if (frame) {
- if (scaleBuffer) {
- scale2x((byte *)frame->pixels, scaleBuffer, videoDecoder->getWidth(), videoDecoder->getHeight(), bytesPerPixel);
- g_system->copyRectToScreen(scaleBuffer, pitch, x, y, width, height);
- } else {
- g_system->copyRectToScreen(frame->pixels, frame->pitch, x, y, width, height);
- }
-
- g_system->updateScreen();
- }
- }
+ _system->copyRectToScreen(frame->pixels, pitch, x, y, width, height);
- 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;
+ _needsScreenUpdate = true;
+ }
}
-
- g_system->delayMillis(10);
+ } else {
+ initGraphics(_width, _height, true, &_pixelFormat);
+ delete _currentVideo;
+ _currentVideo = 0;
}
- delete[] scaleBuffer;
- delete videoDecoder;
}
} // End of namespace ZVision
diff --git a/engines/zvision/zvision.cpp b/engines/zvision/zvision.cpp
index ac810d8d07..de1730f354 100644
--- a/engines/zvision/zvision.cpp
+++ b/engines/zvision/zvision.cpp
@@ -122,9 +122,13 @@ Common::Error ZVision::run() {
currentTime = _system->getMillis();
uint32 deltaTime = currentTime - lastTime;
lastTime = currentTime;
-
- updateScripts();
- updateAnimations(deltaTime);
+
+ if (_currentVideo != 0)
+ continueVideo();
+ else {
+ updateScripts();
+ updateAnimations(deltaTime);
+ }
if (_needsScreenUpdate || _console->isActive()) {
_system->updateScreen();
diff --git a/engines/zvision/zvision.h b/engines/zvision/zvision.h
index d18319a056..ffda12ac1a 100644
--- a/engines/zvision/zvision.h
+++ b/engines/zvision/zvision.h
@@ -27,6 +27,8 @@
#include "common/random.h"
#include "common/events.h"
+#include "video/video_decoder.h"
+
#include "engines/engine.h"
#include "zvision/script_manager.h"
@@ -67,6 +69,7 @@ private:
bool _needsScreenUpdate;
+ Video::VideoDecoder *_currentVideo;
public:
uint32 getFeatures() const;
Common::Language getLanguage() const;
@@ -74,6 +77,8 @@ public:
ScriptManager *getScriptManager() const;
Common::RandomSource *getRandomSource() const;
void renderImageToScreen(const Common::String &fileName, uint32 x, uint32 y);
+ void startVideo(Video::VideoDecoder *videoDecoder);
+ void continueVideo();
private:
void initialize();