[Scummvm-git-logs] scummvm master -> cd9ba2b1f8a8d4c7f563335273180d90e06f3b27

sev- noreply at scummvm.org
Mon Jul 13 17:34:23 UTC 2026


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

Summary:
cadef05669 DIRECTOR: LINGO: Add Border Xtra stub
6a5c414613 DIRECTOR: LINGO: Map QT3Asset Xtra to QuickTimeSupport
bc9010f735 DIRECTOR: Don't create a digital-video widget for an empty sprite bbox
164cd6171d DIRECTOR: Guard copyStretchImg against an empty target rect
ff1a63471f DIRECTOR: XTRA: Add physicus optgraph.dll copy-protection magic (English)
cd9ba2b1f8 DIRECTOR: LINGO: Implement BudAPI baDiskInfo type detection and baFileExists


Commit: cadef056691b52797af33f86791f123750717e00
    https://github.com/scummvm/scummvm/commit/cadef056691b52797af33f86791f123750717e00
Author: Gianluca Boiano (morf3089 at gmail.com)
Date: 2026-07-13T19:34:13+02:00

Commit Message:
DIRECTOR: LINGO: Add Border Xtra stub

Changed paths:
  A engines/director/lingo/xtras/b/border.cpp
  A engines/director/lingo/xtras/b/border.h
    engines/director/lingo/lingo-object.cpp
    engines/director/module.mk


diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index 9fbc2be1294..92002ac9bfa 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -158,6 +158,7 @@
 #include "director/lingo/xlibs/x/xwin.h"
 #include "director/lingo/xlibs/y/yasix.h"
 #include "director/lingo/xtras/a/audio.h"
+#include "director/lingo/xtras/b/border.h"
 #include "director/lingo/xtras/b/budapi.h"
 #include "director/lingo/xtras/d/directsound.h"
 #include "director/lingo/xtras/d/displayres.h"
@@ -271,6 +272,7 @@ static const struct XLibProto {
 	XLIBDEF(BIMXObj,			kXObj,			400),	// D4
 	XLIBDEF(BlitPictXObj,		kXObj,			400),	// D4
 	XLIBDEF(BlockTheDrawingXObj,			kXObj,					400),	// D4
+	XLIBDEF(BorderXtra,			kXtraObj,		500),	// D5
 	XLIBDEF(BudAPIXtra,			kXtraObj,					500),	// D5
 	XLIBDEF(CDROMXObj,			kXObj,			200),	// D2
 	XLIBDEF(CloseBleedWindowXCMD,kXObj,			300),	// D3
diff --git a/engines/director/lingo/xtras/b/border.cpp b/engines/director/lingo/xtras/b/border.cpp
new file mode 100644
index 00000000000..3707c813aff
--- /dev/null
+++ b/engines/director/lingo/xtras/b/border.cpp
@@ -0,0 +1,97 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "director/director.h"
+#include "director/lingo/lingo.h"
+#include "director/lingo/lingo-object.h"
+#include "director/lingo/lingo-utils.h"
+#include "director/lingo/xtras/b/border.h"
+
+/**************************************************
+ *
+ * USED IN:
+ * Physikus (l'Espresso, Italian; Ruske & Pühretmaier)
+ *
+ **************************************************/
+
+/*
+ * Border() -- registers the Border Xtra instance.
+ * new object me
+ * Register object me, integer key -- validate the registration key
+ */
+
+namespace Director {
+
+const char *BorderXtra::xlibName = "Border";
+const XlibFileDesc BorderXtra::fileNames[] = {
+	{ "Border",	nullptr },
+	{ nullptr,	nullptr },
+};
+
+static MethodProto xlibMethods[] = {
+	{ "new",		BorderXtra::m_new,		0, 0,	500 },
+	{ "Register",	BorderXtra::m_register,	1, 1,	500 },
+	{ nullptr, nullptr, 0, 0, 0 }
+};
+
+static BuiltinProto xlibBuiltins[] = {
+	{ nullptr, nullptr, 0, 0, 0, VOIDSYM }
+};
+
+BorderXtraObject::BorderXtraObject(ObjectType ObjectType) :Object<BorderXtraObject>("Border") {
+	_objType = ObjectType;
+}
+
+bool BorderXtraObject::hasProp(const Common::String &propName) {
+	return (propName == "name");
+}
+
+Datum BorderXtraObject::getProp(const Common::String &propName) {
+	if (propName == "name")
+		return Datum(BorderXtra::xlibName);
+	warning("BorderXtra::getProp: unknown property '%s'", propName.c_str());
+	return Datum();
+}
+
+void BorderXtra::open(ObjectType type, const Common::Path &path) {
+	BorderXtraObject::initMethods(xlibMethods);
+	BorderXtraObject *xobj = new BorderXtraObject(type);
+	if (type == kXtraObj) {
+		g_lingo->_openXtras.push_back(xlibName);
+		g_lingo->_openXtraObjects.push_back(xobj);
+	}
+	g_lingo->exposeXObject(xlibName, xobj);
+	g_lingo->initBuiltIns(xlibBuiltins);
+}
+
+void BorderXtra::close(ObjectType type) {
+	BorderXtraObject::cleanupMethods();
+	g_lingo->_globalvars[xlibName] = Datum();
+}
+
+void BorderXtra::m_new(int nargs) {
+	g_lingo->dropStack(nargs);
+	g_lingo->push(g_lingo->_state->me);
+}
+
+XOBJSTUB(BorderXtra::m_register, 0)
+
+} // End of namespace Director
diff --git a/engines/director/lingo/xtras/b/border.h b/engines/director/lingo/xtras/b/border.h
new file mode 100644
index 00000000000..ea9fc1139a6
--- /dev/null
+++ b/engines/director/lingo/xtras/b/border.h
@@ -0,0 +1,50 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef DIRECTOR_LINGO_XTRAS_B_BORDER_H
+#define DIRECTOR_LINGO_XTRAS_B_BORDER_H
+
+namespace Director {
+
+class BorderXtraObject : public Object<BorderXtraObject> {
+public:
+	BorderXtraObject(ObjectType objType);
+
+	bool hasProp(const Common::String &propName) override;
+	Datum getProp(const Common::String &propName) override;
+};
+
+namespace BorderXtra {
+
+extern const char *xlibName;
+extern const XlibFileDesc fileNames[];
+
+void open(ObjectType type, const Common::Path &path);
+void close(ObjectType type);
+
+void m_new(int nargs);
+void m_register(int nargs);
+
+} // End of namespace BorderXtra
+
+} // End of namespace Director
+
+#endif
diff --git a/engines/director/module.mk b/engines/director/module.mk
index 8bc6c97a99f..2ae2f4e25c1 100644
--- a/engines/director/module.mk
+++ b/engines/director/module.mk
@@ -189,6 +189,7 @@ MODULE_OBJS = \
 	lingo/xlibs/x/xwin.o \
 	lingo/xlibs/y/yasix.o \
 	lingo/xtras/a/audio.o \
+	lingo/xtras/b/border.o \
 	lingo/xtras/b/budapi.o \
 	lingo/xtras/d/datetime.o \
 	lingo/xtras/d/directsound.o \


Commit: 6a5c414613f4933bf8925e7ac6bc1af76d1f3d8d
    https://github.com/scummvm/scummvm/commit/6a5c414613f4933bf8925e7ac6bc1af76d1f3d8d
Author: Gianluca Boiano (morf3089 at gmail.com)
Date: 2026-07-13T19:34:13+02:00

Commit Message:
DIRECTOR: LINGO: Map QT3Asset Xtra to QuickTimeSupport

Changed paths:
    engines/director/lingo/xlibs/q/qtsupport.cpp


diff --git a/engines/director/lingo/xlibs/q/qtsupport.cpp b/engines/director/lingo/xlibs/q/qtsupport.cpp
index a1597237368..b3cf4584280 100644
--- a/engines/director/lingo/xlibs/q/qtsupport.cpp
+++ b/engines/director/lingo/xlibs/q/qtsupport.cpp
@@ -25,6 +25,7 @@
  * The Legend of Lotus Spring
  * Löwenzahn 2&3
  * Oscar the Balloonist Drops into the Countryside
+ * Physicus / Physikus (l'Espresso, Italian; Ruske & Pühretmaier)
  *
  *************************************/
 
@@ -68,6 +69,7 @@ const char *QTSupport::xlibName = "QuickTimeSupport";
 const XlibFileDesc QTSupport::fileNames[] = {
 	{ "QuickTime Asset",	nullptr },
 	{ "QTASSET",			nullptr },
+	{ "QT3Asset",			nullptr },	// QuickTime 3 Asset Xtra
 	{ nullptr,		nullptr },
 };
 


Commit: bc9010f735d86c040d7a162ee7bfa9d525cd5e15
    https://github.com/scummvm/scummvm/commit/bc9010f735d86c040d7a162ee7bfa9d525cd5e15
Author: Gianluca Boiano (morf3089 at gmail.com)
Date: 2026-07-13T19:34:13+02:00

Commit Message:
DIRECTOR: Don't create a digital-video widget for an empty sprite bbox

A video sprite not yet positioned has a 0x0 bbox; building a zero-dimension
widget divides by zero in the nearest-neighbour scaler.

Fixes SIGFPE in Graphics::scaleNN via DigitalVideoCastMember::createWidget in Physicus/Physikus (Intro.dxr)

Changed paths:
    engines/director/castmember/digitalvideo.cpp


diff --git a/engines/director/castmember/digitalvideo.cpp b/engines/director/castmember/digitalvideo.cpp
index 3f2e1dc34d2..c6311a75c28 100644
--- a/engines/director/castmember/digitalvideo.cpp
+++ b/engines/director/castmember/digitalvideo.cpp
@@ -433,6 +433,10 @@ Graphics::MacWidget *DigitalVideoCastMember::createWidget(Common::Rect &bbox, Ch
 		}
 	}
 
+	// Zero-sized bbox: nothing to render, and scaling to it would divide by zero.
+	if (bbox.width() <= 0 || bbox.height() <= 0)
+		return nullptr;
+
 	Graphics::MacWidget *widget = new Graphics::MacWidget(g_director->getCurrentWindow()->getMacWindow(), bbox.left, bbox.top, bbox.width(), bbox.height(), g_director->_wm, false);
 
 	_channel = channel;


Commit: 164cd6171d6e235943b82b122c0e9e426ec27c61
    https://github.com/scummvm/scummvm/commit/164cd6171d6e235943b82b122c0e9e426ec27c61
Author: Gianluca Boiano (morf3089 at gmail.com)
Date: 2026-07-13T19:34:13+02:00

Commit Message:
DIRECTOR: Guard copyStretchImg against an empty target rect

Mirrors the existing source-surface guard: a zero-width/height target rect
reaches Surface::scale(0, 0), dividing by zero in the same scaler.

Fixes SIGFPE in Graphics::scaleNN via copyStretchImg in Physicus/Physikus (Intro.dxr)

Changed paths:
    engines/director/images.cpp


diff --git a/engines/director/images.cpp b/engines/director/images.cpp
index ad1537d38c7..816ca2fa0af 100644
--- a/engines/director/images.cpp
+++ b/engines/director/images.cpp
@@ -347,6 +347,10 @@ void copyStretchImg(const Graphics::Surface *srcSurface, Graphics::Surface *targ
 		// Source area is nonexistant
 		return;
 	}
+	if ((targetRect.width() <= 0) || (targetRect.height() <= 0)) {
+		// Target area is nonexistant
+		return;
+	}
 
 	Graphics::Surface *temp1 = nullptr;
 	Graphics::Surface *temp2 = nullptr;


Commit: ff1a63471fccea99dc76132b63da19951d0be2e0
    https://github.com/scummvm/scummvm/commit/ff1a63471fccea99dc76132b63da19951d0be2e0
Author: Gianluca Boiano (morf3089 at gmail.com)
Date: 2026-07-13T19:34:13+02:00

Commit Message:
DIRECTOR: XTRA: Add physicus optgraph.dll copy-protection magic (English)

The English release's startMovie compares GLUCall()'s result against a
constant compiled into the movie's own bytecode (c_intpush 43289555; c_neq;
halt() on mismatch), not against anything optgraph.dll itself computes.

Fixes startMovie halt() on boot in Physicus (English, embedded projector movie in Physicus.exe)

Changed paths:
    engines/director/lingo/xtras/g/glu32.cpp


diff --git a/engines/director/lingo/xtras/g/glu32.cpp b/engines/director/lingo/xtras/g/glu32.cpp
index e7551f5f6e8..764ad760b4f 100644
--- a/engines/director/lingo/xtras/g/glu32.cpp
+++ b/engines/director/lingo/xtras/g/glu32.cpp
@@ -190,6 +190,10 @@ void GLU32Xtra::m_GLUCall(int nargs) {
 			g_lingo->push(Datum(Common::String("92263924"))); // TODO: Check with the game
 			return;
 		}
+		if (gameId == "physicus" && g_director->getLanguage() == Common::EN_ANY) {
+			g_lingo->push(Datum((int)43289555)); //tested
+			return;
+		}
 		// TODO: Tiger Team 2: 32546872
 		warning("GLU32Xtra::m_GLUCall: unhandled optgraph.dll copy protection for game '%s'", gameId.c_str());
 	}


Commit: cd9ba2b1f8a8d4c7f563335273180d90e06f3b27
    https://github.com/scummvm/scummvm/commit/cd9ba2b1f8a8d4c7f563335273180d90e06f3b27
Author: Gianluca Boiano (morf3089 at gmail.com)
Date: 2026-07-13T19:34:13+02:00

Commit Message:
DIRECTOR: LINGO: Implement BudAPI baDiskInfo type detection and baFileExists

Report drive E: as CD-Rom and C: as Hard.

Fixes empty CD-drive list causing getAt() out-of-bounds in Physicus/Physikus (Intro.dxr, BehaviorScript 15)

Changed paths:
    engines/director/lingo/xtras/b/budapi.cpp


diff --git a/engines/director/lingo/xtras/b/budapi.cpp b/engines/director/lingo/xtras/b/budapi.cpp
index 7db2e31a146..e42fc031a1b 100644
--- a/engines/director/lingo/xtras/b/budapi.cpp
+++ b/engines/director/lingo/xtras/b/budapi.cpp
@@ -22,6 +22,7 @@
 #include "common/system.h"
 
 #include "director/director.h"
+#include "director/util.h"
 #include "director/lingo/lingo.h"
 #include "director/lingo/lingo-object.h"
 #include "director/lingo/lingo-utils.h"
@@ -34,6 +35,7 @@
  * Loewenzahn 2 / 3 / 4 / 5 / 6 / 7 / 8 / Adventskalender / Spielebox
  * TKKG 6 / 7 / 8 / 9 / 11 / 13 / 14
  * Oscar the Balloonist Flies into the Mountains
+ * Physicus / Physikus (l'Espresso, Italian; Ruske & Pühretmaier)
  *
  **************************************************/
 
@@ -374,7 +376,26 @@ void BudAPIXtra::m_new(int nargs) {
 XOBJSTUB(BudAPIXtra::m_baVersion, 0)
 XOBJSTUB(BudAPIXtra::m_baSysFolder, 0)
 XOBJSTUB(BudAPIXtra::m_baCpuInfo, 0)
-XOBJSTUB(BudAPIXtra::m_baDiskInfo, 0)
+void BudAPIXtra::m_baDiskInfo(int nargs) {
+	Common::String infoType = g_lingo->pop().asString();
+	Common::String disk = g_lingo->pop().asString();
+
+	if (!infoType.equalsIgnoreCase("type")) {
+		warning("STUB: BudAPIXtra::m_baDiskInfo: unsupported InfoType '%s'", infoType.c_str());
+		g_lingo->push(Datum());
+		return;
+	}
+
+	if (disk.hasSuffix(":"))
+		disk.deleteLastChar();
+
+	if (disk.equalsIgnoreCase("e"))
+		g_lingo->push(Datum(Common::String("CD-Rom")));
+	else if (disk.equalsIgnoreCase("c"))
+		g_lingo->push(Datum(Common::String("Hard")));
+	else
+		g_lingo->push(Datum(Common::String("")));
+}
 XOBJSTUB(BudAPIXtra::m_baMemoryInfo, 0)
 XOBJSTUB(BudAPIXtra::m_baFindApp, 0)
 XOBJSTUB(BudAPIXtra::m_baReadIni, 0)
@@ -436,7 +457,10 @@ XOBJSTUB(BudAPIXtra::m_baPrinterInfo, 0)
 XOBJSTUB(BudAPIXtra::m_baSetPrinter, 0)
 XOBJSTUB(BudAPIXtra::m_baRefreshDesktop, 0)
 XOBJSTUB(BudAPIXtra::m_baFileAge, 0)
-XOBJSTUB(BudAPIXtra::m_baFileExists, 0)
+void BudAPIXtra::m_baFileExists(int nargs) {
+	Common::String name = g_lingo->pop().asString();
+	g_lingo->push(Datum(findPath(name, true, true, false).empty() ? 0 : 1));
+}
 XOBJSTUB(BudAPIXtra::m_baFolderExists, 0)
 XOBJSTUB(BudAPIXtra::m_baCreateFolder, 0)
 XOBJSTUB(BudAPIXtra::m_baDeleteFolder, 0)




More information about the Scummvm-git-logs mailing list