Ticket #8204: loom-text-masking.diff

File loom-text-masking.diff, 2.1 KB (added by eriktorbjorn, 21 years ago)

Patch against an April 27 CVS snapshot

  • scummvm/scumm/charset.cpp

    diff -ur ScummVM-cvs20030427/scummvm/scumm/charset.cpp ScummVM-cvs20030427+hack/scummvm/scumm/charset.cpp
    old new  
    184184}
    185185
    186186void CharsetRendererOld256::printChar(int chr) {
    187         // Indy3 / Zak256
     187        // Indy3 / Zak256 / Loom
    188188        VirtScreen *vs;
    189         byte *char_ptr, *dest_ptr;
    190         unsigned int buffer = 0, mask = 0, x = 0, y = 0;
    191         unsigned char color;
    192 
     189        byte *char_ptr, *dest_ptr, *mask_ptr;
     190        unsigned int buffer = 0, bit = 0, x = 0, y = 0;
     191        bool useMask;
    193192        int w, h;
    194193
    195194        if (!_dropShadow) {
     
    216215
    217216        char_ptr = _fontPtr + chr * 8;
    218217        dest_ptr = vs->screenPtr + vs->xstart + (_top - vs->topline) * _vm->_realWidth + _left;
     218        mask_ptr = _vm->getResourceAddress(rtBuffer, 9) + _vm->_screenStartStrip + (_top - vs->topline) * _vm->gdi._numStrips + _left / 8;
     219        useMask = (vs->number == 0 && !_ignoreCharsetMask);
     220
    219221        _vm->updateDirtyRect(vs->number, _left, _left + w, _top - vs->topline, _top - vs->topline + h, 0);
     222        if (vs->number == 0)
     223                _hasMask = true;
    220224
    221225        for (y = 0; y < 8; y++) {
     226                byte maskmask = revBitMask[_left & 7];
     227                int maskpos = 0;
     228
    222229                for (x = 0; x < 8; x++) {
    223                         if ((mask >>= 1) == 0) {
     230                        if ((bit >>= 1) == 0) {
    224231                                buffer = *char_ptr++;
    225                                 mask = 0x80;
     232                                bit = 0x80;
    226233                        }
    227                         color = ((buffer & mask) != 0);
    228                         if (color) {
     234                        if (buffer & bit) {
     235                                byte *dst = dest_ptr + y * _vm->_realWidth + x;
     236
    229237                                if (_dropShadow)
    230                                         *(dest_ptr + (y + 1) * _vm->_realWidth + x + 1) = 0;
    231                                 *(dest_ptr + y * _vm->_realWidth + x) = _color;
     238                                        *(dst + _vm->_realWidth + 1) = 0;
     239                                *dst = _color;
     240
     241                                if (useMask) {
     242                                        mask_ptr[maskpos] |= maskmask;
     243                                        if (_dropShadow) {
     244                                                int spos = maskpos + _vm->gdi._numStrips;
     245                                                byte sbit = maskmask >> 1;
     246
     247                                                if (sbit == 0) {
     248                                                        sbit = 0x80;
     249                                                        spos++;
     250                                                }
     251                                                mask_ptr[spos] |= sbit;
     252                                        }
     253                                }
     254                        }
     255                        maskmask >>= 1;
     256                        if (maskmask == 0) {
     257                                maskmask = 0x80;
     258                                maskpos++;
    232259                        }
    233260                }
     261                mask_ptr += _vm->gdi._numStrips;
    234262        }
    235263
    236264        // FIXME