diff options
-rw-r--r-- | scumm/scumm.h | 5 | ||||
-rw-r--r-- | scumm/string.cpp | 55 | ||||
-rw-r--r-- | scumm/verbs.cpp | 31 |
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; |