diff --git a/src/fileio.cpp b/src/fileio.cpp index 34b3cf8350..09329b84f5 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -33,6 +33,7 @@ struct Fio { FILE *handles[MAX_FILE_SLOTS]; ///< array of file handles we can have open byte buffer_start[FIO_BUFFER_SIZE]; ///< local buffer when read from file const char *filenames[MAX_FILE_SLOTS]; ///< array of filenames we (should) have open + char *shortnames[MAX_FILE_SLOTS];///< array of short names for spriteloader's use #if defined(LIMITED_FDS) uint open_handles; ///< current amount of open handles uint usage_count[MAX_FILE_SLOTS]; ///< count how many times this file has been opened @@ -47,9 +48,9 @@ uint32 FioGetPos() return _fio.pos + (_fio.buffer - _fio.buffer_start) - FIO_BUFFER_SIZE; } -const char *FioGetFilename() +const char *FioGetFilename(uint8 slot) { - return _fio.filename; + return _fio.shortnames[slot]; } void FioSeekTo(uint32 pos, int mode) @@ -131,6 +132,10 @@ static inline void FioCloseFile(int slot) { if (_fio.handles[slot] != NULL) { fclose(_fio.handles[slot]); + + free(_fio.shortnames[slot]); + _fio.shortnames[slot] = NULL; + _fio.handles[slot] = NULL; #if defined(LIMITED_FDS) _fio.open_handles--; @@ -184,6 +189,14 @@ void FioOpenFile(int slot, const char *filename) FioCloseFile(slot); // if file was opened before, close it _fio.handles[slot] = f; _fio.filenames[slot] = filename; + + /* Store the filename without path and extension */ + const char *t = strrchr(filename, PATHSEPCHAR); + _fio.shortnames[slot] = strdup(t == NULL ? filename : t); + char *t2 = strrchr(_fio.shortnames[slot], '.'); + if (t2 != NULL) *t2 = '\0'; + strtolower(_fio.shortnames[slot]); + #if defined(LIMITED_FDS) _fio.usage_count[slot] = 0; _fio.open_handles++; diff --git a/src/fileio.h b/src/fileio.h index d60d8ed2e6..881c983f3c 100644 --- a/src/fileio.h +++ b/src/fileio.h @@ -12,7 +12,7 @@ void FioSeekTo(uint32 pos, int mode); void FioSeekToFile(uint8 slot, uint32 pos); uint32 FioGetPos(); -const char *FioGetFilename(); +const char *FioGetFilename(uint8 slot); byte FioReadByte(); uint16 FioReadWord(); uint32 FioReadDword(); diff --git a/src/spritecache.cpp b/src/spritecache.cpp index 48c4d67e28..0db8899460 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -24,7 +24,6 @@ uint _sprite_cache_size = 4; struct SpriteCache { void *ptr; - const char *grf_name; uint32 id; uint32 file_pos; uint16 file_slot; @@ -143,7 +142,7 @@ static void* ReadSprite(SpriteCache *sc, SpriteID id, bool real_sprite) SpriteLoaderPNG sprite_loader; SpriteLoader::Sprite sprite; - if (sprite_loader.LoadSprite(&sprite, sc->grf_name, 0, sc->id)) { + if (sprite_loader.LoadSprite(&sprite, file_slot, sc->id)) { sc->ptr = BlitterFactoryBase::GetCurrentBlitter()->Encode(&sprite, &AllocSprite); free(sprite.data); @@ -230,7 +229,7 @@ static void* ReadSprite(SpriteCache *sc, SpriteID id, bool real_sprite) SpriteLoaderGrf sprite_loader; SpriteLoader::Sprite sprite; - if (!sprite_loader.LoadSprite(&sprite, sc->grf_name, file_slot, file_pos)) return NULL; + if (!sprite_loader.LoadSprite(&sprite, file_slot, file_pos)) return NULL; if (id == 142) sprite.height = 10; // Compensate for a TTD bug sc->ptr = BlitterFactoryBase::GetCurrentBlitter()->Encode(&sprite, &AllocSprite); free(sprite.data); @@ -257,19 +256,6 @@ bool LoadNextSprite(int load_index, byte file_slot, uint file_sprite_id) sc->lru = 0; sc->id = file_sprite_id; - const char *fio_grf_name = FioGetFilename(); - const char *t = strrchr(fio_grf_name, PATHSEPCHAR); - char *grf_name; - if (t == NULL) grf_name = strdup(fio_grf_name); - else grf_name = strdup(t); - /* Make the string lowercase and strip extension */ - char *t2 = strrchr(grf_name, '.'); - if (t2 != NULL) *t2 = '\0'; - strtolower(grf_name); - - free((char *)sc->grf_name); - sc->grf_name = grf_name; - return true; } @@ -283,8 +269,6 @@ void DupSprite(SpriteID old_spr, SpriteID new_spr) scnew->file_pos = scold->file_pos; scnew->ptr = NULL; scnew->id = scold->id; - free((char *)scnew->grf_name); - scnew->grf_name = strdup(scold->grf_name); } @@ -493,7 +477,6 @@ void GfxInitSpriteMem() NextBlock(_spritecache_ptr)->size = 0; /* Reset the spritecache 'pool' */ - for (uint i = 0; i < _spritecache_items; i++) free((char *)_spritecache[i].grf_name); free(_spritecache); _spritecache_items = 0; _spritecache = NULL; diff --git a/src/spriteloader/grf.cpp b/src/spriteloader/grf.cpp index d0bc0e334e..bbc9d3f8f7 100644 --- a/src/spriteloader/grf.cpp +++ b/src/spriteloader/grf.cpp @@ -9,7 +9,7 @@ #include "../core/alloc_func.hpp" #include "grf.hpp" -bool SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos) +bool SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, uint8 file_slot, uint32 file_pos) { /* Open the right file and go to the correct position */ FioSeekToFile(file_slot, file_pos); diff --git a/src/spriteloader/grf.hpp b/src/spriteloader/grf.hpp index fe94053392..65b5f62339 100644 --- a/src/spriteloader/grf.hpp +++ b/src/spriteloader/grf.hpp @@ -12,7 +12,7 @@ public: /** * Load a sprite from the disk and return a sprite struct which is the same for all loaders. */ - bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos); + bool LoadSprite(SpriteLoader::Sprite *sprite, uint8 file_slot, uint32 file_pos); }; #endif /* SPRITELOADER_GRF_HPP */ diff --git a/src/spriteloader/png.cpp b/src/spriteloader/png.cpp index abfce00fa0..2af9d02530 100644 --- a/src/spriteloader/png.cpp +++ b/src/spriteloader/png.cpp @@ -181,8 +181,9 @@ static bool LoadPNG(SpriteLoader::Sprite *sprite, const char *filename, uint32 i return true; } -bool SpriteLoaderPNG::LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos) +bool SpriteLoaderPNG::LoadSprite(SpriteLoader::Sprite *sprite, uint8 file_slot, uint32 file_pos) { + const char *filename = FioGetFilename(file_slot); if (!LoadPNG(sprite, filename, file_pos, false)) return false; if (!LoadPNG(sprite, filename, file_pos, true)) return false; return true; diff --git a/src/spriteloader/png.hpp b/src/spriteloader/png.hpp index eb3719180e..7d821dc714 100644 --- a/src/spriteloader/png.hpp +++ b/src/spriteloader/png.hpp @@ -12,7 +12,7 @@ public: /** * Load a sprite from the disk and return a sprite struct which is the same for all loaders. */ - bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos); + bool LoadSprite(SpriteLoader::Sprite *sprite, uint8 file_slot, uint32 file_pos); }; #endif /* SPRITELOADER_PNG_HPP */ diff --git a/src/spriteloader/spriteloader.hpp b/src/spriteloader/spriteloader.hpp index 47d1b7d405..09ad505a88 100644 --- a/src/spriteloader/spriteloader.hpp +++ b/src/spriteloader/spriteloader.hpp @@ -26,7 +26,7 @@ public: /** * Load a sprite from the disk and return a sprite struct which is the same for all loaders. */ - virtual bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos) = 0; + virtual bool LoadSprite(SpriteLoader::Sprite *sprite, uint8 file_slot, uint32 file_pos) = 0; virtual ~SpriteLoader() { } };