aboutsummaryrefslogtreecommitdiff
path: root/scumm
diff options
context:
space:
mode:
Diffstat (limited to 'scumm')
-rw-r--r--scumm/gfx.cpp199
-rw-r--r--scumm/gfx.h17
-rw-r--r--scumm/saveload.cpp2
-rw-r--r--scumm/scummvm.cpp6
-rw-r--r--scumm/string.cpp10
5 files changed, 117 insertions, 117 deletions
diff --git a/scumm/gfx.cpp b/scumm/gfx.cpp
index f265284b4c..8f311f8ce5 100644
--- a/scumm/gfx.cpp
+++ b/scumm/gfx.cpp
@@ -470,7 +470,6 @@ void Scumm::initBGBuffers(int height)
if (_features & GF_AFTER_V7) {
initVirtScreen(0, 0, virtscr[0].topline, _realWidth, height, 1, 1);
-
}
room = getResourceAddress(rtRoom, _roomResource);
@@ -499,7 +498,7 @@ void Scumm::initBGBuffers(int height)
assert(gdi._numZBuffer >= 1 && gdi._numZBuffer <= 8);
if (_features & GF_AFTER_V7)
- itemsize = _scrHeight * gdi._numStrips + gdi._numStrips * 10;
+ itemsize = (_scrHeight + 10) * gdi._numStrips;
else
itemsize = (_scrHeight + 4) * gdi._numStrips;
@@ -790,6 +789,7 @@ void Gdi::drawBitmap(byte *ptr, VirtScreen *vs, int x, int y, const int h,
int numzbuf;
int sx;
bool lightsOn;
+ bool useOrDecompress;
// Check whether lights are turned on or not
lightsOn = (_vm->_features & GF_AFTER_V6) || (vs->number != 0) || (_vm->_vars[_vm->VAR_CURRENT_LIGHTS] & LIGHTMODE_screen);
@@ -835,7 +835,7 @@ void Gdi::drawBitmap(byte *ptr, VirtScreen *vs, int x, int y, const int h,
for (i = 1; i < numzbuf; i++) {
zplane_list[i] = zplnOffsChunkStart + READ_LE_UINT32(zplnOffsChunkStart + 4 + i*4) + 12;
}
-
+
// A small hack to skip to the BSTR->WRAP->OFFS chunk
smap_ptr += 24;
} else {
@@ -886,9 +886,9 @@ void Gdi::drawBitmap(byte *ptr, VirtScreen *vs, int x, int y, const int h,
_mask_ptr = _vm->getResourceAddress(rtBuffer, 9) + (y * _numStrips + x);
if (_vm->_features & GF_SMALL_HEADER)
- decompressBitmap(bgbak_ptr, smap_ptr + READ_LE_UINT32(smap_ptr + stripnr * 4 + 4), h);
+ useOrDecompress = decompressBitmap(bgbak_ptr, smap_ptr + READ_LE_UINT32(smap_ptr + stripnr * 4 + 4), h);
else
- decompressBitmap(bgbak_ptr, smap_ptr + READ_LE_UINT32(smap_ptr + stripnr * 4 + 8), h);
+ useOrDecompress = decompressBitmap(bgbak_ptr, smap_ptr + READ_LE_UINT32(smap_ptr + stripnr * 4 + 8), h);
CHECK_HEAP;
if (vs->alloctwobuffers) {
@@ -930,7 +930,7 @@ void Gdi::drawBitmap(byte *ptr, VirtScreen *vs, int x, int y, const int h,
z_plane_ptr = zplane_list[1] + READ_LE_UINT16(zplane_list[1] + stripnr * 2 + 8);
for (i = 0; i < numzbuf; i++) {
_mask_ptr_dest = _vm->getResourceAddress(rtBuffer, 9) + y * _numStrips + x + _imgBufOffs[i];
- if (_useOrDecompress && flag & dbAllowMaskOr)
+ if (useOrDecompress && (flag & dbAllowMaskOr))
decompressMaskImgOr(_mask_ptr_dest, z_plane_ptr, h);
else
decompressMaskImg(_mask_ptr_dest, z_plane_ptr, h);
@@ -956,13 +956,13 @@ void Gdi::drawBitmap(byte *ptr, VirtScreen *vs, int x, int y, const int h,
if (offs) {
byte *z_plane_ptr = zplane_list[i] + offs;
- if (_useOrDecompress && flag & dbAllowMaskOr) {
+ if (useOrDecompress && (flag & dbAllowMaskOr)) {
decompressMaskImgOr(_mask_ptr_dest, z_plane_ptr, h);
} else {
decompressMaskImg(_mask_ptr_dest, z_plane_ptr, h);
}
} else {
- if (!(_useOrDecompress && flag & dbAllowMaskOr))
+ if (!(useOrDecompress && (flag & dbAllowMaskOr)))
for (int height = 0; height < h; height++)
_mask_ptr_dest[height * _numStrips] = 0;
/* needs better abstraction, FIXME */
@@ -978,7 +978,7 @@ next_iter:
}
-void Gdi::decompressBitmap(byte *bgbak_ptr, byte *smap_ptr, int numLinesToProcess)
+bool Gdi::decompressBitmap(byte *bgbak_ptr, byte *smap_ptr, int numLinesToProcess)
{
byte code = *smap_ptr++;
assert(numLinesToProcess);
@@ -988,16 +988,10 @@ void Gdi::decompressBitmap(byte *bgbak_ptr, byte *smap_ptr, int numLinesToProces
else
_palette_mod = 0;
- _useOrDecompress = false;
+ bool useOrDecompress = false;
_decomp_shr = code % 10;
_decomp_mask = 0xFF >> (8 - _decomp_shr);
- // Note that some of the decoders exist in pairs: one honors _transparency, the other not.
- // The pairs are:
- // unkDecode1 <-> unkDecode3
- // unkDecode2 <-> unkDecode5
- // unkDecode4 <-> unkDecode6
-
switch (code) {
case 1:
unkDecode7(bgbak_ptr, smap_ptr, numLinesToProcess);
@@ -1024,7 +1018,7 @@ void Gdi::decompressBitmap(byte *bgbak_ptr, byte *smap_ptr, int numLinesToProces
case 16:
case 17:
case 18:
- unkDecode6(bgbak_ptr, smap_ptr, numLinesToProcess);
+ unkDecodeC(bgbak_ptr, smap_ptr, numLinesToProcess);
break;
case 24:
@@ -1032,7 +1026,7 @@ void Gdi::decompressBitmap(byte *bgbak_ptr, byte *smap_ptr, int numLinesToProces
case 26:
case 27:
case 28:
- unkDecode5(bgbak_ptr, smap_ptr, numLinesToProcess);
+ unkDecodeB(bgbak_ptr, smap_ptr, numLinesToProcess);
break;
case 34:
@@ -1040,8 +1034,8 @@ void Gdi::decompressBitmap(byte *bgbak_ptr, byte *smap_ptr, int numLinesToProces
case 36:
case 37:
case 38:
- _useOrDecompress = true;
- unkDecode4(bgbak_ptr, smap_ptr, numLinesToProcess);
+ useOrDecompress = true;
+ unkDecodeC_trans(bgbak_ptr, smap_ptr, numLinesToProcess);
break;
case 44:
@@ -1049,8 +1043,8 @@ void Gdi::decompressBitmap(byte *bgbak_ptr, byte *smap_ptr, int numLinesToProces
case 46:
case 47:
case 48:
- _useOrDecompress = true;
- unkDecode2(bgbak_ptr, smap_ptr, numLinesToProcess);
+ useOrDecompress = true;
+ unkDecodeB_trans(bgbak_ptr, smap_ptr, numLinesToProcess);
break;
case 64:
@@ -1063,7 +1057,7 @@ void Gdi::decompressBitmap(byte *bgbak_ptr, byte *smap_ptr, int numLinesToProces
case 106:
case 107:
case 108:
- unkDecode1(bgbak_ptr, smap_ptr, numLinesToProcess);
+ unkDecodeA(bgbak_ptr, smap_ptr, numLinesToProcess);
break;
case 84:
@@ -1076,13 +1070,15 @@ void Gdi::decompressBitmap(byte *bgbak_ptr, byte *smap_ptr, int numLinesToProces
case 126:
case 127:
case 128:
- _useOrDecompress = true;
- unkDecode3(bgbak_ptr, smap_ptr, numLinesToProcess);
+ useOrDecompress = true;
+ unkDecodeA_trans(bgbak_ptr, smap_ptr, numLinesToProcess);
break;
default:
error("Gdi::decompressBitmap: default case %d", code);
}
+
+ return useOrDecompress;
}
void Gdi::draw8ColWithMasking(byte *dst, byte *src, int height, byte *mask)
@@ -1244,7 +1240,7 @@ void Gdi::decompressMaskImgOr(byte *dst, byte *src, int height)
#define READ_BIT (cl--, bit = bits&1, bits>>=1,bit)
#define FILL_BITS do { if (cl <= 8) { bits |= (*src++ << cl); cl += 8; } } while (0)
-void Gdi::unkDecode1(byte *dst, byte *src, int height)
+void Gdi::unkDecodeA(byte *dst, byte *src, int height)
{
byte color = *src++;
uint bits = *src++;
@@ -1293,40 +1289,7 @@ void Gdi::unkDecode1(byte *dst, byte *src, int height)
} while (--height);
}
-void Gdi::unkDecode2(byte *dst, byte *src, int height)
-{
- byte color = *src++;
- uint bits = *src++;
- byte cl = 8;
- byte bit;
- int8 inc = -1;
-
- do {
- int x = 8;
- do {
- FILL_BITS;
- if (color != _transparency)
- *dst = color + _palette_mod;
- dst++;
- if (!READ_BIT) {
- } else if (!READ_BIT) {
- FILL_BITS;
- color = bits & _decomp_mask;
- bits >>= _decomp_shr;
- cl -= _decomp_shr;
- inc = -1;
- } else if (!READ_BIT) {
- color += inc;
- } else {
- inc = -inc;
- color += inc;
- }
- } while (--x);
- dst += _vm->_realWidth - 8;
- } while (--height);
-}
-
-void Gdi::unkDecode3(byte *dst, byte *src, int height)
+void Gdi::unkDecodeA_trans(byte *dst, byte *src, int height)
{
byte color = *src++;
uint bits = *src++;
@@ -1338,7 +1301,7 @@ void Gdi::unkDecode3(byte *dst, byte *src, int height)
int x = 8;
do {
FILL_BITS;
- if (color != _transparency)
+ if (color != _transparentColor)
*dst = color + _palette_mod;
dst++;
@@ -1365,7 +1328,7 @@ void Gdi::unkDecode3(byte *dst, byte *src, int height)
if (!--height)
return;
}
- if (color != _transparency)
+ if (color != _transparentColor)
*dst = color + _palette_mod;
dst++;
} while (--reps);
@@ -1379,7 +1342,7 @@ void Gdi::unkDecode3(byte *dst, byte *src, int height)
} while (--height);
}
-void Gdi::unkDecode4(byte *dst, byte *src, int height)
+void Gdi::unkDecodeB(byte *dst, byte *src, int height)
{
byte color = *src++;
uint bits = *src++;
@@ -1387,14 +1350,11 @@ void Gdi::unkDecode4(byte *dst, byte *src, int height)
byte bit;
int8 inc = -1;
- int x = 8;
do {
- int h = height;
+ int x = 8;
do {
FILL_BITS;
- if (color != _transparency)
- *dst = color + _palette_mod;
- dst += _vm->_realWidth;
+ *dst++ = color + _palette_mod;
if (!READ_BIT) {
} else if (!READ_BIT) {
FILL_BITS;
@@ -1408,12 +1368,12 @@ void Gdi::unkDecode4(byte *dst, byte *src, int height)
inc = -inc;
color += inc;
}
- } while (--h);
- dst -= _vertStripNextInc;
- } while (--x);
+ } while (--x);
+ dst += _vm->_realWidth - 8;
+ } while (--height);
}
-void Gdi::unkDecode5(byte *dst, byte *src, int height)
+void Gdi::unkDecodeB_trans(byte *dst, byte *src, int height)
{
byte color = *src++;
uint bits = *src++;
@@ -1425,7 +1385,9 @@ void Gdi::unkDecode5(byte *dst, byte *src, int height)
int x = 8;
do {
FILL_BITS;
- *dst++ = color + _palette_mod;
+ if (color != _transparentColor)
+ *dst = color + _palette_mod;
+ dst++;
if (!READ_BIT) {
} else if (!READ_BIT) {
FILL_BITS;
@@ -1444,7 +1406,7 @@ void Gdi::unkDecode5(byte *dst, byte *src, int height)
} while (--height);
}
-void Gdi::unkDecode6(byte *dst, byte *src, int height)
+void Gdi::unkDecodeC(byte *dst, byte *src, int height)
{
byte color = *src++;
uint bits = *src++;
@@ -1477,6 +1439,44 @@ void Gdi::unkDecode6(byte *dst, byte *src, int height)
} while (--x);
}
+void Gdi::unkDecodeC_trans(byte *dst, byte *src, int height)
+{
+ byte color = *src++;
+ uint bits = *src++;
+ byte cl = 8;
+ byte bit;
+ int8 inc = -1;
+
+ int x = 8;
+ do {
+ int h = height;
+ do {
+ FILL_BITS;
+ if (color != _transparentColor)
+ *dst = color + _palette_mod;
+ dst += _vm->_realWidth;
+ if (!READ_BIT) {
+ } else if (!READ_BIT) {
+ FILL_BITS;
+ color = bits & _decomp_mask;
+ bits >>= _decomp_shr;
+ cl -= _decomp_shr;
+ inc = -1;
+ } else if (!READ_BIT) {
+ color += inc;
+ } else {
+ inc = -inc;
+ color += inc;
+ }
+ } while (--h);
+ dst -= _vertStripNextInc;
+ } while (--x);
+}
+
+#undef READ_BIT
+#undef FILL_BITS
+
+
/* Ender - Zak256/Indy256 decoders */
#define READ_256BIT \
if ((mask <<= 1) == 256) {buffer = *src++; mask = 1;} \
@@ -1655,8 +1655,6 @@ void Gdi::unkDecode11(byte *dst, byte *src, int height)
#undef NEXT_ROW
#undef READ_256BIT
-#undef READ_BIT
-#undef FILL_BITS
#pragma mark -
@@ -3209,7 +3207,7 @@ void Scumm::bompApplyMask(byte * line_buffer, byte * mask_src, byte bits, int32
}
line_buffer++;
bits >>= 1;
- } while (bits != 0);
+ } while (bits);
bits = 128;
}
}
@@ -3324,7 +3322,7 @@ void Scumm::decompressBomp(byte *dst, byte *src, int w, int h)
void Scumm::drawBomp(BompDrawData * bd, int decode_mode, int mask) {
byte skip_y = 128;
byte skip_y_new = 0;
- byte bits = 0;
+ byte bits;
byte *mask_out = 0;
byte *charset_mask;
byte tmp;
@@ -3423,31 +3421,32 @@ void Scumm::drawBomp(BompDrawData * bd, int decode_mode, int mask) {
}
}
- if (clip_top-- > 0)
- goto labelBompSkip;
-
- if (mask == 1) {
- bompApplyMask(line_ptr, mask_out, bits, clip_right);
- }
-
- bompApplyMask(line_ptr, charset_mask, bits, clip_right);
- bompApplyActorPalette(line_ptr, clip_right);
+ if (clip_top > 0) {
+ clip_top--;
+ } else {
- switch(bd->shadowMode) {
- case 0:
- bompApplyShadow0(line_ptr, dst, clip_right);
- break;
- case 1:
- bompApplyShadow1(line_ptr, dst, clip_right);
- break;
- case 3:
- bompApplyShadow3(line_ptr, dst, clip_right);
- break;
- default:
- error("Unknown bomp shadowMode %d", bd->shadowMode);
+ if (mask == 1) {
+ bompApplyMask(line_ptr, mask_out, bits, clip_right);
+ }
+
+ bompApplyMask(line_ptr, charset_mask, bits, clip_right);
+ bompApplyActorPalette(line_ptr, clip_right);
+
+ switch(bd->shadowMode) {
+ case 0:
+ bompApplyShadow0(line_ptr, dst, clip_right);
+ break;
+ case 1:
+ bompApplyShadow1(line_ptr, dst, clip_right);
+ break;
+ case 3:
+ bompApplyShadow3(line_ptr, dst, clip_right);
+ break;
+ default:
+ error("Unknown bomp shadowMode %d", bd->shadowMode);
+ }
}
-labelBompSkip:
mask_out += mask_pitch;
charset_mask += mask_pitch;
pos_y++;
diff --git a/scumm/gfx.h b/scumm/gfx.h
index 7a469e2419..3d74d7ebad 100644
--- a/scumm/gfx.h
+++ b/scumm/gfx.h
@@ -131,17 +131,18 @@ protected:
byte _palette_mod;
byte _decomp_shr, _decomp_mask;
- byte _transparency;
+ byte _transparentColor;
uint32 _vertStripNextInc;
/* Bitmap decompressors */
- void decompressBitmap(byte *bgbak_ptr, byte *smap_ptr, int numLinesToProcess);
- void unkDecode1(byte *dst, byte *src, int height);
- void unkDecode2(byte *dst, byte *src, int height);
- void unkDecode3(byte *dst, byte *src, int height);
- void unkDecode4(byte *dst, byte *src, int height);
- void unkDecode5(byte *dst, byte *src, int height);
- void unkDecode6(byte *dst, byte *src, int height);
+ bool decompressBitmap(byte *bgbak_ptr, byte *smap_ptr, int numLinesToProcess);
+ void unkDecodeA(byte *dst, byte *src, int height);
+ void unkDecodeA_trans(byte *dst, byte *src, int height);
+ void unkDecodeB(byte *dst, byte *src, int height);
+ void unkDecodeB_trans(byte *dst, byte *src, int height);
+ void unkDecodeC(byte *dst, byte *src, int height);
+ void unkDecodeC_trans(byte *dst, byte *src, int height);
+
void unkDecode7(byte *dst, byte *src, int height);
void unkDecode8(byte *dst, byte *src, int height);
void unkDecode9(byte *dst, byte *src, int height);
diff --git a/scumm/saveload.cpp b/scumm/saveload.cpp
index c8675b0e9e..cf98762ca7 100644
--- a/scumm/saveload.cpp
+++ b/scumm/saveload.cpp
@@ -425,7 +425,7 @@ void Scumm::saveOrLoad(Serializer *s, uint32 savegameVersion)
MKARRAY_OLD(Scumm, gfxUsageBits[0], sleUint32, 200, VER_V8, VER_V9),
MKARRAY(Scumm, gfxUsageBits[0], sleUint32, 410, VER_V10),
- MKLINE(Scumm, gdi._transparency, sleByte, VER_V8),
+ MKLINE(Scumm, gdi._transparentColor, sleByte, VER_V8),
MKARRAY(Scumm, _currentPalette[0], sleByte, 768, VER_V8),
MKARRAY(Scumm, _proc_special_palette[0], sleByte, 256, VER_V8),
diff --git a/scumm/scummvm.cpp b/scumm/scummvm.cpp
index b7c69aeab2..ecd17460b9 100644
--- a/scumm/scummvm.cpp
+++ b/scumm/scummvm.cpp
@@ -934,11 +934,11 @@ void Scumm::initRoomSubBlocks()
ptr = findResourceData(MKID('TRNS'), roomptr);
if (ptr)
- gdi._transparency = ptr[0];
+ gdi._transparentColor = ptr[0];
else if (_features & GF_AFTER_V8)
- gdi._transparency = 5; // FIXME
+ gdi._transparentColor = 5; // FIXME
else
- gdi._transparency = 255;
+ gdi._transparentColor = 255;
initBGBuffers(_scrHeight);
diff --git a/scumm/string.cpp b/scumm/string.cpp
index 7cd4d3c335..2ac56d03eb 100644
--- a/scumm/string.cpp
+++ b/scumm/string.cpp
@@ -348,11 +348,11 @@ void Scumm::CHARSET_1()
void Scumm::description()
{
int c;
- byte *buffer;
+ byte *buf;
- buffer = _charsetBuffer;
+ buf = _charsetBuffer;
_string[0].ypos = camera._cur.y + 88;
- _string[0].xpos = (_realWidth / 2) - (_charset->getStringWidth(0, buffer) >> 1);
+ _string[0].xpos = (_realWidth / 2) - (_charset->getStringWidth(0, buf) >> 1);
if (_string[0].xpos < 0)
_string[0].xpos = 0;
@@ -373,7 +373,7 @@ void Scumm::description()
restoreCharsetBg();
do {
- c = *buffer++;
+ c = *buf++;
if (c == 0) {
_haveMsg = 1;
break;
@@ -554,7 +554,7 @@ void Scumm::drawString(int a)
if (_features & GF_AFTER_V7) {
_charset->_hasMask = true;
- // FIXME - hos is supposed to ever work, since gdi._mask_left is by default set
+ // FIXME - how is this supposed to ever work, since gdi._mask_left is by default set
// to -1 to mark it as invalid. Hence this comparision will always leave it at -1,
// which implies that if the mask was marked invalid, it will always stay so.
// That seems odd and not at all to be the intended thing... or is it?