aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/scumm.h5
-rw-r--r--scumm/string.cpp55
-rw-r--r--scumm/verbs.cpp31
3 files changed, 47 insertions, 44 deletions
diff --git a/scumm/scumm.h b/scumm/scumm.h
index e2f448576b..01bb81de64 100644
--- a/scumm/scumm.h
+++ b/scumm/scumm.h
@@ -199,13 +199,10 @@ protected:
byte _bpp;
uint32 _charOffs;
byte *_charPtr;
- int _width, _height;
int _offsX, _offsY;
- int _bottom;
int _virtScreenHeight;
-
- void drawBits(byte *dst, byte *mask, int drawTop);
+ void drawBits(byte *dst, byte *mask, int drawTop, int width, int height);
public:
byte _colorMap[16];
diff --git a/scumm/string.cpp b/scumm/string.cpp
index 17fe2f5dc9..b63b707623 100644
--- a/scumm/string.cpp
+++ b/scumm/string.cpp
@@ -229,7 +229,8 @@ void CharsetRenderer::printCharOld(int chr)
void CharsetRenderer::printChar(int chr)
{
- int d, right;
+ int width, height;
+ int d;
VirtScreen *vs;
_vm->checkRange(_vm->_maxCharsets - 1, 1, _curId, "Printing with bad charset %d");
@@ -252,8 +253,8 @@ void CharsetRenderer::printChar(int chr)
_charPtr = _fontPtr + _charOffs;
- _width = _charPtr[0];
- _height = _charPtr[1];
+ width = _charPtr[0];
+ height = _charPtr[1];
if (_firstChar) {
_strLeft = 0;
_strTop = 0;
@@ -278,10 +279,8 @@ void CharsetRenderer::printChar(int chr)
_top += _offsY;
_left += _offsX;
- right = _left + _width;
-
- if (right > _right + 1 || _left < 0) {
- _left = right;
+ if (_left + width > _right + 1 || _left < 0) {
+ _left += width;
_top -= _offsY;
return;
}
@@ -305,14 +304,13 @@ void CharsetRenderer::printChar(int chr)
int drawTop = _top - vs->topline;
if (drawTop < 0)
drawTop = 0;
+ int bottom = drawTop + height + _offsY;
- _bottom = drawTop + _height + _offsY;
-
- _vm->updateDirtyRect(vs->number, _left, right, drawTop, _bottom, 0);
+ _vm->updateDirtyRect(vs->number, _left, _left + width, drawTop, bottom, 0);
if (vs->number != 0)
_blitAlso = false;
- if (vs->number == 0 && _blitAlso == 0)
+ if (vs->number == 0 && !_blitAlso)
_hasMask = true;
_virtScreenHeight = vs->height;
@@ -328,24 +326,24 @@ void CharsetRenderer::printChar(int chr)
dst = _vm->getResourceAddress(rtBuffer, vs->number + 5)
+ vs->xstart + drawTop * _vm->_realWidth + _left;
- drawBits(dst, mask, drawTop);
+ drawBits(dst, mask, drawTop, width, height);
- _vm->blit(back, dst, _width, _height);
+ _vm->blit(back, dst, width, height);
} else {
- drawBits(dst, mask, drawTop);
+ drawBits(dst, mask, drawTop, width, height);
}
- _left += _width;
+ _left += width;
if (_left > _strRight)
_strRight = _left;
- if (_top + _height > _strBottom)
- _strBottom = _top + _height;
+ if (_top + height > _strBottom)
+ _strBottom = _top + height;
_top -= _offsY;
}
-void CharsetRenderer::drawBits(byte *dst, byte *mask, int drawTop)
+void CharsetRenderer::drawBits(byte *dst, byte *mask, int drawTop, int width, int height)
{
bool usemask;
byte maskmask;
@@ -361,12 +359,16 @@ void CharsetRenderer::drawBits(byte *dst, byte *mask, int drawTop)
y = 0;
- for (y = 0; y < _height && y + drawTop < _virtScreenHeight;) {
+ for (y = 0; y < height && y + drawTop < _virtScreenHeight; y++) {
maskmask = revBitMask[_left & 7];
maskpos = 0;
- for (x = 0; x < _width; x++) {
+ for (x = 0; x < width; x++) {
+ int myMask = (0xFF << (8 - _bpp)) & 0xFF;
+ int myColor = (bits & myMask) >> (8 - _bpp);
color = (bits >> (8 - _bpp)) & 0xFF;
+ assert(color == myColor);
+
if (color) {
if (usemask) {
mask[maskpos] |= maskmask;
@@ -375,18 +377,19 @@ void CharsetRenderer::drawBits(byte *dst, byte *mask, int drawTop)
}
dst++;
bits <<= _bpp;
- if ((numbits -= _bpp) == 0) {
+ numbits -= _bpp;
+ if (numbits == 0) {
bits = *_charPtr++;
numbits = 8;
}
- if ((maskmask >>= 1) == 0) {
+ maskmask >>= 1;
+ if (maskmask == 0) {
maskmask = 0x80;
maskpos++;
}
}
- dst += _vm->_realWidth - _width;
+ dst += _vm->_realWidth - width;
mask += _vm->gdi._numStrips;
- y++;
}
}
@@ -856,9 +859,7 @@ void Scumm::drawString(int a)
}
for (i = 0; (chr = buf[i++]) != 0;) {
- if (chr == 254)
- chr = 255;
- if (chr == 255) {
+ if (chr == 254 || chr == 255) {
chr = buf[i++];
switch (chr) {
case 9:
diff --git a/scumm/verbs.cpp b/scumm/verbs.cpp
index 3bf502cb47..45bb5c8a7d 100644
--- a/scumm/verbs.cpp
+++ b/scumm/verbs.cpp
@@ -25,6 +25,7 @@
#include "object.h"
#include "resource.h"
#include "verbs.h"
+#include "common/util.h"
void Scumm::redrawVerbs()
{
@@ -115,22 +116,22 @@ int Scumm::checkMouseOver(int x, int y)
return 0;
}
-void Scumm::drawVerb(int vrb, int mode)
+void Scumm::drawVerb(int verb, int mode)
{
VerbSlot *vs;
byte tmp;
- if (!vrb)
+ if (!verb)
return;
- vs = &_verbs[vrb];
+ vs = &_verbs[verb];
if (!vs->saveid && vs->curmode && vs->verbid) {
if (vs->type == kImageVerbType) {
- drawVerbBitmap(vrb, vs->x, vs->y);
+ drawVerbBitmap(verb, vs->x, vs->y);
return;
}
- restoreVerbBG(vrb);
+ restoreVerbBG(verb);
_string[4].charset = vs->charset_nr;
_string[4].xpos = vs->x;
@@ -147,15 +148,19 @@ void Scumm::drawVerb(int vrb, int mode)
// FIXME For the future: Indy3 and under inv scrolling
/*
- if (vrb >= 31 && vrb <= 36)
- vrb += _inventoryOffset;
+ if (verb >= 31 && verb <= 36)
+ verb += _inventoryOffset;
*/
- _messagePtr = getResourceAddress(rtVerb, vrb);
+ _messagePtr = getResourceAddress(rtVerb, verb);
if (!_messagePtr)
return;
assert(_messagePtr);
+ if ((verb == 49 || verb == 48) && mode == 0) {
+ hexdump(_messagePtr, 32);
+ }
+
tmp = charset._center;
charset._center = 0;
drawString(4);
@@ -169,7 +174,7 @@ void Scumm::drawVerb(int vrb, int mode)
vs->oldbottom = charset._strBottom;
charset._strLeft = charset._strRight;
} else {
- restoreVerbBG(vrb);
+ restoreVerbBG(verb);
}
}
@@ -185,7 +190,7 @@ void Scumm::restoreVerbBG(int verb)
}
}
-void Scumm::drawVerbBitmap(int vrb, int x, int y)
+void Scumm::drawVerbBitmap(int verb, int x, int y)
{
VirtScreen *vs;
VerbSlot *vst;
@@ -208,7 +213,7 @@ void Scumm::drawVerbBitmap(int vrb, int x, int y)
xstrip = x >> 3;
ydiff = y - vs->topline;
- obim = getResourceAddress(rtVerb, vrb);
+ obim = getResourceAddress(rtVerb, verb);
if (_features & GF_SMALL_HEADER) {
int obj;
obj = READ_LE_UINT16(obim + 6);
@@ -229,7 +234,7 @@ void Scumm::drawVerbBitmap(int vrb, int x, int y)
imptr = findResource(MKID('IM01'), obim);
if (!imptr)
- error("No image for verb %d", vrb);
+ error("No image for verb %d", verb);
}
for (i = 0; i < imgw; i++) {
tmp = xstrip + i;
@@ -237,7 +242,7 @@ void Scumm::drawVerbBitmap(int vrb, int x, int y)
gdi.drawBitmap(imptr, vs, tmp, ydiff, imgh << 3, i, 1, true);
}
- vst = &_verbs[vrb];
+ vst = &_verbs[verb];
vst->right = vst->x + imgw * 8 - 1;
vst->bottom = vst->y + imgh * 8 - 1;
vst->oldleft = vst->x;