aboutsummaryrefslogtreecommitdiff
path: root/engines/scumm
diff options
context:
space:
mode:
authorFlorian Kagerer2010-10-03 17:25:38 +0000
committerFlorian Kagerer2010-10-03 17:25:38 +0000
commitc9713bef7c0d6e5e7380491c3b201afa6c1e2677 (patch)
tree9a241ccdc6f892e92b2879b29c3fae62009c9b35 /engines/scumm
parent718fe1d18f2550a6e5247782229843fdd5d2ef7f (diff)
downloadscummvm-rg350-c9713bef7c0d6e5e7380491c3b201afa6c1e2677.tar.gz
scummvm-rg350-c9713bef7c0d6e5e7380491c3b201afa6c1e2677.tar.bz2
scummvm-rg350-c9713bef7c0d6e5e7380491c3b201afa6c1e2677.zip
SCUMM/FM-TOWNS: improve merging of graphics layers
svn-id: r52995
Diffstat (limited to 'engines/scumm')
-rw-r--r--engines/scumm/gfx.h1
-rw-r--r--engines/scumm/gfx_towns.cpp12
2 files changed, 12 insertions, 1 deletions
diff --git a/engines/scumm/gfx.h b/engines/scumm/gfx.h
index b4b6309f51..9b628f6264 100644
--- a/engines/scumm/gfx.h
+++ b/engines/scumm/gfx.h
@@ -468,6 +468,7 @@ private:
uint16 *bltInternX;
uint8 **bltInternY;
+ uint16 *bltTmpPal;
} _layers[2];
uint8 *_outBuffer;
diff --git a/engines/scumm/gfx_towns.cpp b/engines/scumm/gfx_towns.cpp
index 1a1e2adc9d..953ab98305 100644
--- a/engines/scumm/gfx_towns.cpp
+++ b/engines/scumm/gfx_towns.cpp
@@ -215,6 +215,8 @@ TownsScreen::~TownsScreen() {
delete[] _layers[1].bltInternX;
delete[] _layers[0].bltInternY;
delete[] _layers[1].bltInternY;
+ delete[] _layers[0].bltTmpPal;
+ delete[] _layers[1].bltTmpPal;
delete[] _outBuffer;
_dirtyRects.clear();
}
@@ -265,6 +267,9 @@ void TownsScreen::setupLayer(int layer, int width, int height, int numCol, void
for (int i = 0; i < _height; ++i)
l->bltInternY[i] = l->pixels + (i / l->scaleH) * l->pitch;
+ delete[] l->bltTmpPal;
+ l->bltTmpPal = (l->bpp == 1 && _bpp == 2) ? new uint16[l->numCol] : 0;
+
l->enabled = true;
l->onBottom = (!layer || !_layers[0].enabled);
l->ready = true;
@@ -448,6 +453,11 @@ void TownsScreen::updateOutputBuffer() {
uint8 *dst = _outBuffer + r->top * _pitch + r->left * _bpp;
int ptch = _pitch - (r->right - r->left + 1) * _bpp;
+ if (_bpp == 2 && l->bpp == 1) {
+ for (int ic = 0; ic < l->numCol; ic++)
+ l->bltTmpPal[ic] = calc16BitColor(&l->palette[ic * 3]);
+ }
+
for (int y = r->top; y <= r->bottom; ++y) {
if (l->bpp == _bpp && l->scaleW == 1 && l->onBottom) {
memcpy(dst, l->bltInternY[y] + l->bltInternX[r->left], (r->right + 1 - r->left) * _bpp);
@@ -461,7 +471,7 @@ void TownsScreen::updateOutputBuffer() {
if (col || l->onBottom) {
if (l->numCol == 16)
col = (col >> 4) & (col & 0x0f);
- WRITE_LE_UINT16(dst, calc16BitColor(&l->palette[col * 3]));
+ WRITE_LE_UINT16(dst, l->bltTmpPal[col]);
}
} else {
WRITE_LE_UINT16(dst, READ_LE_UINT16(src));