[Scummvm-cvs-logs] scummvm master -> 8f20ebb610b9f6be0a4ef8d417318b3e6f0c965f

dreammaster dreammaster at scummvm.org
Sun Jun 1 03:11:09 CEST 2014


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
8f20ebb610 MADS: Fix positioning and clipping of flipped scaled images


Commit: 8f20ebb610b9f6be0a4ef8d417318b3e6f0c965f
    https://github.com/scummvm/scummvm/commit/8f20ebb610b9f6be0a4ef8d417318b3e6f0c965f
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2014-05-31T21:10:29-04:00

Commit Message:
MADS: Fix positioning and clipping of flipped scaled images

Changed paths:
    engines/mads/msurface.cpp
    engines/mads/msurface.h
    engines/mads/sprites.cpp



diff --git a/engines/mads/msurface.cpp b/engines/mads/msurface.cpp
index 0108b0b..00d8563 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 dec36e7..ef2bbd6 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 b7688ad..4f5d50d 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;
 	}
 }
 






More information about the Scummvm-git-logs mailing list