diff options
Diffstat (limited to 'engines/titanic/support/avi_surface.cpp')
-rw-r--r-- | engines/titanic/support/avi_surface.cpp | 24 |
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) { |