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; | 
