[Scummvm-cvs-logs] scummvm master -> b3457144ed6a4002ea8b51ac93ba14047950c262
Kirben
kirben at optusnet.com.au
Sun Aug 28 02:45:53 CEST 2011
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
b3457144ed SCUMM: Add basic support for setOffHeap resource flag in HE90+ games.
Commit: b3457144ed6a4002ea8b51ac93ba14047950c262
https://github.com/scummvm/scummvm/commit/b3457144ed6a4002ea8b51ac93ba14047950c262
Author: Travis Howell (kirben at optusnet.com.au)
Date: 2011-08-27T17:40:23-07:00
Commit Message:
SCUMM: Add basic support for setOffHeap resource flag in HE90+ games.
Changed paths:
engines/scumm/he/intern_he.h
engines/scumm/he/resource_he.cpp
engines/scumm/he/script_v90he.cpp
engines/scumm/resource.cpp
engines/scumm/resource.h
diff --git a/engines/scumm/he/intern_he.h b/engines/scumm/he/intern_he.h
index f4df657..cdc5faa 100644
--- a/engines/scumm/he/intern_he.h
+++ b/engines/scumm/he/intern_he.h
@@ -458,6 +458,7 @@ protected:
virtual void saveOrLoad(Serializer *s);
virtual void readMAXS(int blockSize);
+ void setResourceOffHeap(int typeId, int resId, int val);
virtual void processActors();
diff --git a/engines/scumm/he/resource_he.cpp b/engines/scumm/he/resource_he.cpp
index 39240e3..42748d0 100644
--- a/engines/scumm/he/resource_he.cpp
+++ b/engines/scumm/he/resource_he.cpp
@@ -386,6 +386,40 @@ int ScummEngine_v72he::getSoundResourceSize(ResId id) {
return size;
}
+void ScummEngine_v90he::setResourceOffHeap(int typeId, int resId, int val) {
+ debug(0, "setResourceOffHeap: type %d resId %d toggle %d", typeId, resId, val);
+ ResType type;
+
+ switch (typeId) {
+ case 1:
+ type = rtRoom;
+ break;
+ case 2:
+ type = rtScript;
+ break;
+ case 3:
+ type = rtCostume;
+ break;
+ case 4:
+ type = rtSound;
+ break;
+ case 6:
+ type = rtCharset;
+ break;
+ case 19:
+ type = rtImage;
+ break;
+ default:
+ error("setResourceOffHeap: default case %d", typeId);
+ }
+
+ if (val == 1) {
+ _res->setOffHeap(type, resId);
+ } else {
+ _res->setOnHeap(type, resId);
+ }
+}
+
#endif
} // End of namespace Scumm
diff --git a/engines/scumm/he/script_v90he.cpp b/engines/scumm/he/script_v90he.cpp
index 66a0a34..877f8b2 100644
--- a/engines/scumm/he/script_v90he.cpp
+++ b/engines/scumm/he/script_v90he.cpp
@@ -2358,7 +2358,7 @@ void ScummEngine_v90he::o90_kernelSetFunctions() {
_wiz->_rectOverrideEnabled = false;
break;
case 714:
- debug(5, "o90_kernelSetFunctions: case 714: type %d resId %d unk1 %d", args[1], args[2], args[3]);
+ setResourceOffHeap(args[1], args[2], args[3]);
break;
case 1492:
// Remote start script function
diff --git a/engines/scumm/resource.cpp b/engines/scumm/resource.cpp
index 10301da..8c34ed3 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;
diff --git a/engines/scumm/resource.h b/engines/scumm/resource.h
index 2e89607..ddecca4 100644
--- a/engines/scumm/resource.h
+++ b/engines/scumm/resource.h
@@ -134,12 +134,15 @@ public:
inline void setResourceCounter(byte counter);
inline byte getResourceCounter() const;
+ // HE specific
void lock();
void unlock();
bool isLocked() const;
-
void setModified();
bool isModified() const;
+ void setOffHeap();
+ void setOnHeap();
+ bool isOffHeap() const;
};
/**
@@ -188,12 +191,14 @@ public:
bool isResourceLoaded(ResType type, ResId idx) const;
+ // HE Specific
void lock(ResType type, ResId idx);
void unlock(ResType type, ResId idx);
bool isLocked(ResType type, ResId idx) const;
-
void setModified(ResType type, ResId idx);
bool isModified(ResType type, ResId idx) const;
+ void setOffHeap(ResType type, ResId idx);
+ void setOnHeap(ResType type, ResId idx);
/**
* This method increments the _expireCounter, and if it overflows (which happens
More information about the Scummvm-git-logs
mailing list