Index: scummvm/engines/scumm/gfx.cpp =================================================================== --- scummvm/engines/scumm/gfx.cpp (revisione 33992) +++ scummvm/engines/scumm/gfx.cpp (copia locale) @@ -587,10 +587,10 @@ scale2x(dst, _screenWidth * m, src, vs->pitch, width, height); src = dst; - vsPitch = _screenWidth * m - width * m; + vsPitch = _screenWidth * m; } else { - vsPitch = vs->pitch - width; + vsPitch = vs->pitch; } dst = _compositeBuf; @@ -628,17 +628,32 @@ #ifdef USE_ARM_GFX_ASM asmDrawStripToScreen(height, width, text, src, dst, vs->pitch, width, _textSurface.pitch); #else - for (int h = 0; h < height * m; ++h) { - for (int w = 0; w < width * m; ++w) { - byte tmp = *text++; - if (tmp == CHARSET_MASK_TRANSPARENCY) - tmp = *src; - *dst++ = tmp; - src++; - } - src += vsPitch; - text += _textSurface.pitch - width * m; - } + int h = height * m; + int w = width * m; + + if (h && w) { + text += w; + src += w; + dst += w; + + w = 0-w; + + do { + int ww = w; + do { + uint32 temp = *(const uint32 *)(text + ww); + uint32 mask = temp ^ CHARSET_MASK_TRANSPARENCY_32; + + mask = (((mask & 0x7f7f7f7f) + 0x7f7f7f7f) | mask) & 0x80808080; + mask = ((mask >> 7) + 0x7f7f7f7f) ^ 0x80808080; + + *(uint32 *)(dst + ww) = ((temp ^ *(const uint32 *)(src + ww)) & mask) ^ temp; + } while ((ww+=4)); + + src += vsPitch; + text += _textSurface.pitch; + } while (--h); + } #endif src = _compositeBuf; pitch = width; Index: scummvm/engines/scumm/gfx.h =================================================================== --- scummvm/engines/scumm/gfx.h (revisione 33992) +++ scummvm/engines/scumm/gfx.h (copia locale) @@ -175,6 +175,11 @@ struct StripTable; #define CHARSET_MASK_TRANSPARENCY 253 +#define CHARSET_MASK_TRANSPARENCY_32 \ + (((CHARSET_MASK_TRANSPARENCY & 0xff) ) | \ + ((CHARSET_MASK_TRANSPARENCY & 0xff) << 8) | \ + ((CHARSET_MASK_TRANSPARENCY & 0xff) << 16) | \ + ((CHARSET_MASK_TRANSPARENCY & 0xff) << 24)) class Gdi { protected: