diff options
author | Max Horn | 2004-08-08 22:10:38 +0000 |
---|---|---|
committer | Max Horn | 2004-08-08 22:10:38 +0000 |
commit | 835ef5f0127718959425dfdd7c123cf14ce13829 (patch) | |
tree | 38beec4b02a7fdf0d08fd22fdd7f2e2b9ab07cee /scumm/charset.cpp | |
parent | f8cc6c22416c0e9615abfdd98fc2e86852e897a9 (diff) | |
download | scummvm-rg350-835ef5f0127718959425dfdd7c123cf14ce13829.tar.gz scummvm-rg350-835ef5f0127718959425dfdd7c123cf14ce13829.tar.bz2 scummvm-rg350-835ef5f0127718959425dfdd7c123cf14ce13829.zip |
Patch #1003866 (SCUMM: New text rendering code (fixes various bugs))
svn-id: r14521
Diffstat (limited to 'scumm/charset.cpp')
-rw-r--r-- | scumm/charset.cpp | 85 |
1 files changed, 32 insertions, 53 deletions
diff --git a/scumm/charset.cpp b/scumm/charset.cpp index 43b9b6cdd4..528d25edde 100644 --- a/scumm/charset.cpp +++ b/scumm/charset.cpp @@ -944,7 +944,7 @@ void CharsetRendererV3::setColor(byte color) void CharsetRendererV3::printChar(int chr) { // Indy3 / Zak256 / Loom VirtScreen *vs; - byte *char_ptr, *dest_ptr, *mask_ptr; + byte *char_ptr, *dest_ptr; int width, height; int drawTop; @@ -972,8 +972,6 @@ void CharsetRendererV3::printChar(int chr) { drawTop = _top - vs->topline; char_ptr = _fontPtr + chr * 8; - dest_ptr = vs->screenPtr + vs->xstart + drawTop * vs->width + _left; - mask_ptr = _vm->getMaskBuffer(_left, drawTop, 0); _vm->markRectAsDirty(vs->number, _left, _left + width, drawTop, drawTop + height); @@ -981,8 +979,13 @@ void CharsetRendererV3::printChar(int chr) { _hasMask = true; _textScreenID = vs->number; } + if (_ignoreCharsetMask || !vs->hasTwoBuffers) { + dest_ptr = vs->screenPtr + vs->xstart + drawTop * vs->width + _left; + } else { + dest_ptr = (byte *)_vm->gdi._textSurface.pixels + drawTop * _vm->gdi._textSurface.pitch + _left; + } - drawBits1(vs, dest_ptr, char_ptr, mask_ptr, drawTop, 8, 8); + drawBits1(vs, dest_ptr, char_ptr, drawTop, 8, 8); if (_str.left > _left) _str.left = _left; @@ -1085,24 +1088,29 @@ void CharsetRendererClassic::printChar(int chr) { _vm->markRectAsDirty(vs->number, _left, _left + width, drawTop, drawTop + height + offsY); + byte *dst; + byte *back; + if (!_ignoreCharsetMask) { _hasMask = true; _textScreenID = vs->number; } + if (_ignoreCharsetMask || !vs->hasTwoBuffers) { + dst = vs->screenPtr + vs->xstart + drawTop * vs->width + _left; + } else { + dst = (byte *)_vm->gdi._textSurface.pixels + drawTop * _vm->gdi._textSurface.pitch + _left; + } - byte *mask = _vm->getMaskBuffer(_left, drawTop, 0); - byte *dst = vs->screenPtr + vs->xstart + drawTop * vs->width + _left; - - byte *back = dst; + back = dst; if (_blitAlso && vs->hasTwoBuffers) { dst = vs->backBuf + vs->xstart + drawTop * vs->width + _left; } if (is2byte) { - drawBits1(vs, dst, charPtr, mask, drawTop, origWidth, origHeight); + drawBits1(vs, dst, charPtr, drawTop, origWidth, origHeight); } else { byte bpp = *_fontPtr; - drawBitsN(vs, dst, charPtr, mask, bpp, drawTop, origWidth, origHeight); + drawBitsN(vs, dst, charPtr, bpp, drawTop, origWidth, origHeight); } if (_blitAlso && vs->hasTwoBuffers) { @@ -1128,30 +1136,21 @@ void CharsetRendererClassic::printChar(int chr) { _top -= offsY; } -void CharsetRendererClassic::drawBitsN(VirtScreen *vs, byte *dst, const byte *src, byte *mask, byte bpp, int drawTop, int width, int height) { - byte maskmask; +void CharsetRendererClassic::drawBitsN(VirtScreen *vs, byte *dst, const byte *src, byte bpp, int drawTop, int width, int height) { int y, x; - int maskpos; int color; byte numbits, bits; - bool useMask = (vs->number == kMainVirtScreen && !_ignoreCharsetMask); assert(bpp == 1 || bpp == 2 || bpp == 4 || bpp == 8); bits = *src++; numbits = 8; for (y = 0; y < height && y + drawTop < vs->height; y++) { - maskmask = revBitMask[_left & 7]; - maskpos = 0; - for (x = 0; x < width; x++) { color = (bits >> (8 - bpp)) & 0xFF; if (color && y + drawTop >= 0) { *dst = _vm->_charsetColorMap[color]; - if (useMask) { - mask[maskpos] |= maskmask; - } } dst++; bits <<= bpp; @@ -1160,28 +1159,16 @@ void CharsetRendererClassic::drawBitsN(VirtScreen *vs, byte *dst, const byte *sr bits = *src++; numbits = 8; } - maskmask >>= 1; - if (maskmask == 0) { - maskmask = 0x80; - maskpos++; - } } dst += vs->width - width; - mask += _vm->gdi._numStrips; } } -void CharsetRendererCommon::drawBits1(VirtScreen *vs, byte *dst, const byte *src, byte *mask, int drawTop, int width, int height) { - byte maskmask; +void CharsetRendererCommon::drawBits1(VirtScreen *vs, byte *dst, const byte *src, int drawTop, int width, int height) { int y, x; - int maskpos; byte bits = 0; - bool useMask = (vs->number == kMainVirtScreen && !_ignoreCharsetMask); for (y = 0; y < height && y + drawTop < vs->height; y++) { - maskmask = revBitMask[_left & 7]; - maskpos = 0; - for (x = 0; x < width; x++) { if ((x % 8) == 0) bits = *src++; @@ -1192,30 +1179,11 @@ void CharsetRendererCommon::drawBits1(VirtScreen *vs, byte *dst, const byte *src *(dst + vs->width + 1) = _shadowColor; } *dst = _color; - if (useMask) { - mask[maskpos] |= maskmask; - if (_dropShadow) { - mask[maskpos + _vm->gdi._numStrips] |= maskmask; - if (maskmask == 1) { - mask[maskpos + 1] |= 0x80; - mask[maskpos + _vm->gdi._numStrips + 1] |= 0x80; - } else { - mask[maskpos] |= (maskmask >> 1); - mask[maskpos + _vm->gdi._numStrips] |= (maskmask >> 1); - } - } - } } dst++; - maskmask >>= 1; - if (maskmask == 0) { - maskmask = 0x80; - maskpos++; - } } dst += vs->width - width; - mask += _vm->gdi._numStrips; } } @@ -1293,12 +1261,23 @@ void CharsetRendererNut::printChar(int chr) { shadow.right = _left + width + 2; shadow.bottom = _top + height + 2; + Graphics::Surface s; if (!_ignoreCharsetMask) { _hasMask = true; _textScreenID = kMainVirtScreen; } + if (_ignoreCharsetMask) { + VirtScreen *vs = &_vm->virtscr[kMainVirtScreen]; + s.pixels = vs->screenPtr + vs->xstart + _vm->_screenTop * vs->width; + s.w = vs->width; + s.h = vs->height; + s.pitch = vs->width; + s.bytesPerPixel = 1; + } else { + s = _vm->gdi._textSurface; + } - _current->drawShadowChar(chr, _left, _top, _color, !_ignoreCharsetMask, _curId != 3); + _current->drawShadowChar(s, chr, _left, _top, _color, _curId != 3); _vm->markRectAsDirty(kMainVirtScreen, shadow); if (_str.left > _left) |