[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