[canvaskit] Add relative SkPath operators
Like with the non-relative forms, we want to be able to
chain these together, but not leak the SkPaths (which happens
if the C++ side returns this). Thus, we have to add in
the JS glue to return the "JS this".
Change-Id: Ic640b84f6c09c1d931ad44bc403b14bb0d0893a2
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/251960
Reviewed-by: Hal Canary <halcanary@google.com>
diff --git a/modules/canvaskit/canvaskit_bindings.cpp b/modules/canvaskit/canvaskit_bindings.cpp
index 3290838..6462f7f 100644
--- a/modules/canvaskit/canvaskit_bindings.cpp
+++ b/modules/canvaskit/canvaskit_bindings.cpp
@@ -232,13 +232,20 @@
p.arcTo(oval, startAngle, sweepAngle, forceMoveTo);
}
-void ApplyAddArcToArcSize(SkPath& orig, SkScalar rx, SkScalar ry, SkScalar xAxisRotate,
- bool useSmallArc, bool ccw, SkScalar x, SkScalar y) {
+void ApplyArcToArcSize(SkPath& orig, SkScalar rx, SkScalar ry, SkScalar xAxisRotate,
+ bool useSmallArc, bool ccw, SkScalar x, SkScalar y) {
auto arcSize = useSmallArc ? SkPath::ArcSize::kSmall_ArcSize : SkPath::ArcSize::kLarge_ArcSize;
auto sweep = ccw ? SkPath::Direction::kCCW_Direction : SkPath::Direction::kCW_Direction;
orig.arcTo(rx, ry, xAxisRotate, arcSize, sweep, x, y);
}
+void ApplyRArcToArcSize(SkPath& orig, SkScalar rx, SkScalar ry, SkScalar xAxisRotate,
+ bool useSmallArc, bool ccw, SkScalar dx, SkScalar dy) {
+ auto arcSize = useSmallArc ? SkPath::ArcSize::kSmall_ArcSize : SkPath::ArcSize::kLarge_ArcSize;
+ auto sweep = ccw ? SkPath::Direction::kCCW_Direction : SkPath::Direction::kCW_Direction;
+ orig.rArcTo(rx, ry, xAxisRotate, arcSize, sweep, dx, dy);
+}
+
void ApplyClose(SkPath& p) {
p.close();
}
@@ -248,19 +255,37 @@
p.conicTo(x1, y1, x2, y2, w);
}
+void ApplyRConicTo(SkPath& p, SkScalar dx1, SkScalar dy1, SkScalar dx2, SkScalar dy2,
+ SkScalar w) {
+ p.rConicTo(dx1, dy1, dx2, dy2, w);
+}
+
void ApplyCubicTo(SkPath& p, SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2,
SkScalar x3, SkScalar y3) {
p.cubicTo(x1, y1, x2, y2, x3, y3);
}
+void ApplyRCubicTo(SkPath& p, SkScalar dx1, SkScalar dy1, SkScalar dx2, SkScalar dy2,
+ SkScalar dx3, SkScalar dy3) {
+ p.rCubicTo(dx1, dy1, dx2, dy2, dx3, dy3);
+}
+
void ApplyLineTo(SkPath& p, SkScalar x, SkScalar y) {
p.lineTo(x, y);
}
+void ApplyRLineTo(SkPath& p, SkScalar dx, SkScalar dy) {
+ p.rLineTo(dx, dy);
+}
+
void ApplyMoveTo(SkPath& p, SkScalar x, SkScalar y) {
p.moveTo(x, y);
}
+void ApplyRMoveTo(SkPath& p, SkScalar dx, SkScalar dy) {
+ p.rMoveTo(dx, dy);
+}
+
void ApplyReset(SkPath& p) {
p.reset();
}
@@ -273,6 +298,10 @@
p.quadTo(x1, y1, x2, y2);
}
+void ApplyRQuadTo(SkPath& p, SkScalar dx1, SkScalar dy1, SkScalar dx2, SkScalar dy2) {
+ p.rQuadTo(dx1, dy1, dx2, dy2);
+}
+
void ApplyTransform(SkPath& orig,
SkScalar scaleX, SkScalar skewX, SkScalar transX,
SkScalar skewY, SkScalar scaleY, SkScalar transY,
@@ -1140,7 +1169,7 @@
.function("_addRoundRect", &ApplyAddRoundRect)
.function("_arcTo", &ApplyArcTo)
.function("_arcTo", &ApplyArcToAngle)
- .function("_arcTo", &ApplyAddArcToArcSize)
+ .function("_arcTo", &ApplyArcToArcSize)
.function("_close", &ApplyClose)
.function("_conicTo", &ApplyConicTo)
.function("countPoints", &SkPath::countPoints)
@@ -1151,9 +1180,15 @@
.function("isVolatile", &SkPath::isVolatile)
.function("_lineTo", &ApplyLineTo)
.function("_moveTo", &ApplyMoveTo)
+ .function("_quadTo", &ApplyQuadTo)
+ .function("_rArcTo", &ApplyRArcToArcSize)
+ .function("_rConicTo", &ApplyRConicTo)
+ .function("_rCubicTo", &ApplyRCubicTo)
+ .function("_rLineTo", &ApplyRLineTo)
+ .function("_rMoveTo", &ApplyRMoveTo)
+ .function("_rQuadTo", &ApplyRQuadTo)
.function("reset", &ApplyReset)
.function("rewind", &ApplyRewind)
- .function("_quadTo", &ApplyQuadTo)
.function("setIsVolatile", &SkPath::setIsVolatile)
.function("_transform", select_overload<void(SkPath&, SkScalar, SkScalar, SkScalar, SkScalar, SkScalar, SkScalar, SkScalar, SkScalar, SkScalar)>(&ApplyTransform))