# HG changeset patch # User truelight # Date 1189707754 0 # Node ID 5d5d9b6af0efb2183f95a5dbac3eda2d311edbc5 # Parent 86ad3f6e7a1a7fbcbb34a856973a74caab76f83e (svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it -Note: on a side-note, this allows files bigger than 16+ MiB, needed for tar-support diff -r 86ad3f6e7a1a -r 5d5d9b6af0ef src/fileio.cpp --- a/src/fileio.cpp Thu Sep 13 15:51:50 2007 +0000 +++ b/src/fileio.cpp Thu Sep 13 18:22:34 2007 +0000 @@ -74,18 +74,18 @@ #endif /* LIMITED_FDS */ /* Seek to a file and a position */ -void FioSeekToFile(uint32 pos) +void FioSeekToFile(uint8 slot, uint32 pos) { FILE *f; #if defined(LIMITED_FDS) /* Make sure we have this file open */ - FioRestoreFile(pos >> 24); + FioRestoreFile(slot); #endif /* LIMITED_FDS */ - f = _fio.handles[pos >> 24]; + f = _fio.handles[slot]; assert(f != NULL); _fio.cur_fh = f; - _fio.filename = _fio.filenames[pos >> 24]; - FioSeekTo(GB(pos, 0, 24), SEEK_SET); + _fio.filename = _fio.filenames[slot]; + FioSeekTo(pos, SEEK_SET); } byte FioReadByte() @@ -180,6 +180,7 @@ #endif /* LIMITED_FDS */ f = FioFOpenFile(filename); if (f == NULL) error("Cannot open file '%s'", filename); + uint32 pos = ftell(f); FioCloseFile(slot); // if file was opened before, close it _fio.handles[slot] = f; @@ -188,7 +189,7 @@ _fio.usage_count[slot] = 0; _fio.open_handles++; #endif /* LIMITED_FDS */ - FioSeekToFile(slot << 24); + FioSeekToFile(slot, pos); } const char *_subdirs[NUM_SUBDIRS] = { diff -r 86ad3f6e7a1a -r 5d5d9b6af0ef src/fileio.h --- a/src/fileio.h Thu Sep 13 15:51:50 2007 +0000 +++ b/src/fileio.h Thu Sep 13 18:22:34 2007 +0000 @@ -8,7 +8,7 @@ #include "helpers.hpp" void FioSeekTo(uint32 pos, int mode); -void FioSeekToFile(uint32 pos); +void FioSeekToFile(uint8 slot, uint32 pos); uint32 FioGetPos(); const char *FioGetFilename(); byte FioReadByte(); diff -r 86ad3f6e7a1a -r 5d5d9b6af0ef src/newgrf.cpp --- a/src/newgrf.cpp Thu Sep 13 15:51:50 2007 +0000 +++ b/src/newgrf.cpp Thu Sep 13 18:22:34 2007 +0000 @@ -4506,9 +4506,9 @@ break; case 'atad': // 'data' - se->file_size = size; - se->file_offset = FioGetPos() - (len - (buf - buf_start)) + 1; - se->file_offset |= _file_index << 24; + se->file_size = size; + se->file_offset = FioGetPos() - (len - (buf - buf_start)) + 1; + se->file_slot = _file_index; /* Set default volume and priority */ se->volume = 0x80; diff -r 86ad3f6e7a1a -r 5d5d9b6af0ef src/sound.cpp --- a/src/sound.cpp Thu Sep 13 15:51:50 2007 +0000 +++ b/src/sound.cpp Thu Sep 13 18:22:34 2007 +0000 @@ -45,6 +45,7 @@ FioSeekTo(0, SEEK_SET); for (i = 0; i != count; i++) { + fe[i].file_slot = SOUND_SLOT; fe[i].file_offset = FioReadDword(); fe[i].file_size = FioReadDword(); } @@ -75,7 +76,8 @@ FioSeekTo(size - (2 + 2 + 4 + 4 + 2 + 1), SEEK_CUR); } else if (tag == 'atad') { fe->file_size = size; - fe->file_offset = FioGetPos() | (SOUND_SLOT << 24); + fe->file_slot = SOUND_SLOT; + fe->file_offset = FioGetPos(); break; } else { fe->file_size = 0; @@ -91,7 +93,8 @@ fe->channels = 1; fe->rate = 11025; fe->bits_per_sample = 8; - fe->file_offset = FioGetPos() | (SOUND_SLOT << 24); + fe->file_slot = SOUND_SLOT; + fe->file_offset = FioGetPos(); } } } @@ -114,7 +117,7 @@ int8 *mem = MallocT(fe->file_size); if (mem == NULL) return false; - FioSeekToFile(fe->file_offset); + FioSeekToFile(fe->file_slot, fe->file_offset); FioReadBlock(mem, fe->file_size); for (i = 0; i != fe->file_size; i++) diff -r 86ad3f6e7a1a -r 5d5d9b6af0ef src/sound.h --- a/src/sound.h Thu Sep 13 15:51:50 2007 +0000 +++ b/src/sound.h Thu Sep 13 18:22:34 2007 +0000 @@ -21,6 +21,7 @@ VARDEF MusicFileSettings msf; struct FileEntry { + uint8 file_slot; uint32 file_offset; uint32 file_size; uint16 rate; diff -r 86ad3f6e7a1a -r 5d5d9b6af0ef src/spritecache.cpp --- a/src/spritecache.cpp Thu Sep 13 15:51:50 2007 +0000 +++ b/src/spritecache.cpp Thu Sep 13 18:22:34 2007 +0000 @@ -25,6 +25,7 @@ struct SpriteCache { void *ptr; + uint8 file_slot; uint32 file_pos; int16 lru; uint32 id; @@ -127,6 +128,7 @@ static void* ReadSprite(SpriteCache *sc, SpriteID id, bool real_sprite) { + uint8 file_slot = sc->file_slot; uint32 file_pos = sc->file_pos; DEBUG(sprite, 9, "Load sprite %d", id); @@ -136,7 +138,8 @@ /* SPR_IMG_QUERY is a BIG FAT RED ? */ id = SPR_IMG_QUERY; - file_pos = GetSpriteCache(SPR_IMG_QUERY)->file_pos; + file_slot = GetSpriteCache(SPR_IMG_QUERY)->file_slot; + file_pos = GetSpriteCache(SPR_IMG_QUERY)->file_pos; } if (BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth() == 32) { @@ -145,7 +148,7 @@ SpriteLoaderPNG sprite_loader; SpriteLoader::Sprite sprite; - if (sprite_loader.LoadSprite(&sprite, sc->grf_name, sc->id)) { + if (sprite_loader.LoadSprite(&sprite, sc->grf_name, 0, sc->id)) { sc->ptr = BlitterFactoryBase::GetCurrentBlitter()->Encode(&sprite, &AllocSprite); free(sprite.data); @@ -161,7 +164,7 @@ #endif /* WITH_PNG */ } - FioSeekToFile(file_pos); + FioSeekToFile(file_slot, file_pos); /* Read the size and type */ int num = FioReadWord(); @@ -232,7 +235,7 @@ SpriteLoaderGrf sprite_loader; SpriteLoader::Sprite sprite; - if (!sprite_loader.LoadSprite(&sprite, sc->grf_name, file_pos)) return NULL; + if (!sprite_loader.LoadSprite(&sprite, sc->grf_name, 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); @@ -241,10 +244,10 @@ } -bool LoadNextSprite(int load_index, byte file_index, uint file_sprite_id) +bool LoadNextSprite(int load_index, byte file_slot, uint file_sprite_id) { SpriteCache *sc; - uint32 file_pos = FioGetPos() | (file_index << 24); + uint32 file_pos = FioGetPos(); if (!ReadSpriteHeaderSkipData()) return false; @@ -253,6 +256,7 @@ } sc = AllocateSpriteCache(load_index); + sc->file_slot = file_slot; sc->file_pos = file_pos; sc->ptr = NULL; sc->lru = 0; @@ -280,6 +284,7 @@ SpriteCache *scold = GetSpriteCache(old_spr); SpriteCache *scnew = AllocateSpriteCache(new_spr); + scnew->file_slot = scold->file_slot; scnew->file_pos = scold->file_pos; scnew->ptr = NULL; scnew->id = scold->id; diff -r 86ad3f6e7a1a -r 5d5d9b6af0ef src/spriteloader/grf.cpp --- a/src/spriteloader/grf.cpp Thu Sep 13 15:51:50 2007 +0000 +++ b/src/spriteloader/grf.cpp Thu Sep 13 18:22:34 2007 +0000 @@ -8,10 +8,10 @@ #include "../debug.h" #include "grf.hpp" -bool SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint32 file_pos) +bool SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos) { /* Open the right file and go to the correct position */ - FioSeekToFile(file_pos); + FioSeekToFile(file_slot, file_pos); /* Read the size and type */ int num = FioReadWord(); diff -r 86ad3f6e7a1a -r 5d5d9b6af0ef src/spriteloader/grf.hpp --- a/src/spriteloader/grf.hpp Thu Sep 13 15:51:50 2007 +0000 +++ b/src/spriteloader/grf.hpp Thu Sep 13 18:22:34 2007 +0000 @@ -12,7 +12,7 @@ /** * 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, uint32 file_pos); + bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos); }; #endif /* SPRITELOADER_GRF_HPP */ diff -r 86ad3f6e7a1a -r 5d5d9b6af0ef src/spriteloader/png.cpp --- a/src/spriteloader/png.cpp Thu Sep 13 15:51:50 2007 +0000 +++ b/src/spriteloader/png.cpp Thu Sep 13 18:22:34 2007 +0000 @@ -180,7 +180,7 @@ return true; } -bool SpriteLoaderPNG::LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint32 file_pos) +bool SpriteLoaderPNG::LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos) { if (!LoadPNG(sprite, filename, file_pos, false)) return false; if (!LoadPNG(sprite, filename, file_pos, true)) return false; diff -r 86ad3f6e7a1a -r 5d5d9b6af0ef src/spriteloader/png.hpp --- a/src/spriteloader/png.hpp Thu Sep 13 15:51:50 2007 +0000 +++ b/src/spriteloader/png.hpp Thu Sep 13 18:22:34 2007 +0000 @@ -12,7 +12,7 @@ /** * 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, uint32 file_pos); + bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos); }; #endif /* SPRITELOADER_PNG_HPP */ diff -r 86ad3f6e7a1a -r 5d5d9b6af0ef src/spriteloader/spriteloader.hpp --- a/src/spriteloader/spriteloader.hpp Thu Sep 13 15:51:50 2007 +0000 +++ b/src/spriteloader/spriteloader.hpp Thu Sep 13 18:22:34 2007 +0000 @@ -26,7 +26,7 @@ /** * 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, uint32 file_pos) = 0; + virtual bool LoadSprite(SpriteLoader::Sprite *sprite, const char *filename, uint8 file_slot, uint32 file_pos) = 0; virtual ~SpriteLoader() { } };