diff options
author | Eugene Sandulenko | 2007-10-31 21:37:40 +0000 |
---|---|---|
committer | Eugene Sandulenko | 2007-10-31 21:37:40 +0000 |
commit | 3318c4b47487674aaf19bec9f9db9ac36e1cae96 (patch) | |
tree | b45b45a178742b2d0315aea6d1e9c86151160faf /graphics/dxa_player.cpp | |
parent | 39da7deefb0b55412d871165c563d0a11dcfe61f (diff) | |
download | scummvm-rg350-3318c4b47487674aaf19bec9f9db9ac36e1cae96.tar.gz scummvm-rg350-3318c4b47487674aaf19bec9f9db9ac36e1cae96.tar.bz2 scummvm-rg350-3318c4b47487674aaf19bec9f9db9ac36e1cae96.zip |
Slighly modified patch #1709219: "DXA Player: double size scaling option"
svn-id: r29347
Diffstat (limited to 'graphics/dxa_player.cpp')
-rw-r--r-- | graphics/dxa_player.cpp | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/graphics/dxa_player.cpp b/graphics/dxa_player.cpp index 28a1bc4dbd..11cbc55c96 100644 --- a/graphics/dxa_player.cpp +++ b/graphics/dxa_player.cpp @@ -31,6 +31,23 @@ #include <zlib.h> #endif +static void scaleUpBy2(byte *dst, byte *src, uint16 width, uint16 h) { + uint16 x; + + while (h > 0) { + for (x = width; x > 0; x--) { + register byte v; + + v = *src++; + *dst++ = v; + *dst++ = v; + } + memcpy(dst, dst - width * 2, width * 2); + dst += width * 2; + h--; + } +} + namespace Graphics { DXAPlayer::DXAPlayer() { @@ -40,6 +57,7 @@ DXAPlayer::DXAPlayer() { _frameBuffer2 = 0; _scaledBuffer = 0; _drawBuffer = 0; + _scaledBuffer2 = 0; _inBuffer = 0; _inBufferSize = 0; @@ -58,6 +76,8 @@ DXAPlayer::DXAPlayer() { _frameTicks = 0; _scaleMode = S_NONE; + + _scaling = 1; } DXAPlayer::~DXAPlayer() { @@ -66,13 +86,13 @@ DXAPlayer::~DXAPlayer() { int DXAPlayer::getWidth() { if (!_fd) return 0; - return _width; + return _width * _scaling; } int DXAPlayer::getHeight() { if (!_fd) return 0; - return _height; + return _height * _scaling; } int DXAPlayer::getCurFrame() { @@ -87,6 +107,25 @@ int DXAPlayer::getFrameCount() { return _framesCount; } +bool DXAPlayer::loadFile(const char *filename, uint16 maxWidth, uint16 maxHeight) { + bool result = loadFile(filename); + + if (result) { + _scaling = MIN(maxWidth / _width, maxHeight / _height); + if (_scaling < 1) + _scaling = 1; + if (_scaling > 2) + _scaling = 2; + if (_scaling >= 2) { + _scaledBuffer2 = (uint8 *)malloc(_width * _height * _scaling * _scaling); + if (!_scaledBuffer2) { + _scaling = 1; + } + } + } + return result; +} + bool DXAPlayer::loadFile(const char *filename) { uint32 tag; int32 frameRate; @@ -189,6 +228,7 @@ void DXAPlayer::closeFile() { free(_frameBuffer1); free(_frameBuffer2); free(_scaledBuffer); + free(_scaledBuffer2); free(_inBuffer); free(_decompBuffer); @@ -588,6 +628,12 @@ void DXAPlayer::decodeNextFrame() { _drawBuffer = _frameBuffer1; break; } + + if (_scaling == 2) { + /* Scale up here */ + scaleUpBy2(_scaledBuffer2, _drawBuffer, _width, _height); + _drawBuffer = _scaledBuffer2; + } } } // End of namespace Graphics |