(svn r14191) -Codechange: unify the code to skip sprite payload (i.e. not the header).
authorrubidium
Sat, 30 Aug 2008 09:46:52 +0000
changeset 10032 1f6c6f3bea28
parent 10031 a787bda1be6f
child 10033 0336744fb8a6
(svn r14191) -Codechange: unify the code to skip sprite payload (i.e. not the header).
-Fix: sprite payload skipping wouldn't skip enough bytes in a very small subset of compressed sprites.
src/newgrf.cpp
src/sprite.h
src/spritecache.cpp
--- a/src/newgrf.cpp	Sat Aug 30 09:43:07 2008 +0000
+++ b/src/newgrf.cpp	Sat Aug 30 09:46:52 2008 +0000
@@ -5935,23 +5935,7 @@
 			}
 
 			FioSkipBytes(7);
-			num -= 8;
-
-			if (type & 2) {
-				FioSkipBytes(num);
-			} else {
-				while (num > 0) {
-					int8 i = FioReadByte();
-					if (i >= 0) {
-						num -= i;
-						FioSkipBytes(i);
-					} else {
-						i = -(i >> 3);
-						num -= i;
-						FioReadByte();
-					}
-				}
-			}
+			SkipSpriteData(type, num - 8);
 		}
 
 		if (_skip_sprites > 0) _skip_sprites--;
--- a/src/sprite.h	Sat Aug 30 09:43:07 2008 +0000
+++ b/src/sprite.h	Sat Aug 30 09:46:52 2008 +0000
@@ -56,5 +56,6 @@
 /** Iterate through all DrawTileSeqStructs in DrawTileSprites. */
 #define foreach_draw_tile_seq(idx, list) for (idx = list; ((byte) idx->delta_x) != 0x80; idx++)
 
+void SkipSpriteData(byte type, uint16 num);
 
 #endif /* SPRITE_H */
--- a/src/spritecache.cpp	Sat Aug 30 09:43:07 2008 +0000
+++ b/src/spritecache.cpp	Sat Aug 30 09:46:52 2008 +0000
@@ -72,6 +72,35 @@
 
 static void CompactSpriteCache();
 
+/**
+ * Skip the given amount of sprite graphics data.
+ * @param type the type of sprite (compressed etc)
+ * @param num the amount of sprites to skip
+ */
+void SkipSpriteData(byte type, uint16 num)
+{
+	if (type & 2) {
+		FioSkipBytes(num);
+	} else {
+		while (num > 0) {
+			int8 i = FioReadByte();
+			if (i >= 0) {
+				i = (i == 0) ? 0x80 : i;
+				num -= i;
+				FioSkipBytes(i);
+			} else {
+				i = -(i >> 3);
+				num -= i;
+				FioReadByte();
+			}
+		}
+	}
+}
+
+/**
+ * Read the sprite header data and then skip the real payload.
+ * @return true if the sprite is a pseudo sprite.
+ */
 static bool ReadSpriteHeaderSkipData()
 {
 	uint16 num = FioReadWord();
@@ -88,24 +117,7 @@
 	}
 
 	FioSkipBytes(7);
-	num -= 8;
-	if (num == 0) return true;
-
-	if (type & 2) {
-		FioSkipBytes(num);
-	} else {
-		while (num > 0) {
-			int8 i = FioReadByte();
-			if (i >= 0) {
-				num -= i;
-				FioSkipBytes(i);
-			} else {
-				i = -(i >> 3);
-				num -= i;
-				FioReadByte();
-			}
-		}
-	}
+	SkipSpriteData(type, num - 8);
 
 	return true;
 }