aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic/support/avi_surface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/titanic/support/avi_surface.cpp')
-rw-r--r--engines/titanic/support/avi_surface.cpp24
1 files changed, 13 insertions, 11 deletions
diff --git a/engines/titanic/support/avi_surface.cpp b/engines/titanic/support/avi_surface.cpp
index 6240de951c..22b3e98c16 100644
--- a/engines/titanic/support/avi_surface.cpp
+++ b/engines/titanic/support/avi_surface.cpp
@@ -132,18 +132,21 @@ bool AVISurface::startAtFrame(int frameNumber) {
if (frameNumber == -1)
// Default to starting frame of first movie range
frameNumber = _movieRangeInfo.front()->_startFrame;
- if (_isReversed && frameNumber == _decoder->getFrameCount())
+ if (_isReversed && frameNumber == (int)_decoder->getFrameCount())
--frameNumber;
- // Get the initial frame
- seekToFrame(frameNumber);
- renderFrame();
-
// Start the playback
_decoder->start();
+
+ // Seek to the starting frame
+ seekToFrame(frameNumber);
+
+ // If we're in reverse playback, set the decoder to play in reverse
if (_isReversed)
_decoder->setRate(-1.0);
+ renderFrame();
+
return true;
}
@@ -155,12 +158,9 @@ void AVISurface::seekToFrame(uint frameNumber) {
_decoder->seekToFrame(frameNumber);
_currentFrame = (int)frameNumber;
}
-
- renderFrame();
}
void AVISurface::setReversed(bool isReversed) {
- _decoder->setReverse(isReversed);
_isReversed = isReversed;
}
@@ -196,8 +196,8 @@ bool AVISurface::handleEvents(CMovieEventList &events) {
if (isPlaying()) {
if (newFrame != getFrame()) {
// The frame has been changed, so move to new position
- setReversed(info->_isReversed);
seekToFrame(newFrame);
+ renderFrame();
}
// Get any events for the given position
@@ -273,12 +273,14 @@ void AVISurface::setupDecompressor() {
}
void AVISurface::copyMovieFrame(const Graphics::Surface &src, Graphics::ManagedSurface &dest) {
- assert(src.w == dest.w && src.h == dest.h);
+ // WORKAROUND: A bad video in the Promenade has a frame with a width slightly larger
+ // than the defined width for the movie it's in. Hence the assert below is >=
+ assert(src.w >= dest.w && src.h == dest.h);
if (src.format.bytesPerPixel == 1) {
// Paletted 8-bit, so convert to 16-bit and copy over
Graphics::Surface *s = src.convertTo(dest.format, _decoder->getPalette());
- dest.blitFrom(*s);
+ dest.blitFrom(*s, Common::Rect(0, 0, dest.w, dest.h), Common::Point(0, 0));
s->free();
delete s;
} else if (src.format.bytesPerPixel == 2) {