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

elasota noreply at scummvm.org
Fri Jun 24 04:06:16 UTC 2022


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:
d551c5ed10 MTROPOLIS: Add support for background matte mode mouse collision on mToon elements.


Commit: d551c5ed10e6963c824aabce9b27304dbf19a0c5
    https://github.com/scummvm/scummvm/commit/d551c5ed10e6963c824aabce9b27304dbf19a0c5
Author: elasota (ejlasota at gmail.com)
Date: 2022-06-24T00:01:56-04:00

Commit Message:
MTROPOLIS: Add support for background matte mode mouse collision on mToon elements.

Changed paths:
    engines/mtropolis/elements.cpp
    engines/mtropolis/elements.h


diff --git a/engines/mtropolis/elements.cpp b/engines/mtropolis/elements.cpp
index 8a3444e93ed..ad1f0569564 100644
--- a/engines/mtropolis/elements.cpp
+++ b/engines/mtropolis/elements.cpp
@@ -1308,6 +1308,43 @@ void MToonElement::render(Window *window) {
 	}
 }
 
+bool MToonElement::isMouseCollisionAtPoint(int32 relativeX, int32 relativeY) const {
+	relativeX -= _rect.left;
+	relativeY -= _rect.top;
+
+	if (_renderSurface) {
+		Common::Rect frameRect = _metadata->frames[_renderedFrame].rect;
+
+		if (frameRect.width() == _renderSurface->w && frameRect.height() == _renderSurface->h) {
+			// Frame rect is the size of the render surface, meaning the frame rect is an offset
+			relativeX -= frameRect.left;
+			relativeY -= frameRect.top;
+		}
+		// ... otherwise it's a sub-area of the rendered rect, meaning we shouldn't adjust coordinates
+
+		if (relativeX < 0 || relativeY < 0 || relativeX >= frameRect.width() || relativeY >= frameRect.height())
+			return false;
+
+		if (_renderProps.getInkMode() == VisualElementRenderProperties::kInkModeBackgroundMatte) {
+			// TODO: This doesn't account for scaling
+			ColorRGB8 transColorRGB8 = _renderProps.getBackColor();
+			uint32 transColor = _renderSurface->format.ARGBToColor(255, transColorRGB8.r, transColorRGB8.g, transColorRGB8.b);
+
+			// Sanity-check
+			if (relativeX >= _renderSurface->w || relativeY >= _renderSurface->h)
+				return false;
+
+			// Check if the pixel is transparent
+			if (_renderSurface->getPixel(relativeX, relativeY) == transColor)
+				return false;
+		}
+
+		return true;
+	}
+
+	return false;
+}
+
 VThreadState MToonElement::startPlayingTask(const StartPlayingTaskData &taskData) {
 	if (_rateTimes100000 < 0)
 		_cel = _playRange.max;
diff --git a/engines/mtropolis/elements.h b/engines/mtropolis/elements.h
index 76f3e6e593e..ed8399ff8aa 100644
--- a/engines/mtropolis/elements.h
+++ b/engines/mtropolis/elements.h
@@ -200,6 +200,8 @@ public:
 
 	void render(Window *window) override;
 
+	bool isMouseCollisionAtPoint(int32 relativeX, int32 relativeY) const override;
+
 #ifdef MTROPOLIS_DEBUG_ENABLE
 	const char *debugGetTypeName() const override { return "mToon Element"; }
 	SupportStatus debugGetSupportStatus() const override { return kSupportStatusDone; }




More information about the Scummvm-git-logs mailing list