From 12c9e895b559d1ca2780b5b8f156b0451eb11f11 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 8 Aug 2010 00:38:26 +0000 Subject: VIDEO/GOB: Add CoktelDecoder::setXY() This allows for positioning the video within the video memory. svn-id: r51858 --- engines/gob/videoplayer.cpp | 16 +++++++++++++--- graphics/video/coktel_decoder.cpp | 18 ++++++++++++++---- graphics/video/coktel_decoder.h | 6 ++++++ 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/engines/gob/videoplayer.cpp b/engines/gob/videoplayer.cpp index 715d5cfb9a..d126d0e963 100644 --- a/engines/gob/videoplayer.cpp +++ b/engines/gob/videoplayer.cpp @@ -137,23 +137,29 @@ int VideoPlayer::openVideo(bool primary, const Common::String &file, Properties properties.sprite = -1; video->surface.reset(); video->decoder->setSurfaceMemory(); + video->decoder->setXY(0, 0); } else { video->surface = _vm->_draw->_spritesArray[properties.sprite]; video->decoder->setSurfaceMemory(video->surface->getVidMem(), video->surface->getWidth(), video->surface->getHeight(), 1); + + if (!ownSurf || (ownSurf && screenSize)) + video->decoder->setXY(properties.x, properties.y); + else + video->decoder->setXY(0, 0); } } else { properties.sprite = -1; video->surface.reset(); video->decoder->setSurfaceMemory(); + video->decoder->setXY(0, 0); } if (primary) _needBlit = (properties.flags & kFlagUseBackSurfaceContent) && (properties.sprite == Draw::kFrontSurface); // video->decoder->setFrameRate(_vm->_util->getFrameRate()); - // video->decoder->setXY(x, y); WRITE_VAR(7, video->decoder->getFrameCount()); @@ -306,14 +312,18 @@ bool VideoPlayer::playFrame(int slot, Properties &properties) { if (properties.sprite == Draw::kBackSurface) { - _vm->_draw->invalidateRect(0, 0, video->decoder->getWidth(), video->decoder->getHeight()); + _vm->_draw->invalidateRect(properties.x, properties.y, + properties.x + video->decoder->getWidth(), + properties.y + video->decoder->getHeight()); _vm->_draw->blitInvalidated(); // if (!noRetrace) _vm->_video->retrace(); } else if (properties.sprite == Draw::kFrontSurface) { - _vm->_video->dirtyRectsAdd(0, 0, video->decoder->getWidth(), video->decoder->getHeight()); + _vm->_video->dirtyRectsAdd(properties.x, properties.y, + properties.x + video->decoder->getWidth(), + properties.y + video->decoder->getHeight()); // if (!noRetrace) _vm->_video->retrace(); diff --git a/graphics/video/coktel_decoder.cpp b/graphics/video/coktel_decoder.cpp index d13e678d44..6f846c9a07 100644 --- a/graphics/video/coktel_decoder.cpp +++ b/graphics/video/coktel_decoder.cpp @@ -34,7 +34,7 @@ CoktelDecoder::State::State() : left(0), top(0), right(0), bottom(0), flags(0), CoktelDecoder::CoktelDecoder(Audio::Mixer &mixer, Audio::Mixer::SoundType soundType) : - _mixer(&mixer), _soundType(soundType), _width(0), _height(0), _frameCount(0), + _mixer(&mixer), _soundType(soundType), _width(0), _height(0), _x(0), _y(0), _frameCount(0), _paletteDirty(false), _ownSurface(true) { memset(_palette, 0, 768); @@ -92,8 +92,18 @@ void CoktelDecoder::freeSurface() { _ownSurface = true; } +void CoktelDecoder::setXY(uint16 x, uint16 y) { + _x = x; + _y = y; +} + void CoktelDecoder::close() { freeSurface(); + + _x = 0; + _y = 0; + + _frameCount = 0; } uint16 CoktelDecoder::getWidth() const { @@ -289,11 +299,11 @@ void PreIMDDecoder::processFrame() { } void PreIMDDecoder::renderFrame() { - uint16 w = MIN(_surface.w, _width); - uint16 h = MIN(_surface.h, _height); + uint16 w = CLIP(_surface.w - _x, 0, _width); + uint16 h = CLIP(_surface.h - _y, 0, _height); const byte *src = _videoBuffer; - byte *dst = (byte *) _surface.pixels; // + x/y + byte *dst = (byte *) _surface.pixels + (_y * _surface.pitch) + _x; uint32 frameDataSize = _videoBufferSize; diff --git a/graphics/video/coktel_decoder.h b/graphics/video/coktel_decoder.h index ec9acbe879..a4d12c5294 100644 --- a/graphics/video/coktel_decoder.h +++ b/graphics/video/coktel_decoder.h @@ -69,6 +69,9 @@ public: /** Reset the video memory. */ void setSurfaceMemory(); + /** Draw the video starting at this position within the video memory. */ + void setXY(uint16 x, uint16 y); + // VideoDecoder interface void close(); @@ -88,6 +91,9 @@ protected: uint16 _width; uint16 _height; + uint16 _x; + uint16 _y; + uint32 _frameCount; byte _palette[768]; -- cgit v1.2.3