[Scummvm-cvs-logs] CVS: scummvm/saga sprite.cpp,1.76,1.77

Torbjörn Andersson eriktorbjorn at users.sourceforge.net
Fri Jan 13 11:08:03 CET 2006


Update of /cvsroot/scummvm/scummvm/saga
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14294

Modified Files:
	sprite.cpp 
Log Message:
Hopefully fixed IHNM sprite clipping. (IHNM sprites are upside down
compared to ITE sprites, so to simplify things they are now flipped after
they are decoded.)


Index: sprite.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sprite.cpp,v
retrieving revision 1.76
retrieving revision 1.77
diff -u -d -r1.76 -r1.77
--- sprite.cpp	18 Oct 2005 01:30:19 -0000	1.76
+++ sprite.cpp	13 Jan 2006 19:07:49 -0000	1.77
@@ -145,7 +145,22 @@
 		if (spriteInfo->decodedBuffer == NULL) {
 			memoryError("Sprite::loadList");
 		}
-		memcpy(spriteInfo->decodedBuffer, _decodeBuf, outputLength);
+
+		// IHNM sprites are upside-down, for reasons which i can only
+		// assume are perverse. To simplify things, flip them now. Not
+		// at drawing time.
+
+		if (_vm->getGameType() == GType_IHNM) {
+			byte *src = _decodeBuf + spriteInfo->width * (spriteInfo->height - 1);
+			byte *dst = spriteInfo->decodedBuffer;
+
+			for (int j = 0; j < spriteInfo->height; j++) {
+				memcpy(dst, src, spriteInfo->width);
+				src -= spriteInfo->width;
+				dst += spriteInfo->width;
+			}
+		} else
+			memcpy(spriteInfo->decodedBuffer, _decodeBuf, outputLength);
 	}
 
 	free(spriteListData);
@@ -204,13 +219,6 @@
 		srcRowPointer += width * io;
 	}
 
-	int traverseSign = 1;
-
-	if (_vm->getGameType() == GType_IHNM) {
-		traverseSign = -1;
-		bufRowPointer += clipHeight * ds->pitch;
-	}
-
 	for (i = io; i < clipHeight; i++) {
 		for (j = jo; j < clipWidth; j++) {
 			assert((byte *)ds->pixels <= (byte *)(bufRowPointer + j + spritePointer.x));
@@ -223,7 +231,7 @@
 				*(bufRowPointer + j + spritePointer.x) = *(srcRowPointer + j);
 			}
 		}
-		bufRowPointer += ds->pitch * traverseSign;
+		bufRowPointer += ds->pitch;
 		srcRowPointer += width;
 	}
 }
@@ -252,7 +260,6 @@
 	int yAlign, sph;
 	Point spritePointer;
 
-
 	getScaledSpriteBuffer(spriteList, spriteNumber, scale, width, height, xAlign, yAlign, spriteBuffer);
 	spw = (screenRect.width() - width) / 2;
 	sph = (screenRect.height() - height) / 2;
@@ -277,7 +284,6 @@
 	int yAlign;
 	Point spritePointer;
 
-
 	getScaledSpriteBuffer(spriteList, spriteNumber, scale, width, height, xAlign, yAlign, spriteBuffer);
 
 	spritePointer.x = screenCoord.x + xAlign;
@@ -318,7 +324,6 @@
 	byte *maskRowPointer;
 	int maskZ;
 
-
 	if (!_vm->_scene->isBGMaskPresent()) {
 		draw(ds, clipRect, spriteList, spriteNumber, screenCoord, scale);
 		return;
@@ -343,16 +348,9 @@
 	}
 
 	// Finally, draw the occluded sprite
-	sourceRowPointer = spriteBuffer + clipData.drawSource.x + (clipData.drawSource.y * width);
 
-	int traverseSign;
-	if (_vm->getGameType() == GType_IHNM) {
-		traverseSign = -1;
-		destRowPointer = (byte *)ds->pixels + clipData.drawDest.x + ((clipData.drawDest.y + clipData.drawHeight) * ds->pitch);
-	} else {
-		traverseSign = 1;
-		destRowPointer = (byte *)ds->pixels + clipData.drawDest.x + (clipData.drawDest.y * ds->pitch);
-	}
+	sourceRowPointer = spriteBuffer + clipData.drawSource.x + (clipData.drawSource.y * width);
+	destRowPointer = (byte *)ds->pixels + clipData.drawDest.x + (clipData.drawDest.y * ds->pitch);
 	maskRowPointer = maskBuffer + clipData.drawDest.x + (clipData.drawDest.y * maskWidth);
 
 	for (y = 0; y < clipData.drawHeight; y++) {
@@ -370,7 +368,7 @@
 			destPointer++;
 			maskPointer++;
 		}
-		destRowPointer += ds->pitch * traverseSign;
+		destRowPointer += ds->pitch;
 		maskRowPointer += maskWidth;
 		sourceRowPointer += width;
 	}





More information about the Scummvm-git-logs mailing list