# HG changeset patch # User rubidium # Date 1220089612 0 # Node ID 1f6c6f3bea2811d73a66554b180f17e4f3494822 # Parent a787bda1be6f88fcdcbec9f9a9ea15bbfbde97cb (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. diff -r a787bda1be6f -r 1f6c6f3bea28 src/newgrf.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--; diff -r a787bda1be6f -r 1f6c6f3bea28 src/sprite.h --- 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 */ diff -r a787bda1be6f -r 1f6c6f3bea28 src/spritecache.cpp --- 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; }