[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