From 15563b5a7cf594dbee51c2b09bf2ccb5ccf03e4e Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sat, 18 Jun 2022 18:21:35 +0100 Subject: [PATCH] AGS: Changed SpriteCache::FreeMem to comply with sound cache From upstream 94a462d52d5533f4ebb4cef1bbddd280b4f876a2 --- engines/ags/shared/ac/sprite_cache.cpp | 12 +++++------- engines/ags/shared/ac/sprite_cache.h | 4 ++-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/engines/ags/shared/ac/sprite_cache.cpp b/engines/ags/shared/ac/sprite_cache.cpp index 101f0455ff1..c05c7ed7025 100644 --- a/engines/ags/shared/ac/sprite_cache.cpp +++ b/engines/ags/shared/ac/sprite_cache.cpp @@ -215,8 +215,8 @@ Bitmap *SpriteCache::operator [] (sprkey_t index) { return _spriteData[index].Image; } -void SpriteCache::FreeMem(size_t threshold) { - for (int tries = 0; (_mru.size() > 0) && (_cacheSize >= threshold); ++tries) { +void SpriteCache::FreeMem(size_t space) { + for (int tries = 0; (_mru.size() > 0) && (_cacheSize >= (_maxCacheSize - space)); ++tries) { DisposeOldest(); if (tries > 1000) { // ??? Debug::Printf(kDbgGroup_SprCache, kDbgMsg_Error, "RUNTIME CACHE ERROR: STUCK IN FREE_UP_MEM; RESETTING CACHE"); @@ -299,8 +299,6 @@ size_t SpriteCache::LoadSprite(sprkey_t index) { if (index < 0 || (size_t)index >= _spriteData.size()) return 0; - FreeMem(_maxCacheSize); - sprkey_t load_index = GetDataIndex(index); Bitmap *image; HError err = _file.LoadSprite(load_index, image); @@ -330,10 +328,10 @@ size_t SpriteCache::LoadSprite(sprkey_t index) { if (index != 0) // leave sprite 0 locked _spriteData[index].Flags &= ~SPRCACHEFLAG_LOCKED; - // we need to store this because the main program might - // alter spritewidth/height if it resizes stuff - size_t size = _sprInfos[index].Width * _sprInfos[index].Height * + const size_t size = _sprInfos[index].Width * _sprInfos[index].Height * _spriteData[index].Image->GetBPP(); + // Clear up space before adding to cache + FreeMem(size); _spriteData[index].Size = size; _cacheSize += size; diff --git a/engines/ags/shared/ac/sprite_cache.h b/engines/ags/shared/ac/sprite_cache.h index 552f7a7eb3b..d1715407c67 100644 --- a/engines/ags/shared/ac/sprite_cache.h +++ b/engines/ags/shared/ac/sprite_cache.h @@ -154,8 +154,8 @@ private: sprkey_t GetDataIndex(sprkey_t index); // Delete the oldest (least recently used) image in cache void DisposeOldest(); - // Keep disposing oldest elements until cache size is reduced to the given threshold - void FreeMem(size_t threshold); + // Keep disposing oldest elements until cache has at least the given free space + void FreeMem(size_t space); // Information required for the sprite streaming struct SpriteData {