diff options
| author | Torbjörn Andersson | 2006-12-14 05:21:19 +0000 |
|---|---|---|
| committer | Torbjörn Andersson | 2006-12-14 05:21:19 +0000 |
| commit | 45886ec8ed7ef2244523b05e10a852d9851d772d (patch) | |
| tree | a9c85c71e486ae3a558260389c18ceec17166f15 /graphics | |
| parent | 42228fdc361b7c68d6326c2a89131b3bda966a90 (diff) | |
| download | scummvm-rg350-45886ec8ed7ef2244523b05e10a852d9851d772d.tar.gz scummvm-rg350-45886ec8ed7ef2244523b05e10a852d9851d772d.tar.bz2 scummvm-rg350-45886ec8ed7ef2244523b05e10a852d9851d772d.zip | |
When drawing an interlaced frame, only clear every other line instead of the
entire buffer.
Introduced a _drawBuffer pointer which points either to _scaledBuffer or
_frameBuffer1. That way, we don't need to copy _frameBuffer1 every time we
draw an unscaled frame. (Probably the most common case by far.)
Adjusted the Broken Sword 1 DXA player for the second change. (It sneakily
avoids copying each frame by using _drawBuffer directly.)
svn-id: r24846
Diffstat (limited to 'graphics')
| -rw-r--r-- | graphics/dxa_player.cpp | 12 | ||||
| -rw-r--r-- | graphics/dxa_player.h | 1 |
2 files changed, 9 insertions, 4 deletions
diff --git a/graphics/dxa_player.cpp b/graphics/dxa_player.cpp index d4e216d27d..157b5ef24e 100644 --- a/graphics/dxa_player.cpp +++ b/graphics/dxa_player.cpp @@ -35,6 +35,7 @@ DXAPlayer::DXAPlayer() { _frameBuffer1 = 0; _frameBuffer2 = 0; _scaledBuffer = 0; + _drawBuffer = 0; _width = 0; _height = 0; @@ -146,7 +147,7 @@ void DXAPlayer::copyFrameToBuffer(byte *dst, uint x, uint y, uint pitch) { uint h = _height; uint w = _width; - byte *src = _scaledBuffer; + byte *src = _drawBuffer; dst += y * pitch + x; do { @@ -510,18 +511,21 @@ void DXAPlayer::decodeNextFrame() { switch (_scaleMode) { case S_INTERLACED: - memset(_scaledBuffer, 0, _width * _height); - for (int cy = 0; cy < _curHeight; cy++) + for (int cy = 0; cy < _curHeight; cy++) { memcpy(&_scaledBuffer[2 * cy * _width], &_frameBuffer1[cy * _width], _width); + memset(&_scaledBuffer[((2 * cy) + 1) * _width], 0, _width); + } + _drawBuffer = _scaledBuffer; break; case S_DOUBLE: for (int cy = 0; cy < _curHeight; cy++) { memcpy(&_scaledBuffer[2 * cy * _width], &_frameBuffer1[cy * _width], _width); memcpy(&_scaledBuffer[((2 * cy) + 1) * _width], &_frameBuffer1[cy * _width], _width); } + _drawBuffer = _scaledBuffer; break; case S_NONE: - memcpy(_scaledBuffer, _frameBuffer1, _width * _height); + _drawBuffer = _frameBuffer1; break; } } diff --git a/graphics/dxa_player.h b/graphics/dxa_player.h index 09cfb021a9..a6e751c8a3 100644 --- a/graphics/dxa_player.h +++ b/graphics/dxa_player.h @@ -45,6 +45,7 @@ protected: byte *_frameBuffer1; byte *_frameBuffer2; byte *_scaledBuffer; + byte *_drawBuffer; uint16 _width; uint16 _height, _curHeight; uint16 _framesCount; |
