[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