aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEinar Johan Trøan Sømåen2014-01-21 02:25:18 +0100
committerEinar Johan Trøan Sømåen2014-01-21 02:25:18 +0100
commit2dfbad8074dce96af03f3bf2927e9bdffc3a16ec (patch)
treea5eb378282474b703b51fef409a64131b185ccf6
parent0b76f66edcf283f48f8f945dc18a764bf427fdf1 (diff)
downloadscummvm-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.cpp10
-rw-r--r--engines/wintermute/video/video_theora_player.cpp11
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();
}