[Scummvm-git-logs] scummvm master -> 57bb4359ef8b7c6ca69322a72d073e4bf240d5ee

djsrv dservilla at gmail.com
Thu Jul 9 04:59:26 UTC 2020


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

Summary:
3aaeced035 GRAPHICS: MACGUI: Allow windows to be hidden
e18f8a6c84 DIRECTOR: LINGO: Mark Datum functions as const
94d8c49a84 DIRECTOR: LINGO: Properly init/destroy windows
57bb4359ef DIRECTOR: LINGO: Implement the visible of window


Commit: 3aaeced035b7f23d2cc3b27ec5675527fb2f89e4
    https://github.com/scummvm/scummvm/commit/3aaeced035b7f23d2cc3b27ec5675527fb2f89e4
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-08T17:10:55-04:00

Commit Message:
GRAPHICS: MACGUI: Allow windows to be hidden

Changed paths:
    graphics/macgui/macwindow.cpp
    graphics/macgui/macwindow.h
    graphics/macgui/macwindowmanager.cpp


diff --git a/graphics/macgui/macwindow.cpp b/graphics/macgui/macwindow.cpp
index 1f82ef6d96..2462f1f028 100644
--- a/graphics/macgui/macwindow.cpp
+++ b/graphics/macgui/macwindow.cpp
@@ -39,8 +39,14 @@ BaseMacWindow::BaseMacWindow(int id, bool editable, MacWindowManager *wm) :
 	_contentIsDirty = true;
 
 	_type = kWindowUnknown;
+
+	_visible = true;
 }
 
+void BaseMacWindow::setVisible(bool visible) { _visible = visible; }
+
+bool BaseMacWindow::isVisible() { return _visible; }
+
 MacWindow::MacWindow(int id, bool scrollable, bool resizable, bool editable, MacWindowManager *wm) :
 		BaseMacWindow(id, editable, wm), _scrollable(scrollable), _resizable(resizable) {
 	_borderIsDirty = true;
diff --git a/graphics/macgui/macwindow.h b/graphics/macgui/macwindow.h
index 53d1e50ac5..f3c8afff89 100644
--- a/graphics/macgui/macwindow.h
+++ b/graphics/macgui/macwindow.h
@@ -98,6 +98,17 @@ public:
 	 */
 	bool isEditable() { return _editable; }
 
+	/**
+	 * Mutator to change the visible state of the window.
+	 * @param visible Target state.
+	 */
+	void setVisible(bool visible);
+	/**
+	 * Accessor to determine whether a window is active.
+	 * @return True if the window is active.
+	 */
+	bool isVisible();
+
 	/**
 	 * Method to access the entire surface of the window (e.g. to draw an image).
 	 * @return A pointer to the entire surface of the window.
@@ -141,6 +152,8 @@ protected:
 
 	bool (*_callback)(WindowClick, Common::Event &, void *);
 	void *_dataPtr;
+
+	bool _visible;
 };
 
 /**
diff --git a/graphics/macgui/macwindowmanager.cpp b/graphics/macgui/macwindowmanager.cpp
index 7d39ce57dc..b4f4d15062 100644
--- a/graphics/macgui/macwindowmanager.cpp
+++ b/graphics/macgui/macwindowmanager.cpp
@@ -412,6 +412,9 @@ void MacWindowManager::draw() {
 
 	for (Common::List<BaseMacWindow *>::const_iterator it = _windowStack.begin(); it != _windowStack.end(); it++) {
 		BaseMacWindow *w = *it;
+		if (!w->isVisible())
+			continue;
+
 		if (w->draw(_screen, _fullRefresh)) {
 			w->setDirty(false);
 


Commit: e18f8a6c8474a14bd8e858572dbe47862ab134e6
    https://github.com/scummvm/scummvm/commit/e18f8a6c8474a14bd8e858572dbe47862ab134e6
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-08T21:52:15-04:00

Commit Message:
DIRECTOR: LINGO: Mark Datum functions as const

Changed paths:
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 836336173d..ca12928645 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -646,7 +646,7 @@ void Lingo::resetLingo() {
 	// timeoutScript is not reset
 }
 
-int Lingo::getAlignedType(Datum &d1, Datum &d2) {
+int Lingo::getAlignedType(const Datum &d1, const Datum &d2) {
 	int opType = VOID;
 
 	int d1Type = d1.type;
@@ -797,7 +797,7 @@ Datum Datum::eval() {
 	return g_lingo->varFetch(*this);
 }
 
-int Datum::asInt() {
+int Datum::asInt() const {
 	int res = 0;
 
 	switch (type) {
@@ -831,7 +831,7 @@ int Datum::asInt() {
 	return res;
 }
 
-double Datum::asFloat() {
+double Datum::asFloat() const {
 	double res = 0.0;
 
 	switch (type) {
@@ -865,7 +865,7 @@ double Datum::asFloat() {
 	return res;
 }
 
-Common::String Datum::asString(bool printonly) {
+Common::String Datum::asString(bool printonly) const {
 	Common::String s;
 	switch (type) {
 	case INT:
@@ -971,7 +971,7 @@ Common::String Datum::asString(bool printonly) {
 	return s;
 }
 
-const char *Datum::type2str(bool isk) {
+const char *Datum::type2str(bool isk) const {
 	static char res[20];
 
 	switch (isk ? u.i : type) {
@@ -1001,7 +1001,7 @@ const char *Datum::type2str(bool isk) {
 	}
 }
 
-int Datum::equalTo(Datum &d, bool ignoreCase) {
+int Datum::equalTo(Datum &d, bool ignoreCase) const {
 	int alignType = g_lingo->getAlignedType(*this, d);
 
 	if (alignType == FLOAT) {
@@ -1021,7 +1021,7 @@ int Datum::equalTo(Datum &d, bool ignoreCase) {
 	}
 }
 
-int Datum::compareTo(Datum &d, bool ignoreCase) {
+int Datum::compareTo(Datum &d, bool ignoreCase) const {
 	int alignType = g_lingo->getAlignedType(*this, d);
 
 	if (alignType == FLOAT) {
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index b1f9c171b8..09d20ed86f 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -136,14 +136,14 @@ struct Datum {	/* interpreter stack type */
 	}
 
 	Datum eval();
-	double asFloat();
-	int asInt();
-	Common::String asString(bool printonly = false);
+	double asFloat() const;
+	int asInt() const;
+	Common::String asString(bool printonly = false) const;
 
-	const char *type2str(bool isk = false);
+	const char *type2str(bool isk = false) const;
 
-	int equalTo(Datum &d, bool ignoreCase = false);
-	int compareTo(Datum &d, bool ignoreCase = false);
+	int equalTo(Datum &d, bool ignoreCase = false) const;
+	int compareTo(Datum &d, bool ignoreCase = false) const;
 };
 
 struct PCell {
@@ -287,7 +287,7 @@ public:
 	void varAssign(Datum &var, Datum &value, bool global = false, DatumHash *localvars = nullptr);
 	Datum varFetch(Datum &var, bool global = false, DatumHash *localvars = nullptr);
 
-	int getAlignedType(Datum &d1, Datum &d2);
+	int getAlignedType(const Datum &d1, const Datum &d2);
 
 	void printAllVars();
 


Commit: 94d8c49a846c63a417c1f741c7a5307a4735a6c3
    https://github.com/scummvm/scummvm/commit/94d8c49a846c63a417c1f741c7a5307a4735a6c3
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-09T00:37:23-04:00

Commit Message:
DIRECTOR: LINGO: Properly init/destroy windows

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo.cpp
    graphics/macgui/macwindowmanager.h


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 03f7878345..15ca7f5343 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -2198,6 +2198,9 @@ void LB::b_window(int nargs) {
 	Graphics::MacWindowManager *wm = g_director->getMacWindowManager();
 	Stage *window = new Stage(wm->getNextId(), false, false, false, wm, g_director);
 	window->setName(windowName);
+	window->resize(640, 480); // FIXME: remove this
+	window->setVisible(false);
+	wm->addWindowInitialized(window);
 	windowList->push_back(window);
 	g_lingo->push(window);
 }
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index ca12928645..97c6cc4ccd 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -32,6 +32,7 @@
 #include "director/movie.h"
 #include "director/score.h"
 #include "director/sprite.h"
+#include "director/stage.h"
 #include "director/util.h"
 
 #include "director/lingo/lingo.h"
@@ -770,7 +771,13 @@ void Datum::reset() {
 			delete u.parr;
 			break;
 		case OBJECT:
-			delete u.obj;
+			if (u.obj->getObjType() == kWindowObj) {
+				Stage *window = static_cast<Stage *>(u.obj);
+				g_director->_wm->removeWindow(window);
+				g_director->_wm->removeMarked();
+			} else {
+				delete u.obj;
+			}
 			break;
 		case CASTREF:
 		case FIELDREF:
diff --git a/graphics/macgui/macwindowmanager.h b/graphics/macgui/macwindowmanager.h
index 12ba4b004b..d059c8bc7b 100644
--- a/graphics/macgui/macwindowmanager.h
+++ b/graphics/macgui/macwindowmanager.h
@@ -265,6 +265,8 @@ public:
 	void renderZoomBox(bool redraw = false);
 	void addZoomBox(ZoomBox *box);
 
+	void removeMarked();
+
 public:
 	MacFontManager *_fontMan;
 	uint32 _mode;
@@ -283,7 +285,6 @@ public:
 private:
 	void drawDesktop();
 
-	void removeMarked();
 	void removeFromStack(BaseMacWindow *target);
 	void removeFromWindowList(BaseMacWindow *target);
 


Commit: 57bb4359ef8b7c6ca69322a72d073e4bf240d5ee
    https://github.com/scummvm/scummvm/commit/57bb4359ef8b7c6ca69322a72d073e4bf240d5ee
Author: djsrv (dservilla at gmail.com)
Date: 2020-07-09T00:54:31-04:00

Commit Message:
DIRECTOR: LINGO: Implement the visible of window

Changed paths:
    engines/director/lingo/lingo-funcs.cpp
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo-the.cpp
    engines/director/stage.cpp
    engines/director/stage.h
    graphics/macgui/macwindow.h


diff --git a/engines/director/lingo/lingo-funcs.cpp b/engines/director/lingo/lingo-funcs.cpp
index 6d27020a4a..dade4bbf75 100644
--- a/engines/director/lingo/lingo-funcs.cpp
+++ b/engines/director/lingo/lingo-funcs.cpp
@@ -189,47 +189,11 @@ void Lingo::func_goto(Datum &frame, Datum &movie) {
 
 	if (movie.type != VOID) {
 		Common::String movieFilenameRaw = movie.asString();
-		Common::String movieFilename = pathMakeRelative(movieFilenameRaw);
-		Common::String cleanedFilename;
-
-		bool fileExists = false;
-
-		if (_vm->getPlatform() == Common::kPlatformMacintosh) {
-			Common::MacResManager resMan;
-
-			for (const byte *p = (const byte *)movieFilename.c_str(); *p; p++)
-				if (*p >= 0x20 && *p <= 0x7f)
-					cleanedFilename += (char) *p;
-
-			if (resMan.open(movieFilename)) {
-				fileExists = true;
-				cleanedFilename = movieFilename;
-			} else if (!movieFilename.equals(cleanedFilename) && resMan.open(cleanedFilename)) {
-				fileExists = true;
-			}
-		} else {
-			Common::File file;
-			cleanedFilename = movieFilename + ".MMM";
-
-			if (file.open(movieFilename)) {
-				fileExists = true;
-				cleanedFilename = movieFilename;
-			} else if (!movieFilename.equals(cleanedFilename) && file.open(cleanedFilename)) {
-				fileExists = true;
-			}
-		}
-
-		debug(1, "func_goto: '%s' -> '%s' -> '%s' -> '%s'", movieFilenameRaw.c_str(), convertPath(movieFilenameRaw).c_str(),
-				movieFilename.c_str(), cleanedFilename.c_str());
+		Stage *stage = _vm->getCurrentStage();
 
-		if (!fileExists) {
-			warning("Movie %s does not exist", movieFilename.c_str());
+		if (!stage->setNextMovie(movieFilenameRaw))
 			return;
-		}
-
-		Stage *stage = _vm->getCurrentStage();
 
-		stage->_nextMovie.movie = cleanedFilename;
 		stage->getCurrentMovie()->getScore()->_stopPlay = true;
 
 		stage->_nextMovie.frameS.clear();
diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index bd16bd5461..4fa669f444 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -24,9 +24,11 @@
 
 #include "director/director.h"
 #include "director/stage.h"
+#include "director/util.h"
 #include "director/lingo/lingo.h"
 #include "director/lingo/lingo-code.h"
 #include "director/lingo/lingo-object.h"
+#include "director/lingo/lingo-the.h"
 #include "director/lingo/lingo-gr.h"
 #include "director/lingo/xlibs/fileio.h"
 
@@ -317,9 +319,42 @@ void LM::m_respondsTo(int nargs) {
 
 // Window
 
+bool Stage::hasProp(const Common::String &propName) {
+	return g_lingo->_theEntityFields.contains(propName) && g_lingo->_theEntityFields[propName]->entity == kTheWindow;
+}
+
+Datum Stage::getProp(const Common::String &propName) {
+	if (g_lingo->_theEntityFields.contains(propName)) {
+		switch (g_lingo->_theEntityFields[propName]->field) {
+		case kTheVisible:
+			return isVisible();
+		default:
+			break;
+		}
+	}
+	
+	warning("Stage::getProp: unhandled property '%s'", propName.c_str());
+	return Datum();
+}
+
+bool Stage::setProp(const Common::String &propName, const Datum &value) {
+	if (g_lingo->_theEntityFields.contains(propName)) {
+		switch (g_lingo->_theEntityFields[propName]->field) {
+		case kTheVisible:
+			setVisible(value.asInt());
+			return true;
+		default:
+			break;
+		}
+	}
+	
+	warning("Stage::getProp: unhandled property '%s'", propName.c_str());
+	return false;
+}
+
 void LM::m_close(int nargs) {
-	g_lingo->printSTUBWithArglist("m_close", nargs);
-	g_lingo->dropStack(nargs);
+	Stage *me = static_cast<Stage *>(g_lingo->_currentMe.u.obj);
+	me->setVisible(false);
 }
 
 void LM::m_forget(int nargs) {
@@ -328,8 +363,8 @@ void LM::m_forget(int nargs) {
 }
 
 void LM::m_open(int nargs) {
-	g_lingo->printSTUBWithArglist("m_open", nargs);
-	g_lingo->dropStack(nargs);
+	Stage *me = static_cast<Stage *>(g_lingo->_currentMe.u.obj);
+	me->setVisible(true);
 }
 
 void LM::m_moveToBack(int nargs) {
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 3f07ca94b6..44d2f20a25 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -149,7 +149,7 @@ TheEntity entities[] = {
 	{ kTheTraceLoad,		"traceLoad",		false, 4 },	//				D4 p
 	{ kTheTraceLogFile,		"traceLogFile",		false, 4 },	//				D4 p
 	{ kTheUpdateMovieEnabled,"updateMovieEnabled",false,4 },//				D4 p
-	{ kTheWindow,			"window",			true,  4 },	//				D4
+	// { kTheWindow,			"window",			true,  4 },	//				D4
 	{ kTheWindowList,		"windowList",		false, 4 },	//				D4 p
 	{ kTheNOEntity, NULL, false, 0 }
 };
diff --git a/engines/director/stage.cpp b/engines/director/stage.cpp
index ce56ee5b51..695505d074 100644
--- a/engines/director/stage.cpp
+++ b/engines/director/stage.cpp
@@ -20,6 +20,7 @@
  *
  */
 
+#include "common/file.h"
 #include "common/system.h"
 #include "common/macresman.h"
 
@@ -71,6 +72,9 @@ void Stage::invertChannel(Channel *channel) {
 }
 
 bool Stage::render(bool forceRedraw, Graphics::ManagedSurface *blitTo) {
+	if (!_currentMovie)
+		return false;
+
 	if (!blitTo)
 		blitTo = &_surface;
 
@@ -89,7 +93,7 @@ bool Stage::render(bool forceRedraw, Graphics::ManagedSurface *blitTo) {
 		const Common::Rect &r = *i;
 		blitTo->fillRect(r, _stageColor);
 
-		_dirtyChannels = g_director->getCurrentMovie()->getScore()->getSpriteIntersections(r);
+		_dirtyChannels = _currentMovie->getScore()->getSpriteIntersections(r);
 		for (Common::List<Channel *>::iterator j = _dirtyChannels.begin(); j != _dirtyChannels.end(); j++) {
 			if ((*j)->_visible)
 				inkBlitFrom(*j, r, blitTo);
@@ -270,6 +274,59 @@ Common::Point Stage::getMousePos() {
 	return g_system->getEventManager()->getMousePos() - Common::Point(_innerDims.left, _innerDims.top);
 }
 
+void Stage::setVisible(bool visible) {
+	// setting visible triggers movie load
+	if (!_currentMovie) {
+		Common::String movieName = getName();
+		setNextMovie(movieName);
+	}
+
+	BaseMacWindow::setVisible(visible);
+}
+
+bool Stage::setNextMovie(Common::String &movieFilenameRaw) {
+	Common::String movieFilename = pathMakeRelative(movieFilenameRaw);
+	Common::String cleanedFilename;
+
+	bool fileExists = false;
+
+	if (_vm->getPlatform() == Common::kPlatformMacintosh) {
+		Common::MacResManager resMan;
+
+		for (const byte *p = (const byte *)movieFilename.c_str(); *p; p++)
+			if (*p >= 0x20 && *p <= 0x7f)
+				cleanedFilename += (char) *p;
+
+		if (resMan.open(movieFilename)) {
+			fileExists = true;
+			cleanedFilename = movieFilename;
+		} else if (!movieFilename.equals(cleanedFilename) && resMan.open(cleanedFilename)) {
+			fileExists = true;
+		}
+	} else {
+		Common::File file;
+		cleanedFilename = movieFilename + ".MMM";
+
+		if (file.open(movieFilename)) {
+			fileExists = true;
+			cleanedFilename = movieFilename;
+		} else if (!movieFilename.equals(cleanedFilename) && file.open(cleanedFilename)) {
+			fileExists = true;
+		}
+	}
+
+	debug(1, "Stage::setNextMovie: '%s' -> '%s' -> '%s' -> '%s'", movieFilenameRaw.c_str(), convertPath(movieFilenameRaw).c_str(),
+			movieFilename.c_str(), cleanedFilename.c_str());
+
+	if (!fileExists) {
+		warning("Movie %s does not exist", movieFilename.c_str());
+		return false;
+	}
+
+	_nextMovie.movie = cleanedFilename;
+	return true;
+}
+
 bool Stage::step() {
 	bool loop = false;
 
diff --git a/engines/director/stage.h b/engines/director/stage.h
index ff5e891661..911053778e 100644
--- a/engines/director/stage.h
+++ b/engines/director/stage.h
@@ -114,6 +114,9 @@ class Stage : public Graphics::MacWindow, public Object<Stage> {
 	Movie *getCurrentMovie() const { return _currentMovie; }
 	Common::String getCurrentPath() const { return _currentPath; }
 
+	virtual void setVisible(bool visible);
+	bool setNextMovie(Common::String &movieFilenameRaw);
+
 	bool step();
 
 	// tests.cpp
@@ -135,6 +138,11 @@ class Stage : public Graphics::MacWindow, public Object<Stage> {
 	void loadEXERIFX(Common::SeekableReadStream *stream, uint32 offset);
 	void loadMac(const Common::String movie);
 
+	// lingo/lingo-object.cpp
+	virtual bool hasProp(const Common::String &propName);
+	virtual Datum getProp(const Common::String &propName);
+	virtual bool setProp(const Common::String &propName, const Datum &value);
+
 public:
 	Common::List<Common::Rect> _dirtyRects;
 	Common::List<Channel *> _dirtyChannels;
diff --git a/graphics/macgui/macwindow.h b/graphics/macgui/macwindow.h
index f3c8afff89..453104b4b6 100644
--- a/graphics/macgui/macwindow.h
+++ b/graphics/macgui/macwindow.h
@@ -102,7 +102,7 @@ public:
 	 * Mutator to change the visible state of the window.
 	 * @param visible Target state.
 	 */
-	void setVisible(bool visible);
+	virtual void setVisible(bool visible);
 	/**
 	 * Accessor to determine whether a window is active.
 	 * @return True if the window is active.




More information about the Scummvm-git-logs mailing list