summaryrefslogtreecommitdiff
path: root/src/spritecache.cpp
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2011-11-24 12:26:44 +0000
committerpeter1138 <peter1138@openttd.org>2011-11-24 12:26:44 +0000
commit15d0a22aac6b90a2055e68d019cab4350376a8fd (patch)
tree0b94b0f8551f81dcdf924ce628d1a674d7a8fb63 /src/spritecache.cpp
parent4e97261315211c65459b91685537f82e5c454604 (diff)
downloadopenttd-15d0a22aac6b90a2055e68d019cab4350376a8fd.tar.xz
(svn r23315) -Codechange: Only encode sprites for zoom levels that will be used.
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;