(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
authorpeter1138
Tue, 22 Jan 2008 07:27:06 +0000
changeset 8374 7a1b6c89cb89
parent 8373 7431d91527f2
child 8375 c84b6f2337dd
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
src/fileio.cpp
src/fileio.h
src/spritecache.cpp
src/spriteloader/grf.cpp
src/spriteloader/grf.hpp
src/spriteloader/png.cpp
src/spriteloader/png.hpp
src/spriteloader/spriteloader.hpp
--- a/src/fileio.cpp	Mon Jan 21 23:55:57 2008 +0000
+++ b/src/fileio.cpp	Tue Jan 22 07:27:06 2008 +0000
@@ -33,6 +33,7 @@
 	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 @@
 	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 @@
 {
 	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 @@
 	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++;
--- a/src/fileio.h	Mon Jan 21 23:55:57 2008 +0000
+++ b/src/fileio.h	Tue Jan 22 07:27:06 2008 +0000
@@ -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();
--- a/src/spritecache.cpp	Mon Jan 21 23:55:57 2008 +0000
+++ b/src/spritecache.cpp	Tue Jan 22 07:27:06 2008 +0000
@@ -24,7 +24,6 @@
 
 struct SpriteCache {
  	void *ptr;
-	const char *grf_name;
 	uint32 id;
  	uint32 file_pos;
 	uint16 file_slot;
@@ -143,7 +142,7 @@
 		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 @@
 	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 @@
 	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 @@
 	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 @@
 	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;
--- a/src/spriteloader/grf.cpp	Mon Jan 21 23:55:57 2008 +0000
+++ b/src/spriteloader/grf.cpp	Tue Jan 22 07:27:06 2008 +0000
@@ -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);
--- a/src/spriteloader/grf.hpp	Mon Jan 21 23:55:57 2008 +0000
+++ b/src/spriteloader/grf.hpp	Tue Jan 22 07:27:06 2008 +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, uint8 file_slot, uint32 file_pos);
+	bool LoadSprite(SpriteLoader::Sprite *sprite, uint8 file_slot, uint32 file_pos);
 };
 
 #endif /* SPRITELOADER_GRF_HPP */
--- a/src/spriteloader/png.cpp	Mon Jan 21 23:55:57 2008 +0000
+++ b/src/spriteloader/png.cpp	Tue Jan 22 07:27:06 2008 +0000
@@ -181,8 +181,9 @@
 	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;
--- a/src/spriteloader/png.hpp	Mon Jan 21 23:55:57 2008 +0000
+++ b/src/spriteloader/png.hpp	Tue Jan 22 07:27:06 2008 +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, uint8 file_slot, uint32 file_pos);
+	bool LoadSprite(SpriteLoader::Sprite *sprite, uint8 file_slot, uint32 file_pos);
 };
 
 #endif /* SPRITELOADER_PNG_HPP */
--- a/src/spriteloader/spriteloader.hpp	Mon Jan 21 23:55:57 2008 +0000
+++ b/src/spriteloader/spriteloader.hpp	Tue Jan 22 07:27:06 2008 +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, uint8 file_slot, uint32 file_pos) = 0;
+	virtual bool LoadSprite(SpriteLoader::Sprite *sprite, uint8 file_slot, uint32 file_pos) = 0;
 
 	virtual ~SpriteLoader() { }
 };