[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