diff options
Diffstat (limited to 'engines/scumm/resource.cpp')
-rw-r--r-- | engines/scumm/resource.cpp | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/engines/scumm/resource.cpp b/engines/scumm/resource.cpp index 10301da3e3..8c34ed3626 100644 --- a/engines/scumm/resource.cpp +++ b/engines/scumm/resource.cpp @@ -47,7 +47,8 @@ enum { RF_USAGE = 0x7F, RF_USAGE_MAX = RF_USAGE, - RS_MODIFIED = 0x10 + RS_MODIFIED = 0x10, + RF_OFFHEAP = 0x40 }; @@ -938,6 +939,18 @@ void ResourceManager::unlock(ResType type, ResId idx) { _types[type][idx].unlock(); } +void ResourceManager::setOffHeap(ResType type, ResId idx) { + if (!validateResource("setOffHeap", type, idx)) + return; + _types[type][idx].setOffHeap(); +} + +void ResourceManager::setOnHeap(ResType type, ResId idx) { + if (!validateResource("setOnHeap", type, idx)) + return; + _types[type][idx].setOnHeap(); +} + bool ResourceManager::isLocked(ResType type, ResId idx) const { if (!validateResource("isLocked", type, idx)) return false; @@ -956,6 +969,18 @@ bool ResourceManager::Resource::isLocked() const { return (_flags & RF_LOCK) != 0; } +void ResourceManager::Resource::setOffHeap() { + _flags |= RF_OFFHEAP; +} + +void ResourceManager::Resource::setOnHeap() { + _flags &= ~RF_OFFHEAP; +} + +bool ResourceManager::Resource::isOffHeap() const { + return (_flags & RF_OFFHEAP) != 0; +} + bool ScummEngine::isResourceInUse(ResType type, ResId idx) const { if (!_res->validateResource("isResourceInUse", type, idx)) return false; @@ -1035,7 +1060,7 @@ void ResourceManager::expireResources(uint32 size) { while (idx-- > 0) { Resource &tmp = _types[type][idx]; byte counter = tmp.getResourceCounter(); - if (!tmp.isLocked() && counter >= best_counter && tmp._address && !_vm->isResourceInUse(type, idx)) { + if (!tmp.isLocked() && counter >= best_counter && tmp._address && !_vm->isResourceInUse(type, idx) && !tmp.isOffHeap()) { best_counter = counter; best_type = type; best_res = idx; |