diff options
author | Eugene Sandulenko | 2010-10-14 20:44:44 +0000 |
---|---|---|
committer | Eugene Sandulenko | 2010-10-14 20:44:44 +0000 |
commit | f67bbc4eccd483e329845c05c8aa2dc5ab6f8215 (patch) | |
tree | ad4db0272853566115c4846a4efc580790f81ff8 /engines/sword25/fmv | |
parent | 00a477fa79c3b9d5317203a9f839fac04ffe8b1d (diff) | |
download | scummvm-rg350-f67bbc4eccd483e329845c05c8aa2dc5ab6f8215.tar.gz scummvm-rg350-f67bbc4eccd483e329845c05c8aa2dc5ab6f8215.tar.bz2 scummvm-rg350-f67bbc4eccd483e329845c05c8aa2dc5ab6f8215.zip |
SWORD25: Attempt to optimize movie rendering
Current code makes about 5 blits of each frame which is a huge
overhead. This code is an attempt to make that 1. Doesn't work yet
as the rendering pipe keeps blitting invisible pictures.
svn-id: r53459
Diffstat (limited to 'engines/sword25/fmv')
-rw-r--r-- | engines/sword25/fmv/movieplayer.cpp | 21 | ||||
-rw-r--r-- | engines/sword25/fmv/movieplayer.h | 3 |
2 files changed, 24 insertions, 0 deletions
diff --git a/engines/sword25/fmv/movieplayer.cpp b/engines/sword25/fmv/movieplayer.cpp index 1ca7b43dae..164f46eb09 100644 --- a/engines/sword25/fmv/movieplayer.cpp +++ b/engines/sword25/fmv/movieplayer.cpp @@ -41,6 +41,8 @@ #ifdef USE_THEORADEC +#define INDIRECTRENDERING 1 + namespace Sword25 { #define BS_LOG_PREFIX "MOVIEPLAYER" @@ -69,6 +71,8 @@ bool MoviePlayer::loadMovie(const Common::String &filename, uint z) { // Ausgabebitmap erstellen GraphicEngine *pGfx = Kernel::GetInstance()->GetGfx(); + +#if INDIRECTRENDERING _outputBitmap = pGfx->GetMainPanel()->addDynamicBitmap(_decoder.getWidth(), _decoder.getHeight()); if (!_outputBitmap.isValid()) { BS_LOG_ERRORLN("Output bitmap for movie playback could not be created."); @@ -91,6 +95,17 @@ bool MoviePlayer::loadMovie(const Common::String &filename, uint z) { // Ausgabebitmap auf dem Bildschirm zentrieren _outputBitmap->setX((pGfx->GetDisplayWidth() - _outputBitmap->getWidth()) / 2); _outputBitmap->setY((pGfx->GetDisplayHeight() - _outputBitmap->getHeight()) / 2); +#else + _backSurface = pGfx->getSurface(); + + _outX = (pGfx->GetDisplayWidth() - _decoder.getWidth()) / 2; + _outY = (pGfx->GetDisplayHeight() - _decoder.getHeight()) / 2; + + if (_outX < 0) + _outX = 0; + if (_outY < 0) + _outY = 0; +#endif return true; } @@ -118,8 +133,14 @@ void MoviePlayer::update() { // Transfer the next frame assert(s->bytesPerPixel == 4); + +#if INDIRECTRENDERING byte *frameData = (byte *)s->getBasePtr(0, 0); _outputBitmap->setContent(frameData, s->pitch * s->h, 0, s->pitch); +#else + g_system->copyRectToScreen((byte *)s->getBasePtr(0, 0), s->pitch, _outX, _outY, MIN(s->w, _backSurface->w), MIN(s->h, _backSurface->h)); + g_system->updateScreen(); +#endif } } diff --git a/engines/sword25/fmv/movieplayer.h b/engines/sword25/fmv/movieplayer.h index c02285df74..26b5cdd0d8 100644 --- a/engines/sword25/fmv/movieplayer.h +++ b/engines/sword25/fmv/movieplayer.h @@ -140,6 +140,9 @@ private: TheoraDecoder _decoder; + Graphics::Surface *_backSurface; + int _outX, _outY; + RenderObjectPtr<Bitmap> _outputBitmap; }; |