[Scummvm-git-logs] scummvm master -> 0091a20fe9c13ef4c2f8f0e7342f96bae6d50357

rvanlaar noreply at scummvm.org
Fri Sep 23 21:00:22 UTC 2022


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
423783f394 JANITORIAL: DIRECTOR: Improve debug message
0091a20fe9 DIRECTOR: limit files closed by closeResFile


Commit: 423783f394f0fd252af3971e2b14addfc475229c
    https://github.com/scummvm/scummvm/commit/423783f394f0fd252af3971e2b14addfc475229c
Author: Roland van Laar (roland at rolandvanlaar.nl)
Date: 2022-09-23T22:09:40+02:00

Commit Message:
JANITORIAL: DIRECTOR: Improve debug message

Make debug message reference the function it's in.
Not the old one.

Changed paths:
    engines/director/cast.cpp


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 9979eac7dd1..ec9043f23eb 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -474,7 +474,7 @@ void Cast::loadCast() {
 
 	// Font Directory
 	if (_castArchive->hasResource(MKTAG('F', 'O', 'N', 'D'), -1)) {
-		debug("Cast::loadArchive(): Movie has fonts. Loading....");
+		debug("Cast::loadCast(): Movie has fonts. Loading....");
 
 		_vm->_wm->_fontMan->loadFonts(_castArchive->getPathName());
 	}


Commit: 0091a20fe9c13ef4c2f8f0e7342f96bae6d50357
    https://github.com/scummvm/scummvm/commit/0091a20fe9c13ef4c2f8f0e7342f96bae6d50357
Author: Roland van Laar (roland at rolandvanlaar.nl)
Date: 2022-09-23T22:55:50+02:00

Commit Message:
DIRECTOR: limit files closed by closeResFile

Lingo function `closeResFile` is only responsible for closing resource
file opened by `openResFile`. Register in `openResFile` which files
where opened and close only those files in `closeResFile`.

- Rename `_openResFiles` to `_allOpenResFiles` and
- Add new `_openResFiles` hashmap to track which files were opened in
  `openResFile`.

Changed paths:
    engines/director/cast.cpp
    engines/director/cursor.cpp
    engines/director/director.cpp
    engines/director/director.h
    engines/director/lingo/lingo-builtins.cpp
    engines/director/movie.cpp
    engines/director/resource.cpp
    engines/director/sound.cpp
    engines/director/window.cpp


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index ec9043f23eb..454862efe93 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -961,11 +961,11 @@ void Cast::loadExternalSound(Common::SeekableReadStreamEndian &stream) {
 
 	Common::String resPath = g_director->getCurrentPath() + str;
 
-	if (!g_director->_openResFiles.contains(resPath)) {
+	if (!g_director->_allOpenResFiles.contains(resPath)) {
 		MacArchive *resFile = new MacArchive();
 
 		if (resFile->openFile(resPath)) {
-			g_director->_openResFiles.setVal(resPath, resFile);
+			g_director->_allOpenResFiles.setVal(resPath, resFile);
 		} else {
 			delete resFile;
 		}
diff --git a/engines/director/cursor.cpp b/engines/director/cursor.cpp
index bbc68639be9..617030e24e7 100644
--- a/engines/director/cursor.cpp
+++ b/engines/director/cursor.cpp
@@ -175,7 +175,7 @@ void Cursor::readFromResource(Datum resourceId) {
 	default:
 		bool readSuccessful = false;
 
-		for (Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator it = g_director->_openResFiles.begin(); it != g_director->_openResFiles.end(); ++it) {
+		for (Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator it = g_director->_allOpenResFiles.begin(); it != g_director->_allOpenResFiles.end(); ++it) {
 			MacArchive *arch = (MacArchive *)it->_value;
 			Common::SeekableReadStreamEndian *cursorStream = nullptr;
 			if (arch->hasResource(MKTAG('C', 'U', 'R', 'S'), resourceId.asInt()))
diff --git a/engines/director/director.cpp b/engines/director/director.cpp
index 1fe0546bab5..08a3f39daa3 100644
--- a/engines/director/director.cpp
+++ b/engines/director/director.cpp
@@ -135,7 +135,7 @@ DirectorEngine::~DirectorEngine() {
 	delete _wm;
 	delete _surface;
 
-	for (Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator it = _openResFiles.begin(); it != _openResFiles.end(); ++it) {
+	for (Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator it = _allOpenResFiles.begin(); it != _allOpenResFiles.end(); ++it) {
 		delete it->_value;
 	}
 
diff --git a/engines/director/director.h b/engines/director/director.h
index 7291a3ef73a..44c6d6b96d9 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -58,6 +58,7 @@ class ManagedSurface;
 namespace Director {
 
 class Archive;
+class MacArchive;
 class Cast;
 class DirectorSound;
 class Lingo;
@@ -237,9 +238,13 @@ public:
 	Common::Rect _fixStageRect;
 	Common::List<Common::String> _extraSearchPath;
 
-	Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> _openResFiles;
+	Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> _allOpenResFiles;
+	// Opened Resource Files that were opened by OpenResFile
+	Common::HashMap<Common::String, MacArchive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> _openResFiles;
+
 	Common::Array<Graphics::WinCursorGroup *> _winCursor;
 
+
 protected:
 	Common::Error run() override;
 
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 0c46117c560..5d77c51306f 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1058,9 +1058,13 @@ void LB::b_closeDA(int nargs) {
 }
 
 void LB::b_closeResFile(int nargs) {
-	if (nargs == 0) { // Close all res files
-		for (Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator
+	// closeResFile closes only resource files that were opened with openResFile.
+
+	if (nargs == 0) { // Close all open resesource files
+		for (Common::HashMap<Common::String, MacArchive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator
 				it = g_director->_openResFiles.begin(); it != g_director->_openResFiles.end(); ++it) {
+			// also clean up the global resource file hashmap
+			g_director->_allOpenResFiles.erase(it->_key);
 			delete it->_value;
 		}
 		g_director->_openResFiles.clear();
@@ -1074,6 +1078,8 @@ void LB::b_closeResFile(int nargs) {
 		auto archive = g_director->_openResFiles.getVal(resFileName);
 		delete archive;
 		g_director->_openResFiles.erase(resFileName);
+		// also clean up the global resource file hashmap
+		g_director->_allOpenResFiles.erase(resFileName);
 	}
 }
 
@@ -1149,11 +1155,13 @@ void LB::b_openResFile(int nargs) {
 		return;
 	}
 
-	if (!g_director->_openResFiles.contains(resPath)) {
+	if (!g_director->_allOpenResFiles.contains(resPath)) {
 		MacArchive *resFile = new MacArchive();
 
 		if (resFile->openFile(pathMakeRelative(resPath))) {
+			// Track responsibility. closeResFile may only close resource files opened by openResFile.
 			g_director->_openResFiles.setVal(resPath, resFile);
+			g_director->_allOpenResFiles.setVal(resPath, resFile);
 		} else {
 			delete resFile;
 		}
@@ -1169,11 +1177,11 @@ void LB::b_openXlib(int nargs) {
 	if (g_director->getPlatform() == Common::kPlatformMacintosh) {
 		// try opening the file as a resfile
 		Common::String resPath = g_director->getCurrentWindow()->getCurrentPath() + d.asString();
-		if (!g_director->_openResFiles.contains(resPath)) {
+		if (!g_director->_allOpenResFiles.contains(resPath)) {
 			MacArchive *resFile = new MacArchive();
 
 			if (resFile->openFile(pathMakeRelative(resPath))) {
-				g_director->_openResFiles.setVal(resPath, resFile);
+				g_director->_allOpenResFiles.setVal(resPath, resFile);
 				uint32 XCOD = MKTAG('X', 'C', 'O', 'D');
 				uint32 XCMD = MKTAG('X', 'C', 'M', 'D');
 
@@ -1216,7 +1224,7 @@ void LB::b_showResFile(int nargs) {
 	if (nargs)
 		g_lingo->pop();
 	Common::String out;
-	for (auto it = g_director->_openResFiles.begin(); it != g_director->_openResFiles.end(); it++)
+	for (auto it = g_director->_allOpenResFiles.begin(); it != g_director->_allOpenResFiles.end(); it++)
 		out += it->_key + "\n";
 	g_debugger->debugLogFile(out, false);
 }
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 821061565d1..9bf4ccef89b 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -97,7 +97,7 @@ Movie::~Movie() {
 	delete _cast;
 
 	if (_sharedCast)
-		g_director->_openResFiles.erase(_sharedCast->getArchive()->getPathName());
+		g_director->_allOpenResFiles.erase(_sharedCast->getArchive()->getPathName());
 
 	delete _sharedCast;
 	delete _score;
@@ -285,7 +285,7 @@ void Movie::clearSharedCast() {
 	if (!_sharedCast)
 		return;
 
-	g_director->_openResFiles.erase(_sharedCast->getArchive()->getPathName());
+	g_director->_allOpenResFiles.erase(_sharedCast->getArchive()->getPathName());
 
 	delete _sharedCast;
 
@@ -315,7 +315,7 @@ void Movie::loadSharedCastsFrom(Common::String filename) {
 	_sharedCast->loadArchive();
 
 	// Register the resfile so that Cursor::readFromResource can find it
-	g_director->_openResFiles.setVal(sharedCast->getPathName(), sharedCast);
+	g_director->_allOpenResFiles.setVal(sharedCast->getPathName(), sharedCast);
 }
 
 CastMember *Movie::getCastMember(CastMemberID memberID) {
diff --git a/engines/director/resource.cpp b/engines/director/resource.cpp
index 634deddc1a0..50c59262228 100644
--- a/engines/director/resource.cpp
+++ b/engines/director/resource.cpp
@@ -185,7 +185,7 @@ void Window::probeMacBinary(MacArchive *archive) {
 		}
 	}
 	// Register the resfile so that Cursor::readFromResource can find it
-	g_director->_openResFiles.setVal(archive->getPathName(), archive);
+	g_director->_allOpenResFiles.setVal(archive->getPathName(), archive);
 }
 
 Archive *Window::openMainArchive(const Common::String movie) {
diff --git a/engines/director/sound.cpp b/engines/director/sound.cpp
index 51d5d481927..9c21782022e 100644
--- a/engines/director/sound.cpp
+++ b/engines/director/sound.cpp
@@ -319,7 +319,7 @@ void DirectorSound::loadSampleSounds(uint type) {
 	uint id = 0xFF;
 	Archive *archive = nullptr;
 
-	for (Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator it = g_director->_openResFiles.begin(); it != g_director->_openResFiles.end(); ++it) {
+	for (Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator it = g_director->_allOpenResFiles.begin(); it != g_director->_allOpenResFiles.end(); ++it) {
 		Common::Array<uint16> idList = it->_value->getResourceIDList(tag);
 		for (uint j = 0; j < idList.size(); j++) {
 			if ((idList[j] & 0xFF) == type) {
@@ -525,7 +525,7 @@ void DirectorSound::playFPlaySound() {
 	Archive *archive = nullptr;
 
 	// iterate opened ResFiles
-	for (Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator it = g_director->_openResFiles.begin(); it != g_director->_openResFiles.end(); ++it) {
+	for (Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator it = g_director->_allOpenResFiles.begin(); it != g_director->_allOpenResFiles.end(); ++it) {
 		id = it->_value->findResourceID(tag, sndName, true);
 		if (id != 0xFFFF) {
 			archive = it->_value;
diff --git a/engines/director/window.cpp b/engines/director/window.cpp
index 39521e2e02b..d34b36b987d 100644
--- a/engines/director/window.cpp
+++ b/engines/director/window.cpp
@@ -339,14 +339,14 @@ bool Window::step() {
 			} else {
 				// clear reference in openResFile before deleting shared cast
 				if (sharedCast)
-					g_director->_openResFiles.erase(sharedCast->getArchive()->getPathName());
+					g_director->_allOpenResFiles.erase(sharedCast->getArchive()->getPathName());
 				delete sharedCast;
 				_currentMovie->loadSharedCastsFrom(sharedCastPath);
 			}
 		} else {
 			// clear reference in openResFile before deleting shared cast
 			if (sharedCast)
-				g_director->_openResFiles.erase(sharedCast->getArchive()->getPathName());
+				g_director->_allOpenResFiles.erase(sharedCast->getArchive()->getPathName());
 			delete sharedCast;
 		}
 




More information about the Scummvm-git-logs mailing list