Move fillrule to test()
diff --git a/include/rive/math/hit_test.hpp b/include/rive/math/hit_test.hpp
index 1e30bde..dadee50 100644
--- a/include/rive/math/hit_test.hpp
+++ b/include/rive/math/hit_test.hpp
@@ -20,7 +20,6 @@
     Vec2D            m_offset;
     float            m_height;
     int              m_IWidth, m_IHeight;
-    int              m_WindingMask;
     bool             m_ExpectsMove;
 
     void recurse_cubic(Vec2D b, Vec2D c, Vec2D d, int count);
@@ -30,7 +29,7 @@
     HitTester(const IAABB& area) { reset(area); }
 
     void reset();
-    void reset(const IAABB& area, FillRule = rive::FillRule::nonZero);
+    void reset(const IAABB& area);
 
     void move(Vec2D);
     void line(Vec2D);
@@ -40,7 +39,7 @@
     
     void addRect(const AABB&, const Mat2D&, PathDirection = PathDirection::ccw);
 
-    bool test();    // calls reset() afterwards
+    bool test(FillRule = rive::FillRule::nonZero);
 };
 
 }
diff --git a/src/hittest_command_path.cpp b/src/hittest_command_path.cpp
index 0b51de7..4dec9af 100644
--- a/src/hittest_command_path.cpp
+++ b/src/hittest_command_path.cpp
@@ -11,7 +11,7 @@
 }
 
 bool HitTestCommandPath::wasHit() {
-    return m_Tester.test();
+    return m_Tester.test(m_FillRule);
 }
 
 void HitTestCommandPath::reset() {
@@ -19,6 +19,7 @@
 }
 
 void HitTestCommandPath::fillRule(FillRule value) {
+    // remember this here, and pass it to test()
     m_FillRule = value;
 }
 
diff --git a/src/math/hit_test.cpp b/src/math/hit_test.cpp
index 2463f1a..d652c0b 100644
--- a/src/math/hit_test.cpp
+++ b/src/math/hit_test.cpp
@@ -165,12 +165,10 @@
     m_DW.clear();
 }
 
-void HitTester::reset(const IAABB& clip, FillRule rule) {
+void HitTester::reset(const IAABB& clip) {
     m_offset = Vec2D{ (float)clip.left, (float)clip.top };
     m_height = (float)clip.height();
 
-    m_WindingMask = (rule == rive::FillRule::nonZero) ? -1 : 1;
-
     m_IWidth = clip.width();
     m_IHeight = clip.height();
     m_DW.resize(m_IWidth * m_IHeight);
@@ -320,20 +318,16 @@
     close();
 }
 
-bool HitTester::test() {
+bool HitTester::test(FillRule rule) {
     if (!m_ExpectsMove) {
         this->close();
     }
 
-    const int* row = m_DW.data();
-    int winding = 0;
-    for (int y = 0; y < m_IHeight; ++y) {
-        int w = 0;
-        for (int x = 0; x < m_IWidth; ++x) {
-            w += *row++;
-            winding |= w & m_WindingMask;
-        }
+    const int mask = (rule == rive::FillRule::nonZero) ? -1 : 1;
+
+    int nonzero = 0;
+    for (auto m : m_DW) {
+        nonzero |= (m & mask);
     }
-    this->reset();
-    return winding != 0;
+    return nonzero != 0;
 }