fix: treat artboard as layout for hit testing inheritance (#10341) 583274d7b9
* fix: treat artboard as layout for hit testing inheritance

Co-authored-by: hernan <hernan@rive.app>
diff --git a/.rive_head b/.rive_head
index 4216257..a19b195 100644
--- a/.rive_head
+++ b/.rive_head
@@ -1 +1 @@
-cc34f96631a6279e94227c10862cdde8ebf6b478
+583274d7b9361269fb90db7b080c1c3e1d71df44
diff --git a/src/artboard.cpp b/src/artboard.cpp
index ffcf2c8..20f13b4 100644
--- a/src/artboard.cpp
+++ b/src/artboard.cpp
@@ -1110,7 +1110,7 @@
         }
     }
 #endif
-    return Drawable::hitTestPoint(position, skipOnUnclipped);
+    return LayoutComponent::hitTestPoint(position, skipOnUnclipped);
 }
 
 void Artboard::draw(Renderer* renderer) { draw(renderer, DrawOption::kNormal); }
diff --git a/tests/unit_tests/assets/scroll_test.riv b/tests/unit_tests/assets/scroll_test.riv
new file mode 100644
index 0000000..e0ead10
--- /dev/null
+++ b/tests/unit_tests/assets/scroll_test.riv
Binary files differ
diff --git a/tests/unit_tests/runtime/scroll_test.cpp b/tests/unit_tests/runtime/scroll_test.cpp
new file mode 100644
index 0000000..6d720d8
--- /dev/null
+++ b/tests/unit_tests/runtime/scroll_test.cpp
@@ -0,0 +1,101 @@
+#include "rive/file.hpp"
+#include "rive/animation/linear_animation.hpp"
+#include "rive/animation/linear_animation_instance.hpp"
+#include "rive/animation/state_machine_instance.hpp"
+#include "rive/viewmodel/viewmodel.hpp"
+#include "rive/viewmodel/viewmodel_instance_number.hpp"
+#include "rive/viewmodel/viewmodel_instance_trigger.hpp"
+#include "utils/serializing_factory.hpp"
+#include "rive_file_reader.hpp"
+#include <catch.hpp>
+#include <cstdio>
+#include <cstring>
+
+using namespace rive;
+
+TEST_CASE("multiple scrolliing artboards", "[silver]")
+{
+    SerializingFactory silver;
+    auto file = ReadRiveFile("assets/scroll_test.riv", &silver);
+
+    auto artboard = file->artboardDefault();
+    silver.frameSize(artboard->width(), artboard->height());
+
+    auto stateMachine = artboard->stateMachineAt(0);
+    stateMachine->advanceAndApply(0.1f);
+
+    auto renderer = silver.makeRenderer();
+    artboard->draw(renderer.get());
+
+    silver.addFrame();
+
+    // Click in the middle of the state machine.
+    stateMachine->pointerDown(
+        rive::Vec2D(artboard->width() / 2.0f, artboard->height() / 2.0f));
+    // Advance and apply twice to take the transition and apply the next state.
+    stateMachine->advanceAndApply(0.1f);
+    stateMachine->advanceAndApply(1.0f);
+
+    artboard->draw(renderer.get());
+
+    silver.addFrame();
+
+    // Start scroll on right element
+    stateMachine->pointerDown(rive::Vec2D(260.0f, 500.0f));
+    // Advance and apply twice to take the transition and apply the next state.
+    stateMachine->advanceAndApply(0.1f);
+    stateMachine->advanceAndApply(1.0f);
+    artboard->draw(renderer.get());
+
+    float yMovement = 400.0f;
+    float xMovement = 100.0f;
+
+    int frames = (int)(1.0f / 0.016f);
+    for (int i = 0; i < frames; i++)
+    {
+        silver.addFrame();
+        stateMachine->pointerMove(
+            rive::Vec2D(260.0f - (i * xMovement / frames),
+                        500.0f - (i * yMovement / frames)));
+        // Advance and apply twice to take the transition and apply the next
+        // state.
+        stateMachine->advanceAndApply(0.1f);
+        stateMachine->advanceAndApply(0.016f);
+        artboard->draw(renderer.get());
+    }
+    silver.addFrame();
+    stateMachine->pointerUp(
+        rive::Vec2D(260.0f - xMovement, 500.0f - yMovement));
+    stateMachine->advanceAndApply(0.1f);
+    stateMachine->advanceAndApply(0.016f);
+    artboard->draw(renderer.get());
+
+    silver.addFrame();
+
+    // Start scroll on left element
+    stateMachine->pointerDown(rive::Vec2D(50.0f, 500.0f));
+    // Advance and apply twice to take the transition and apply the next state.
+    stateMachine->advanceAndApply(0.1f);
+    stateMachine->advanceAndApply(1.0f);
+    artboard->draw(renderer.get());
+
+    for (int i = 0; i < frames; i++)
+    {
+        silver.addFrame();
+        stateMachine->pointerMove(
+            rive::Vec2D(50.0f + (i * xMovement / frames),
+                        500.0f - (i * yMovement / frames)));
+        // Advance and apply twice to take the transition and apply the next
+        // state.
+        stateMachine->advanceAndApply(0.1f);
+        stateMachine->advanceAndApply(0.016f);
+        artboard->draw(renderer.get());
+    }
+    silver.addFrame();
+    stateMachine->pointerUp(rive::Vec2D(50.0f + xMovement, 500.0f - yMovement));
+    stateMachine->advanceAndApply(0.1f);
+    stateMachine->advanceAndApply(0.016f);
+    artboard->draw(renderer.get());
+
+    CHECK(silver.matches("scroll_test"));
+}
diff --git a/tests/unit_tests/silvers/scroll_test.sriv b/tests/unit_tests/silvers/scroll_test.sriv
new file mode 100644
index 0000000..faac6be
--- /dev/null
+++ b/tests/unit_tests/silvers/scroll_test.sriv
Binary files differ