diff --git a/src/constraints/ik_constraint.cpp b/src/constraints/ik_constraint.cpp
index ed049ec..7985526 100644
--- a/src/constraints/ik_constraint.cpp
+++ b/src/constraints/ik_constraint.cpp
@@ -6,6 +6,10 @@
 
 using namespace rive;
 
+static float atan2(Vec2D v) {
+    return std::atan2(v.y(), v.x());
+}
+
 void IKConstraint::buildDependencies() {
     Super::buildDependencies();
 
@@ -92,7 +96,7 @@
 
     // Note this is directional, hence not transformMat2d
     Vec2D toTargetLocal = Vec2D::transformDir(toTarget, iworld);
-    float r = std::atan2(toTargetLocal[1], toTargetLocal[0]);
+    float r = atan2(toTargetLocal);
 
     constrainRotation(*fk1, r);
     fk1->angle = r;
@@ -135,20 +139,20 @@
         b2->tipWorldTranslation(pB);
 
         Vec2D avLocal = Vec2D::transformDir(pB - pC, secondChildWorldInverse);
-        float angleCorrection = -std::atan2(avLocal[1], avLocal[0]);
+        float angleCorrection = -atan2(avLocal);
 
         if (invertDirection()) {
-            r1 = std::atan2(cv[1], cv[0]) - A;
+            r1 = atan2(cv) - A;
             r2 = -C + math::PI + angleCorrection;
         } else {
-            r1 = A + std::atan2(cv[1], cv[0]);
+            r1 = A + atan2(cv);
             r2 = C - math::PI + angleCorrection;
         }
     } else if (invertDirection()) {
-        r1 = std::atan2(cv[1], cv[0]) - A;
+        r1 = atan2(cv) - A;
         r2 = -C + math::PI;
     } else {
-        r1 = A + std::atan2(cv[1], cv[0]);
+        r1 = A + atan2(cv);
         r2 = C - math::PI;
     }
 
diff --git a/src/shapes/metrics_path.cpp b/src/shapes/metrics_path.cpp
index d6d5639..0190008 100644
--- a/src/shapes/metrics_path.cpp
+++ b/src/shapes/metrics_path.cpp
@@ -229,16 +229,13 @@
             const PathPart& part = m_Parts[i];
             switch (part.type) {
                 case PathPart::line: {
-                    const Vec2D& point = m_TransformedPoints[part.offset];
-                    result->lineTo(point[0], point[1]);
+                    result->line(m_TransformedPoints[part.offset]);
                     break;
                 }
                 default: {
-                    const Vec2D& point1 = m_TransformedPoints[part.offset];
-                    const Vec2D& point2 = m_TransformedPoints[part.offset + 1];
-                    const Vec2D& point3 = m_TransformedPoints[part.offset + 2];
-                    result->cubicTo(
-                        point1[0], point1[1], point2[0], point2[1], point3[0], point3[1]);
+                    result->cubic(m_TransformedPoints[part.offset + 0],
+                                  m_TransformedPoints[part.offset + 1],
+                                  m_TransformedPoints[part.offset + 2]);
                     break;
                 }
             }
@@ -253,15 +250,13 @@
     const PathPart& part = m_Parts[index];
     switch (part.type) {
         case PathPart::line: {
-            const Vec2D& from = m_TransformedPoints[part.offset - 1];
-            const Vec2D& to = m_TransformedPoints[part.offset];
-            Vec2D dir = to - from;
+            const Vec2D from = m_TransformedPoints[part.offset - 1];
+            const Vec2D to = m_TransformedPoints[part.offset];
+            const Vec2D dir = to - from;
             if (moveTo) {
-                Vec2D point = from + dir * startT;
-                result->moveTo(point[0], point[1]);
+                result->move(from + dir * startT);
             }
-            dir = from + dir * endT;
-            result->lineTo(dir[0], dir[1]);
+            result->line(from + dir * endT);
 
             break;
         }
@@ -325,29 +320,27 @@
                 // Start is 0, so split at end and keep the left side.
                 computeHull(from, fromOut, toIn, to, endT, hull);
                 if (moveTo) {
-                    result->moveTo(from[0], from[1]);
+                    result->move(from);
                 }
-                result->cubicTo(
-                    hull[0][0], hull[0][1], hull[3][0], hull[3][1], hull[5][0], hull[5][1]);
+                result->cubic(hull[0], hull[3], hull[5]);
             } else {
                 // Split at start since it's non 0.
                 computeHull(from, fromOut, toIn, to, startT, hull);
                 if (moveTo) {
                     // Move to first point on the right side.
-                    result->moveTo(hull[5][0], hull[5][1]);
+                    result->move(hull[5]);
                 }
                 if (endT == 1.0f) {
                     // End is 1, so no further split is necessary just cubicTo
                     // the remaining right side.
-                    result->cubicTo(hull[4][0], hull[4][1], hull[2][0], hull[2][1], to[0], to[1]);
+                    result->cubic(hull[4], hull[2], to);
                 } else {
                     // End is not 1, so split again and cubic to the left side
                     // of the split and remap endT to the new curve range
                     computeHull(
                         hull[5], hull[4], hull[2], to, (endT - startT) / (1.0f - startT), hull);
 
-                    result->cubicTo(
-                        hull[0][0], hull[0][1], hull[3][0], hull[3][1], hull[5][0], hull[5][1]);
+                    result->cubic(hull[0], hull[3], hull[5]);
                 }
             }
             break;
diff --git a/src/shapes/path.cpp b/src/shapes/path.cpp
index 520c88b..0b11b30 100644
--- a/src/shapes/path.cpp
+++ b/src/shapes/path.cpp
@@ -54,24 +54,19 @@
     auto firstPoint = vertices[0];
 
     // Init out to translation
-    float outX, outY;
+    Vec2D out;
     bool prevIsCubic;
 
-    float startX, startY;
-    float startInX, startInY;
+    Vec2D start, startIn;
     bool startIsCubic;
 
     if (firstPoint->is<CubicVertex>()) {
         auto cubic = firstPoint->as<CubicVertex>();
         startIsCubic = prevIsCubic = true;
-        auto inPoint = cubic->renderIn();
-        startInX = inPoint[0];
-        startInY = inPoint[1];
-        auto outPoint = cubic->renderOut();
-        outX = outPoint[0];
-        outY = outPoint[1];
-        auto translation = cubic->renderTranslation();
-        commandPath.moveTo(startX = translation[0], startY = translation[1]);
+        startIn = cubic->renderIn();
+        out = cubic->renderOut();
+        start = cubic->renderTranslation();
+        commandPath.move(start);
     } else {
         startIsCubic = prevIsCubic = false;
         auto point = *firstPoint->as<StraightVertex>();
@@ -100,24 +95,17 @@
 
             float renderRadius = std::min(toPrevLength, std::min(toNextLength, radius));
 
-            Vec2D translation = Vec2D::scaleAndAdd(pos, toPrev, renderRadius);
-            commandPath.moveTo(startInX = startX = translation[0],
-                               startInY = startY = translation[1]);
+            startIn = start = Vec2D::scaleAndAdd(pos, toPrev, renderRadius);
+            commandPath.move(startIn);
 
             Vec2D outPoint = Vec2D::scaleAndAdd(pos, toPrev, icircleConstant * renderRadius);
             Vec2D inPoint = Vec2D::scaleAndAdd(pos, toNext, icircleConstant * renderRadius);
-            Vec2D posNext = Vec2D::scaleAndAdd(pos, toNext, renderRadius);
-            commandPath.cubicTo(outPoint[0],
-                                outPoint[1],
-                                inPoint[0],
-                                inPoint[1],
-                                outX = posNext[0],
-                                outY = posNext[1]);
+            out = Vec2D::scaleAndAdd(pos, toNext, renderRadius);
+            commandPath.cubic(outPoint, inPoint, out);
             prevIsCubic = false;
         } else {
-            auto translation = point.renderTranslation();
-            commandPath.moveTo(startInX = startX = outX = translation[0],
-                               startInY = startY = outY = translation[1]);
+            startIn = start = out = point.renderTranslation();
+            commandPath.move(out);
         }
     }
 
@@ -129,18 +117,16 @@
             auto inPoint = cubic->renderIn();
             auto translation = cubic->renderTranslation();
 
-            commandPath.cubicTo(outX, outY, inPoint[0], inPoint[1], translation[0], translation[1]);
+            commandPath.cubic(out, inPoint, translation);
 
             prevIsCubic = true;
-            auto outPoint = cubic->renderOut();
-            outX = outPoint[0];
-            outY = outPoint[1];
+            out = cubic->renderOut();
         } else {
             auto point = *vertex->as<StraightVertex>();
             Vec2D pos = point.renderTranslation();
 
             if (auto radius = point.radius(); radius > 0.0f) {
-                Vec2D toPrev = Vec2D(outX, outY) - pos;
+                Vec2D toPrev = out - pos;
                 auto toPrevLength = toPrev.length();
                 toPrev[0] /= toPrevLength;
                 toPrev[1] /= toPrevLength;
@@ -158,40 +144,32 @@
 
                 Vec2D translation = Vec2D::scaleAndAdd(pos, toPrev, renderRadius);
                 if (prevIsCubic) {
-                    commandPath.cubicTo(
-                        outX, outY, translation[0], translation[1], translation[0], translation[1]);
+                    commandPath.cubic(out, translation, translation);
                 } else {
-                    commandPath.lineTo(translation[0], translation[1]);
+                    commandPath.line(translation);
                 }
 
                 Vec2D outPoint = Vec2D::scaleAndAdd(pos, toPrev, icircleConstant * renderRadius);
                 Vec2D inPoint = Vec2D::scaleAndAdd(pos, toNext, icircleConstant * renderRadius);
-                Vec2D posNext = Vec2D::scaleAndAdd(pos, toNext, renderRadius);
-                commandPath.cubicTo(outPoint[0],
-                                    outPoint[1],
-                                    inPoint[0],
-                                    inPoint[1],
-                                    outX = posNext[0],
-                                    outY = posNext[1]);
+                out = Vec2D::scaleAndAdd(pos, toNext, renderRadius);
+                commandPath.cubic(outPoint, inPoint, out);
                 prevIsCubic = false;
             } else if (prevIsCubic) {
-                float x = pos[0];
-                float y = pos[1];
-                commandPath.cubicTo(outX, outY, x, y, x, y);
+                commandPath.cubic(out, pos, pos);
 
                 prevIsCubic = false;
-                outX = x;
-                outY = y;
+                out = pos;
             } else {
-                commandPath.lineTo(outX = pos[0], outY = pos[1]);
+                out = pos;
+                commandPath.line(out);
             }
         }
     }
     if (isClosed) {
         if (prevIsCubic || startIsCubic) {
-            commandPath.cubicTo(outX, outY, startInX, startInY, startX, startY);
+            commandPath.cubic(out, startIn, start);
         } else {
-            commandPath.lineTo(startX, startY);
+            commandPath.line(start);
         }
         commandPath.close();
     }
