[Scummvm-cvs-logs] scummvm master -> 695e5db9a7a051a1b4a37c4bbc1c89c333bbac22

csnover csnover at users.noreply.github.com
Thu Mar 10 21:17:29 CET 2016


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:
eac416f480 SCI32: Implement kCantBeHere
4a16ebc970 SCI32: Implement kSetNowSeen
0bb4c32c50 SCI32: Minor cleanup of kernel calls
695e5db9a7 SCI32: Remove side-effect-abusing calls to ScreenItem::getCelObj


Commit: eac416f480ca5d08a6117b15e78ef906a0135c91
    https://github.com/scummvm/scummvm/commit/eac416f480ca5d08a6117b15e78ef906a0135c91
Author: Colin Snover (github.com at zetafleet.com)
Date: 2016-03-10T10:38:07-06:00

Commit Message:
SCI32: Implement kCantBeHere

Changed paths:
    engines/sci/engine/kernel.h
    engines/sci/engine/kernel_tables.h
    engines/sci/engine/kgraphics32.cpp
    engines/sci/graphics/compare.cpp



diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h
index f844d96..d521d4f 100644
--- a/engines/sci/engine/kernel.h
+++ b/engines/sci/engine/kernel.h
@@ -452,7 +452,7 @@ reg_t kScrollWindowShow(EngineState *s, int argc, reg_t *argv);
 reg_t kScrollWindowDestroy(EngineState *s, int argc, reg_t *argv);
 
 reg_t kMulDiv(EngineState *s, int argc, reg_t *argv);
-reg_t kCantBeHere32(EngineState *s, int argc, reg_t *argv);
+reg_t kSetNowSeen32(EngineState *s, int argc, reg_t *argv);
 reg_t kRemapColors32(EngineState *s, int argc, reg_t *argv);
 
 reg_t kAddScreenItem(EngineState *s, int argc, reg_t *argv);
diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h
index 6258197..ad07072 100644
--- a/engines/sci/engine/kernel_tables.h
+++ b/engines/sci/engine/kernel_tables.h
@@ -446,10 +446,10 @@ static SciKernelMapEntry s_kernelMap[] = {
 	{ MAP_CALL(AvoidPath),         SIG_EVERYWHERE,           "ii(.*)",                NULL,            NULL },
 	{ MAP_CALL(BaseSetter),        SIG_EVERYWHERE,           "o",                     NULL,            NULL },
 	{ MAP_CALL(CanBeHere),         SIG_EVERYWHERE,           "o(l)",                  NULL,            NULL },
+	{ MAP_CALL(CantBeHere),        SIG_SCI16, SIGFOR_ALL,    "o(l)",                  NULL,            NULL },
 #ifdef ENABLE_SCI32
-	{ "CantBeHere", kCantBeHere32, SIG_SCI32, SIGFOR_ALL,    "ol",                    NULL,            NULL },
+	{ MAP_CALL(CantBeHere),        SIG_SCI32, SIGFOR_ALL,    "ol",                    NULL,            NULL },
 #endif
-	{ MAP_CALL(CantBeHere),        SIG_EVERYWHERE,           "o(l)",                  NULL,            NULL },
 	{ MAP_CALL(CelHigh),           SIG_EVERYWHERE,           "ii(i)",                 NULL,            kCelHigh_workarounds },
 	{ MAP_CALL(CelWide),           SIG_EVERYWHERE,           "ii(i)",                 NULL,            kCelWide_workarounds },
 	{ MAP_CALL(CheckFreeSpace),    SIG_SCI32, SIGFOR_ALL,    "r.*",                   NULL,            NULL },
diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp
index 9c5d214..84506cc 100644
--- a/engines/sci/engine/kgraphics32.cpp
+++ b/engines/sci/engine/kgraphics32.cpp
@@ -71,15 +71,6 @@ reg_t kIsHiRes(EngineState *s, int argc, reg_t *argv) {
 	return make_reg(0, 1);
 }
 
-// SCI32 variant, can't work like sci16 variants
-reg_t kCantBeHere32(EngineState *s, int argc, reg_t *argv) {
-	// TODO
-//	reg_t curObject = argv[0];
-//	reg_t listReference = (argc > 1) ? argv[1] : NULL_REG;
-
-	return NULL_REG;
-}
-
 reg_t kAddScreenItem(EngineState *s, int argc, reg_t *argv) {
 	debugC(6, kDebugLevelGraphics, "kAddScreenItem %x:%x (%s)", argv[0].getSegment(), argv[0].getOffset(), g_sci->getEngineState()->_segMan->getObjectName(argv[0]));
 	g_sci->_gfxFrameout->kernelAddScreenItem(argv[0]);
diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp
index 8333459..698ad1b 100644
--- a/engines/sci/graphics/compare.cpp
+++ b/engines/sci/graphics/compare.cpp
@@ -74,11 +74,22 @@ reg_t GfxCompare::canBeHereCheckRectList(reg_t checkObject, const Common::Rect &
 	uint16 signal;
 	Common::Rect curRect;
 
+	uint16 flags;
+#ifdef ENABLE_SCI32
+	if (getSciVersion() >= SCI_VERSION_2) {
+		flags = kSignalIgnoreActor | kSignalHidden;
+	} else {
+#endif
+		flags = kSignalIgnoreActor | kSignalRemoveView | kSignalNoUpdate;
+#ifdef ENABLE_SCI32
+	}
+#endif
+
 	while (curNode) {
 		curObject = curNode->value;
 		if (curObject != checkObject) {
 			signal = readSelectorValue(_segMan, curObject, SELECTOR(signal));
-			if (!(signal & (kSignalIgnoreActor | kSignalRemoveView | kSignalNoUpdate))) {
+			if (!(signal & flags)) {
 				curRect.left = readSelectorValue(_segMan, curObject, SELECTOR(brLeft));
 				curRect.top = readSelectorValue(_segMan, curObject, SELECTOR(brTop));
 				curRect.right = readSelectorValue(_segMan, curObject, SELECTOR(brRight));
@@ -151,32 +162,45 @@ void GfxCompare::kernelSetNowSeen(reg_t objectReference) {
 
 reg_t GfxCompare::kernelCanBeHere(reg_t curObject, reg_t listReference) {
 	Common::Rect checkRect;
-	Common::Rect adjustedRect;
-	uint16 signal, controlMask;
 	uint16 result;
 
 	checkRect.left = readSelectorValue(_segMan, curObject, SELECTOR(brLeft));
 	checkRect.top = readSelectorValue(_segMan, curObject, SELECTOR(brTop));
 	checkRect.right = readSelectorValue(_segMan, curObject, SELECTOR(brRight));
 	checkRect.bottom = readSelectorValue(_segMan, curObject, SELECTOR(brBottom));
+	uint16 signal = readSelectorValue(_segMan, curObject, SELECTOR(signal));
 
-	if (!checkRect.isValidRect()) {	// can occur in Iceman and Mother Goose - HACK? TODO: is this really occuring in sierra sci? check this
-		warning("kCan(t)BeHere - invalid rect %d, %d -> %d, %d", checkRect.left, checkRect.top, checkRect.right, checkRect.bottom);
-		return NULL_REG; // this means "can be here"
-	}
-
-	adjustedRect = _coordAdjuster->onControl(checkRect);
+#ifdef ENABLE_SCI32
+	if (getSciVersion() >= SCI_VERSION_2) {
+		result = 0;
+		if ((signal & (kSignalIgnoreActor | kSignalHidden)) == 0) {
+			List *list = _segMan->lookupList(listReference);
+			if (!list) {
+				error("kCanBeHere called with non-list as parameter");
+			}
+			result = !canBeHereCheckRectList(curObject, checkRect, list).isNull();
+		}
+	} else {
+#endif
+		if (!checkRect.isValidRect()) {	// can occur in Iceman and Mother Goose - HACK? TODO: is this really occuring in sierra sci? check this
+			warning("kCan(t)BeHere - invalid rect %d, %d -> %d, %d", checkRect.left, checkRect.top, checkRect.right, checkRect.bottom);
+			return NULL_REG; // this means "can be here"
+		}
 
-	signal = readSelectorValue(_segMan, curObject, SELECTOR(signal));
-	controlMask = readSelectorValue(_segMan, curObject, SELECTOR(illegalBits));
-	result = isOnControl(GFX_SCREEN_MASK_CONTROL, adjustedRect) & controlMask;
-	if ((!result) && (signal & (kSignalIgnoreActor | kSignalRemoveView)) == 0) {
-		List *list = _segMan->lookupList(listReference);
-		if (!list)
-			error("kCanBeHere called with non-list as parameter");
+		Common::Rect adjustedRect = _coordAdjuster->onControl(checkRect);
+		uint16 controlMask = readSelectorValue(_segMan, curObject, SELECTOR(illegalBits));
+		result = isOnControl(GFX_SCREEN_MASK_CONTROL, adjustedRect) & controlMask;
+		if ((!result) && (signal & (kSignalIgnoreActor | kSignalRemoveView)) == 0) {
+			List *list = _segMan->lookupList(listReference);
+			if (!list)
+				error("kCanBeHere called with non-list as parameter");
 
-		return canBeHereCheckRectList(curObject, checkRect, list);
+			return canBeHereCheckRectList(curObject, checkRect, list);
+		}
+#ifdef ENABLE_SCI32
 	}
+#endif
+
 	return make_reg(0, result);
 }
 


Commit: 4a16ebc970bfe1eae948b5d59accc321b092db8c
    https://github.com/scummvm/scummvm/commit/4a16ebc970bfe1eae948b5d59accc321b092db8c
Author: Colin Snover (github.com at zetafleet.com)
Date: 2016-03-10T14:16:56-06:00

Commit Message:
SCI32: Implement kSetNowSeen

Changed paths:
    engines/sci/engine/kernel.h
    engines/sci/engine/kernel_tables.h
    engines/sci/engine/kgraphics.cpp
    engines/sci/graphics/compare.cpp
    engines/sci/graphics/frameout.cpp
    engines/sci/graphics/frameout.h
    engines/sci/graphics/screen_item32.cpp
    engines/sci/graphics/screen_item32.h



diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h
index d521d4f..6feaeb8 100644
--- a/engines/sci/engine/kernel.h
+++ b/engines/sci/engine/kernel.h
@@ -452,7 +452,6 @@ reg_t kScrollWindowShow(EngineState *s, int argc, reg_t *argv);
 reg_t kScrollWindowDestroy(EngineState *s, int argc, reg_t *argv);
 
 reg_t kMulDiv(EngineState *s, int argc, reg_t *argv);
-reg_t kSetNowSeen32(EngineState *s, int argc, reg_t *argv);
 reg_t kRemapColors32(EngineState *s, int argc, reg_t *argv);
 
 reg_t kAddScreenItem(EngineState *s, int argc, reg_t *argv);
diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h
index ad07072..1cb02d4 100644
--- a/engines/sci/engine/kernel_tables.h
+++ b/engines/sci/engine/kernel_tables.h
@@ -568,7 +568,10 @@ static SciKernelMapEntry s_kernelMap[] = {
 	{ MAP_CALL(SetDebug),          SIG_EVERYWHERE,           "(i*)",                  NULL,            NULL },
 	{ MAP_CALL(SetJump),           SIG_EVERYWHERE,           "oiii",                  NULL,            NULL },
 	{ MAP_CALL(SetMenu),           SIG_EVERYWHERE,           "i(.*)",                 NULL,            NULL },
-	{ MAP_CALL(SetNowSeen),        SIG_EVERYWHERE,           "o(i)",                  NULL,            NULL },
+	{ MAP_CALL(SetNowSeen),        SIG_SCI16, SIGFOR_ALL,    "o(i)",                  NULL,            NULL },
+#ifdef ENABLE_SCI32
+	{ MAP_CALL(SetNowSeen),        SIG_SCI32, SIGFOR_ALL,    "o",                     NULL,            NULL },
+#endif
 	{ MAP_CALL(SetPort),           SIG_EVERYWHERE,           "i(iiiii)(i)",           NULL,            kSetPort_workarounds },
 	{ MAP_CALL(SetQuitStr),        SIG_EVERYWHERE,           "r",                     NULL,            NULL },
 	{ MAP_CALL(SetSynonyms),       SIG_EVERYWHERE,           "o",                     NULL,            NULL },
diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp
index 93d0d91..c79ffa9 100644
--- a/engines/sci/engine/kgraphics.cpp
+++ b/engines/sci/engine/kgraphics.cpp
@@ -572,9 +572,17 @@ reg_t kBaseSetter(EngineState *s, int argc, reg_t *argv) {
 }
 
 reg_t kSetNowSeen(EngineState *s, int argc, reg_t *argv) {
-	g_sci->_gfxCompare->kernelSetNowSeen(argv[0]);
-
-	return s->r_acc;
+#ifdef ENABLE_SCI32
+	if (getSciVersion() >= SCI_VERSION_2) {
+		g_sci->_gfxFrameout->kernelSetNowSeen(argv[0]);
+		return NULL_REG;
+	} else {
+#endif
+		g_sci->_gfxCompare->kernelSetNowSeen(argv[0]);
+		return s->r_acc;
+#ifdef ENABLE_SCI32
+	}
+#endif
 }
 
 reg_t kPalette(EngineState *s, int argc, reg_t *argv) {
diff --git a/engines/sci/graphics/compare.cpp b/engines/sci/graphics/compare.cpp
index 698ad1b..2f830179 100644
--- a/engines/sci/graphics/compare.cpp
+++ b/engines/sci/graphics/compare.cpp
@@ -122,9 +122,6 @@ uint16 GfxCompare::kernelOnControl(byte screenMask, const Common::Rect &rect) {
 void GfxCompare::kernelSetNowSeen(reg_t objectReference) {
 	GfxView *view = NULL;
 	Common::Rect celRect(0, 0);
-	// TODO/FIXME: Torin's menu code tries to draw special views with an ID of 0xFFFF, which
-	// are not currently handled properly and cause a crash. These might be text views that
-	// are not properly implemented.
 	GuiResourceId viewId = (GuiResourceId)readSelectorValue(_segMan, objectReference, SELECTOR(view));
 	int16 loopNo = readSelectorValue(_segMan, objectReference, SELECTOR(loop));
 	int16 celNo = readSelectorValue(_segMan, objectReference, SELECTOR(cel));
@@ -135,26 +132,8 @@ void GfxCompare::kernelSetNowSeen(reg_t objectReference) {
 		z = (int16)readSelectorValue(_segMan, objectReference, SELECTOR(z));
 
 	view = _cache->getView(viewId);
-
-#ifdef ENABLE_SCI32
-	if (view->isSci2Hires())
-		view->adjustToUpscaledCoordinates(y, x);
-	else if ((getSciVersion() >= SCI_VERSION_2_1_EARLY) && (getSciVersion() <= SCI_VERSION_2_1_LATE))
-		_coordAdjuster->fromScriptToDisplay(y, x);
-#endif
-
 	view->getCelRect(loopNo, celNo, x, y, z, celRect);
 
-#ifdef ENABLE_SCI32
-	if (view->isSci2Hires()) {
-		view->adjustBackUpscaledCoordinates(celRect.top, celRect.left);
-		view->adjustBackUpscaledCoordinates(celRect.bottom, celRect.right);
-	} else if ((getSciVersion() >= SCI_VERSION_2_1_EARLY) && (getSciVersion() <= SCI_VERSION_2_1_LATE)) {
-		_coordAdjuster->fromDisplayToScript(celRect.top, celRect.left);
-		_coordAdjuster->fromDisplayToScript(celRect.bottom, celRect.right);
-	}
-#endif
-
 	if (lookupSelector(_segMan, objectReference, SELECTOR(nsTop), NULL, NULL) == kSelectorVariable) {
 		setNSRect(objectReference, celRect);
 	}
diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp
index 655e59d..78e61b9 100644
--- a/engines/sci/graphics/frameout.cpp
+++ b/engines/sci/graphics/frameout.cpp
@@ -2028,6 +2028,26 @@ bool GfxFrameout::isOnMe(const ScreenItem &screenItem, const Plane &plane, const
 	return true;
 }
 
+void GfxFrameout::kernelSetNowSeen(const reg_t screenItemObject) const {
+	const reg_t planeObject = readSelector(_segMan, screenItemObject, SELECTOR(plane));
+
+	Plane *plane = _planes.findByObject(planeObject);
+	if (plane == nullptr) {
+		error("Plane %04x:%04x not found", PRINT_REG(planeObject));
+	}
+
+	ScreenItem *screenItem = plane->_screenItemList.findByObject(screenItemObject);
+	if (screenItem == nullptr) {
+		error("Screen item %04x:%04x not found", PRINT_REG(screenItemObject));
+	}
+
+	Common::Rect result = screenItem->getNowSeenRect(*plane);
+	writeSelectorValue(_segMan, screenItemObject, SELECTOR(nsLeft), result.left);
+	writeSelectorValue(_segMan, screenItemObject, SELECTOR(nsTop), result.top);
+	writeSelectorValue(_segMan, screenItemObject, SELECTOR(nsRight), result.right - 1);
+	writeSelectorValue(_segMan, screenItemObject, SELECTOR(nsBottom), result.bottom - 1);
+}
+
 #pragma mark -
 #pragma mark Debugging
 
diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h
index f864abc..969123f 100644
--- a/engines/sci/graphics/frameout.h
+++ b/engines/sci/graphics/frameout.h
@@ -245,6 +245,7 @@ public:
 	void kernelAddScreenItem(const reg_t object);
 	void kernelUpdateScreenItem(const reg_t object);
 	void kernelDeleteScreenItem(const reg_t object);
+	void kernelSetNowSeen(const reg_t screenItemObject) const;
 
 #pragma mark -
 #pragma mark Planes
diff --git a/engines/sci/graphics/screen_item32.cpp b/engines/sci/graphics/screen_item32.cpp
index 4a42221..9f6dc7a 100644
--- a/engines/sci/graphics/screen_item32.cpp
+++ b/engines/sci/graphics/screen_item32.cpp
@@ -495,6 +495,109 @@ void ScreenItem::update(const reg_t object) {
 	_deleted = 0;
 }
 
+// TODO: This code is quite similar to calcRects, so try to deduplicate
+// if possible
+Common::Rect ScreenItem::getNowSeenRect(const Plane &plane) const {
+	CelObj &celObj = getCelObj();
+
+	Common::Rect celObjRect(celObj._width, celObj._height);
+	Common::Rect nsRect;
+
+	if (_useInsetRect) {
+		// TODO: This is weird. Checking to see if the inset rect is
+		// fully inside the bounds of the celObjRect, and then
+		// clipping to the celObjRect, is pretty useless.
+		if (_insetRect.right > 0 && _insetRect.bottom > 0 && _insetRect.left < celObj._width && _insetRect.top < celObj._height) {
+			nsRect = _insetRect;
+			nsRect.clip(celObjRect);
+		} else {
+			nsRect = Common::Rect();
+		}
+	} else {
+		nsRect = celObjRect;
+	}
+
+	const uint16 scriptWidth = g_sci->_gfxFrameout->getCurrentBuffer().scriptWidth;
+	const uint16 scriptHeight = g_sci->_gfxFrameout->getCurrentBuffer().scriptHeight;
+
+	Ratio scaleX, scaleY;
+	if (_scale.signal & kScaleSignalDoScaling32) {
+		if (_scale.signal & kScaleSignalUseVanishingPoint) {
+			int num = _scale.max * (_position.y - plane._vanishingPoint.y) / (scriptWidth - plane._vanishingPoint.y);
+			scaleX = Ratio(num, 128);
+			scaleY = Ratio(num, 128);
+		} else {
+			scaleX = Ratio(_scale.x, 128);
+			scaleY = Ratio(_scale.y, 128);
+		}
+	}
+
+	if (scaleX.getNumerator() == 0 || scaleY.getNumerator() == 0) {
+		return Common::Rect();
+	}
+
+	int16 displaceX = celObj._displace.x;
+	int16 displaceY = celObj._displace.y;
+
+	if (_mirrorX != celObj._mirrorX && _celInfo.type != kCelTypePic) {
+		displaceX = celObj._width - displaceX - 1;
+	}
+
+	if (celObj._scaledWidth != scriptWidth || celObj._scaledHeight != scriptHeight) {
+		if (_useInsetRect) {
+			Ratio scriptToScaledX(celObj._scaledWidth, scriptWidth);
+			Ratio scriptToScaledY(celObj._scaledHeight, scriptHeight);
+			mulru(nsRect, scriptToScaledX, scriptToScaledY, 0);
+
+			// TODO: This is weird. Checking to see if the inset rect is
+			// fully inside the bounds of the celObjRect, and then
+			// clipping to the celObjRect, is pretty useless.
+			if (nsRect.right > 0 && nsRect.bottom > 0 && nsRect.left < celObj._width && nsRect.top < celObj._height) {
+				nsRect.clip(celObjRect);
+			} else {
+				nsRect = Common::Rect();
+			}
+		}
+
+		if (!scaleX.isOne() || !scaleY.isOne()) {
+			mulinc(nsRect, scaleX, scaleY);
+			// TODO: This was in the original code, baked into the
+			// multiplication though it is not immediately clear
+			// why this is the only one that reduces the BR corner
+			nsRect.right -= 1;
+			nsRect.bottom -= 1;
+		}
+
+		Ratio scaledToScriptX(scriptWidth, celObj._scaledWidth);
+		Ratio scaledToScriptY(scriptHeight, celObj._scaledHeight);
+
+		displaceX = (displaceX * scaleX * scaledToScriptX).toInt();
+		displaceY = (displaceY * scaleY * scaledToScriptY).toInt();
+
+		mulinc(nsRect, scaledToScriptX, scaledToScriptY);
+		nsRect.translate(_position.x - displaceX, _position.y - displaceY);
+	} else {
+		if (!scaleX.isOne() || !scaleY.isOne()) {
+			mulinc(nsRect, scaleX, scaleY);
+			// TODO: This was in the original code, baked into the
+			// multiplication though it is not immediately clear
+			// why this is the only one that reduces the BR corner
+			nsRect.right -= 1;
+			nsRect.bottom -= 1;
+		}
+
+		displaceX = (displaceX * scaleX).toInt();
+		displaceY = (displaceY * scaleY).toInt();
+		nsRect.translate(_position.x - displaceX, _position.y - displaceY);
+
+		if (_mirrorX != celObj._mirrorX && _celInfo.type != kCelTypePic) {
+			nsRect.translate(plane._gameRect.width() - nsRect.width(), 0);
+		}
+	}
+
+	return nsRect;
+}
+
 #pragma mark -
 #pragma mark ScreenItemList
 ScreenItem *ScreenItemList::findByObject(const reg_t object) const {
diff --git a/engines/sci/graphics/screen_item32.h b/engines/sci/graphics/screen_item32.h
index 52782ac..977d80e 100644
--- a/engines/sci/graphics/screen_item32.h
+++ b/engines/sci/graphics/screen_item32.h
@@ -259,6 +259,13 @@ public:
 	 * VM object.
 	 */
 	void update(const reg_t object);
+
+	/**
+	 * Gets the "now seen" rect for the screen item, which
+	 * represents the current size and position of the
+	 * screen item on the screen in script coordinates.
+	 */
+	Common::Rect getNowSeenRect(const Plane &plane) const;
 };
 
 #pragma mark -


Commit: 0bb4c32c50cddecd696e581b5b642de18750d392
    https://github.com/scummvm/scummvm/commit/0bb4c32c50cddecd696e581b5b642de18750d392
Author: Colin Snover (github.com at zetafleet.com)
Date: 2016-03-10T14:16:56-06:00

Commit Message:
SCI32: Minor cleanup of kernel calls

Changed paths:
    engines/sci/engine/kernel_tables.h
    engines/sci/engine/kgraphics32.cpp



diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h
index 1cb02d4..a0ae627 100644
--- a/engines/sci/engine/kernel_tables.h
+++ b/engines/sci/engine/kernel_tables.h
@@ -696,7 +696,7 @@ static SciKernelMapEntry s_kernelMap[] = {
 	{ MAP_DUMMY(MarkMemory),       SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
 	{ MAP_DUMMY(GetHighItemPri),   SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
 	{ MAP_DUMMY(ShowStylePercent), SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
-	{ MAP_DUMMY(InvertRect),       SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
+	{ MAP_DUMMY(InvertRect),       SIG_UNTIL_SCI21EARLY, SIGFOR_ALL, "(.*)",          NULL,            NULL },
 	{ MAP_DUMMY(InputText),        SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
 	{ MAP_CALL(TextWidth),         SIG_UNTIL_SCI21EARLY, SIGFOR_ALL, "ri",            NULL,            NULL },
 	{ MAP_DUMMY(PointSize),        SIG_EVERYWHERE,           "(.*)",                  NULL,            NULL },
diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp
index 84506cc..06a3336 100644
--- a/engines/sci/engine/kgraphics32.cpp
+++ b/engines/sci/engine/kgraphics32.cpp
@@ -63,46 +63,45 @@ namespace Sci {
 extern void showScummVMDialog(const Common::String &message);
 
 reg_t kIsHiRes(EngineState *s, int argc, reg_t *argv) {
-	// Returns 0 if the screen width or height is less than 640 or 400,
-	// respectively.
-	if (g_system->getWidth() < 640 || g_system->getHeight() < 400)
+	const Buffer &buffer = g_sci->_gfxFrameout->getCurrentBuffer();
+	if (buffer.screenWidth < 640 || buffer.screenHeight < 400)
 		return make_reg(0, 0);
 
 	return make_reg(0, 1);
 }
 
 reg_t kAddScreenItem(EngineState *s, int argc, reg_t *argv) {
-	debugC(6, kDebugLevelGraphics, "kAddScreenItem %x:%x (%s)", argv[0].getSegment(), argv[0].getOffset(), g_sci->getEngineState()->_segMan->getObjectName(argv[0]));
+	debugC(6, kDebugLevelGraphics, "kAddScreenItem %x:%x (%s)", PRINT_REG(argv[0]), s->_segMan->getObjectName(argv[0]));
 	g_sci->_gfxFrameout->kernelAddScreenItem(argv[0]);
 	return NULL_REG;
 }
 
 reg_t kUpdateScreenItem(EngineState *s, int argc, reg_t *argv) {
-	debugC(7, kDebugLevelGraphics, "kUpdateScreenItem %x:%x (%s)", argv[0].getSegment(), argv[0].getOffset(), g_sci->getEngineState()->_segMan->getObjectName(argv[0]));
+	debugC(7, kDebugLevelGraphics, "kUpdateScreenItem %x:%x (%s)", PRINT_REG(argv[0]), s->_segMan->getObjectName(argv[0]));
 	g_sci->_gfxFrameout->kernelUpdateScreenItem(argv[0]);
 	return NULL_REG;
 }
 
 reg_t kDeleteScreenItem(EngineState *s, int argc, reg_t *argv) {
-	debugC(6, kDebugLevelGraphics, "kDeleteScreenItem %x:%x (%s)", argv[0].getSegment(), argv[0].getOffset(), g_sci->getEngineState()->_segMan->getObjectName(argv[0]));
+	debugC(6, kDebugLevelGraphics, "kDeleteScreenItem %x:%x (%s)", PRINT_REG(argv[0]), s->_segMan->getObjectName(argv[0]));
 	g_sci->_gfxFrameout->kernelDeleteScreenItem(argv[0]);
 	return NULL_REG;
 }
 
 reg_t kAddPlane(EngineState *s, int argc, reg_t *argv) {
-	debugC(6, kDebugLevelGraphics, "kAddPlane %x:%x (%s)", argv[0].getSegment(), argv[0].getOffset(), g_sci->getEngineState()->_segMan->getObjectName(argv[0]));
+	debugC(6, kDebugLevelGraphics, "kAddPlane %x:%x (%s)", PRINT_REG(argv[0]), s->_segMan->getObjectName(argv[0]));
 	g_sci->_gfxFrameout->kernelAddPlane(argv[0]);
 	return s->r_acc;
 }
 
 reg_t kUpdatePlane(EngineState *s, int argc, reg_t *argv) {
-	debugC(7, kDebugLevelGraphics, "kUpdatePlane %x:%x (%s)", argv[0].getSegment(), argv[0].getOffset(), g_sci->getEngineState()->_segMan->getObjectName(argv[0]));
+	debugC(7, kDebugLevelGraphics, "kUpdatePlane %x:%x (%s)", PRINT_REG(argv[0]), s->_segMan->getObjectName(argv[0]));
 	g_sci->_gfxFrameout->kernelUpdatePlane(argv[0]);
 	return s->r_acc;
 }
 
 reg_t kDeletePlane(EngineState *s, int argc, reg_t *argv) {
-	debugC(6, kDebugLevelGraphics, "kDeletePlane %x:%x (%s)", argv[0].getSegment(), argv[0].getOffset(), g_sci->getEngineState()->_segMan->getObjectName(argv[0]));
+	debugC(6, kDebugLevelGraphics, "kDeletePlane %x:%x (%s)", PRINT_REG(argv[0]), s->_segMan->getObjectName(argv[0]));
 	g_sci->_gfxFrameout->kernelDeletePlane(argv[0]);
 	return s->r_acc;
 }
@@ -141,7 +140,6 @@ reg_t kObjectIntersect(EngineState *s, int argc, reg_t *argv) {
 	return make_reg(0, objRect1.intersects(objRect2));
 }
 
-// Tests if the coordinate is on the passed object
 reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv) {
 	int16 x = argv[0].toSint16();
 	int16 y = argv[1].toSint16();
@@ -682,11 +680,6 @@ reg_t kBitmapCreateFromUnknown(EngineState *s, int argc, reg_t *argv) {
 	return kStub(s, argc + 1, argv - 1);
 }
 
-// Used for edit boxes in save/load dialogs. It's a rewritten version of kEditControl,
-// but it handles events on its own, using an internal loop, instead of using SCI
-// scripts for event management like kEditControl does. Called by script 64914,
-// DEdit::hilite().
-
 reg_t kEditText(EngineState *s, int argc, reg_t *argv) {
 	return g_sci->_gfxControls32->kernelEditText(argv[0]);
 }


Commit: 695e5db9a7a051a1b4a37c4bbc1c89c333bbac22
    https://github.com/scummvm/scummvm/commit/695e5db9a7a051a1b4a37c4bbc1c89c333bbac22
Author: Colin Snover (github.com at zetafleet.com)
Date: 2016-03-10T14:16:56-06:00

Commit Message:
SCI32: Remove side-effect-abusing calls to ScreenItem::getCelObj

Changed paths:
    engines/sci/graphics/plane32.cpp
    engines/sci/graphics/screen_item32.cpp



diff --git a/engines/sci/graphics/plane32.cpp b/engines/sci/graphics/plane32.cpp
index 4487070..04cfa5a 100644
--- a/engines/sci/graphics/plane32.cpp
+++ b/engines/sci/graphics/plane32.cpp
@@ -325,7 +325,6 @@ void Plane::calcLists(Plane &visiblePlane, const PlaneList &planeList, DrawList
 				}
 			} else if (item->_created) {
 				// add item to draw list
-				item->getCelObj();
 				item->calcRects(*this);
 
 				if(!item->_screenRect.isEmpty()) {
@@ -338,7 +337,6 @@ void Plane::calcLists(Plane &visiblePlane, const PlaneList &planeList, DrawList
 				}
 			} else if (item->_updated) {
 				// add old rect to erase list, new item to draw list
-				item->getCelObj();
 				item->calcRects(*this);
 				if (/* TODO: g_Remap_numActiveRemaps */ false) { // active remaps
 					// if item and vitem don't overlap, ...
@@ -691,7 +689,6 @@ void Plane::redrawAll(Plane *visiblePlane, const PlaneList &planeList, DrawList
 		if (*screenItemPtr != nullptr) {
 			ScreenItem &screenItem = **screenItemPtr;
 			if (!screenItem._deleted) {
-				screenItem.getCelObj();
 				screenItem.calcRects(*this);
 				if (!screenItem._screenRect.isEmpty()) {
 					drawList.add(&screenItem, screenItem._screenRect);
diff --git a/engines/sci/graphics/screen_item32.cpp b/engines/sci/graphics/screen_item32.cpp
index 9f6dc7a..41771c8 100644
--- a/engines/sci/graphics/screen_item32.cpp
+++ b/engines/sci/graphics/screen_item32.cpp
@@ -228,7 +228,9 @@ void ScreenItem::calcRects(const Plane &plane) {
 	const int16 screenWidth = g_sci->_gfxFrameout->getCurrentBuffer().screenWidth;
 	const int16 screenHeight = g_sci->_gfxFrameout->getCurrentBuffer().screenHeight;
 
-	Common::Rect celRect(_celObj->_width, _celObj->_height);
+	const CelObj &celObj = getCelObj();
+
+	Common::Rect celRect(celObj._width, celObj._height);
 	if (_useInsetRect) {
 		if (_insetRect.intersects(celRect)) {
 			_insetRect.clip(celRect);
@@ -256,10 +258,10 @@ void ScreenItem::calcRects(const Plane &plane) {
 	if (newRatioX.getNumerator() && newRatioY.getNumerator()) {
 		_screenItemRect = _insetRect;
 
-		if (_celObj->_scaledWidth != scriptWidth || _celObj->_scaledHeight != scriptHeight) {
+		if (celObj._scaledWidth != scriptWidth || celObj._scaledHeight != scriptHeight) {
 			if (_useInsetRect) {
-				Ratio celScriptXRatio(_celObj->_scaledWidth, scriptWidth);
-				Ratio celScriptYRatio(_celObj->_scaledHeight, scriptHeight);
+				Ratio celScriptXRatio(celObj._scaledWidth, scriptWidth);
+				Ratio celScriptYRatio(celObj._scaledHeight, scriptHeight);
 				mulru(_screenItemRect, celScriptXRatio, celScriptYRatio, 0);
 
 				if (_screenItemRect.intersects(celRect)) {
@@ -269,11 +271,11 @@ void ScreenItem::calcRects(const Plane &plane) {
 				}
 			}
 
-			int displaceX = _celObj->_displace.x;
-			int displaceY = _celObj->_displace.y;
+			int displaceX = celObj._displace.x;
+			int displaceY = celObj._displace.y;
 
-			if (_mirrorX != _celObj->_mirrorX && _celInfo.type != kCelTypePic) {
-				displaceX = _celObj->_width - _celObj->_displace.x - 1;
+			if (_mirrorX != celObj._mirrorX && _celInfo.type != kCelTypePic) {
+				displaceX = celObj._width - celObj._displace.x - 1;
 			}
 
 			if (!newRatioX.isOne() || !newRatioY.isOne()) {
@@ -282,8 +284,8 @@ void ScreenItem::calcRects(const Plane &plane) {
 				displaceY = (displaceY * newRatioY).toInt();
 			}
 
-			Ratio celXRatio(screenWidth, _celObj->_scaledWidth);
-			Ratio celYRatio(screenHeight, _celObj->_scaledHeight);
+			Ratio celXRatio(screenWidth, celObj._scaledWidth);
+			Ratio celYRatio(screenHeight, celObj._scaledHeight);
 
 			displaceX = (displaceX * celXRatio).toInt();
 			displaceY = (displaceY * celYRatio).toInt();
@@ -300,7 +302,7 @@ void ScreenItem::calcRects(const Plane &plane) {
 
 			_screenItemRect.translate(_scaledPosition.x, _scaledPosition.y);
 
-			if (_mirrorX != _celObj->_mirrorX && _celInfo.type == kCelTypePic) {
+			if (_mirrorX != celObj._mirrorX && _celInfo.type == kCelTypePic) {
 				Common::Rect temp(_insetRect);
 
 				if (!newRatioX.isOne()) {
@@ -323,12 +325,12 @@ void ScreenItem::calcRects(const Plane &plane) {
 			_scaledPosition.y += plane._planeRect.top;
 			_screenItemRect.translate(plane._planeRect.left, plane._planeRect.top);
 
-			_ratioX = newRatioX * Ratio(screenWidth, _celObj->_scaledWidth);
-			_ratioY = newRatioY * Ratio(screenHeight, _celObj->_scaledHeight);
+			_ratioX = newRatioX * Ratio(screenWidth, celObj._scaledWidth);
+			_ratioY = newRatioY * Ratio(screenHeight, celObj._scaledHeight);
 		} else {
-			int displaceX = _celObj->_displace.x;
-			if (_mirrorX != _celObj->_mirrorX && _celInfo.type != kCelTypePic) {
-				displaceX = _celObj->_width - _celObj->_displace.x - 1;
+			int displaceX = celObj._displace.x;
+			if (_mirrorX != celObj._mirrorX && _celInfo.type != kCelTypePic) {
+				displaceX = celObj._width - celObj._displace.x - 1;
 			}
 
 			if (!newRatioX.isOne() || !newRatioY.isOne()) {
@@ -341,10 +343,10 @@ void ScreenItem::calcRects(const Plane &plane) {
 			}
 
 			_scaledPosition.x = _position.x - (displaceX * newRatioX).toInt();
-			_scaledPosition.y = _position.y - (_celObj->_displace.y * newRatioY).toInt();
+			_scaledPosition.y = _position.y - (celObj._displace.y * newRatioY).toInt();
 			_screenItemRect.translate(_scaledPosition.x, _scaledPosition.y);
 
-			if (_mirrorX != _celObj->_mirrorX && _celInfo.type == kCelTypePic) {
+			if (_mirrorX != celObj._mirrorX && _celInfo.type == kCelTypePic) {
 				Common::Rect temp(_insetRect);
 
 				if (!newRatioX.isOne()) {
@@ -353,7 +355,7 @@ void ScreenItem::calcRects(const Plane &plane) {
 				}
 
 				CelObjPic *celObjPic = dynamic_cast<CelObjPic *>(_celObj);
-				temp.translate(celObjPic->_relativePosition.x - (displaceX * newRatioX).toInt(), celObjPic->_relativePosition.y - (_celObj->_displace.y * newRatioY).toInt());
+				temp.translate(celObjPic->_relativePosition.x - (displaceX * newRatioX).toInt(), celObjPic->_relativePosition.y - (celObj._displace.y * newRatioY).toInt());
 
 				// TODO: This is weird.
 				int deltaX = plane._gameRect.width() - temp.right - 1 - temp.left;
@@ -366,15 +368,15 @@ void ScreenItem::calcRects(const Plane &plane) {
 			_scaledPosition.y += plane._gameRect.top;
 			_screenItemRect.translate(plane._gameRect.left, plane._gameRect.top);
 
-			if (screenWidth != _celObj->_scaledWidth || _celObj->_scaledHeight != screenHeight) {
-				Ratio celXRatio(screenWidth, _celObj->_scaledWidth);
-				Ratio celYRatio(screenHeight, _celObj->_scaledHeight);
+			if (screenWidth != celObj._scaledWidth || celObj._scaledHeight != screenHeight) {
+				Ratio celXRatio(screenWidth, celObj._scaledWidth);
+				Ratio celYRatio(screenHeight, celObj._scaledHeight);
 				mulru(_scaledPosition, celXRatio, celYRatio);
 				mulru(_screenItemRect, celXRatio, celYRatio, 1);
 			}
 
-			_ratioX = newRatioX * Ratio(screenWidth, _celObj->_scaledWidth);
-			_ratioY = newRatioY * Ratio(screenHeight, _celObj->_scaledHeight);
+			_ratioX = newRatioX * Ratio(screenWidth, celObj._scaledWidth);
+			_ratioY = newRatioY * Ratio(screenHeight, celObj._scaledHeight);
 		}
 
 		_screenRect = _screenItemRect;






More information about the Scummvm-git-logs mailing list