summaryrefslogtreecommitdiff
path: root/src/spritecache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/spritecache.cpp')
-rw-r--r--src/spritecache.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/spritecache.cpp b/src/spritecache.cpp
index 7765c340a..dc5a2acd1 100644
--- a/src/spritecache.cpp
+++ b/src/spritecache.cpp
@@ -199,6 +199,7 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty
/* Try loading 32bpp graphics in case we are 32bpp output */
SpriteLoaderPNG sprite_loader;
SpriteLoader::Sprite sprite;
+ sprite.type = sprite_type;
if (sprite_loader.LoadSprite(&sprite, file_slot, sc->id, sprite_type)) {
return BlitterFactoryBase::GetCurrentBlitter()->Encode(&sprite, allocator);
@@ -290,6 +291,7 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty
SpriteLoaderGrf sprite_loader;
SpriteLoader::Sprite sprite;
+ sprite.type = sprite_type;
if (!sprite_loader.LoadSprite(&sprite, file_slot, file_pos, sprite_type)) {
if (id == SPR_IMG_QUERY) usererror("Okay... something went horribly wrong. I couldn't load the fallback sprite. What should I do?");
@@ -608,7 +610,7 @@ void *GetRawSprite(SpriteID sprite, SpriteType type, AllocatorProc *allocator)
}
-void GfxInitSpriteMem()
+static void GfxInitSpriteCache()
{
/* initialize sprite cache heap */
if (_spritecache_ptr == NULL) _spritecache_ptr = (MemBlock*)MallocT<byte>(_sprite_cache_size * 1024 * 1024);
@@ -617,6 +619,11 @@ void GfxInitSpriteMem()
_spritecache_ptr->size = ((_sprite_cache_size * 1024 * 1024) - sizeof(MemBlock)) | S_FREE_MASK;
/* Sentinel block (identified by size == 0) */
NextBlock(_spritecache_ptr)->size = 0;
+}
+
+void GfxInitSpriteMem()
+{
+ GfxInitSpriteCache();
/* Reset the spritecache 'pool' */
free(_spritecache);
@@ -626,4 +633,19 @@ void GfxInitSpriteMem()
_compact_cache_counter = 0;
}
+/**
+ * Remove all encoded sprites from the sprite cache without
+ * discarding sprite location information.
+ */
+void GfxClearSpriteCache()
+{
+ /* Clear sprite ptr for all cached items */
+ for (uint i = 0; i != _spritecache_items; i++) {
+ SpriteCache *sc = GetSpriteCache(i);
+ sc->ptr = NULL;
+ }
+
+ GfxInitSpriteCache();
+}
+
/* static */ ReusableBuffer<SpriteLoader::CommonPixel> SpriteLoader::Sprite::buffer;