(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.
--- 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;
}