changeset 10032:764bf7d90222 draft

(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.
author rubidium <rubidium@openttd.org>
date Sat, 30 Aug 2008 09:46:52 +0000
parents 1c3f5f4b3a97
children cb5901118b1c
files src/newgrf.cpp src/sprite.h src/spritecache.cpp
diffstat 3 files changed, 32 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -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
+++ b/src/sprite.h
@@ -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
+++ b/src/spritecache.cpp
@@ -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;
 }