From 951ea4ae6d6e62d7f7a24b34bb859d5b6982f89e Mon Sep 17 00:00:00 2001 From: rubidium Date: Sat, 30 Aug 2008 09:46:52 +0000 Subject: (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 | 18 +----------------- src/sprite.h | 1 + src/spritecache.cpp | 48 ++++++++++++++++++++++++++++++------------------ 3 files changed, 32 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 1ef2fe87c..b49605b22 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -5935,23 +5935,7 @@ void LoadNewGRFFile(GRFConfig *config, uint file_index, GrfLoadingStage stage) } 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 --git a/src/sprite.h b/src/sprite.h index b996280d8..26bdb0595 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -56,5 +56,6 @@ struct DrawBuildingsTileStruct { /** 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 --git a/src/spritecache.cpp b/src/spritecache.cpp index 296744ab5..ae331e3ed 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -72,31 +72,20 @@ static int _compact_cache_counter; static void CompactSpriteCache(); -static bool ReadSpriteHeaderSkipData() +/** + * 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) { - uint16 num = FioReadWord(); - byte type; - - if (num == 0) return false; - - type = FioReadByte(); - if (type == 0xFF) { - FioSkipBytes(num); - /* Some NewGRF files have "empty" pseudo-sprites which are 1 - * byte long. Catch these so the sprites won't be displayed. */ - return num != 1; - } - - FioSkipBytes(7); - num -= 8; - if (num == 0) return true; - 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 { @@ -106,6 +95,29 @@ static bool ReadSpriteHeaderSkipData() } } } +} + +/** + * 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(); + byte type; + + if (num == 0) return false; + + type = FioReadByte(); + if (type == 0xFF) { + FioSkipBytes(num); + /* Some NewGRF files have "empty" pseudo-sprites which are 1 + * byte long. Catch these so the sprites won't be displayed. */ + return num != 1; + } + + FioSkipBytes(7); + SkipSpriteData(type, num - 8); return true; } -- cgit v1.2.3-70-g09d2