[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