aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Montoir2007-05-17 22:13:31 +0000
committerGregory Montoir2007-05-17 22:13:31 +0000
commite9827d0884318822b20d13dbe6465c78194e5ea2 (patch)
tree27ad533e46001d04bd81045b088ce34ddf873fab
parentedaadd692feecd478f1b27df8aa35a68978e5c57 (diff)
downloadscummvm-rg350-e9827d0884318822b20d13dbe6465c78194e5ea2.tar.gz
scummvm-rg350-e9827d0884318822b20d13dbe6465c78194e5ea2.tar.bz2
scummvm-rg350-e9827d0884318822b20d13dbe6465c78194e5ea2.zip
added code for gfxSpriteFunc1 and gfxSpriteFunc2, which are used for sprite masking (see also bug #1624797)
svn-id: r26861
-rw-r--r--engines/cine/gfx.cpp78
-rw-r--r--engines/cine/gfx.h6
-rw-r--r--engines/cine/various.cpp26
3 files changed, 94 insertions, 16 deletions
diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp
index b5cdecd7de..4abd25c65d 100644
--- a/engines/cine/gfx.cpp
+++ b/engines/cine/gfx.cpp
@@ -189,6 +189,84 @@ void gfxFillSprite(byte *spritePtr, uint16 width, uint16 height, byte *page, int
}
}
+// gfxDrawMaskedSprite
+void gfxSpriteFunc1(byte *spritePtr, byte *maskPtr, uint16 width, uint16 height, byte *page, int16 x, int16 y) {
+ int16 i, j;
+
+ for (i = 0; i < height; i++) {
+ byte *destPtr = page + x + y * 320;
+ destPtr += i * 320;
+
+ for (j = 0; j < width * 8; j++) {
+ if (x + j >= 0 && x + j < 320 && i + y >= 0 && i + y < 200 && *maskPtr == 0) {
+ *destPtr = *spritePtr;
+ }
+ ++destPtr;
+ ++spritePtr;
+ ++maskPtr;
+ }
+ }
+}
+
+// gfxUpdateSpriteMask
+void gfxSpriteFunc2(byte *spritePtr, byte *spriteMskPtr, int16 width, int16 height, byte *maskPtr,
+ int16 maskWidth, int16 maskHeight, byte *bufferSprPtr, byte *bufferMskPtr, int16 xs, int16 ys, int16 xm, int16 ym, byte maskIdx) {
+ int16 i, j, d, spritePitch, maskPitch;
+
+ width *= 8;
+ maskWidth *= 8;
+
+ spritePitch = width;
+ maskPitch = maskWidth;
+
+ if (maskIdx == 0) {
+ memcpy(bufferSprPtr, spritePtr, spritePitch * height);
+ memcpy(bufferMskPtr, spriteMskPtr, spritePitch * height);
+ }
+
+ if (ys > ym) {
+ d = ys - ym;
+ maskPtr += d * maskPitch;
+ maskHeight -= d;
+ }
+ if (maskHeight <= 0) {
+ return;
+ }
+ if (xs > xm) {
+ d = xs - xm;
+ maskPtr += d;
+ maskWidth -= d;
+ }
+ if (maskWidth <= 0) {
+ return;
+ }
+ if (ys < ym) {
+ d = ym - ys;
+ spriteMskPtr += d * spritePitch;
+ bufferMskPtr += d * spritePitch;
+ height -= d;
+ }
+ if (height <= 0) {
+ return;
+ }
+ if (xs < xm) {
+ d = xm - xs;
+ spriteMskPtr += d;
+ bufferMskPtr += d;
+ width -= d;
+ }
+ if (width <= 0) {
+ return;
+ }
+ for (j = 0; j < height; ++j) {
+ for (i = 0; i < width; ++i) {
+ bufferMskPtr[i] |= maskPtr[i] ^ 1;
+ }
+ bufferMskPtr += spritePitch;
+ maskPtr += maskPitch;
+ }
+}
+
void gfxDrawLine(int16 x1, int16 y1, int16 x2, int16 y2, byte color, byte *page) {
if (x1 == x2) {
if (y1 > y2) {
diff --git a/engines/cine/gfx.h b/engines/cine/gfx.h
index 08f7bae640..a993568281 100644
--- a/engines/cine/gfx.h
+++ b/engines/cine/gfx.h
@@ -45,11 +45,11 @@ void gfxCopyPage(byte *source, byte *dest);
void transformPaletteRange(byte startColor, byte numColor, int8 r, int8 g, int8 b);
void gfxFlipPage(void);
-void gfxSpriteFunc1(byte *ptr, uint16 width, uint16 height, byte *page, int16 x, int16 y);
+void gfxSpriteFunc1(byte *ptr, byte *msk, uint16 width, uint16 height, byte *page, int16 x, int16 y);
void gfxFillSprite(byte *src4, uint16 sw, uint16 sh, byte *dst4, int16 sx, int16 sy);
-void gfxSpriteFunc2(byte *spritePtr, int16 width, int16 height, byte *maskPtr,
- int16 maskWidth, int16 maskHeight, byte *bufferPtr, int16 x, int16 y, byte maskIdx);
+void gfxSpriteFunc2(byte *spritePtr, byte *spriteMskPtr, int16 width, int16 height, byte *maskPtr,
+ int16 maskWidth, int16 maskHeight, byte *bufferSprPtr, byte *bufferMskPtr, int16 xs, int16 ys, int16 xm, int16 ym, byte maskIdx);
void gfxDrawLine(int16 x1, int16 y1, int16 x2, int16 y2, byte color, byte *page);
void gfxDrawPlainBox(int16 x1, int16 y1, int16 x2, int16 y2, byte color);
diff --git a/engines/cine/various.cpp b/engines/cine/various.cpp
index 92a38f969b..5479625eb1 100644
--- a/engines/cine/various.cpp
+++ b/engines/cine/various.cpp
@@ -2188,13 +2188,18 @@ uint16 executePlayerInput(void) {
void drawSprite(overlayHeadElement *currentOverlay, byte *spritePtr,
byte *maskPtr, uint16 width, uint16 height, byte *page, int16 x, int16 y) {
-#if 0
byte *ptr = NULL;
+ byte *msk = NULL;
byte i = 0;
uint16 si = 0;
overlayHeadElement *pCurrentOverlay = currentOverlay;
- while (pCurrentOverlay) { // unfinished, probably for mask handling..
+ if (g_cine->getGameType() == Cine::GType_OS) {
+ drawSpriteRaw2(spritePtr, objectTable[currentOverlay->objIdx].part, width, height, page, x, y);
+ return;
+ }
+
+ while (pCurrentOverlay) {
if (pCurrentOverlay->type == 5) {
int16 maskX;
int16 maskY;
@@ -2203,7 +2208,8 @@ void drawSprite(overlayHeadElement *currentOverlay, byte *spritePtr,
uint16 maskSpriteIdx;
if (!si) {
- ptr = (byte *)malloc(width * height);
+ ptr = (byte *)malloc(width * 8 * height);
+ msk = (byte *)malloc(width * 8 * height);
si = 1;
}
@@ -2214,25 +2220,19 @@ void drawSprite(overlayHeadElement *currentOverlay, byte *spritePtr,
maskWidth = animDataTable[maskSpriteIdx].width / 2;
maskHeight = animDataTable[maskSpriteIdx].height;
-
- gfxSpriteFunc2(spritePtr, width, height, animDataTable[maskSpriteIdx].ptr1, maskWidth, maskHeight, ptr, maskX - x,maskY - y, i++);
+ gfxSpriteFunc2(spritePtr, maskPtr, width, height, animDataTable[maskSpriteIdx].ptr1, maskWidth, maskHeight, ptr, msk, x, y, maskX, maskY, i++);
}
pCurrentOverlay = pCurrentOverlay->next;
}
if (si) {
- gfxSpriteFunc1(ptr, width, height, page, x, y);
+ gfxSpriteFunc1(ptr, msk, width, height, page, x, y);
free(ptr);
- } else
-#endif
-
- if (g_cine->getGameType() == Cine::GType_OS) {
- drawSpriteRaw2(spritePtr, objectTable[currentOverlay->objIdx].part, width, height, page, x, y);
+ free(msk);
} else {
- drawSpriteRaw(spritePtr, maskPtr, width, height, page, x, y);
+ gfxSpriteFunc1(spritePtr, maskPtr, width, height, page, x, y);
}
-
}
int16 additionalBgVScroll = 0;