aboutsummaryrefslogtreecommitdiff
path: root/graphics/dxa_player.cpp
diff options
context:
space:
mode:
authorEugene Sandulenko2007-10-31 21:37:40 +0000
committerEugene Sandulenko2007-10-31 21:37:40 +0000
commit3318c4b47487674aaf19bec9f9db9ac36e1cae96 (patch)
treeb45b45a178742b2d0315aea6d1e9c86151160faf /graphics/dxa_player.cpp
parent39da7deefb0b55412d871165c563d0a11dcfe61f (diff)
downloadscummvm-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.cpp50
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