[Scummvm-git-logs] scummvm master -> 98b5adc4cc059471985e4b218ebe84888efd72b0

ysj1173886760 42030331+ysj1173886760 at users.noreply.github.com
Tue Aug 17 00:57:28 UTC 2021


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:
98b5adc4cc DIRECTOR: fix memory leak when using win cursor.


Commit: 98b5adc4cc059471985e4b218ebe84888efd72b0
    https://github.com/scummvm/scummvm/commit/98b5adc4cc059471985e4b218ebe84888efd72b0
Author: ysj1173886760 (1173886760 at qq.com)
Date: 2021-08-17T08:56:13+08:00

Commit Message:
DIRECTOR: fix memory leak when using win cursor.

Changed paths:
    engines/director/cursor.cpp
    engines/director/director.cpp
    engines/director/director.h
    engines/director/resource.cpp
    engines/director/score.cpp


diff --git a/engines/director/cursor.cpp b/engines/director/cursor.cpp
index 04b5ad57da..193cb414eb 100644
--- a/engines/director/cursor.cpp
+++ b/engines/director/cursor.cpp
@@ -21,6 +21,8 @@
 
 #include "image/image_decoder.h"
 
+#include "graphics/wincursor.h"
+
 #include "director/director.h"
 #include "director/cursor.h"
 #include "director/movie.h"
@@ -194,10 +196,14 @@ void Cursor::readFromResource(int resourceId) {
 		// for win platform, try the cursor from exe
 		if (!readSuccessful && g_director->getPlatform() == Common::kPlatformWindows) {
 			// i'm not sure, in jman we have cursor id 2, 3, 4. and custom cursor id 128 129 130
-			int id = (resourceId & 0x7f) + 2;
-			if (g_director->_winCursor.contains(id)) {
-				resetCursor(Graphics::kMacCursorCustom, false, id);
-				readSuccessful = true;
+			uint id = (resourceId & 0x7f) + 2;
+			for (uint i = 0; i < g_director->_winCursor.size(); i++) {
+				for (uint j = 0; j < g_director->_winCursor[i]->cursors.size(); j++) {
+					if (id == g_director->_winCursor[i]->cursors[j].id.getID()) {
+						resetCursor(Graphics::kMacCursorCustom, false, id);
+						readSuccessful = true;
+					}
+				}
 			}
 		}
 
diff --git a/engines/director/director.cpp b/engines/director/director.cpp
index 99f6646ded..83db5d7e07 100644
--- a/engines/director/director.cpp
+++ b/engines/director/director.cpp
@@ -27,6 +27,7 @@
 #include "common/tokenizer.h"
 
 #include "graphics/macgui/macwindowmanager.h"
+#include "graphics/wincursor.h"
 
 #include "director/director.h"
 #include "director/archive.h"
@@ -129,8 +130,8 @@ DirectorEngine::~DirectorEngine() {
 		delete it->_value;
 	}
 
-	for (Common::HashMap<uint, Graphics::Cursor *>::iterator it = _winCursor.begin(); it != _winCursor.end(); it++)
-		delete it->_value;
+	for (uint i = 0; i < _winCursor.size(); i++)
+		delete _winCursor[i];
 
 	clearPalettes();
 }
diff --git a/engines/director/director.h b/engines/director/director.h
index 583065310b..ab534a6ae8 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -47,6 +47,7 @@ class SeekableReadStreamEndian;
 namespace Graphics {
 class MacWindowManager;
 struct MacPlotData;
+struct WinCursorGroup;
 typedef Common::Array<byte *> MacPatterns;
 
 class ManagedSurface;
@@ -258,7 +259,7 @@ public:
 	char _dirSeparator;
 
 	Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> _openResFiles;
-	Common::HashMap<uint, Graphics::Cursor *> _winCursor;
+	Common::Array<Graphics::WinCursorGroup *> _winCursor;
 
 protected:
 	Common::Error run() override;
diff --git a/engines/director/resource.cpp b/engines/director/resource.cpp
index e50b74c632..2c2887d10d 100644
--- a/engines/director/resource.cpp
+++ b/engines/director/resource.cpp
@@ -240,9 +240,7 @@ void Window::loadEXE(const Common::String movie) {
 		Common::Array<Common::WinResourceID> idList = exe->getIDList(Common::kWinGroupCursor);
 		for (uint i = 0; i < idList.size(); i++) {
 			Graphics::WinCursorGroup *group = Graphics::WinCursorGroup::createCursorGroup(exe, idList[i]);
-			for (uint j = 0; j < group->cursors.size(); j++) {
-				g_director->_winCursor.setVal(group->cursors[j].id.getID(), group->cursors[j].cursor);
-			}
+			g_director->_winCursor.push_back(group);
 		}
 
 		delete exe;
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index fba7be37fc..1906234fba 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -599,10 +599,10 @@ void Score::renderCursor(Common::Point pos, bool forceUpdate) {
 				return;
 
 			// try to use the cursor read from exe file.
-			if (g_director->getPlatform() == Common::kPlatformWindows && _channels[spriteId]->_cursor._cursorType == Graphics::kMacCursorCustom)
-				_vm->_wm->replaceCursor(_channels[spriteId]->_cursor._cursorType, g_director->_winCursor[_channels[spriteId]->_cursor._cursorResId]);
-			else
-				_vm->_wm->replaceCursor(_channels[spriteId]->_cursor._cursorType, &_channels[spriteId]->_cursor);
+			// currently, we are using mac arrow to represent custom win cursor since we didn't find where it stores. So i comment it out here.
+//			if (g_director->getPlatform() == Common::kPlatformWindows && _channels[spriteId]->_cursor._cursorType == Graphics::kMacCursorCustom)
+//				_vm->_wm->replaceCursor(_channels[spriteId]->_cursor._cursorType, g_director->_winCursor[_channels[spriteId]->_cursor._cursorResId]);
+			_vm->_wm->replaceCursor(_channels[spriteId]->_cursor._cursorType, &_channels[spriteId]->_cursor);
 			_currentCursor = _channels[spriteId]->_cursor.getRef();
 			return;
 		}




More information about the Scummvm-git-logs mailing list