aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Horn2002-12-04 13:36:27 +0000
committerMax Horn2002-12-04 13:36:27 +0000
commit89335008e9076bdfd0565514a7b22ecf4738b605 (patch)
treef177dcbf676afc7e059e104519c701d79ad55b4a
parentbe506653c9adcee20af99adf7248c0173fc246c5 (diff)
downloadscummvm-rg350-89335008e9076bdfd0565514a7b22ecf4738b605.tar.gz
scummvm-rg350-89335008e9076bdfd0565514a7b22ecf4738b605.tar.bz2
scummvm-rg350-89335008e9076bdfd0565514a7b22ecf4738b605.zip
lots of cleanup to the graphics code; removed various global states (makes it easier to understand the code)
svn-id: r5831
-rw-r--r--scumm/gfx.cpp91
-rw-r--r--scumm/gfx.h33
-rw-r--r--scumm/saveload.cpp4
-rw-r--r--scumm/scumm.h7
-rw-r--r--scumm/scummvm.cpp2
-rw-r--r--scumm/string.cpp18
6 files changed, 81 insertions, 74 deletions
diff --git a/scumm/gfx.cpp b/scumm/gfx.cpp
index 21f9211855..b811bc1371 100644
--- a/scumm/gfx.cpp
+++ b/scumm/gfx.cpp
@@ -273,7 +273,7 @@ void Scumm::blit(byte *dst, byte *src, int w, int h)
void Scumm::setCursor(int cursor)
{
if (cursor >= 0 && cursor <= 3)
- gdi._currentCursor = cursor;
+ _currentCursor = cursor;
else
warning("setCursor(%d)", cursor);
}
@@ -452,7 +452,7 @@ void Scumm::setPaletteFromPtr(byte *ptr)
// check for that. And somebody before me added a check for V7 games, turning this
// off there, too... I wonder if it hurts other games, too? What exactly is broken
// if we remove this patch?
- if ((_gameId == GID_MONKEY_VGA) || (_features & GF_AFTER_V7) || (i <= 15 || r < 252 || g < 252 || b < 252)) {
+ if ((_features & GF_AFTER_V7) || (i <= 15 || r < 252 || g < 252 || b < 252)) {
*dest++ = r;
*dest++ = g;
*dest++ = b;
@@ -728,8 +728,7 @@ void Scumm::fadeOut(int effect)
// Fill screen 0 with black
vs = &virtscr[0];
- gdi._backbuff_ptr = vs->screenPtr + vs->xstart;
- memset(gdi._backbuff_ptr, 0, vs->size);
+ memset(vs->screenPtr + vs->xstart, 0, vs->size);
// Fade to black with the specified effect, if any.
switch (effect) {
@@ -921,14 +920,14 @@ void Gdi::drawBitmap(byte *ptr, VirtScreen *vs, int x, int y, int h,
if (_vm->hasCharsetMask(sx << 3, y, (sx + 1) << 3, bottom)) {
if (flag & dbClear || !lightsOn)
- clear8ColWithMasking();
+ clear8ColWithMasking(_backbuff_ptr, h, _mask_ptr);
else
- draw8ColWithMasking();
+ draw8ColWithMasking(_backbuff_ptr, _bgbak_ptr, h, _mask_ptr);
} else {
if (flag & dbClear || !lightsOn)
- clear8Col();
+ clear8Col(_backbuff_ptr, h);
else
- _vm->blit(_backbuff_ptr, _bgbak_ptr, 8, h);
+ draw8Col(_backbuff_ptr, _bgbak_ptr, h);
}
}
CHECK_HEAP;
@@ -950,13 +949,13 @@ void Gdi::drawBitmap(byte *ptr, VirtScreen *vs, int x, int y, int h,
// are still too unstable for me to investigate.
if (flag & dbDrawMaskOnAll) {
- _z_plane_ptr = zplane_list[1] + READ_LE_UINT16(zplane_list[1] + stripnr * 2 + 8);
+ byte *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)
- decompressMaskImgOr();
+ decompressMaskImgOr(_mask_ptr_dest, z_plane_ptr, h);
else
- decompressMaskImg();
+ decompressMaskImg(_mask_ptr_dest, z_plane_ptr, h);
}
} else {
for (i = 1; i < numzbuf; i++) {
@@ -976,15 +975,15 @@ void Gdi::drawBitmap(byte *ptr, VirtScreen *vs, int x, int y, int h,
_mask_ptr_dest = _vm->getResourceAddress(rtBuffer, 9) + y * _numStrips + x + _imgBufOffs[i];
if (offs) {
- _z_plane_ptr = zplane_list[i] + offs;
+ byte *z_plane_ptr = zplane_list[i] + offs;
if (_useOrDecompress && flag & dbAllowMaskOr)
- decompressMaskImgOr();
+ decompressMaskImgOr(_mask_ptr_dest, z_plane_ptr, h);
else
- decompressMaskImg();
+ decompressMaskImg(_mask_ptr_dest, z_plane_ptr, h);
} else {
if (!(_useOrDecompress && flag & dbAllowMaskOr))
- for (int height = 0; height < _numLinesToProcess; height++)
+ for (int height = 0; height < h; height++)
_mask_ptr_dest[height * _numStrips] = 0;
/* needs better abstraction, FIXME */
}
@@ -1135,12 +1134,8 @@ int Scumm::hasCharsetMask(int x, int y, int x2, int y2)
return 1;
}
-void Gdi::draw8ColWithMasking()
+void Gdi::draw8ColWithMasking(byte *dst, byte *src, int height, byte *mask)
{
- int height = _numLinesToProcess;
- byte *mask = _mask_ptr;
- byte *dst = _backbuff_ptr;
- byte *src = _bgbak_ptr;
byte maskbits;
do {
@@ -1164,7 +1159,7 @@ void Gdi::draw8ColWithMasking()
dst[7] = src[7];
} else {
#if defined(SCUMM_NEED_ALIGNMENT)
- memcpy(dst, src, 2 * sizeof(uint32));
+ memcpy(dst, src, 8);
#else
((uint32 *)dst)[0] = ((uint32 *)src)[0];
((uint32 *)dst)[1] = ((uint32 *)src)[1];
@@ -1176,11 +1171,8 @@ void Gdi::draw8ColWithMasking()
} while (--height);
}
-void Gdi::clear8ColWithMasking()
+void Gdi::clear8ColWithMasking(byte *dst, int height, byte *mask)
{
- int height = _numLinesToProcess;
- byte *mask = _mask_ptr;
- byte *dst = _backbuff_ptr;
byte maskbits;
do {
@@ -1204,7 +1196,7 @@ void Gdi::clear8ColWithMasking()
dst[7] = 0;
} else {
#if defined(SCUMM_NEED_ALIGNMENT)
- memset(dst, 0, 2 * sizeof(uint32));
+ memset(dst, 0, 8);
#else
((uint32 *)dst)[0] = 0;
((uint32 *)dst)[1] = 0;
@@ -1215,14 +1207,11 @@ void Gdi::clear8ColWithMasking()
} while (--height);
}
-void Gdi::clear8Col()
+void Gdi::clear8Col(byte *dst, int height)
{
- int height = _numLinesToProcess;
- byte *dst = _backbuff_ptr;
-
do {
#if defined(SCUMM_NEED_ALIGNMENT)
- memset(dst, 0, 2 * sizeof(uint32));
+ memset(dst, 0, 8);
#else
((uint32 *)dst)[0] = 0;
((uint32 *)dst)[1] = 0;
@@ -1231,11 +1220,23 @@ void Gdi::clear8Col()
} while (--height);
}
-void Gdi::decompressMaskImg()
+void Gdi::draw8Col(byte *dst, byte *src, int height)
+{
+ do {
+#if defined(SCUMM_NEED_ALIGNMENT)
+ memcpy(dst, src, 8);
+#else
+ ((uint32 *)dst)[0] = ((uint32 *)src)[0];
+ ((uint32 *)dst)[1] = ((uint32 *)src)[1];
+#endif
+ dst += _vm->_realWidth;
+ src += _vm->_realWidth;
+ } while (--height);
+}
+
+
+void Gdi::decompressMaskImg(byte *dst, byte *src, int height)
{
- byte *src = _z_plane_ptr;
- byte *dst = _mask_ptr_dest;
- int height = _numLinesToProcess;
byte b, c;
while (1) {
@@ -1262,15 +1263,13 @@ void Gdi::decompressMaskImg()
}
}
-void Gdi::decompressMaskImgOr()
+void Gdi::decompressMaskImgOr(byte *dst, byte *src, int height)
{
- byte *src = _z_plane_ptr;
- byte *dst = _mask_ptr_dest;
- int height = _numLinesToProcess;
byte b, c;
while (1) {
b = *src++;
+
if (b & 0x80) {
b &= 0x7F;
c = *src++;
@@ -1600,7 +1599,7 @@ void Gdi::unkDecode7()
do {
/* Endian safe */
#if defined(SCUMM_NEED_ALIGNMENT)
- memcpy(dst, src, 2 * sizeof(uint32));
+ memcpy(dst, src, 8);
#else
((uint32 *)dst)[0] = ((uint32 *)src)[0];
((uint32 *)dst)[1] = ((uint32 *)src)[1];
@@ -2720,11 +2719,11 @@ void Gdi::resetBackground(int top, int bottom, int strip)
if (_numLinesToProcess) {
if ((_vm->_features & GF_AFTER_V6) || (_vm->_vars[_vm->VAR_CURRENT_LIGHTS] & LIGHTMODE_screen)) {
if (_vm->hasCharsetMask(strip << 3, top, (strip + 1) << 3, bottom))
- draw8ColWithMasking();
+ draw8ColWithMasking(_backbuff_ptr, _bgbak_ptr, _numLinesToProcess, _mask_ptr);
else
- _vm->blit(_backbuff_ptr, _bgbak_ptr, 8, _numLinesToProcess);
+ draw8Col(_backbuff_ptr, _bgbak_ptr, _numLinesToProcess);
} else {
- clear8Col();
+ clear8Col(_backbuff_ptr, _numLinesToProcess);
}
}
}
@@ -3028,12 +3027,12 @@ void Scumm::decompressDefaultCursor(int idx)
} else {
_cursorWidth = 16;
_cursorHeight = 16;
- _cursorHotspotX = default_cursor_hotspots[2 * gdi._currentCursor];
- _cursorHotspotY = default_cursor_hotspots[2 * gdi._currentCursor + 1];
+ _cursorHotspotX = default_cursor_hotspots[2 * _currentCursor];
+ _cursorHotspotY = default_cursor_hotspots[2 * _currentCursor + 1];
for (i = 0; i < 16; i++) {
for (j = 0; j < 16; j++) {
- if (default_cursor_images[gdi._currentCursor][i] & (1 << j))
+ if (default_cursor_images[_currentCursor][i] & (1 << j))
_grabbedCursor[16 * i + 15 - j] = color;
}
}
diff --git a/scumm/gfx.h b/scumm/gfx.h
index eca0c543f4..c4230fbea2 100644
--- a/scumm/gfx.h
+++ b/scumm/gfx.h
@@ -109,17 +109,22 @@ struct BompDrawData { /* Bomp graphics data */
uint16 shadowMode;
};
-struct Gdi {
+class Gdi {
+ friend class Scumm; // Mostly for the code in saveload.cpp ...
+public:
Scumm *_vm;
+protected:
byte *_readPtr;
uint _readOffs;
+public:
int _numZBuffer;
int _imgBufOffs[5];
byte _disable_zbuffer;
int32 _numStrips;
+protected:
bool _useOrDecompress;
int _numLinesToProcess;
int _tempNumLines;
@@ -130,8 +135,9 @@ struct Gdi {
int16 _drawMouseX;
int16 _drawMouseY;
+public:
int16 _mask_top, _mask_bottom, _mask_right, _mask_left;
- byte _currentCursor;
+protected:
byte _mouseColors[4];
byte _mouseColor;
byte _mouseClipMask1, _mouseClipMask2, _mouseClipMask3;
@@ -142,7 +148,6 @@ struct Gdi {
byte *_bgbak_ptr;
byte *_mask_ptr;
byte *_mask_ptr_dest;
- byte *_z_plane_ptr;
byte _palette_mod;
byte _decomp_shr, _decomp_mask;
@@ -164,27 +169,31 @@ struct Gdi {
void unkDecode10();
void unkDecode11();
+public:
void drawBitmap(byte *ptr, VirtScreen *vs, int x, int y, int h, int stripnr, int numstrip, byte flag);
void clearUpperMask();
void disableZBuffer() { _disable_zbuffer++; }
void enableZBuffer() { _disable_zbuffer--; }
- void draw8ColWithMasking();
- void clear8ColWithMasking();
- void clear8Col();
- void decompressMaskImgOr();
- void decompressMaskImg();
-
- void resetBackground(int top, int bottom, int strip);
- void drawStripToScreen(VirtScreen *vs, int x, int w, int t, int b);
- void updateDirtyScreen(VirtScreen *vs);
+protected:
+ void draw8ColWithMasking(byte *dst, byte *src, int height, byte *mask);
+ void draw8Col(byte *dst, byte *src, int height);
+ void clear8ColWithMasking(byte *dst, int height, byte *mask);
+ void clear8Col(byte *dst, int height);
+ void decompressMaskImgOr(byte *dst, byte *src, int height);
+ void decompressMaskImg(byte *dst, byte *src, int height);
+public:
enum DrawBitmapFlags {
dbAllowMaskOr = 1,
dbDrawMaskOnAll = 2,
dbClear = 4
};
+
+ void resetBackground(int top, int bottom, int strip);
+ void drawStripToScreen(VirtScreen *vs, int x, int w, int t, int b);
+ void updateDirtyScreen(VirtScreen *vs);
};
#endif
diff --git a/scumm/saveload.cpp b/scumm/saveload.cpp
index 33ecf348bf..8be9d988c1 100644
--- a/scumm/saveload.cpp
+++ b/scumm/saveload.cpp
@@ -398,7 +398,7 @@ void Scumm::saveOrLoad(Serializer *s)
MKLINE(Scumm, _userPut, sleByte),
MKLINE(Scumm, _cursorState, sleByte),
MKLINE(Scumm, gdi._cursorActive, sleByte),
- MKLINE(Scumm, gdi._currentCursor, sleByte),
+ MKLINE(Scumm, _currentCursor, sleByte),
MKLINE(Scumm, _doEffect, sleByte),
MKLINE(Scumm, _switchRoomEffect, sleByte),
@@ -513,7 +513,7 @@ void Scumm::saveOrLoad(Serializer *s)
MKLINE(Scumm, _userPut, sleByte),
MKLINE(Scumm, _cursorState, sleByte),
MKLINE(Scumm, gdi._cursorActive, sleByte),
- MKLINE(Scumm, gdi._currentCursor, sleByte),
+ MKLINE(Scumm, _currentCursor, sleByte),
MKLINE(Scumm, _doEffect, sleByte),
MKLINE(Scumm, _switchRoomEffect, sleByte),
diff --git a/scumm/scumm.h b/scumm/scumm.h
index 61d92896a2..4a19cef967 100644
--- a/scumm/scumm.h
+++ b/scumm/scumm.h
@@ -200,14 +200,10 @@ struct CharsetRenderer {
byte _ignoreCharsetMask;
- byte *_backbuff_ptr, *_bgbak_ptr;
- byte *_mask_ptr;
- byte *_dest_ptr;
-
byte _colorMap[16];
byte _buffer[512];
- void drawBits();
+ void drawBits(byte *dst, byte *mask);
void printChar(int chr);
void printCharOld(int chr);
int getSpacing(byte chr, byte *charset);
@@ -696,6 +692,7 @@ public:
int _cursorHotspotX, _cursorHotspotY, _cursorWidth, _cursorHeight;
byte _cursorAnimate, _cursorAnimateIndex, _grabbedCursor[2048];
int8 _cursorState;
+ byte _currentCursor;
byte _newEffect, _switchRoomEffect2, _switchRoomEffect;
bool _doEffect;
diff --git a/scumm/scummvm.cpp b/scumm/scummvm.cpp
index da5025081b..ab41c5131f 100644
--- a/scumm/scummvm.cpp
+++ b/scumm/scummvm.cpp
@@ -311,7 +311,7 @@ void Scumm::scummInit()
_talkDelay = 0;
_keepText = false;
- gdi._currentCursor = 0;
+ _currentCursor = 0;
_cursorState = 0;
_userPut = 0;
diff --git a/scumm/string.cpp b/scumm/string.cpp
index e98b067717..cc4821e527 100644
--- a/scumm/string.cpp
+++ b/scumm/string.cpp
@@ -1023,10 +1023,14 @@ void CharsetRenderer::printChar(int chr)
if (vs->number == 0 && _blitAlso == 0)
_hasMask = true;
+ byte *_backbuff_ptr;
+ byte *_mask_ptr;
+ byte *_dest_ptr;
+
_dest_ptr = _backbuff_ptr = vs->screenPtr + vs->xstart + _drawTop * _vm->_realWidth + _left;
if (_blitAlso) {
- _dest_ptr = _bgbak_ptr = _vm->getResourceAddress(rtBuffer, vs->number + 5)
+ _dest_ptr = _vm->getResourceAddress(rtBuffer, vs->number + 5)
+ vs->xstart + _drawTop * _vm->_realWidth + _left;
}
@@ -1036,10 +1040,10 @@ void CharsetRenderer::printChar(int chr)
_virtScreenHeight = vs->height;
_charPtr += 4;
- drawBits();
+ drawBits(_dest_ptr, _mask_ptr);
if (_blitAlso)
- _vm->blit(_backbuff_ptr, _bgbak_ptr, _width, _height);
+ _vm->blit(_backbuff_ptr, _dest_ptr, _width, _height);
_left += _width;
if (_left > _strRight)
@@ -1051,10 +1055,10 @@ void CharsetRenderer::printChar(int chr)
_top -= _offsY;
}
-void CharsetRenderer::drawBits()
+void CharsetRenderer::drawBits(byte *dst, byte *mask)
{
bool usemask;
- byte *dst, *mask, maskmask;
+ byte maskmask;
int y, x;
int maskpos;
int color;
@@ -1065,8 +1069,6 @@ void CharsetRenderer::drawBits()
bits = *_charPtr++;
numbits = 8;
- dst = _dest_ptr;
- mask = _mask_ptr;
y = 0;
for (y = 0; y < _height && y + _drawTop < _virtScreenHeight;) {
@@ -1092,7 +1094,7 @@ void CharsetRenderer::drawBits()
maskpos++;
}
}
- dst = (_dest_ptr += _vm->_realWidth);
+ dst += _vm->_realWidth - _width;
mask += _vm->gdi._numStrips;
y++;
}