From 047298745f4e134a1b1f88d7c6ff824fd7a0dcdf Mon Sep 17 00:00:00 2001 From: Gregory Montoir Date: Fri, 24 Feb 2006 22:36:55 +0000 Subject: added TRLE wiz masking (mostly untested) svn-id: r20847 --- engines/scumm/he/wiz_he.cpp | 116 ++++++++++++++++++++++++++++++++++++++++---- engines/scumm/he/wiz_he.h | 1 + 2 files changed, 108 insertions(+), 9 deletions(-) (limited to 'engines') diff --git a/engines/scumm/he/wiz_he.cpp b/engines/scumm/he/wiz_he.cpp index ab9d7a0d6d..1f4be9c81d 100644 --- a/engines/scumm/he/wiz_he.cpp +++ b/engines/scumm/he/wiz_he.cpp @@ -355,6 +355,106 @@ void Wiz::copyWizImage(uint8 *dst, const uint8 *src, int dstw, int dsth, int src } } +static void decodeWizMask(uint8 *&dst, uint8 &mask, int w, int maskType) { + switch (maskType) { + case 0: + while (w--) { + mask >>= 1; + if (mask == 0) { + mask = 0x80; + ++dst; + } + } + break; + case 1: + while (w--) { + *dst &= ~mask; + mask >>= 1; + if (mask == 0) { + mask = 0x80; + ++dst; + } + } + break; + case 2: + while (w--) { + *dst |= mask; + mask >>= 1; + if (mask == 0) { + mask = 0x80; + ++dst; + } + } + break; + } +} + +void Wiz::copyWizImageWithMask(uint8 *dst, const uint8 *src, int dstw, int dsth, int srcx, int srcy, int srcw, int srch, const Common::Rect *rect, int maskT, int maskP) { + Common::Rect srcRect, dstRect; + if (!calcClipRects(dstw, dsth, srcx, srcy, srcw, srch, rect, srcRect, dstRect)) { + return; + } + dst += dstRect.top * ((dstw + (srcRect.left & 7)) >> 3) + ((dstRect.left + (srcRect.left & 7)) >> 3); + uint8 mask = 1 << (7 - (dstRect.left & 7)); + for (int y = 0; y < srcRect.top; ++y) { + src += READ_LE_UINT16(src) + 2; + } + int h = srcRect.height(); + while (h--) { + uint16 off = READ_LE_UINT16(src); src += 2; + uint8 *dstNextLine = dst + dstw; + const uint8 *srcNextLine = src + off; + if (off != 0) { + int x = srcRect.left; + int w = srcRect.width(); + while (w > 0) { + uint8 code = *src++; + if (code & 1) { + code >>= 1; + if (x > 0) { + x -= code; + if (x >= 0) continue; + code = -x; + } + decodeWizMask(dst, mask, code, maskT); + w -= code; + } else { + bool setColor = (code & 2) == 2; + code = (code >> 2) + 1; + if (x > 0) { + x -= code; + if (x >= 0) { + if (setColor) { + ++src; + } else { + src += code; + } + continue; + } + if (!setColor) { + src += x; + } + code = -x; + } + w -= code; + if (w < 0) { + code += w; + } + if (setColor) { + decodeWizMask(dst, mask, code, maskP); + ++src; + } else { + decodeWizMask(dst, mask, code, maskP); + src += code; + } + } + } + } + dst = dstNextLine; + src = srcNextLine; + } +} + void Wiz::copyRaw16BitWizImage(uint8 *dst, const uint8 *src, int dstw, int dsth, int srcx, int srcy, int srcw, int srch, const Common::Rect *rect, int flags, const uint8 *palPtr, int transColor) { // RAW 16 bits in 555 format @@ -1079,15 +1179,13 @@ uint8 *Wiz::drawWizImage(int resNum, int state, int x1, int y1, int zorder, int copyRawWizImage(dst, wizd, cw, ch, x1, y1, width, height, &rScreen, flags, palPtr, transColor); break; case 1: - // TODO Adding masking for flags 0x80 and 0x100 - if (flags & 0x80) - // Used in maze - debug(0, "drawWizImage: Unhandled flag 0x80"); - if (flags & 0x100) { - // Used in readdemo - debug(0, "drawWizImage: Unhandled flag 0x100"); - } - copyWizImage(dst, wizd, cw, ch, x1, y1, width, height, &rScreen, flags, palPtr, xmapPtr); + if (flags & 0x80) { + copyWizImageWithMask(dst, wizd, cw, ch, x1, y1, width, height, &rScreen, 0, 2); + } else if (flags & 0x100) { + copyWizImageWithMask(dst, wizd, cw, ch, x1, y1, width, height, &rScreen, 0, 1); + } else { + copyWizImage(dst, wizd, cw, ch, x1, y1, width, height, &rScreen, flags, palPtr, xmapPtr); + } break; case 2: copyRaw16BitWizImage(dst, wizd, cw, ch, x1, y1, width, height, &rScreen, flags, palPtr, transColor); diff --git a/engines/scumm/he/wiz_he.h b/engines/scumm/he/wiz_he.h index 86d3e97721..597a857a1f 100644 --- a/engines/scumm/he/wiz_he.h +++ b/engines/scumm/he/wiz_he.h @@ -193,6 +193,7 @@ public: static void copyAuxImage(uint8 *dst1, uint8 *dst2, const uint8 *src, int dstw, int dsth, int srcx, int srcy, int srcw, int srch); static void copyWizImage(uint8 *dst, const uint8 *src, int dstw, int dsth, int srcx, int srcy, int srcw, int srch, const Common::Rect *rect, int flags = 0, const uint8 *palPtr = NULL, const uint8 *xmapPtr = NULL); + static void copyWizImageWithMask(uint8 *dst, const uint8 *src, int dstw, int dsth, int srcx, int srcy, int srcw, int srch, const Common::Rect *rect, int maskT, int maskP); static void copyRawWizImage(uint8 *dst, const uint8 *src, int dstw, int dsth, int srcx, int srcy, int srcw, int srch, const Common::Rect *rect, int flags, const uint8 *palPtr, int transColor); static void copyRaw16BitWizImage(uint8 *dst, const uint8 *src, int dstw, int dsth, int srcx, int srcy, int srcw, int srch, const Common::Rect *rect, int flags, const uint8 *palPtr, int transColor); static void decompressWizImage(uint8 *dst, int dstPitch, const Common::Rect &dstRect, const uint8 *src, const Common::Rect &srcRect, int flags, const uint8 *palPtr = NULL, const uint8 *xmapPtr = NULL); -- cgit v1.2.3