src/spritecache.cpp
branchNewGRF_ports
changeset 6870 ca3fd1fbe311
parent 6720 35756db7e577
child 6871 5a9dc001e1ad
--- a/src/spritecache.cpp	Thu Sep 06 19:42:48 2007 +0000
+++ b/src/spritecache.cpp	Sat Oct 06 21:16:00 2007 +0000
@@ -25,6 +25,7 @@
 
 struct SpriteCache {
 	void *ptr;
+	uint8 file_slot;
 	uint32 file_pos;
 	int16 lru;
 	uint32 id;
@@ -120,13 +121,14 @@
 	/* Special case for Sprite ID zero -- its position is also 0... */
 	if (id == 0) return true;
 	if (id >= _spritecache_items) return false;
-	return GetSpriteCache(id)->file_pos != 0;
+	return !(GetSpriteCache(id)->file_pos == 0 && GetSpriteCache(id)->file_slot == 0);
 }
 
 void* AllocSprite(size_t);
 
 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;