diff options
author | Einar Johan Trøan Sømåen | 2014-01-21 02:25:18 +0100 |
---|---|---|
committer | Einar Johan Trøan Sømåen | 2014-01-21 02:25:18 +0100 |
commit | 2dfbad8074dce96af03f3bf2927e9bdffc3a16ec (patch) | |
tree | a5eb378282474b703b51fef409a64131b185ccf6 | |
parent | 0b76f66edcf283f48f8f945dc18a764bf427fdf1 (diff) | |
download | scummvm-rg350-2dfbad8074dce96af03f3bf2927e9bdffc3a16ec.tar.gz scummvm-rg350-2dfbad8074dce96af03f3bf2927e9bdffc3a16ec.tar.bz2 scummvm-rg350-2dfbad8074dce96af03f3bf2927e9bdffc3a16ec.zip |
WINTERMUTE: Avoid using Graphics::copyFrom to copy FMV-frames.
copyFrom frees and reallocates the surface for every update, as long
as the dimensions and format stay the same, we can do with just a
memcpy.
This gives a tiny improvement in the update-part of the Theora-player
(on the order of a bit more than 1 second saved total in the 1:28 long
J.U.L.I.A.-intro)
-rw-r--r-- | engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp | 10 | ||||
-rw-r--r-- | engines/wintermute/video/video_theora_player.cpp | 11 |
2 files changed, 17 insertions, 4 deletions
diff --git a/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp index 9ec8573a87..73797f20f3 100644 --- a/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp +++ b/engines/wintermute/base/gfx/osystem/base_surface_osystem.cpp @@ -447,8 +447,14 @@ bool BaseSurfaceOSystem::drawSprite(int x, int y, Rect32 *rect, Rect32 *newRect, bool BaseSurfaceOSystem::putSurface(const Graphics::Surface &surface, bool hasAlpha) { _loaded = true; - _surface->free(); - _surface->copyFrom(surface); + if (surface.format == _surface->format && surface.w == _surface->w && surface.h == _surface->h) { + const byte *src = (const byte*) surface.getBasePtr(0, 0); + byte *dst = (byte*) _surface->getBasePtr(0, 0); + memcpy(dst, src, surface.pitch * surface.h); + } else { + _surface->free(); + _surface->copyFrom(surface); + } if (hasAlpha) { _alphaType = TransparentSurface::ALPHA_FULL; } else { diff --git a/engines/wintermute/video/video_theora_player.cpp b/engines/wintermute/video/video_theora_player.cpp index 44eecf93a8..aedc9bf025 100644 --- a/engines/wintermute/video/video_theora_player.cpp +++ b/engines/wintermute/video/video_theora_player.cpp @@ -305,8 +305,15 @@ bool VideoTheoraPlayer::update() { if (!_theoraDecoder->endOfVideo() && _theoraDecoder->getTimeToNextFrame() == 0) { const Graphics::Surface *decodedFrame = _theoraDecoder->decodeNextFrame(); if (decodedFrame) { - _surface.free(); - _surface.copyFrom(*decodedFrame); + if (decodedFrame->format == _surface.format && decodedFrame->w == _surface.w && decodedFrame->h == _surface.h) { + const byte *src = (const byte*) decodedFrame->getBasePtr(0, 0); + byte *dst = (byte*) _surface.getBasePtr(0, 0); + memcpy(dst, src, _surface.pitch * _surface.h); + } else { + _surface.free(); + _surface.copyFrom(*decodedFrame); + } + if (_texture) { writeVideo(); } |