aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2014-05-31 21:10:29 -0400
committerPaul Gilbert2014-05-31 21:10:29 -0400
commit8f20ebb610b9f6be0a4ef8d417318b3e6f0c965f (patch)
tree4cd0dda635a2a3630f9928545b407e2b143865ec
parent7d82cac910533eb965fa3edc0630db74d0757d8b (diff)
downloadscummvm-rg350-8f20ebb610b9f6be0a4ef8d417318b3e6f0c965f.tar.gz
scummvm-rg350-8f20ebb610b9f6be0a4ef8d417318b3e6f0c965f.tar.bz2
scummvm-rg350-8f20ebb610b9f6be0a4ef8d417318b3e6f0c965f.zip
MADS: Fix positioning and clipping of flipped scaled images
-rw-r--r--engines/mads/msurface.cpp10
-rw-r--r--engines/mads/msurface.h3
-rw-r--r--engines/mads/sprites.cpp32
3 files changed, 23 insertions, 22 deletions
diff --git a/engines/mads/msurface.cpp b/engines/mads/msurface.cpp
index 0108b0b91f..00d85635fa 100644
--- a/engines/mads/msurface.cpp
+++ b/engines/mads/msurface.cpp
@@ -258,7 +258,7 @@ void MSurface::copyFrom(MSurface *src, const Common::Rect &srcBounds,
}
void MSurface::copyFrom(MSurface *src, const Common::Point &destPos, int depth,
- DepthSurface *depthSurface, int scale, int transparentColor) {
+ DepthSurface *depthSurface, int scale, bool flipped, int transparentColor) {
int destX = destPos.x, destY = destPos.y;
int frameWidth = src->getWidth();
int frameHeight = src->getHeight();
@@ -337,12 +337,12 @@ void MSurface::copyFrom(MSurface *src, const Common::Point &destPos, int depth,
int destRight = this->getWidth() - 1;
int destBottom = this->getHeight() - 1;
- bool normalFrame = true;
// Check x bounding area
int spriteLeft = 0;
int spriteWidth = distXCount;
int widthAmount = destX + distXCount - 1;
+ int direction = flipped ? -1 : 1;
if (destX < 0) {
spriteWidth += destX;
@@ -355,7 +355,7 @@ void MSurface::copyFrom(MSurface *src, const Common::Point &destPos, int depth,
int spriteRight = spriteLeft + spriteWidth;
if (spriteWidth <= 0)
return;
- if (!normalFrame) {
+ if (flipped) {
destX += distXCount - 1;
spriteLeft = -(distXCount - spriteRight);
spriteRight = (-spriteLeft + spriteWidth);
@@ -380,7 +380,7 @@ void MSurface::copyFrom(MSurface *src, const Common::Point &destPos, int depth,
byte *destPixelsP = this->getBasePtr(destX + spriteLeft, destY + spriteTop);
- spriteLeft = (spriteLeft * (normalFrame ? 1 : -1));
+ spriteLeft = spriteLeft * direction;
// Loop through the lines of the sprite
for (int yp = 0, sprY = -1; yp < frameHeight; ++yp, srcPixelsP += src->pitch) {
@@ -412,7 +412,7 @@ void MSurface::copyFrom(MSurface *src, const Common::Point &destPos, int depth,
if ((*srcP != transparentColor) && (depth <= pixelDepth))
*destP = *srcP;
- ++destP;
+ destP += direction;
}
// Move to the next destination line
diff --git a/engines/mads/msurface.h b/engines/mads/msurface.h
index dec36e7caf..ef2bbd6784 100644
--- a/engines/mads/msurface.h
+++ b/engines/mads/msurface.h
@@ -162,10 +162,11 @@ public:
* @param depth Depth of sprite
* @param depthSurface Depth surface to use with sprite depth
* @param scale Scale for image
+ * @param flipped Flag for whether image is to be flipped
* @param transparentColor Transparency palette index
*/
void copyFrom(MSurface *src, const Common::Point &destPos, int depth, DepthSurface *depthSurface,
- int scale, int transparentColor = -1);
+ int scale, bool flipped, int transparentColor = -1);
/**
* Copies the surface to a given destination surface
diff --git a/engines/mads/sprites.cpp b/engines/mads/sprites.cpp
index b7688ad417..4f5d50db4f 100644
--- a/engines/mads/sprites.cpp
+++ b/engines/mads/sprites.cpp
@@ -317,16 +317,10 @@ void SpriteSlots::drawSprites(MSurface *s) {
assert(frameNumber > 0);
MSprite *sprite = spriteSet.getFrame(frameNumber - 1);
- MSurface *spr = sprite;
- if (flipped) {
- // Create a flipped copy of the sprite temporarily
- spr = sprite->flipHorizontal();
- }
-
if ((slot._scale < 100) && (slot._scale != -1)) {
// Scaled drawing
- s->copyFrom(spr, slot._position, slot._depth, &scene._depthSurface,
- slot._scale, sprite->getTransparencyIndex());
+ s->copyFrom(sprite, slot._position, slot._depth, &scene._depthSurface,
+ slot._scale, flipped, sprite->getTransparencyIndex());
} else {
int xp, yp;
@@ -334,23 +328,29 @@ void SpriteSlots::drawSprites(MSurface *s) {
xp = slot._position.x - scene._posAdjust.x;
yp = slot._position.y - scene._posAdjust.y;
} else {
- xp = slot._position.x - (spr->w / 2) - scene._posAdjust.x;
- yp = slot._position.y - spr->h - scene._posAdjust.y + 1;
+ xp = slot._position.x - (sprite->w / 2) - scene._posAdjust.x;
+ yp = slot._position.y - sprite->h - scene._posAdjust.y + 1;
}
if (slot._depth > 1) {
// Draw the frame with depth processing
- s->copyFrom(spr, Common::Point(xp, yp), slot._depth, &scene._depthSurface,
- -1, sprite->getTransparencyIndex());
+ s->copyFrom(sprite, Common::Point(xp, yp), slot._depth, &scene._depthSurface,
+ -1, flipped, sprite->getTransparencyIndex());
} else {
+ MSurface *spr = sprite;
+ if (flipped) {
+ // Create a flipped copy of the sprite temporarily
+ spr = sprite->flipHorizontal();
+ }
+
// No depth, so simply draw the image
spr->copyTo(s, Common::Point(xp, yp), sprite->getTransparencyIndex());
+
+ // Free sprite if it was a flipped one
+ if (flipped)
+ delete spr;
}
}
-
- // Free sprite if it was a flipped one
- if (flipped)
- delete spr;
}
}