Use pathbuilder to keep path geometry immutable

- remove some dead testing code in pathopsconics

Change-Id: If0788220741f9e9aa7be39c085b54566e590f6b2
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/1067983
Reviewed-by: Kaylee Lubick <kjlubick@google.com>
Commit-Queue: Mike Reed <mike@reedtribe.org>
Reviewed-by: Florin Malita <fmalita@google.com>
diff --git a/tests/PathOpsAsWindingTest.cpp b/tests/PathOpsAsWindingTest.cpp
index 56c245b..cf112ac 100644
--- a/tests/PathOpsAsWindingTest.cpp
+++ b/tests/PathOpsAsWindingTest.cpp
@@ -419,69 +419,68 @@
 }
 
 DEF_TEST(PathOpsAsWinding, reporter) {
-    SkPath test;
-    test.addRect({1, 2, 3, 4});
+    SkPath test = SkPath::Rect({1, 2, 3, 4});
     // if test is winding
     auto result = AsWinding(test);
     REPORTER_ASSERT(reporter, result.has_value());
     REPORTER_ASSERT(reporter, test == *result);
     // if test is empty
-    test.reset();
-    test.setFillType(SkPathFillType::kEvenOdd);
+    test = SkPath().makeFillType(SkPathFillType::kEvenOdd);
     result = AsWinding(test);
     REPORTER_ASSERT(reporter, result.has_value());
     REPORTER_ASSERT(reporter, result->isEmpty());
     REPORTER_ASSERT(reporter, result->getFillType() == SkPathFillType::kWinding);
     // if test is convex
-    test.addCircle(5, 5, 10);
+    test = SkPath::Circle(5, 5, 10).makeFillType(SkPathFillType::kEvenOdd);
     result = AsWinding(test);
     REPORTER_ASSERT(reporter, result.has_value());
     REPORTER_ASSERT(reporter, result->isConvex());
-    test.setFillType(SkPathFillType::kWinding);
+    test = test.makeFillType(SkPathFillType::kWinding);
     REPORTER_ASSERT(reporter, test == *result);
     // if test has infinity
-    test.reset();
-    test.addRect({1, 2, 3, SK_ScalarInfinity});
-    test.setFillType(SkPathFillType::kEvenOdd);
+    test = SkPath::Rect({1, 2, 3, SK_ScalarInfinity})
+           .makeFillType(SkPathFillType::kEvenOdd);
     result = AsWinding(test);
     REPORTER_ASSERT(reporter, !result.has_value());
+
     // if test has only one contour
-    test.reset();
-    SkPoint ell[] = {{0, 0}, {4, 0}, {4, 1}, {1, 1}, {1, 4}, {0, 4}};
-    test.addPoly(ell, true);
-    test.setFillType(SkPathFillType::kEvenOdd);
+    const SkPoint ell[] = {{0, 0}, {4, 0}, {4, 1}, {1, 1}, {1, 4}, {0, 4}};
+    SkPathBuilder builder(SkPathFillType::kEvenOdd);
+    builder.addPolygon(ell, true);
+    test = builder.snapshot();
     result = AsWinding(test);
     REPORTER_ASSERT(reporter, result.has_value());
     REPORTER_ASSERT(reporter, !result->isConvex());
-    test.setFillType(SkPathFillType::kWinding);
+    test = test.makeFillType(SkPathFillType::kWinding);
     REPORTER_ASSERT(reporter, test == *result);
     // test two contours that do not overlap or share bounds
-    test.addRect({5, 2, 6, 3});
-    test.setFillType(SkPathFillType::kEvenOdd);
+    builder.addRect({5, 2, 6, 3});
+    test = builder.detach();
     result = AsWinding(test);
     REPORTER_ASSERT(reporter, result.has_value());
     REPORTER_ASSERT(reporter, !result->isConvex());
-    test.setFillType(SkPathFillType::kWinding);
+    test = test.makeFillType(SkPathFillType::kWinding);
     REPORTER_ASSERT(reporter, test == *result);
+
     // test two contours that do not overlap but share bounds
-    test.reset();
-    test.addPoly(ell, true);
-    test.addRect({2, 2, 3, 3});
-    test.setFillType(SkPathFillType::kEvenOdd);
+    test = SkPathBuilder(SkPathFillType::kEvenOdd)
+           .addPolygon(ell, true)
+           .addRect({2, 2, 3, 3})
+           .detach();
     result = AsWinding(test);
     REPORTER_ASSERT(reporter, result.has_value());
     REPORTER_ASSERT(reporter, !result->isConvex());
-    test.setFillType(SkPathFillType::kWinding);
+    test = test.makeFillType(SkPathFillType::kWinding);
     REPORTER_ASSERT(reporter, test == *result);
     // test two contours that partially overlap
-    test.reset();
-    test.addRect({0, 0, 3, 3});
-    test.addRect({1, 1, 4, 4});
-    test.setFillType(SkPathFillType::kEvenOdd);
+    test = SkPathBuilder(SkPathFillType::kEvenOdd)
+           .addRect({0, 0, 3, 3})
+           .addRect({1, 1, 4, 4})
+           .detach();
     result = AsWinding(test);
     REPORTER_ASSERT(reporter, result.has_value());
     REPORTER_ASSERT(reporter, !result->isConvex());
-    test.setFillType(SkPathFillType::kWinding);
+    test = test.makeFillType(SkPathFillType::kWinding);
     REPORTER_ASSERT(reporter, test == *result);
 
     // test a in b, b in a, cw/ccw
@@ -492,31 +491,32 @@
     for (bool aFirst : {false, true}) {
         for (auto dirA : {SkPathDirection::kCW, SkPathDirection::kCCW}) {
             for (auto dirB : {SkPathDirection::kCW, SkPathDirection::kCCW}) {
-                test.reset();
-                test.setFillType(SkPathFillType::kEvenOdd);
+                builder.reset().setFillType(SkPathFillType::kEvenOdd);
                 if (aFirst) {
-                    test.addRect(rectA, dirA);
-                    test.addRect(rectB, dirB);
+                    builder.addRect(rectA, dirA);
+                    builder.addRect(rectB, dirB);
                 } else {
-                    test.addRect(rectB, dirB);
-                    test.addRect(rectA, dirA);
+                    builder.addRect(rectB, dirB);
+                    builder.addRect(rectA, dirA);
                 }
+                test = builder.detach();
                 SkPath original = test;
                 result = AsWinding(test);
                 REPORTER_ASSERT(reporter, result.has_value());
                 REPORTER_ASSERT(reporter, result->getFillType() == SkPathFillType::kWinding);
-                test.reset();
+
                 if (aFirst) {
-                    test.addRect(rectA, dirA);
+                    builder.addRect(rectA, dirA);
                 }
                 if (dirA != dirB) {
-                    test.addRect(rectB, dirB);
+                    builder.addRect(rectB, dirB);
                 } else {
-                    test.addPoly(SkPathDirection::kCW == dirA ? revBccw : revBcw, true);
+                    builder.addPolygon(SkPathDirection::kCW == dirA ? revBccw : revBcw, true);
                 }
                 if (!aFirst) {
-                    test.addRect(rectA, dirA);
+                    builder.addRect(rectA, dirA);
                 }
+                test = builder.detach();
                 REPORTER_ASSERT(reporter, test == *result);
             }
         }
@@ -531,12 +531,16 @@
                     SkPath pathA = build_squircle(curveA, rectA, dirA);
                     for (auto curveB : { SkPath::kLine_Verb, SkPath::kQuad_Verb,
                                      SkPath::kConic_Verb, SkPath::kCubic_Verb } ) {
-                        test = aFirst ? pathA : SkPath();
-                        test.addPath(build_squircle(curveB, rectB, dirB));
-                        if (!aFirst) {
-                            test.addPath(pathA);
+                        builder.reset();
+                        if (aFirst) {
+                            builder = pathA;
                         }
-                        test.setFillType(SkPathFillType::kEvenOdd);
+                        builder.addPath(build_squircle(curveB, rectB, dirB));
+                        if (!aFirst) {
+                            builder.addPath(pathA);
+                        }
+                        builder.setFillType(SkPathFillType::kEvenOdd);
+                        test = builder.detach();
                         result = AsWinding(test);
                         REPORTER_ASSERT(reporter, result.has_value());
                         REPORTER_ASSERT(reporter, result->getFillType() == SkPathFillType::kWinding);
diff --git a/tests/PathOpsBuilderConicTest.cpp b/tests/PathOpsBuilderConicTest.cpp
index c5fc97c..7c950bb 100644
--- a/tests/PathOpsBuilderConicTest.cpp
+++ b/tests/PathOpsBuilderConicTest.cpp
@@ -8,6 +8,7 @@
 #include "include/core/SkBitmap.h"
 #include "include/core/SkMatrix.h"
 #include "include/core/SkPath.h"
+#include "include/core/SkPathBuilder.h"
 #include "include/core/SkPathTypes.h"
 #include "include/core/SkRect.h"
 #include "include/core/SkRegion.h"
@@ -20,8 +21,6 @@
 #include "tests/Test.h"
 #include "tools/flags/CommandLineFlags.h"
 
-#define DEBUG_SIMPLIFY_FAILS 0
-
 struct OvalSet {
     SkRect fBounds;
     int fColumns;
@@ -36,12 +35,11 @@
     for (int x = 0; x < set.fColumns; ++x) {
         for (int y = 0; y < set.fRows; ++y) {
             for (SkScalar r = 0; r < 360; r += 360.f / set.fRotations) {
-                SkPath rotated;
                 SkMatrix matrix;
                 matrix.reset();
                 matrix.postRotate(r, 0, 0);
                 matrix.postTranslate(x * set.fXSpacing, y * set.fYSpacing);
-                oval.transform(matrix, &rotated);
+                SkPath rotated = oval.makeTransform(matrix);
                 if (builder) {
                     builder->add(rotated, kUnion_SkPathOp);
                 } else if (!region) {
@@ -67,9 +65,8 @@
 }
 
 static void testOne(skiatest::Reporter* reporter, const OvalSet& set) {
-    SkPath oval, regionResult, builderResult, opResult;
-    oval.setFillType(SkPathFillType::kWinding);
-    oval.addOval(set.fBounds);
+    SkPath regionResult, builderResult, opResult;
+    SkPath oval = SkPath::Oval(set.fBounds);
     SkOpBuilder builder;
     SkRegion region;
     testOvalSet(set, oval, nullptr, &region, &regionResult);
@@ -140,367 +137,325 @@
     }
 }
 
-#if DEBUG_SIMPLIFY_FAILS
-static bool simplify_fails(skiatest::Reporter* reporter, const SkPath& path) {
-    SkPath simplifiedPath;
-    bool failed = !Simplify(path, &simplifiedPath);
-    if (!failed) {
-        SkBitmap bitmap;
-        failed = !!comparePaths(reporter, __FUNCTION__, path, simplifiedPath, bitmap);
-    }
-    return failed;
-}
-
-static SkPath subset_simplify_fail(skiatest::Reporter* reporter, const SkPath& path) {
-    SubsetContours subsetContours(path);
-    bool failed = simplify_fails(reporter, path);
-    SkASSERT(failed);
-    SkPath lastFailed = path;
-    SkPath minimal;
-    while (subsetContours.subset(failed, &minimal)) {
-        failed = simplify_fails(reporter, minimal);
-        SkDebugf(" %s\n", failed ? "failed" : "");
-        if (failed) {
-            lastFailed = minimal;
-        }
-    }
-    failed = simplify_fails(reporter, lastFailed);
-    SkASSERT(failed);
-    SubsetVerbs subsetVerbs(lastFailed);
-    while (subsetVerbs.subset(failed, &minimal)) {
-        failed = simplify_fails(reporter, minimal);
-        SkDebugf(" %s\n", failed ? "failed" : "");
-        if (failed) {
-            lastFailed = minimal;
-        }
-    }
-    return lastFailed;
-}
-#endif
-
 DEF_TEST(SixtyOvals_2_2_9_73, reporter) {
-    SkPath path;
-    path.moveTo(SkBits2Float(0x434d53ca), SkBits2Float(0x43ad6ab0));  // 205.327f, 346.833f
-path.conicTo(SkBits2Float(0x434d53ca), SkBits2Float(0x40a00000), SkBits2Float(0x42d253ca), SkBits2Float(0x40a00000), SkBits2Float(0x3f3504f3));  // 205.327f, 5, 105.164f, 5, 0.707107f
-path.conicTo(SkBits2Float(0x40a00000), SkBits2Float(0x40a00000), SkBits2Float(0x40a00000), SkBits2Float(0x43ad6ab0), SkBits2Float(0x3f3504f3));  // 5, 5, 5, 346.833f, 0.707107f
-path.conicTo(SkBits2Float(0x40a00000), SkBits2Float(0x442c2ab0), SkBits2Float(0x42d253ca), SkBits2Float(0x442c2ab0), SkBits2Float(0x3f3504f3));  // 5, 688.667f, 105.164f, 688.667f, 0.707107f
-path.conicTo(SkBits2Float(0x434d53ca), SkBits2Float(0x442c2ab0), SkBits2Float(0x434d53ca), SkBits2Float(0x43ad6ab0), SkBits2Float(0x3f3504f3));  // 205.327f, 688.667f, 205.327f, 346.833f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0xc2834d04), SkBits2Float(0x43c6d5fb));  // -65.6504f, 397.672f
-path.conicTo(SkBits2Float(0x431a136e), SkBits2Float(0x4307cfe3), SkBits2Float(0x429ab133), SkBits2Float(0x428edb31), SkBits2Float(0x3f3504f3));  // 154.076f, 135.812f, 77.3461f, 71.4281f, 0.707107f
-path.conicTo(SkBits2Float(0x3f1dc4d0), SkBits2Float(0x40e169c2), SkBits2Float(0xc35b1c2c), SkBits2Float(0x438673b0), SkBits2Float(0x3f3504f3));  // 0.616284f, 7.04416f, -219.11f, 268.904f, 0.707107f
-path.conicTo(SkBits2Float(0xc3db6b0e), SkBits2Float(0x4404b0dc), SkBits2Float(0xc3b50da4), SkBits2Float(0x4414c96f), SkBits2Float(0x3f3504f3));  // -438.836f, 530.763f, -362.107f, 595.147f, 0.707107f
-path.conicTo(SkBits2Float(0xc38eb03a), SkBits2Float(0x4424e202), SkBits2Float(0xc2834d04), SkBits2Float(0x43c6d5fb), SkBits2Float(0x3f3504f3));  // -285.377f, 659.531f, -65.6504f, 397.672f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0xc398f46d), SkBits2Float(0x438337ac));  // -305.91f, 262.435f
-path.conicTo(SkBits2Float(0x41f5d870), SkBits2Float(0x434b137f), SkBits2Float(0x41556629), SkBits2Float(0x42d0de52), SkBits2Float(0x3f3504f3));  // 30.7307f, 203.076f, 13.3374f, 104.434f, 0.707107f
-path.conicTo(SkBits2Float(0xc081c918), SkBits2Float(0x40b95a5c), SkBits2Float(0xc3aa5918), SkBits2Float(0x42824d58), SkBits2Float(0x3f3504f3));  // -4.0558f, 5.79228f, -340.696f, 65.1511f, 0.707107f
-path.conicTo(SkBits2Float(0xc4295587), SkBits2Float(0x42f9050a), SkBits2Float(0xc424fc5c), SkBits2Float(0x435f26db), SkBits2Float(0x3f3504f3));  // -677.336f, 124.51f, -659.943f, 223.152f, 0.707107f
-path.conicTo(SkBits2Float(0xc420a331), SkBits2Float(0x43a0e598), SkBits2Float(0xc398f46d), SkBits2Float(0x438337ac), SkBits2Float(0x3f3504f3));  // -642.55f, 321.794f, -305.91f, 262.435f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0xc3c983e0), SkBits2Float(0x408cdc40));  // -403.03f, 4.40189f
-path.conicTo(SkBits2Float(0xc2d5fcd2), SkBits2Float(0x432f5193), SkBits2Float(0xc263a5d9), SkBits2Float(0x42b12617), SkBits2Float(0x3f3504f3));  // -106.994f, 175.319f, -56.912f, 88.5744f, 0.707107f
-path.conicTo(SkBits2Float(0xc0da9066), SkBits2Float(0x3fea4196), SkBits2Float(0xc3976eed), SkBits2Float(0xc329162e), SkBits2Float(0x3f3504f3));  // -6.83013f, 1.83013f, -302.867f, -169.087f, 0.707107f
-path.conicTo(SkBits2Float(0xc415b9cc), SkBits2Float(0xc3aa006f), SkBits2Float(0xc4223f09), SkBits2Float(0xc37d4256), SkBits2Float(0x3f3504f3));  // -598.903f, -340.003f, -648.985f, -253.259f, 0.707107f
-path.conicTo(SkBits2Float(0xc42ec446), SkBits2Float(0xc32683cf), SkBits2Float(0xc3c983e0), SkBits2Float(0x408cdc40), SkBits2Float(0x3f3504f3));  // -699.067f, -166.515f, -403.03f, 4.40189f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0xc39bc8c8), SkBits2Float(0xc37fb0d7));  // -311.569f, -255.691f
-path.conicTo(SkBits2Float(0xc342a797), SkBits2Float(0x42830e25), SkBits2Float(0xc2c9102e), SkBits2Float(0x41fa2834), SkBits2Float(0x3f3504f3));  // -194.655f, 65.5276f, -100.532f, 31.2696f, 0.707107f
-path.conicTo(SkBits2Float(0xc0cd12f5), SkBits2Float(0xc03f4152), SkBits2Float(0xc2f6a523), SkBits2Float(0xc3a21a77), SkBits2Float(0x3f3504f3));  // -6.40856f, -2.98836f, -123.323f, -324.207f, 0.707107f
-path.conicTo(SkBits2Float(0xc3703c8a), SkBits2Float(0xc4215b37), SkBits2Float(0xc3a72e05), SkBits2Float(0xc418cab4), SkBits2Float(0x3f3504f3));  // -240.236f, -645.425f, -334.36f, -611.167f, 0.707107f
-path.conicTo(SkBits2Float(0xc3d63dc5), SkBits2Float(0xc4103a31), SkBits2Float(0xc39bc8c8), SkBits2Float(0xc37fb0d7), SkBits2Float(0x3f3504f3));  // -428.483f, -576.909f, -311.569f, -255.691f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0xc294a419), SkBits2Float(0xc3c6124c));  // -74.3205f, -396.143f
-path.conicTo(SkBits2Float(0xc33f3c05), SkBits2Float(0xc295d95d), SkBits2Float(0xc2c2390a), SkBits2Float(0xc222aa8c), SkBits2Float(0x3f3504f3));  // -191.234f, -74.9245f, -97.1114f, -40.6665f, 0.707107f
-path.conicTo(SkBits2Float(0xc03f4154), SkBits2Float(0xc0cd12f4), SkBits2Float(0x42e3d9e6), SkBits2Float(0xc3a3d041), SkBits2Float(0x3f3504f3));  // -2.98836f, -6.40856f, 113.926f, -327.627f, 0.707107f
-path.conicTo(SkBits2Float(0x4366d6ec), SkBits2Float(0xc422361b), SkBits2Float(0x4308b76c), SkBits2Float(0xc42ac69e), SkBits2Float(0x3f3504f3));  // 230.84f, -648.845f, 136.716f, -683.103f, 0.707107f
-path.conicTo(SkBits2Float(0x422a5fb0), SkBits2Float(0xc4335721), SkBits2Float(0xc294a419), SkBits2Float(0xc3c6124c), SkBits2Float(0x3f3504f3));  // 42.5934f, -717.361f, -74.3205f, -396.143f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x4345b3f8), SkBits2Float(0xc3af9e21));  // 197.703f, -351.235f
-path.conicTo(SkBits2Float(0xc2c4aac2), SkBits2Float(0xc3345194), SkBits2Float(0xc24101bb), SkBits2Float(0xc2bb2617), SkBits2Float(0x3f3504f3));  // -98.3335f, -180.319f, -48.2517f, -93.5744f, 0.707107f
-path.conicTo(SkBits2Float(0x3fea41a0), SkBits2Float(0xc0da9066), SkBits2Float(0x4394eeee), SkBits2Float(0xc331bf31), SkBits2Float(0x3f3504f3));  // 1.83013f, -6.83013f, 297.867f, -177.747f, 0.707107f
-path.conicTo(SkBits2Float(0x441479cd), SkBits2Float(0xc3ae54f0), SkBits2Float(0x4407f490), SkBits2Float(0xc3d9b434), SkBits2Float(0x3f3504f3));  // 593.903f, -348.664f, 543.821f, -435.408f, 0.707107f
-path.conicTo(SkBits2Float(0x43f6dea8), SkBits2Float(0xc40289bc), SkBits2Float(0x4345b3f8), SkBits2Float(0xc3af9e21), SkBits2Float(0x3f3504f3));  // 493.74f, -522.152f, 197.703f, -351.235f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x43bc9c08), SkBits2Float(0xc30dfb1e));  // 377.219f, -141.981f
-path.conicTo(SkBits2Float(0x422250a2), SkBits2Float(0xc34956f5), SkBits2Float(0x41b97bee), SkBits2Float(0xc2cd653e), SkBits2Float(0x3f3504f3));  // 40.5787f, -201.34f, 23.1855f, -102.698f, 0.707107f
-path.conicTo(SkBits2Float(0x40b95a5b), SkBits2Float(0xc081c919), SkBits2Float(0x43ab375e), SkBits2Float(0x425d363a), SkBits2Float(0x3f3504f3));  // 5.79228f, -4.0558f, 342.433f, 55.303f, 0.707107f
-path.conicTo(SkBits2Float(0x4429c4a9), SkBits2Float(0x42e552cb), SkBits2Float(0x442e1dd4), SkBits2Float(0x4180287c), SkBits2Float(0x3f3504f3));  // 679.073f, 114.662f, 696.466f, 16.0198f, 0.707107f
-path.conicTo(SkBits2Float(0x443276ff), SkBits2Float(0xc2a53e8d), SkBits2Float(0x43bc9c08), SkBits2Float(0xc30dfb1e), SkBits2Float(0x3f3504f3));  // 713.859f, -82.6222f, 377.219f, -141.981f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x43be1d75), SkBits2Float(0x4305b53c));  // 380.23f, 133.708f
-path.conicTo(SkBits2Float(0x432080f6), SkBits2Float(0xc30026d3), SkBits2Float(0x42a78c44), SkBits2Float(0xc27f121c), SkBits2Float(0x3f3504f3));  // 160.504f, -128.152f, 83.774f, -63.7677f, 0.707107f
-path.conicTo(SkBits2Float(0x40e169c3), SkBits2Float(0x3f1dc4b8), SkBits2Float(0x4362c542), SkBits2Float(0x43833cea), SkBits2Float(0x3f3504f3));  // 7.04416f, 0.616283f, 226.771f, 262.476f, 0.707107f
-path.conicTo(SkBits2Float(0x43df3f9c), SkBits2Float(0x44031579), SkBits2Float(0x4402ce83), SkBits2Float(0x43e5f9cc), SkBits2Float(0x3f3504f3));  // 446.497f, 524.336f, 523.227f, 459.952f, 0.707107f
-path.conicTo(SkBits2Float(0x4415fd38), SkBits2Float(0x43c5c8a6), SkBits2Float(0x43be1d75), SkBits2Float(0x4305b53c), SkBits2Float(0x3f3504f3));  // 599.957f, 395.568f, 380.23f, 133.708f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x434d53ca), SkBits2Float(0x44487cfb));  // 205.327f, 801.953f
-path.conicTo(SkBits2Float(0x434d53ca), SkBits2Float(0x43e60f46), SkBits2Float(0x42d253ca), SkBits2Float(0x43e60f46), SkBits2Float(0x3f3504f3));  // 205.327f, 460.119f, 105.164f, 460.119f, 0.707107f
-path.conicTo(SkBits2Float(0x40a00000), SkBits2Float(0x43e60f46), SkBits2Float(0x40a00000), SkBits2Float(0x44487cfb), SkBits2Float(0x3f3504f3));  // 5, 460.119f, 5, 801.953f, 0.707107f
-path.conicTo(SkBits2Float(0x40a00000), SkBits2Float(0x448ef92a), SkBits2Float(0x42d253ca), SkBits2Float(0x448ef92a), SkBits2Float(0x3f3504f3));  // 5, 1143.79f, 105.164f, 1143.79f, 0.707107f
-path.conicTo(SkBits2Float(0x434d53ca), SkBits2Float(0x448ef92a), SkBits2Float(0x434d53ca), SkBits2Float(0x44487cfb), SkBits2Float(0x3f3504f3));  // 205.327f, 1143.79f, 205.327f, 801.953f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0xc2834d04), SkBits2Float(0x445532a0));  // -65.6504f, 852.791f
-path.conicTo(SkBits2Float(0x431a136e), SkBits2Float(0x4413bb9c), SkBits2Float(0x429ab133), SkBits2Float(0x4403a309), SkBits2Float(0x3f3504f3));  // 154.076f, 590.931f, 77.3461f, 526.547f, 0.707107f
-path.conicTo(SkBits2Float(0x3f1dc4d0), SkBits2Float(0x43e714ed), SkBits2Float(0xc35b1c2c), SkBits2Float(0x4435017b), SkBits2Float(0x3f3504f3));  // 0.616284f, 462.163f, -219.11f, 724.023f, 0.707107f
-path.conicTo(SkBits2Float(0xc3db6b0e), SkBits2Float(0x4476787f), SkBits2Float(0xc3b50da4), SkBits2Float(0x44834889), SkBits2Float(0x3f3504f3));  // -438.836f, 985.883f, -362.107f, 1050.27f, 0.707107f
-path.conicTo(SkBits2Float(0xc38eb03a), SkBits2Float(0x448b54d2), SkBits2Float(0xc2834d04), SkBits2Float(0x445532a0), SkBits2Float(0x3f3504f3));  // -285.377f, 1114.65f, -65.6504f, 852.791f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0xc398f46d), SkBits2Float(0x44336379));  // -305.91f, 717.554f
-path.conicTo(SkBits2Float(0x41f5d870), SkBits2Float(0x44248c83), SkBits2Float(0x41556629), SkBits2Float(0x440be36d), SkBits2Float(0x3f3504f3));  // 30.7307f, 658.195f, 13.3374f, 559.554f, 0.707107f
-path.conicTo(SkBits2Float(0xc081c918), SkBits2Float(0x43e674af), SkBits2Float(0xc3aa5918), SkBits2Float(0x4402114e), SkBits2Float(0x3f3504f3));  // -4.0558f, 460.912f, -340.696f, 520.27f, 0.707107f
-path.conicTo(SkBits2Float(0xc4295587), SkBits2Float(0x4410e844), SkBits2Float(0xc424fc5c), SkBits2Float(0x4429915a), SkBits2Float(0x3f3504f3));  // -677.336f, 579.629f, -659.943f, 678.271f, 0.707107f
-path.conicTo(SkBits2Float(0xc420a331), SkBits2Float(0x44423a6f), SkBits2Float(0xc398f46d), SkBits2Float(0x44336379), SkBits2Float(0x3f3504f3));  // -642.55f, 776.913f, -305.91f, 717.554f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0xc3c983e0), SkBits2Float(0x43e5c2b7));  // -403.03f, 459.521f
-path.conicTo(SkBits2Float(0xc2d5fcd2), SkBits2Float(0x441d9c08), SkBits2Float(0xc263a5d9), SkBits2Float(0x4407ec66), SkBits2Float(0x3f3504f3));  // -106.994f, 630.438f, -56.912f, 543.694f, 0.707107f
-path.conicTo(SkBits2Float(0xc0da9066), SkBits2Float(0x43e47988), SkBits2Float(0xc3976eed), SkBits2Float(0x438f042f), SkBits2Float(0x3f3504f3));  // -6.83013f, 456.949f, -302.867f, 286.033f, 0.707107f
-path.conicTo(SkBits2Float(0xc415b9cc), SkBits2Float(0x42e63b5c), SkBits2Float(0xc4223f09), SkBits2Float(0x4349dc36), SkBits2Float(0x3f3504f3));  // -598.903f, 115.116f, -648.985f, 201.86f, 0.707107f
-path.conicTo(SkBits2Float(0xc42ec446), SkBits2Float(0x43904d5e), SkBits2Float(0xc3c983e0), SkBits2Float(0x43e5c2b7), SkBits2Float(0x3f3504f3));  // -699.067f, 288.604f, -403.03f, 459.521f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0xc39bc8c8), SkBits2Float(0x43476db5));  // -311.569f, 199.429f
-path.conicTo(SkBits2Float(0xc342a797), SkBits2Float(0x44022968), SkBits2Float(0xc2c9102e), SkBits2Float(0x43f331c9), SkBits2Float(0x3f3504f3));  // -194.655f, 520.647f, -100.532f, 486.389f, 0.707107f
-path.conicTo(SkBits2Float(0xc0cd12f5), SkBits2Float(0x43e210c3), SkBits2Float(0xc2f6a523), SkBits2Float(0x4302e99e), SkBits2Float(0x3f3504f3));  // -6.40856f, 452.131f, -123.323f, 130.913f, 0.707107f
-path.conicTo(SkBits2Float(0xc3703c8a), SkBits2Float(0xc33e4e50), SkBits2Float(0xc3a72e05), SkBits2Float(0xc31c0c44), SkBits2Float(0x3f3504f3));  // -240.236f, -190.306f, -334.36f, -156.048f, 0.707107f
-path.conicTo(SkBits2Float(0xc3d63dc5), SkBits2Float(0xc2f39470), SkBits2Float(0xc39bc8c8), SkBits2Float(0x43476db5), SkBits2Float(0x3f3504f3));  // -428.483f, -121.79f, -311.569f, 199.429f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0xc294a419), SkBits2Float(0x426be7d0));  // -74.3205f, 58.9764f
-path.conicTo(SkBits2Float(0xc33f3c05), SkBits2Float(0x43be18ef), SkBits2Float(0xc2c2390a), SkBits2Float(0x43cf39f4), SkBits2Float(0x3f3504f3));  // -191.234f, 380.195f, -97.1114f, 414.453f, 0.707107f
-path.conicTo(SkBits2Float(0xc03f4154), SkBits2Float(0x43e05afa), SkBits2Float(0x42e3d9e6), SkBits2Float(0x42fefc14), SkBits2Float(0x3f3504f3));  // -2.98836f, 448.711f, 113.926f, 127.492f, 0.707107f
-path.conicTo(SkBits2Float(0x4366d6ec), SkBits2Float(0xc341b9e0), SkBits2Float(0x4308b76c), SkBits2Float(0xc363fbec), SkBits2Float(0x3f3504f3));  // 230.84f, -193.726f, 136.716f, -227.984f, 0.707107f
-path.conicTo(SkBits2Float(0x422a5fb0), SkBits2Float(0xc3831efc), SkBits2Float(0xc294a419), SkBits2Float(0x426be7d0), SkBits2Float(0x3f3504f3));  // 42.5934f, -262.242f, -74.3205f, 58.9764f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x4345b3f8), SkBits2Float(0x42cfc494));  // 197.703f, 103.884f
-path.conicTo(SkBits2Float(0xc2c4aac2), SkBits2Float(0x4389667c), SkBits2Float(0xc24101bb), SkBits2Float(0x43b4c5c0), SkBits2Float(0x3f3504f3));  // -98.3335f, 274.801f, -48.2517f, 361.545f, 0.707107f
-path.conicTo(SkBits2Float(0x3fea41a0), SkBits2Float(0x43e02504), SkBits2Float(0x4394eeee), SkBits2Float(0x438aafae), SkBits2Float(0x3f3504f3));  // 1.83013f, 448.289f, 297.867f, 277.372f, 0.707107f
-path.conicTo(SkBits2Float(0x441479cd), SkBits2Float(0x42d4e958), SkBits2Float(0x4407f490), SkBits2Float(0x419db120), SkBits2Float(0x3f3504f3));  // 593.903f, 106.456f, 543.821f, 19.7115f, 0.707107f
-path.conicTo(SkBits2Float(0x43f6dea8), SkBits2Float(0xc28610c8), SkBits2Float(0x4345b3f8), SkBits2Float(0x42cfc494), SkBits2Float(0x3f3504f3));  // 493.74f, -67.0328f, 197.703f, 103.884f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x43bc9c08), SkBits2Float(0x439c91b7));  // 377.219f, 313.138f
-path.conicTo(SkBits2Float(0x422250a2), SkBits2Float(0x437dc797), SkBits2Float(0x41b97bee), SkBits2Float(0x43b035f6), SkBits2Float(0x3f3504f3));  // 40.5787f, 253.78f, 23.1855f, 352.422f, 0.707107f
-path.conicTo(SkBits2Float(0x40b95a5b), SkBits2Float(0x43e18822), SkBits2Float(0x43ab375e), SkBits2Float(0x43ff360d), SkBits2Float(0x3f3504f3));  // 5.79228f, 451.064f, 342.433f, 510.422f, 0.707107f
-path.conicTo(SkBits2Float(0x4429c4a9), SkBits2Float(0x440e71fc), SkBits2Float(0x442e1dd4), SkBits2Float(0x43eb91ce), SkBits2Float(0x3f3504f3));  // 679.073f, 569.781f, 696.466f, 471.139f, 0.707107f
-path.conicTo(SkBits2Float(0x443276ff), SkBits2Float(0x43ba3fa3), SkBits2Float(0x43bc9c08), SkBits2Float(0x439c91b7), SkBits2Float(0x3f3504f3));  // 713.859f, 372.497f, 377.219f, 313.138f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x43be1d75), SkBits2Float(0x441334f2));  // 380.23f, 588.827f
-path.conicTo(SkBits2Float(0x432080f6), SkBits2Float(0x43a37bdc), SkBits2Float(0x42a78c44), SkBits2Float(0x43c3ad02), SkBits2Float(0x3f3504f3));  // 160.504f, 326.968f, 83.774f, 391.352f, 0.707107f
-path.conicTo(SkBits2Float(0x40e169c3), SkBits2Float(0x43e3de28), SkBits2Float(0x4362c542), SkBits2Float(0x44336618), SkBits2Float(0x3f3504f3));  // 7.04416f, 455.736f, 226.771f, 717.595f, 0.707107f
-path.conicTo(SkBits2Float(0x43df3f9c), SkBits2Float(0x4474dd1c), SkBits2Float(0x4402ce83), SkBits2Float(0x4464c489), SkBits2Float(0x3f3504f3));  // 446.497f, 979.455f, 523.227f, 915.071f, 0.707107f
-path.conicTo(SkBits2Float(0x4415fd38), SkBits2Float(0x4454abf6), SkBits2Float(0x43be1d75), SkBits2Float(0x441334f2), SkBits2Float(0x3f3504f3));  // 599.957f, 850.687f, 380.23f, 588.827f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x43bb9978), SkBits2Float(0x43ad6ab0));  // 375.199f, 346.833f
-path.conicTo(SkBits2Float(0x43bb9978), SkBits2Float(0x40a00000), SkBits2Float(0x43898486), SkBits2Float(0x40a00000), SkBits2Float(0x3f3504f3));  // 375.199f, 5, 275.035f, 5, 0.707107f
-path.conicTo(SkBits2Float(0x432edf26), SkBits2Float(0x40a00000), SkBits2Float(0x432edf26), SkBits2Float(0x43ad6ab0), SkBits2Float(0x3f3504f3));  // 174.872f, 5, 174.872f, 346.833f, 0.707107f
-path.conicTo(SkBits2Float(0x432edf26), SkBits2Float(0x442c2ab0), SkBits2Float(0x43898486), SkBits2Float(0x442c2ab0), SkBits2Float(0x3f3504f3));  // 174.872f, 688.667f, 275.035f, 688.667f, 0.707107f
-path.conicTo(SkBits2Float(0x43bb9978), SkBits2Float(0x442c2ab0), SkBits2Float(0x43bb9978), SkBits2Float(0x43ad6ab0), SkBits2Float(0x3f3504f3));  // 375.199f, 688.667f, 375.199f, 346.833f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x42d07148), SkBits2Float(0x43c6d5fb));  // 104.221f, 397.672f
-path.conicTo(SkBits2Float(0x43a1f94a), SkBits2Float(0x4307cfe3), SkBits2Float(0x437737c0), SkBits2Float(0x428edb31), SkBits2Float(0x3f3504f3));  // 323.948f, 135.812f, 247.218f, 71.4281f, 0.707107f
-path.conicTo(SkBits2Float(0x432a7ceb), SkBits2Float(0x40e169c2), SkBits2Float(0xc244f418), SkBits2Float(0x438673b0), SkBits2Float(0x3f3504f3));  // 170.488f, 7.04416f, -49.2384f, 268.904f, 0.707107f
-path.conicTo(SkBits2Float(0xc3867b7b), SkBits2Float(0x4404b0dc), SkBits2Float(0xc3403c22), SkBits2Float(0x4414c96f), SkBits2Float(0x3f3504f3));  // -268.965f, 530.763f, -192.235f, 595.147f, 0.707107f
-path.conicTo(SkBits2Float(0xc2e7029c), SkBits2Float(0x4424e202), SkBits2Float(0x42d07148), SkBits2Float(0x43c6d5fb), SkBits2Float(0x3f3504f3));  // -115.505f, 659.531f, 104.221f, 397.672f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0xc30809b4), SkBits2Float(0x438337ac));  // -136.038f, 262.435f
-path.conicTo(SkBits2Float(0x43489a34), SkBits2Float(0x434b137f), SkBits2Float(0x43373589), SkBits2Float(0x42d0de52), SkBits2Float(0x3f3504f3));  // 200.602f, 203.076f, 183.209f, 104.434f, 0.707107f
-path.conicTo(SkBits2Float(0x4325d0dd), SkBits2Float(0x40b95a5c), SkBits2Float(0xc32ad30a), SkBits2Float(0x42824d58), SkBits2Float(0x3f3504f3));  // 165.816f, 5.79228f, -170.824f, 65.1511f, 0.707107f
-path.conicTo(SkBits2Float(0xc3fdbb7b), SkBits2Float(0x42f9050a), SkBits2Float(0xc3f50925), SkBits2Float(0x435f26db), SkBits2Float(0x3f3504f3));  // -507.465f, 124.51f, -490.071f, 223.152f, 0.707107f
-path.conicTo(SkBits2Float(0xc3ec56cf), SkBits2Float(0x43a0e598), SkBits2Float(0xc30809b4), SkBits2Float(0x438337ac), SkBits2Float(0x3f3504f3));  // -472.678f, 321.794f, -136.038f, 262.435f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0xc369289a), SkBits2Float(0x408cdc40));  // -233.159f, 4.40189f
-path.conicTo(SkBits2Float(0x427b82f4), SkBits2Float(0x432f5193), SkBits2Float(0x42e1eb60), SkBits2Float(0x42b12617), SkBits2Float(0x3f3504f3));  // 62.8779f, 175.319f, 112.96f, 88.5744f, 0.707107f
-path.conicTo(SkBits2Float(0x43230aa3), SkBits2Float(0x3fea4196), SkBits2Float(0xc304feb4), SkBits2Float(0xc329162e), SkBits2Float(0x3f3504f3));  // 163.042f, 1.83013f, -132.995f, -169.087f, 0.707107f
-path.conicTo(SkBits2Float(0xc3d68405), SkBits2Float(0xc3aa006f), SkBits2Float(0xc3ef8e7f), SkBits2Float(0xc37d4256), SkBits2Float(0x3f3504f3));  // -429.031f, -340.003f, -479.113f, -253.259f, 0.707107f
-path.conicTo(SkBits2Float(0xc4044c7c), SkBits2Float(0xc32683cf), SkBits2Float(0xc369289a), SkBits2Float(0x408cdc40), SkBits2Float(0x3f3504f3));  // -529.195f, -166.515f, -233.159f, 4.40189f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0xc30db26a), SkBits2Float(0xc37fb0d7));  // -141.697f, -255.691f
-path.conicTo(SkBits2Float(0xc1c64388), SkBits2Float(0x42830e25), SkBits2Float(0x428aae1e), SkBits2Float(0x41fa2834), SkBits2Float(0x3f3504f3));  // -24.783f, 65.5276f, 69.3401f, 31.2696f, 0.707107f
-path.conicTo(SkBits2Float(0x4323768e), SkBits2Float(0xc03f4152), SkBits2Float(0x423a3252), SkBits2Float(0xc3a21a77), SkBits2Float(0x3f3504f3));  // 163.463f, -2.98836f, 46.5491f, -324.207f, 0.707107f
-path.conicTo(SkBits2Float(0xc28cbac8), SkBits2Float(0xc4215b37), SkBits2Float(0xc3247ce4), SkBits2Float(0xc418cab4), SkBits2Float(0x3f3504f3));  // -70.3648f, -645.425f, -164.488f, -611.167f, 0.707107f
-path.conicTo(SkBits2Float(0xc3814e32), SkBits2Float(0xc4103a31), SkBits2Float(0xc30db26a), SkBits2Float(0xc37fb0d7), SkBits2Float(0x3f3504f3));  // -258.611f, -576.909f, -141.697f, -255.691f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x42bf1a33), SkBits2Float(0xc3c6124c));  // 95.5512f, -396.143f
-path.conicTo(SkBits2Float(0xc1aae6f8), SkBits2Float(0xc295d95d), SkBits2Float(0x42918542), SkBits2Float(0xc222aa8c), SkBits2Float(0x3f3504f3));  // -21.3628f, -74.9245f, 72.7603f, -40.6665f, 0.707107f
-path.conicTo(SkBits2Float(0x4326e221), SkBits2Float(0xc0cd12f4), SkBits2Float(0x438de60c), SkBits2Float(0xc3a3d041), SkBits2Float(0x3f3504f3));  // 166.883f, -6.40856f, 283.797f, -327.627f, 0.707107f
-path.conicTo(SkBits2Float(0x43c85b09), SkBits2Float(0xc422361b), SkBits2Float(0x43994b49), SkBits2Float(0xc42ac69e), SkBits2Float(0x3f3504f3));  // 400.711f, -648.845f, 306.588f, -683.103f, 0.707107f
-path.conicTo(SkBits2Float(0x43547712), SkBits2Float(0xc4335721), SkBits2Float(0x42bf1a33), SkBits2Float(0xc3c6124c), SkBits2Float(0x3f3504f3));  // 212.465f, -717.361f, 95.5512f, -396.143f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x43b7c98f), SkBits2Float(0xc3af9e21));  // 367.575f, -351.235f
-path.conicTo(SkBits2Float(0x428f138a), SkBits2Float(0xc3345194), SkBits2Float(0x42f33d6e), SkBits2Float(0xc2bb2617), SkBits2Float(0x3f3504f3));  // 71.5382f, -180.319f, 121.62f, -93.5744f, 0.707107f
-path.conicTo(SkBits2Float(0x432bb3a9), SkBits2Float(0xc0da9066), SkBits2Float(0x43e9de81), SkBits2Float(0xc331bf31), SkBits2Float(0x3f3504f3));  // 171.702f, -6.83013f, 467.738f, -177.747f, 0.707107f
-path.conicTo(SkBits2Float(0x443ef196), SkBits2Float(0xc3ae54f0), SkBits2Float(0x44326c5a), SkBits2Float(0xc3d9b434), SkBits2Float(0x3f3504f3));  // 763.775f, -348.664f, 713.693f, -435.408f, 0.707107f
-path.conicTo(SkBits2Float(0x4425e71e), SkBits2Float(0xc40289bc), SkBits2Float(0x43b7c98f), SkBits2Float(0xc3af9e21), SkBits2Float(0x3f3504f3));  // 663.611f, -522.152f, 367.575f, -351.235f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x4408c5ce), SkBits2Float(0xc30dfb1e));  // 547.091f, -141.981f
-path.conicTo(SkBits2Float(0x4352734e), SkBits2Float(0xc34956f5), SkBits2Float(0x43410ea4), SkBits2Float(0xc2cd653e), SkBits2Float(0x3f3504f3));  // 210.45f, -201.34f, 193.057f, -102.698f, 0.707107f
-path.conicTo(SkBits2Float(0x432fa9f9), SkBits2Float(0xc081c919), SkBits2Float(0x44001378), SkBits2Float(0x425d363a), SkBits2Float(0x3f3504f3));  // 175.664f, -4.0558f, 512.304f, 55.303f, 0.707107f
-path.conicTo(SkBits2Float(0x44543c72), SkBits2Float(0x42e552cb), SkBits2Float(0x4458959e), SkBits2Float(0x4180287c), SkBits2Float(0x3f3504f3));  // 848.944f, 114.662f, 866.338f, 16.0198f, 0.707107f
-path.conicTo(SkBits2Float(0x445ceec8), SkBits2Float(0xc2a53e8d), SkBits2Float(0x4408c5ce), SkBits2Float(0xc30dfb1e), SkBits2Float(0x3f3504f3));  // 883.731f, -82.6222f, 547.091f, -141.981f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x44098684), SkBits2Float(0x4305b53c));  // 550.102f, 133.708f
-path.conicTo(SkBits2Float(0x43a5300e), SkBits2Float(0xc30026d3), SkBits2Float(0x437da548), SkBits2Float(0xc27f121c), SkBits2Float(0x3f3504f3));  // 330.375f, -128.152f, 253.646f, -63.7677f, 0.707107f
-path.conicTo(SkBits2Float(0x4330ea74), SkBits2Float(0x3f1dc4b8), SkBits2Float(0x43c65234), SkBits2Float(0x43833cea), SkBits2Float(0x3f3504f3));  // 176.916f, 0.616283f, 396.642f, 262.476f, 0.707107f
-path.conicTo(SkBits2Float(0x441a1798), SkBits2Float(0x44031579), SkBits2Float(0x442d464c), SkBits2Float(0x43e5f9cc), SkBits2Float(0x3f3504f3));  // 616.369f, 524.336f, 693.098f, 459.952f, 0.707107f
-path.conicTo(SkBits2Float(0x44407502), SkBits2Float(0x43c5c8a6), SkBits2Float(0x44098684), SkBits2Float(0x4305b53c), SkBits2Float(0x3f3504f3));  // 769.828f, 395.568f, 550.102f, 133.708f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x43bb9978), SkBits2Float(0x44487cfb));  // 375.199f, 801.953f
-path.conicTo(SkBits2Float(0x43bb9978), SkBits2Float(0x43e60f46), SkBits2Float(0x43898486), SkBits2Float(0x43e60f46), SkBits2Float(0x3f3504f3));  // 375.199f, 460.119f, 275.035f, 460.119f, 0.707107f
-path.conicTo(SkBits2Float(0x432edf26), SkBits2Float(0x43e60f46), SkBits2Float(0x432edf26), SkBits2Float(0x44487cfb), SkBits2Float(0x3f3504f3));  // 174.872f, 460.119f, 174.872f, 801.953f, 0.707107f
-path.conicTo(SkBits2Float(0x432edf26), SkBits2Float(0x448ef92a), SkBits2Float(0x43898486), SkBits2Float(0x448ef92a), SkBits2Float(0x3f3504f3));  // 174.872f, 1143.79f, 275.035f, 1143.79f, 0.707107f
-path.conicTo(SkBits2Float(0x43bb9978), SkBits2Float(0x448ef92a), SkBits2Float(0x43bb9978), SkBits2Float(0x44487cfb), SkBits2Float(0x3f3504f3));  // 375.199f, 1143.79f, 375.199f, 801.953f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x42d07148), SkBits2Float(0x445532a0));  // 104.221f, 852.791f
-path.conicTo(SkBits2Float(0x43a1f94a), SkBits2Float(0x4413bb9c), SkBits2Float(0x437737c0), SkBits2Float(0x4403a309), SkBits2Float(0x3f3504f3));  // 323.948f, 590.931f, 247.218f, 526.547f, 0.707107f
-path.conicTo(SkBits2Float(0x432a7ceb), SkBits2Float(0x43e714ed), SkBits2Float(0xc244f418), SkBits2Float(0x4435017b), SkBits2Float(0x3f3504f3));  // 170.488f, 462.163f, -49.2384f, 724.023f, 0.707107f
-path.conicTo(SkBits2Float(0xc3867b7b), SkBits2Float(0x4476787f), SkBits2Float(0xc3403c22), SkBits2Float(0x44834889), SkBits2Float(0x3f3504f3));  // -268.965f, 985.883f, -192.235f, 1050.27f, 0.707107f
-path.conicTo(SkBits2Float(0xc2e7029c), SkBits2Float(0x448b54d2), SkBits2Float(0x42d07148), SkBits2Float(0x445532a0), SkBits2Float(0x3f3504f3));  // -115.505f, 1114.65f, 104.221f, 852.791f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0xc30809b4), SkBits2Float(0x44336379));  // -136.038f, 717.554f
-path.conicTo(SkBits2Float(0x43489a34), SkBits2Float(0x44248c83), SkBits2Float(0x43373589), SkBits2Float(0x440be36d), SkBits2Float(0x3f3504f3));  // 200.602f, 658.195f, 183.209f, 559.554f, 0.707107f
-path.conicTo(SkBits2Float(0x4325d0dd), SkBits2Float(0x43e674af), SkBits2Float(0xc32ad30a), SkBits2Float(0x4402114e), SkBits2Float(0x3f3504f3));  // 165.816f, 460.912f, -170.824f, 520.27f, 0.707107f
-path.conicTo(SkBits2Float(0xc3fdbb7b), SkBits2Float(0x4410e844), SkBits2Float(0xc3f50925), SkBits2Float(0x4429915a), SkBits2Float(0x3f3504f3));  // -507.465f, 579.629f, -490.071f, 678.271f, 0.707107f
-path.conicTo(SkBits2Float(0xc3ec56cf), SkBits2Float(0x44423a6f), SkBits2Float(0xc30809b4), SkBits2Float(0x44336379), SkBits2Float(0x3f3504f3));  // -472.678f, 776.913f, -136.038f, 717.554f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0xc369289a), SkBits2Float(0x43e5c2b7));  // -233.159f, 459.521f
-path.conicTo(SkBits2Float(0x427b82f4), SkBits2Float(0x441d9c08), SkBits2Float(0x42e1eb60), SkBits2Float(0x4407ec66), SkBits2Float(0x3f3504f3));  // 62.8779f, 630.438f, 112.96f, 543.694f, 0.707107f
-path.conicTo(SkBits2Float(0x43230aa3), SkBits2Float(0x43e47988), SkBits2Float(0xc304feb4), SkBits2Float(0x438f042f), SkBits2Float(0x3f3504f3));  // 163.042f, 456.949f, -132.995f, 286.033f, 0.707107f
-path.conicTo(SkBits2Float(0xc3d68405), SkBits2Float(0x42e63b5c), SkBits2Float(0xc3ef8e7f), SkBits2Float(0x4349dc36), SkBits2Float(0x3f3504f3));  // -429.031f, 115.116f, -479.113f, 201.86f, 0.707107f
-path.conicTo(SkBits2Float(0xc4044c7c), SkBits2Float(0x43904d5e), SkBits2Float(0xc369289a), SkBits2Float(0x43e5c2b7), SkBits2Float(0x3f3504f3));  // -529.195f, 288.604f, -233.159f, 459.521f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0xc30db26a), SkBits2Float(0x43476db5));  // -141.697f, 199.429f
-path.conicTo(SkBits2Float(0xc1c64388), SkBits2Float(0x44022968), SkBits2Float(0x428aae1e), SkBits2Float(0x43f331c9), SkBits2Float(0x3f3504f3));  // -24.783f, 520.647f, 69.3401f, 486.389f, 0.707107f
-path.conicTo(SkBits2Float(0x4323768e), SkBits2Float(0x43e210c3), SkBits2Float(0x423a3252), SkBits2Float(0x4302e99e), SkBits2Float(0x3f3504f3));  // 163.463f, 452.131f, 46.5491f, 130.913f, 0.707107f
-path.conicTo(SkBits2Float(0xc28cbac8), SkBits2Float(0xc33e4e50), SkBits2Float(0xc3247ce4), SkBits2Float(0xc31c0c44), SkBits2Float(0x3f3504f3));  // -70.3648f, -190.306f, -164.488f, -156.048f, 0.707107f
-path.conicTo(SkBits2Float(0xc3814e32), SkBits2Float(0xc2f39470), SkBits2Float(0xc30db26a), SkBits2Float(0x43476db5), SkBits2Float(0x3f3504f3));  // -258.611f, -121.79f, -141.697f, 199.429f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x42bf1a33), SkBits2Float(0x426be7d0));  // 95.5512f, 58.9764f
-path.conicTo(SkBits2Float(0xc1aae6f8), SkBits2Float(0x43be18ef), SkBits2Float(0x42918542), SkBits2Float(0x43cf39f4), SkBits2Float(0x3f3504f3));  // -21.3628f, 380.195f, 72.7603f, 414.453f, 0.707107f
-path.conicTo(SkBits2Float(0x4326e221), SkBits2Float(0x43e05afa), SkBits2Float(0x438de60c), SkBits2Float(0x42fefc14), SkBits2Float(0x3f3504f3));  // 166.883f, 448.711f, 283.797f, 127.492f, 0.707107f
-path.conicTo(SkBits2Float(0x43c85b09), SkBits2Float(0xc341b9e0), SkBits2Float(0x43994b49), SkBits2Float(0xc363fbec), SkBits2Float(0x3f3504f3));  // 400.711f, -193.726f, 306.588f, -227.984f, 0.707107f
-path.conicTo(SkBits2Float(0x43547712), SkBits2Float(0xc3831efc), SkBits2Float(0x42bf1a33), SkBits2Float(0x426be7d0), SkBits2Float(0x3f3504f3));  // 212.465f, -262.242f, 95.5512f, 58.9764f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x43b7c98f), SkBits2Float(0x42cfc494));  // 367.575f, 103.884f
-path.conicTo(SkBits2Float(0x428f138a), SkBits2Float(0x4389667c), SkBits2Float(0x42f33d6e), SkBits2Float(0x43b4c5c0), SkBits2Float(0x3f3504f3));  // 71.5382f, 274.801f, 121.62f, 361.545f, 0.707107f
-path.conicTo(SkBits2Float(0x432bb3a9), SkBits2Float(0x43e02504), SkBits2Float(0x43e9de81), SkBits2Float(0x438aafae), SkBits2Float(0x3f3504f3));  // 171.702f, 448.289f, 467.738f, 277.372f, 0.707107f
-path.conicTo(SkBits2Float(0x443ef196), SkBits2Float(0x42d4e958), SkBits2Float(0x44326c5a), SkBits2Float(0x419db120), SkBits2Float(0x3f3504f3));  // 763.775f, 106.456f, 713.693f, 19.7115f, 0.707107f
-path.conicTo(SkBits2Float(0x4425e71e), SkBits2Float(0xc28610c8), SkBits2Float(0x43b7c98f), SkBits2Float(0x42cfc494), SkBits2Float(0x3f3504f3));  // 663.611f, -67.0328f, 367.575f, 103.884f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x4408c5ce), SkBits2Float(0x439c91b7));  // 547.091f, 313.138f
-path.conicTo(SkBits2Float(0x4352734e), SkBits2Float(0x437dc797), SkBits2Float(0x43410ea4), SkBits2Float(0x43b035f6), SkBits2Float(0x3f3504f3));  // 210.45f, 253.78f, 193.057f, 352.422f, 0.707107f
-path.conicTo(SkBits2Float(0x432fa9f9), SkBits2Float(0x43e18822), SkBits2Float(0x44001378), SkBits2Float(0x43ff360d), SkBits2Float(0x3f3504f3));  // 175.664f, 451.064f, 512.304f, 510.422f, 0.707107f
-path.conicTo(SkBits2Float(0x44543c72), SkBits2Float(0x440e71fc), SkBits2Float(0x4458959e), SkBits2Float(0x43eb91ce), SkBits2Float(0x3f3504f3));  // 848.944f, 569.781f, 866.338f, 471.139f, 0.707107f
-path.conicTo(SkBits2Float(0x445ceec8), SkBits2Float(0x43ba3fa3), SkBits2Float(0x4408c5ce), SkBits2Float(0x439c91b7), SkBits2Float(0x3f3504f3));  // 883.731f, 372.497f, 547.091f, 313.138f, 0.707107f
-path.close();
-path.moveTo(SkBits2Float(0x44098684), SkBits2Float(0x441334f2));  // 550.102f, 588.827f
-path.conicTo(SkBits2Float(0x43a5300e), SkBits2Float(0x43a37bdc), SkBits2Float(0x437da548), SkBits2Float(0x43c3ad02), SkBits2Float(0x3f3504f3));  // 330.375f, 326.968f, 253.646f, 391.352f, 0.707107f
-path.conicTo(SkBits2Float(0x4330ea74), SkBits2Float(0x43e3de28), SkBits2Float(0x43c65234), SkBits2Float(0x44336618), SkBits2Float(0x3f3504f3));  // 176.916f, 455.736f, 396.642f, 717.595f, 0.707107f
-path.conicTo(SkBits2Float(0x441a1798), SkBits2Float(0x4474dd1c), SkBits2Float(0x442d464c), SkBits2Float(0x4464c489), SkBits2Float(0x3f3504f3));  // 616.369f, 979.455f, 693.098f, 915.071f, 0.707107f
-path.conicTo(SkBits2Float(0x44407502), SkBits2Float(0x4454abf6), SkBits2Float(0x44098684), SkBits2Float(0x441334f2), SkBits2Float(0x3f3504f3));  // 769.828f, 850.687f, 550.102f, 588.827f, 0.707107f
-path.close();
-SkPath lastFailed = path;
-#if DEBUG_SIMPLIFY_FAILS
-    for (;;) {
-        SkPath failed = subset_simplify_fail(reporter, lastFailed);
-        if (failed == lastFailed) {
-            break;
-        }
-        lastFailed = failed;
-    }
-#endif
-    testSimplify(reporter, lastFailed, __FUNCTION__);
+    SkPath path = SkPathBuilder()
+    .moveTo(SkBits2Float(0x434d53ca), SkBits2Float(0x43ad6ab0))  // 205.327f, 346.833f
+    .conicTo(SkBits2Float(0x434d53ca), SkBits2Float(0x40a00000), SkBits2Float(0x42d253ca), SkBits2Float(0x40a00000), SkBits2Float(0x3f3504f3))   // 205.327f, 5, 105.164f, 5, 0.707107f
+    .conicTo(SkBits2Float(0x40a00000), SkBits2Float(0x40a00000), SkBits2Float(0x40a00000), SkBits2Float(0x43ad6ab0), SkBits2Float(0x3f3504f3))   // 5, 5, 5, 346.833f, 0.707107f
+    .conicTo(SkBits2Float(0x40a00000), SkBits2Float(0x442c2ab0), SkBits2Float(0x42d253ca), SkBits2Float(0x442c2ab0), SkBits2Float(0x3f3504f3))   // 5, 688.667f, 105.164f, 688.667f, 0.707107f
+    .conicTo(SkBits2Float(0x434d53ca), SkBits2Float(0x442c2ab0), SkBits2Float(0x434d53ca), SkBits2Float(0x43ad6ab0), SkBits2Float(0x3f3504f3))   // 205.327f, 688.667f, 205.327f, 346.833f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0xc2834d04), SkBits2Float(0x43c6d5fb))   // -65.6504f, 397.672f
+    .conicTo(SkBits2Float(0x431a136e), SkBits2Float(0x4307cfe3), SkBits2Float(0x429ab133), SkBits2Float(0x428edb31), SkBits2Float(0x3f3504f3))   // 154.076f, 135.812f, 77.3461f, 71.4281f, 0.707107f
+    .conicTo(SkBits2Float(0x3f1dc4d0), SkBits2Float(0x40e169c2), SkBits2Float(0xc35b1c2c), SkBits2Float(0x438673b0), SkBits2Float(0x3f3504f3))   // 0.616284f, 7.04416f, -219.11f, 268.904f, 0.707107f
+    .conicTo(SkBits2Float(0xc3db6b0e), SkBits2Float(0x4404b0dc), SkBits2Float(0xc3b50da4), SkBits2Float(0x4414c96f), SkBits2Float(0x3f3504f3))   // -438.836f, 530.763f, -362.107f, 595.147f, 0.707107f
+    .conicTo(SkBits2Float(0xc38eb03a), SkBits2Float(0x4424e202), SkBits2Float(0xc2834d04), SkBits2Float(0x43c6d5fb), SkBits2Float(0x3f3504f3))   // -285.377f, 659.531f, -65.6504f, 397.672f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0xc398f46d), SkBits2Float(0x438337ac))   // -305.91f, 262.435f
+    .conicTo(SkBits2Float(0x41f5d870), SkBits2Float(0x434b137f), SkBits2Float(0x41556629), SkBits2Float(0x42d0de52), SkBits2Float(0x3f3504f3))   // 30.7307f, 203.076f, 13.3374f, 104.434f, 0.707107f
+    .conicTo(SkBits2Float(0xc081c918), SkBits2Float(0x40b95a5c), SkBits2Float(0xc3aa5918), SkBits2Float(0x42824d58), SkBits2Float(0x3f3504f3))   // -4.0558f, 5.79228f, -340.696f, 65.1511f, 0.707107f
+    .conicTo(SkBits2Float(0xc4295587), SkBits2Float(0x42f9050a), SkBits2Float(0xc424fc5c), SkBits2Float(0x435f26db), SkBits2Float(0x3f3504f3))   // -677.336f, 124.51f, -659.943f, 223.152f, 0.707107f
+    .conicTo(SkBits2Float(0xc420a331), SkBits2Float(0x43a0e598), SkBits2Float(0xc398f46d), SkBits2Float(0x438337ac), SkBits2Float(0x3f3504f3))   // -642.55f, 321.794f, -305.91f, 262.435f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0xc3c983e0), SkBits2Float(0x408cdc40))   // -403.03f, 4.40189f
+    .conicTo(SkBits2Float(0xc2d5fcd2), SkBits2Float(0x432f5193), SkBits2Float(0xc263a5d9), SkBits2Float(0x42b12617), SkBits2Float(0x3f3504f3))   // -106.994f, 175.319f, -56.912f, 88.5744f, 0.707107f
+    .conicTo(SkBits2Float(0xc0da9066), SkBits2Float(0x3fea4196), SkBits2Float(0xc3976eed), SkBits2Float(0xc329162e), SkBits2Float(0x3f3504f3))   // -6.83013f, 1.83013f, -302.867f, -169.087f, 0.707107f
+    .conicTo(SkBits2Float(0xc415b9cc), SkBits2Float(0xc3aa006f), SkBits2Float(0xc4223f09), SkBits2Float(0xc37d4256), SkBits2Float(0x3f3504f3))   // -598.903f, -340.003f, -648.985f, -253.259f, 0.707107f
+    .conicTo(SkBits2Float(0xc42ec446), SkBits2Float(0xc32683cf), SkBits2Float(0xc3c983e0), SkBits2Float(0x408cdc40), SkBits2Float(0x3f3504f3))   // -699.067f, -166.515f, -403.03f, 4.40189f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0xc39bc8c8), SkBits2Float(0xc37fb0d7))   // -311.569f, -255.691f
+    .conicTo(SkBits2Float(0xc342a797), SkBits2Float(0x42830e25), SkBits2Float(0xc2c9102e), SkBits2Float(0x41fa2834), SkBits2Float(0x3f3504f3))   // -194.655f, 65.5276f, -100.532f, 31.2696f, 0.707107f
+    .conicTo(SkBits2Float(0xc0cd12f5), SkBits2Float(0xc03f4152), SkBits2Float(0xc2f6a523), SkBits2Float(0xc3a21a77), SkBits2Float(0x3f3504f3))   // -6.40856f, -2.98836f, -123.323f, -324.207f, 0.707107f
+    .conicTo(SkBits2Float(0xc3703c8a), SkBits2Float(0xc4215b37), SkBits2Float(0xc3a72e05), SkBits2Float(0xc418cab4), SkBits2Float(0x3f3504f3))   // -240.236f, -645.425f, -334.36f, -611.167f, 0.707107f
+    .conicTo(SkBits2Float(0xc3d63dc5), SkBits2Float(0xc4103a31), SkBits2Float(0xc39bc8c8), SkBits2Float(0xc37fb0d7), SkBits2Float(0x3f3504f3))   // -428.483f, -576.909f, -311.569f, -255.691f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0xc294a419), SkBits2Float(0xc3c6124c))   // -74.3205f, -396.143f
+    .conicTo(SkBits2Float(0xc33f3c05), SkBits2Float(0xc295d95d), SkBits2Float(0xc2c2390a), SkBits2Float(0xc222aa8c), SkBits2Float(0x3f3504f3))   // -191.234f, -74.9245f, -97.1114f, -40.6665f, 0.707107f
+    .conicTo(SkBits2Float(0xc03f4154), SkBits2Float(0xc0cd12f4), SkBits2Float(0x42e3d9e6), SkBits2Float(0xc3a3d041), SkBits2Float(0x3f3504f3))   // -2.98836f, -6.40856f, 113.926f, -327.627f, 0.707107f
+    .conicTo(SkBits2Float(0x4366d6ec), SkBits2Float(0xc422361b), SkBits2Float(0x4308b76c), SkBits2Float(0xc42ac69e), SkBits2Float(0x3f3504f3))   // 230.84f, -648.845f, 136.716f, -683.103f, 0.707107f
+    .conicTo(SkBits2Float(0x422a5fb0), SkBits2Float(0xc4335721), SkBits2Float(0xc294a419), SkBits2Float(0xc3c6124c), SkBits2Float(0x3f3504f3))   // 42.5934f, -717.361f, -74.3205f, -396.143f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x4345b3f8), SkBits2Float(0xc3af9e21))   // 197.703f, -351.235f
+    .conicTo(SkBits2Float(0xc2c4aac2), SkBits2Float(0xc3345194), SkBits2Float(0xc24101bb), SkBits2Float(0xc2bb2617), SkBits2Float(0x3f3504f3))   // -98.3335f, -180.319f, -48.2517f, -93.5744f, 0.707107f
+    .conicTo(SkBits2Float(0x3fea41a0), SkBits2Float(0xc0da9066), SkBits2Float(0x4394eeee), SkBits2Float(0xc331bf31), SkBits2Float(0x3f3504f3))   // 1.83013f, -6.83013f, 297.867f, -177.747f, 0.707107f
+    .conicTo(SkBits2Float(0x441479cd), SkBits2Float(0xc3ae54f0), SkBits2Float(0x4407f490), SkBits2Float(0xc3d9b434), SkBits2Float(0x3f3504f3))   // 593.903f, -348.664f, 543.821f, -435.408f, 0.707107f
+    .conicTo(SkBits2Float(0x43f6dea8), SkBits2Float(0xc40289bc), SkBits2Float(0x4345b3f8), SkBits2Float(0xc3af9e21), SkBits2Float(0x3f3504f3))   // 493.74f, -522.152f, 197.703f, -351.235f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x43bc9c08), SkBits2Float(0xc30dfb1e))   // 377.219f, -141.981f
+    .conicTo(SkBits2Float(0x422250a2), SkBits2Float(0xc34956f5), SkBits2Float(0x41b97bee), SkBits2Float(0xc2cd653e), SkBits2Float(0x3f3504f3))   // 40.5787f, -201.34f, 23.1855f, -102.698f, 0.707107f
+    .conicTo(SkBits2Float(0x40b95a5b), SkBits2Float(0xc081c919), SkBits2Float(0x43ab375e), SkBits2Float(0x425d363a), SkBits2Float(0x3f3504f3))   // 5.79228f, -4.0558f, 342.433f, 55.303f, 0.707107f
+    .conicTo(SkBits2Float(0x4429c4a9), SkBits2Float(0x42e552cb), SkBits2Float(0x442e1dd4), SkBits2Float(0x4180287c), SkBits2Float(0x3f3504f3))   // 679.073f, 114.662f, 696.466f, 16.0198f, 0.707107f
+    .conicTo(SkBits2Float(0x443276ff), SkBits2Float(0xc2a53e8d), SkBits2Float(0x43bc9c08), SkBits2Float(0xc30dfb1e), SkBits2Float(0x3f3504f3))   // 713.859f, -82.6222f, 377.219f, -141.981f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x43be1d75), SkBits2Float(0x4305b53c))   // 380.23f, 133.708f
+    .conicTo(SkBits2Float(0x432080f6), SkBits2Float(0xc30026d3), SkBits2Float(0x42a78c44), SkBits2Float(0xc27f121c), SkBits2Float(0x3f3504f3))   // 160.504f, -128.152f, 83.774f, -63.7677f, 0.707107f
+    .conicTo(SkBits2Float(0x40e169c3), SkBits2Float(0x3f1dc4b8), SkBits2Float(0x4362c542), SkBits2Float(0x43833cea), SkBits2Float(0x3f3504f3))   // 7.04416f, 0.616283f, 226.771f, 262.476f, 0.707107f
+    .conicTo(SkBits2Float(0x43df3f9c), SkBits2Float(0x44031579), SkBits2Float(0x4402ce83), SkBits2Float(0x43e5f9cc), SkBits2Float(0x3f3504f3))   // 446.497f, 524.336f, 523.227f, 459.952f, 0.707107f
+    .conicTo(SkBits2Float(0x4415fd38), SkBits2Float(0x43c5c8a6), SkBits2Float(0x43be1d75), SkBits2Float(0x4305b53c), SkBits2Float(0x3f3504f3))   // 599.957f, 395.568f, 380.23f, 133.708f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x434d53ca), SkBits2Float(0x44487cfb))   // 205.327f, 801.953f
+    .conicTo(SkBits2Float(0x434d53ca), SkBits2Float(0x43e60f46), SkBits2Float(0x42d253ca), SkBits2Float(0x43e60f46), SkBits2Float(0x3f3504f3))   // 205.327f, 460.119f, 105.164f, 460.119f, 0.707107f
+    .conicTo(SkBits2Float(0x40a00000), SkBits2Float(0x43e60f46), SkBits2Float(0x40a00000), SkBits2Float(0x44487cfb), SkBits2Float(0x3f3504f3))   // 5, 460.119f, 5, 801.953f, 0.707107f
+    .conicTo(SkBits2Float(0x40a00000), SkBits2Float(0x448ef92a), SkBits2Float(0x42d253ca), SkBits2Float(0x448ef92a), SkBits2Float(0x3f3504f3))   // 5, 1143.79f, 105.164f, 1143.79f, 0.707107f
+    .conicTo(SkBits2Float(0x434d53ca), SkBits2Float(0x448ef92a), SkBits2Float(0x434d53ca), SkBits2Float(0x44487cfb), SkBits2Float(0x3f3504f3))   // 205.327f, 1143.79f, 205.327f, 801.953f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0xc2834d04), SkBits2Float(0x445532a0))   // -65.6504f, 852.791f
+    .conicTo(SkBits2Float(0x431a136e), SkBits2Float(0x4413bb9c), SkBits2Float(0x429ab133), SkBits2Float(0x4403a309), SkBits2Float(0x3f3504f3))   // 154.076f, 590.931f, 77.3461f, 526.547f, 0.707107f
+    .conicTo(SkBits2Float(0x3f1dc4d0), SkBits2Float(0x43e714ed), SkBits2Float(0xc35b1c2c), SkBits2Float(0x4435017b), SkBits2Float(0x3f3504f3))   // 0.616284f, 462.163f, -219.11f, 724.023f, 0.707107f
+    .conicTo(SkBits2Float(0xc3db6b0e), SkBits2Float(0x4476787f), SkBits2Float(0xc3b50da4), SkBits2Float(0x44834889), SkBits2Float(0x3f3504f3))   // -438.836f, 985.883f, -362.107f, 1050.27f, 0.707107f
+    .conicTo(SkBits2Float(0xc38eb03a), SkBits2Float(0x448b54d2), SkBits2Float(0xc2834d04), SkBits2Float(0x445532a0), SkBits2Float(0x3f3504f3))   // -285.377f, 1114.65f, -65.6504f, 852.791f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0xc398f46d), SkBits2Float(0x44336379))   // -305.91f, 717.554f
+    .conicTo(SkBits2Float(0x41f5d870), SkBits2Float(0x44248c83), SkBits2Float(0x41556629), SkBits2Float(0x440be36d), SkBits2Float(0x3f3504f3))   // 30.7307f, 658.195f, 13.3374f, 559.554f, 0.707107f
+    .conicTo(SkBits2Float(0xc081c918), SkBits2Float(0x43e674af), SkBits2Float(0xc3aa5918), SkBits2Float(0x4402114e), SkBits2Float(0x3f3504f3))   // -4.0558f, 460.912f, -340.696f, 520.27f, 0.707107f
+    .conicTo(SkBits2Float(0xc4295587), SkBits2Float(0x4410e844), SkBits2Float(0xc424fc5c), SkBits2Float(0x4429915a), SkBits2Float(0x3f3504f3))   // -677.336f, 579.629f, -659.943f, 678.271f, 0.707107f
+    .conicTo(SkBits2Float(0xc420a331), SkBits2Float(0x44423a6f), SkBits2Float(0xc398f46d), SkBits2Float(0x44336379), SkBits2Float(0x3f3504f3))   // -642.55f, 776.913f, -305.91f, 717.554f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0xc3c983e0), SkBits2Float(0x43e5c2b7))   // -403.03f, 459.521f
+    .conicTo(SkBits2Float(0xc2d5fcd2), SkBits2Float(0x441d9c08), SkBits2Float(0xc263a5d9), SkBits2Float(0x4407ec66), SkBits2Float(0x3f3504f3))   // -106.994f, 630.438f, -56.912f, 543.694f, 0.707107f
+    .conicTo(SkBits2Float(0xc0da9066), SkBits2Float(0x43e47988), SkBits2Float(0xc3976eed), SkBits2Float(0x438f042f), SkBits2Float(0x3f3504f3))   // -6.83013f, 456.949f, -302.867f, 286.033f, 0.707107f
+    .conicTo(SkBits2Float(0xc415b9cc), SkBits2Float(0x42e63b5c), SkBits2Float(0xc4223f09), SkBits2Float(0x4349dc36), SkBits2Float(0x3f3504f3))   // -598.903f, 115.116f, -648.985f, 201.86f, 0.707107f
+    .conicTo(SkBits2Float(0xc42ec446), SkBits2Float(0x43904d5e), SkBits2Float(0xc3c983e0), SkBits2Float(0x43e5c2b7), SkBits2Float(0x3f3504f3))   // -699.067f, 288.604f, -403.03f, 459.521f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0xc39bc8c8), SkBits2Float(0x43476db5))   // -311.569f, 199.429f
+    .conicTo(SkBits2Float(0xc342a797), SkBits2Float(0x44022968), SkBits2Float(0xc2c9102e), SkBits2Float(0x43f331c9), SkBits2Float(0x3f3504f3))   // -194.655f, 520.647f, -100.532f, 486.389f, 0.707107f
+    .conicTo(SkBits2Float(0xc0cd12f5), SkBits2Float(0x43e210c3), SkBits2Float(0xc2f6a523), SkBits2Float(0x4302e99e), SkBits2Float(0x3f3504f3))   // -6.40856f, 452.131f, -123.323f, 130.913f, 0.707107f
+    .conicTo(SkBits2Float(0xc3703c8a), SkBits2Float(0xc33e4e50), SkBits2Float(0xc3a72e05), SkBits2Float(0xc31c0c44), SkBits2Float(0x3f3504f3))   // -240.236f, -190.306f, -334.36f, -156.048f, 0.707107f
+    .conicTo(SkBits2Float(0xc3d63dc5), SkBits2Float(0xc2f39470), SkBits2Float(0xc39bc8c8), SkBits2Float(0x43476db5), SkBits2Float(0x3f3504f3))   // -428.483f, -121.79f, -311.569f, 199.429f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0xc294a419), SkBits2Float(0x426be7d0))   // -74.3205f, 58.9764f
+    .conicTo(SkBits2Float(0xc33f3c05), SkBits2Float(0x43be18ef), SkBits2Float(0xc2c2390a), SkBits2Float(0x43cf39f4), SkBits2Float(0x3f3504f3))   // -191.234f, 380.195f, -97.1114f, 414.453f, 0.707107f
+    .conicTo(SkBits2Float(0xc03f4154), SkBits2Float(0x43e05afa), SkBits2Float(0x42e3d9e6), SkBits2Float(0x42fefc14), SkBits2Float(0x3f3504f3))   // -2.98836f, 448.711f, 113.926f, 127.492f, 0.707107f
+    .conicTo(SkBits2Float(0x4366d6ec), SkBits2Float(0xc341b9e0), SkBits2Float(0x4308b76c), SkBits2Float(0xc363fbec), SkBits2Float(0x3f3504f3))   // 230.84f, -193.726f, 136.716f, -227.984f, 0.707107f
+    .conicTo(SkBits2Float(0x422a5fb0), SkBits2Float(0xc3831efc), SkBits2Float(0xc294a419), SkBits2Float(0x426be7d0), SkBits2Float(0x3f3504f3))   // 42.5934f, -262.242f, -74.3205f, 58.9764f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x4345b3f8), SkBits2Float(0x42cfc494))   // 197.703f, 103.884f
+    .conicTo(SkBits2Float(0xc2c4aac2), SkBits2Float(0x4389667c), SkBits2Float(0xc24101bb), SkBits2Float(0x43b4c5c0), SkBits2Float(0x3f3504f3))   // -98.3335f, 274.801f, -48.2517f, 361.545f, 0.707107f
+    .conicTo(SkBits2Float(0x3fea41a0), SkBits2Float(0x43e02504), SkBits2Float(0x4394eeee), SkBits2Float(0x438aafae), SkBits2Float(0x3f3504f3))   // 1.83013f, 448.289f, 297.867f, 277.372f, 0.707107f
+    .conicTo(SkBits2Float(0x441479cd), SkBits2Float(0x42d4e958), SkBits2Float(0x4407f490), SkBits2Float(0x419db120), SkBits2Float(0x3f3504f3))   // 593.903f, 106.456f, 543.821f, 19.7115f, 0.707107f
+    .conicTo(SkBits2Float(0x43f6dea8), SkBits2Float(0xc28610c8), SkBits2Float(0x4345b3f8), SkBits2Float(0x42cfc494), SkBits2Float(0x3f3504f3))   // 493.74f, -67.0328f, 197.703f, 103.884f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x43bc9c08), SkBits2Float(0x439c91b7))   // 377.219f, 313.138f
+    .conicTo(SkBits2Float(0x422250a2), SkBits2Float(0x437dc797), SkBits2Float(0x41b97bee), SkBits2Float(0x43b035f6), SkBits2Float(0x3f3504f3))   // 40.5787f, 253.78f, 23.1855f, 352.422f, 0.707107f
+    .conicTo(SkBits2Float(0x40b95a5b), SkBits2Float(0x43e18822), SkBits2Float(0x43ab375e), SkBits2Float(0x43ff360d), SkBits2Float(0x3f3504f3))   // 5.79228f, 451.064f, 342.433f, 510.422f, 0.707107f
+    .conicTo(SkBits2Float(0x4429c4a9), SkBits2Float(0x440e71fc), SkBits2Float(0x442e1dd4), SkBits2Float(0x43eb91ce), SkBits2Float(0x3f3504f3))   // 679.073f, 569.781f, 696.466f, 471.139f, 0.707107f
+    .conicTo(SkBits2Float(0x443276ff), SkBits2Float(0x43ba3fa3), SkBits2Float(0x43bc9c08), SkBits2Float(0x439c91b7), SkBits2Float(0x3f3504f3))   // 713.859f, 372.497f, 377.219f, 313.138f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x43be1d75), SkBits2Float(0x441334f2))   // 380.23f, 588.827f
+    .conicTo(SkBits2Float(0x432080f6), SkBits2Float(0x43a37bdc), SkBits2Float(0x42a78c44), SkBits2Float(0x43c3ad02), SkBits2Float(0x3f3504f3))   // 160.504f, 326.968f, 83.774f, 391.352f, 0.707107f
+    .conicTo(SkBits2Float(0x40e169c3), SkBits2Float(0x43e3de28), SkBits2Float(0x4362c542), SkBits2Float(0x44336618), SkBits2Float(0x3f3504f3))   // 7.04416f, 455.736f, 226.771f, 717.595f, 0.707107f
+    .conicTo(SkBits2Float(0x43df3f9c), SkBits2Float(0x4474dd1c), SkBits2Float(0x4402ce83), SkBits2Float(0x4464c489), SkBits2Float(0x3f3504f3))   // 446.497f, 979.455f, 523.227f, 915.071f, 0.707107f
+    .conicTo(SkBits2Float(0x4415fd38), SkBits2Float(0x4454abf6), SkBits2Float(0x43be1d75), SkBits2Float(0x441334f2), SkBits2Float(0x3f3504f3))   // 599.957f, 850.687f, 380.23f, 588.827f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x43bb9978), SkBits2Float(0x43ad6ab0))   // 375.199f, 346.833f
+    .conicTo(SkBits2Float(0x43bb9978), SkBits2Float(0x40a00000), SkBits2Float(0x43898486), SkBits2Float(0x40a00000), SkBits2Float(0x3f3504f3))   // 375.199f, 5, 275.035f, 5, 0.707107f
+    .conicTo(SkBits2Float(0x432edf26), SkBits2Float(0x40a00000), SkBits2Float(0x432edf26), SkBits2Float(0x43ad6ab0), SkBits2Float(0x3f3504f3))   // 174.872f, 5, 174.872f, 346.833f, 0.707107f
+    .conicTo(SkBits2Float(0x432edf26), SkBits2Float(0x442c2ab0), SkBits2Float(0x43898486), SkBits2Float(0x442c2ab0), SkBits2Float(0x3f3504f3))   // 174.872f, 688.667f, 275.035f, 688.667f, 0.707107f
+    .conicTo(SkBits2Float(0x43bb9978), SkBits2Float(0x442c2ab0), SkBits2Float(0x43bb9978), SkBits2Float(0x43ad6ab0), SkBits2Float(0x3f3504f3))   // 375.199f, 688.667f, 375.199f, 346.833f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x42d07148), SkBits2Float(0x43c6d5fb))   // 104.221f, 397.672f
+    .conicTo(SkBits2Float(0x43a1f94a), SkBits2Float(0x4307cfe3), SkBits2Float(0x437737c0), SkBits2Float(0x428edb31), SkBits2Float(0x3f3504f3))   // 323.948f, 135.812f, 247.218f, 71.4281f, 0.707107f
+    .conicTo(SkBits2Float(0x432a7ceb), SkBits2Float(0x40e169c2), SkBits2Float(0xc244f418), SkBits2Float(0x438673b0), SkBits2Float(0x3f3504f3))   // 170.488f, 7.04416f, -49.2384f, 268.904f, 0.707107f
+    .conicTo(SkBits2Float(0xc3867b7b), SkBits2Float(0x4404b0dc), SkBits2Float(0xc3403c22), SkBits2Float(0x4414c96f), SkBits2Float(0x3f3504f3))   // -268.965f, 530.763f, -192.235f, 595.147f, 0.707107f
+    .conicTo(SkBits2Float(0xc2e7029c), SkBits2Float(0x4424e202), SkBits2Float(0x42d07148), SkBits2Float(0x43c6d5fb), SkBits2Float(0x3f3504f3))   // -115.505f, 659.531f, 104.221f, 397.672f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0xc30809b4), SkBits2Float(0x438337ac))   // -136.038f, 262.435f
+    .conicTo(SkBits2Float(0x43489a34), SkBits2Float(0x434b137f), SkBits2Float(0x43373589), SkBits2Float(0x42d0de52), SkBits2Float(0x3f3504f3))   // 200.602f, 203.076f, 183.209f, 104.434f, 0.707107f
+    .conicTo(SkBits2Float(0x4325d0dd), SkBits2Float(0x40b95a5c), SkBits2Float(0xc32ad30a), SkBits2Float(0x42824d58), SkBits2Float(0x3f3504f3))   // 165.816f, 5.79228f, -170.824f, 65.1511f, 0.707107f
+    .conicTo(SkBits2Float(0xc3fdbb7b), SkBits2Float(0x42f9050a), SkBits2Float(0xc3f50925), SkBits2Float(0x435f26db), SkBits2Float(0x3f3504f3))   // -507.465f, 124.51f, -490.071f, 223.152f, 0.707107f
+    .conicTo(SkBits2Float(0xc3ec56cf), SkBits2Float(0x43a0e598), SkBits2Float(0xc30809b4), SkBits2Float(0x438337ac), SkBits2Float(0x3f3504f3))   // -472.678f, 321.794f, -136.038f, 262.435f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0xc369289a), SkBits2Float(0x408cdc40))   // -233.159f, 4.40189f
+    .conicTo(SkBits2Float(0x427b82f4), SkBits2Float(0x432f5193), SkBits2Float(0x42e1eb60), SkBits2Float(0x42b12617), SkBits2Float(0x3f3504f3))   // 62.8779f, 175.319f, 112.96f, 88.5744f, 0.707107f
+    .conicTo(SkBits2Float(0x43230aa3), SkBits2Float(0x3fea4196), SkBits2Float(0xc304feb4), SkBits2Float(0xc329162e), SkBits2Float(0x3f3504f3))   // 163.042f, 1.83013f, -132.995f, -169.087f, 0.707107f
+    .conicTo(SkBits2Float(0xc3d68405), SkBits2Float(0xc3aa006f), SkBits2Float(0xc3ef8e7f), SkBits2Float(0xc37d4256), SkBits2Float(0x3f3504f3))   // -429.031f, -340.003f, -479.113f, -253.259f, 0.707107f
+    .conicTo(SkBits2Float(0xc4044c7c), SkBits2Float(0xc32683cf), SkBits2Float(0xc369289a), SkBits2Float(0x408cdc40), SkBits2Float(0x3f3504f3))   // -529.195f, -166.515f, -233.159f, 4.40189f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0xc30db26a), SkBits2Float(0xc37fb0d7))   // -141.697f, -255.691f
+    .conicTo(SkBits2Float(0xc1c64388), SkBits2Float(0x42830e25), SkBits2Float(0x428aae1e), SkBits2Float(0x41fa2834), SkBits2Float(0x3f3504f3))   // -24.783f, 65.5276f, 69.3401f, 31.2696f, 0.707107f
+    .conicTo(SkBits2Float(0x4323768e), SkBits2Float(0xc03f4152), SkBits2Float(0x423a3252), SkBits2Float(0xc3a21a77), SkBits2Float(0x3f3504f3))   // 163.463f, -2.98836f, 46.5491f, -324.207f, 0.707107f
+    .conicTo(SkBits2Float(0xc28cbac8), SkBits2Float(0xc4215b37), SkBits2Float(0xc3247ce4), SkBits2Float(0xc418cab4), SkBits2Float(0x3f3504f3))   // -70.3648f, -645.425f, -164.488f, -611.167f, 0.707107f
+    .conicTo(SkBits2Float(0xc3814e32), SkBits2Float(0xc4103a31), SkBits2Float(0xc30db26a), SkBits2Float(0xc37fb0d7), SkBits2Float(0x3f3504f3))   // -258.611f, -576.909f, -141.697f, -255.691f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x42bf1a33), SkBits2Float(0xc3c6124c))   // 95.5512f, -396.143f
+    .conicTo(SkBits2Float(0xc1aae6f8), SkBits2Float(0xc295d95d), SkBits2Float(0x42918542), SkBits2Float(0xc222aa8c), SkBits2Float(0x3f3504f3))   // -21.3628f, -74.9245f, 72.7603f, -40.6665f, 0.707107f
+    .conicTo(SkBits2Float(0x4326e221), SkBits2Float(0xc0cd12f4), SkBits2Float(0x438de60c), SkBits2Float(0xc3a3d041), SkBits2Float(0x3f3504f3))   // 166.883f, -6.40856f, 283.797f, -327.627f, 0.707107f
+    .conicTo(SkBits2Float(0x43c85b09), SkBits2Float(0xc422361b), SkBits2Float(0x43994b49), SkBits2Float(0xc42ac69e), SkBits2Float(0x3f3504f3))   // 400.711f, -648.845f, 306.588f, -683.103f, 0.707107f
+    .conicTo(SkBits2Float(0x43547712), SkBits2Float(0xc4335721), SkBits2Float(0x42bf1a33), SkBits2Float(0xc3c6124c), SkBits2Float(0x3f3504f3))   // 212.465f, -717.361f, 95.5512f, -396.143f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x43b7c98f), SkBits2Float(0xc3af9e21))   // 367.575f, -351.235f
+    .conicTo(SkBits2Float(0x428f138a), SkBits2Float(0xc3345194), SkBits2Float(0x42f33d6e), SkBits2Float(0xc2bb2617), SkBits2Float(0x3f3504f3))   // 71.5382f, -180.319f, 121.62f, -93.5744f, 0.707107f
+    .conicTo(SkBits2Float(0x432bb3a9), SkBits2Float(0xc0da9066), SkBits2Float(0x43e9de81), SkBits2Float(0xc331bf31), SkBits2Float(0x3f3504f3))   // 171.702f, -6.83013f, 467.738f, -177.747f, 0.707107f
+    .conicTo(SkBits2Float(0x443ef196), SkBits2Float(0xc3ae54f0), SkBits2Float(0x44326c5a), SkBits2Float(0xc3d9b434), SkBits2Float(0x3f3504f3))   // 763.775f, -348.664f, 713.693f, -435.408f, 0.707107f
+    .conicTo(SkBits2Float(0x4425e71e), SkBits2Float(0xc40289bc), SkBits2Float(0x43b7c98f), SkBits2Float(0xc3af9e21), SkBits2Float(0x3f3504f3))   // 663.611f, -522.152f, 367.575f, -351.235f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x4408c5ce), SkBits2Float(0xc30dfb1e))   // 547.091f, -141.981f
+    .conicTo(SkBits2Float(0x4352734e), SkBits2Float(0xc34956f5), SkBits2Float(0x43410ea4), SkBits2Float(0xc2cd653e), SkBits2Float(0x3f3504f3))   // 210.45f, -201.34f, 193.057f, -102.698f, 0.707107f
+    .conicTo(SkBits2Float(0x432fa9f9), SkBits2Float(0xc081c919), SkBits2Float(0x44001378), SkBits2Float(0x425d363a), SkBits2Float(0x3f3504f3))   // 175.664f, -4.0558f, 512.304f, 55.303f, 0.707107f
+    .conicTo(SkBits2Float(0x44543c72), SkBits2Float(0x42e552cb), SkBits2Float(0x4458959e), SkBits2Float(0x4180287c), SkBits2Float(0x3f3504f3))   // 848.944f, 114.662f, 866.338f, 16.0198f, 0.707107f
+    .conicTo(SkBits2Float(0x445ceec8), SkBits2Float(0xc2a53e8d), SkBits2Float(0x4408c5ce), SkBits2Float(0xc30dfb1e), SkBits2Float(0x3f3504f3))   // 883.731f, -82.6222f, 547.091f, -141.981f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x44098684), SkBits2Float(0x4305b53c))   // 550.102f, 133.708f
+    .conicTo(SkBits2Float(0x43a5300e), SkBits2Float(0xc30026d3), SkBits2Float(0x437da548), SkBits2Float(0xc27f121c), SkBits2Float(0x3f3504f3))   // 330.375f, -128.152f, 253.646f, -63.7677f, 0.707107f
+    .conicTo(SkBits2Float(0x4330ea74), SkBits2Float(0x3f1dc4b8), SkBits2Float(0x43c65234), SkBits2Float(0x43833cea), SkBits2Float(0x3f3504f3))   // 176.916f, 0.616283f, 396.642f, 262.476f, 0.707107f
+    .conicTo(SkBits2Float(0x441a1798), SkBits2Float(0x44031579), SkBits2Float(0x442d464c), SkBits2Float(0x43e5f9cc), SkBits2Float(0x3f3504f3))   // 616.369f, 524.336f, 693.098f, 459.952f, 0.707107f
+    .conicTo(SkBits2Float(0x44407502), SkBits2Float(0x43c5c8a6), SkBits2Float(0x44098684), SkBits2Float(0x4305b53c), SkBits2Float(0x3f3504f3))   // 769.828f, 395.568f, 550.102f, 133.708f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x43bb9978), SkBits2Float(0x44487cfb))   // 375.199f, 801.953f
+    .conicTo(SkBits2Float(0x43bb9978), SkBits2Float(0x43e60f46), SkBits2Float(0x43898486), SkBits2Float(0x43e60f46), SkBits2Float(0x3f3504f3))   // 375.199f, 460.119f, 275.035f, 460.119f, 0.707107f
+    .conicTo(SkBits2Float(0x432edf26), SkBits2Float(0x43e60f46), SkBits2Float(0x432edf26), SkBits2Float(0x44487cfb), SkBits2Float(0x3f3504f3))   // 174.872f, 460.119f, 174.872f, 801.953f, 0.707107f
+    .conicTo(SkBits2Float(0x432edf26), SkBits2Float(0x448ef92a), SkBits2Float(0x43898486), SkBits2Float(0x448ef92a), SkBits2Float(0x3f3504f3))   // 174.872f, 1143.79f, 275.035f, 1143.79f, 0.707107f
+    .conicTo(SkBits2Float(0x43bb9978), SkBits2Float(0x448ef92a), SkBits2Float(0x43bb9978), SkBits2Float(0x44487cfb), SkBits2Float(0x3f3504f3))   // 375.199f, 1143.79f, 375.199f, 801.953f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x42d07148), SkBits2Float(0x445532a0))   // 104.221f, 852.791f
+    .conicTo(SkBits2Float(0x43a1f94a), SkBits2Float(0x4413bb9c), SkBits2Float(0x437737c0), SkBits2Float(0x4403a309), SkBits2Float(0x3f3504f3))   // 323.948f, 590.931f, 247.218f, 526.547f, 0.707107f
+    .conicTo(SkBits2Float(0x432a7ceb), SkBits2Float(0x43e714ed), SkBits2Float(0xc244f418), SkBits2Float(0x4435017b), SkBits2Float(0x3f3504f3))   // 170.488f, 462.163f, -49.2384f, 724.023f, 0.707107f
+    .conicTo(SkBits2Float(0xc3867b7b), SkBits2Float(0x4476787f), SkBits2Float(0xc3403c22), SkBits2Float(0x44834889), SkBits2Float(0x3f3504f3))   // -268.965f, 985.883f, -192.235f, 1050.27f, 0.707107f
+    .conicTo(SkBits2Float(0xc2e7029c), SkBits2Float(0x448b54d2), SkBits2Float(0x42d07148), SkBits2Float(0x445532a0), SkBits2Float(0x3f3504f3))   // -115.505f, 1114.65f, 104.221f, 852.791f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0xc30809b4), SkBits2Float(0x44336379))   // -136.038f, 717.554f
+    .conicTo(SkBits2Float(0x43489a34), SkBits2Float(0x44248c83), SkBits2Float(0x43373589), SkBits2Float(0x440be36d), SkBits2Float(0x3f3504f3))   // 200.602f, 658.195f, 183.209f, 559.554f, 0.707107f
+    .conicTo(SkBits2Float(0x4325d0dd), SkBits2Float(0x43e674af), SkBits2Float(0xc32ad30a), SkBits2Float(0x4402114e), SkBits2Float(0x3f3504f3))   // 165.816f, 460.912f, -170.824f, 520.27f, 0.707107f
+    .conicTo(SkBits2Float(0xc3fdbb7b), SkBits2Float(0x4410e844), SkBits2Float(0xc3f50925), SkBits2Float(0x4429915a), SkBits2Float(0x3f3504f3))   // -507.465f, 579.629f, -490.071f, 678.271f, 0.707107f
+    .conicTo(SkBits2Float(0xc3ec56cf), SkBits2Float(0x44423a6f), SkBits2Float(0xc30809b4), SkBits2Float(0x44336379), SkBits2Float(0x3f3504f3))   // -472.678f, 776.913f, -136.038f, 717.554f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0xc369289a), SkBits2Float(0x43e5c2b7))   // -233.159f, 459.521f
+    .conicTo(SkBits2Float(0x427b82f4), SkBits2Float(0x441d9c08), SkBits2Float(0x42e1eb60), SkBits2Float(0x4407ec66), SkBits2Float(0x3f3504f3))   // 62.8779f, 630.438f, 112.96f, 543.694f, 0.707107f
+    .conicTo(SkBits2Float(0x43230aa3), SkBits2Float(0x43e47988), SkBits2Float(0xc304feb4), SkBits2Float(0x438f042f), SkBits2Float(0x3f3504f3))   // 163.042f, 456.949f, -132.995f, 286.033f, 0.707107f
+    .conicTo(SkBits2Float(0xc3d68405), SkBits2Float(0x42e63b5c), SkBits2Float(0xc3ef8e7f), SkBits2Float(0x4349dc36), SkBits2Float(0x3f3504f3))   // -429.031f, 115.116f, -479.113f, 201.86f, 0.707107f
+    .conicTo(SkBits2Float(0xc4044c7c), SkBits2Float(0x43904d5e), SkBits2Float(0xc369289a), SkBits2Float(0x43e5c2b7), SkBits2Float(0x3f3504f3))   // -529.195f, 288.604f, -233.159f, 459.521f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0xc30db26a), SkBits2Float(0x43476db5))   // -141.697f, 199.429f
+    .conicTo(SkBits2Float(0xc1c64388), SkBits2Float(0x44022968), SkBits2Float(0x428aae1e), SkBits2Float(0x43f331c9), SkBits2Float(0x3f3504f3))   // -24.783f, 520.647f, 69.3401f, 486.389f, 0.707107f
+    .conicTo(SkBits2Float(0x4323768e), SkBits2Float(0x43e210c3), SkBits2Float(0x423a3252), SkBits2Float(0x4302e99e), SkBits2Float(0x3f3504f3))   // 163.463f, 452.131f, 46.5491f, 130.913f, 0.707107f
+    .conicTo(SkBits2Float(0xc28cbac8), SkBits2Float(0xc33e4e50), SkBits2Float(0xc3247ce4), SkBits2Float(0xc31c0c44), SkBits2Float(0x3f3504f3))   // -70.3648f, -190.306f, -164.488f, -156.048f, 0.707107f
+    .conicTo(SkBits2Float(0xc3814e32), SkBits2Float(0xc2f39470), SkBits2Float(0xc30db26a), SkBits2Float(0x43476db5), SkBits2Float(0x3f3504f3))   // -258.611f, -121.79f, -141.697f, 199.429f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x42bf1a33), SkBits2Float(0x426be7d0))   // 95.5512f, 58.9764f
+    .conicTo(SkBits2Float(0xc1aae6f8), SkBits2Float(0x43be18ef), SkBits2Float(0x42918542), SkBits2Float(0x43cf39f4), SkBits2Float(0x3f3504f3))   // -21.3628f, 380.195f, 72.7603f, 414.453f, 0.707107f
+    .conicTo(SkBits2Float(0x4326e221), SkBits2Float(0x43e05afa), SkBits2Float(0x438de60c), SkBits2Float(0x42fefc14), SkBits2Float(0x3f3504f3))   // 166.883f, 448.711f, 283.797f, 127.492f, 0.707107f
+    .conicTo(SkBits2Float(0x43c85b09), SkBits2Float(0xc341b9e0), SkBits2Float(0x43994b49), SkBits2Float(0xc363fbec), SkBits2Float(0x3f3504f3))   // 400.711f, -193.726f, 306.588f, -227.984f, 0.707107f
+    .conicTo(SkBits2Float(0x43547712), SkBits2Float(0xc3831efc), SkBits2Float(0x42bf1a33), SkBits2Float(0x426be7d0), SkBits2Float(0x3f3504f3))   // 212.465f, -262.242f, 95.5512f, 58.9764f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x43b7c98f), SkBits2Float(0x42cfc494))   // 367.575f, 103.884f
+    .conicTo(SkBits2Float(0x428f138a), SkBits2Float(0x4389667c), SkBits2Float(0x42f33d6e), SkBits2Float(0x43b4c5c0), SkBits2Float(0x3f3504f3))   // 71.5382f, 274.801f, 121.62f, 361.545f, 0.707107f
+    .conicTo(SkBits2Float(0x432bb3a9), SkBits2Float(0x43e02504), SkBits2Float(0x43e9de81), SkBits2Float(0x438aafae), SkBits2Float(0x3f3504f3))   // 171.702f, 448.289f, 467.738f, 277.372f, 0.707107f
+    .conicTo(SkBits2Float(0x443ef196), SkBits2Float(0x42d4e958), SkBits2Float(0x44326c5a), SkBits2Float(0x419db120), SkBits2Float(0x3f3504f3))   // 763.775f, 106.456f, 713.693f, 19.7115f, 0.707107f
+    .conicTo(SkBits2Float(0x4425e71e), SkBits2Float(0xc28610c8), SkBits2Float(0x43b7c98f), SkBits2Float(0x42cfc494), SkBits2Float(0x3f3504f3))   // 663.611f, -67.0328f, 367.575f, 103.884f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x4408c5ce), SkBits2Float(0x439c91b7))   // 547.091f, 313.138f
+    .conicTo(SkBits2Float(0x4352734e), SkBits2Float(0x437dc797), SkBits2Float(0x43410ea4), SkBits2Float(0x43b035f6), SkBits2Float(0x3f3504f3))   // 210.45f, 253.78f, 193.057f, 352.422f, 0.707107f
+    .conicTo(SkBits2Float(0x432fa9f9), SkBits2Float(0x43e18822), SkBits2Float(0x44001378), SkBits2Float(0x43ff360d), SkBits2Float(0x3f3504f3))   // 175.664f, 451.064f, 512.304f, 510.422f, 0.707107f
+    .conicTo(SkBits2Float(0x44543c72), SkBits2Float(0x440e71fc), SkBits2Float(0x4458959e), SkBits2Float(0x43eb91ce), SkBits2Float(0x3f3504f3))   // 848.944f, 569.781f, 866.338f, 471.139f, 0.707107f
+    .conicTo(SkBits2Float(0x445ceec8), SkBits2Float(0x43ba3fa3), SkBits2Float(0x4408c5ce), SkBits2Float(0x439c91b7), SkBits2Float(0x3f3504f3))   // 883.731f, 372.497f, 547.091f, 313.138f, 0.707107f
+    .close()
+    .moveTo(SkBits2Float(0x44098684), SkBits2Float(0x441334f2))   // 550.102f, 588.827f
+    .conicTo(SkBits2Float(0x43a5300e), SkBits2Float(0x43a37bdc), SkBits2Float(0x437da548), SkBits2Float(0x43c3ad02), SkBits2Float(0x3f3504f3))   // 330.375f, 326.968f, 253.646f, 391.352f, 0.707107f
+    .conicTo(SkBits2Float(0x4330ea74), SkBits2Float(0x43e3de28), SkBits2Float(0x43c65234), SkBits2Float(0x44336618), SkBits2Float(0x3f3504f3))   // 176.916f, 455.736f, 396.642f, 717.595f, 0.707107f
+    .conicTo(SkBits2Float(0x441a1798), SkBits2Float(0x4474dd1c), SkBits2Float(0x442d464c), SkBits2Float(0x4464c489), SkBits2Float(0x3f3504f3))   // 616.369f, 979.455f, 693.098f, 915.071f, 0.707107f
+    .conicTo(SkBits2Float(0x44407502), SkBits2Float(0x4454abf6), SkBits2Float(0x44098684), SkBits2Float(0x441334f2), SkBits2Float(0x3f3504f3))   // 769.828f, 850.687f, 550.102f, 588.827f, 0.707107f
+    .close()
+    .detach();
+
+    testSimplify(reporter, path, __FUNCTION__);
 }
 
 DEF_TEST(SixtyOvals_2_2_9_73_reduced, reporter) {
-    SkPath path;
-path.moveTo(377.219f, -141.981f);
-path.conicTo(40.5787f, -201.34f, 23.1855f, -102.698f, 0.707107f);
-path.lineTo(377.219f, -141.981f);
-path.close();
-path.moveTo(306.588f, -227.984f);
-path.conicTo(212.465f, -262.242f, 95.5512f, 58.9764f, 0.707107f);
-path.lineTo(306.588f, -227.984f);
-path.close();
+    SkPath path = SkPathBuilder()
+                  .moveTo(377.219f, -141.981f)
+                  .conicTo(40.5787f, -201.34f, 23.1855f, -102.698f, 0.707107f)
+                  .lineTo(377.219f, -141.981f)
+                  .close()
+                  .moveTo(306.588f, -227.984f)
+                  .conicTo(212.465f, -262.242f, 95.5512f, 58.9764f, 0.707107f)
+                  .lineTo(306.588f, -227.984f)
+                  .close()
+                  .detach();
 testSimplify(reporter, path, __FUNCTION__);
 }
 
 DEF_TEST(SixtyOvalsA, reporter) {
-SkPath path;
-path.setFillType(SkPathFillType::kEvenOdd);
-path.moveTo(11.1722f, -8.10398f);
-path.conicTo(22.9143f, -10.3787f, 23.7764f, -7.72542f, 1.00863f);
-path.conicTo(24.6671f, -4.98406f, 13.8147f, 0.0166066f, 0.973016f);
-path.conicTo(24.6378f, 5.07425f, 23.7764f, 7.72542f, 1.00888f);
-path.conicTo(22.8777f, 10.4915f, 11.1648f, 8.13034f, 0.960143f);
-path.conicTo(16.9503f, 18.5866f, 14.6946f, 20.2254f, 1.00881f);
-path.conicTo(12.4417f, 21.8623f, 4.29722f, 13.1468f, 1.0092f);
-path.conicTo(2.92708f, 25, 0, 25, 0.955692f);
-path.conicTo(-2.79361f, 25, -4.258f, 13.1048f, 1.00818f);
-path.conicTo(-4.27813f, 13.1264f, -4.29822f, 13.1479f, 1.03158f);
-path.conicTo(-12.44f, 21.8635f, -14.6946f, 20.2254f, 1.00811f);
-path.conicTo(-16.9933f, 18.5554f, -11.1722f, 8.10398f, 0.989875f);
-path.conicTo(-22.9143f, 10.3787f, -23.7764f, 7.72542f, 1.00863f);
-path.conicTo(-24.6671f, 4.98406f, -13.8147f, -0.0166066f, 0.973016f);
-path.conicTo(-24.6378f, -5.07425f, -23.7764f, -7.72542f, 1.00888f);
-path.conicTo(-22.8777f, -10.4915f, -11.1648f, -8.13034f, 0.960143f);
-path.conicTo(-16.9503f, -18.5866f, -14.6946f, -20.2254f, 1.00881f);
-path.conicTo(-12.4417f, -21.8623f, -4.29722f, -13.1468f, 1.0092f);
-path.conicTo(-2.92708f, -25, 0, -25, 0.955692f);
-path.conicTo(2.79361f, -25, 4.258f, -13.1048f, 1.00818f);
-path.conicTo(4.27813f, -13.1264f, 4.29822f, -13.1479f, 1.03158f);
-path.conicTo(12.44f, -21.8635f, 14.6946f, -20.2254f, 1.00811f);
-path.conicTo(16.9933f, -18.5554f, 11.1722f, -8.10398f, 0.989875f);
-path.close();
-SkPath one(path);
-path.reset();
-path.setFillType(SkPathFillType::kWinding);
-path.moveTo(-1.54509f, -4.75528f);
-path.conicTo(22.2313f, -12.4807f, 23.7764f, -7.72543f, 0.707107f);
-path.conicTo(25.3215f, -2.97014f, 1.54509f, 4.75528f, 0.707107f);
-path.conicTo(-22.2313f, 12.4807f, -23.7764f, 7.72543f, 0.707107f);
-path.conicTo(-25.3215f, 2.97014f, -1.54509f, -4.75528f, 0.707107f);
-path.close();
-SkPath two(path);
-std::ignore = Op(one, two, kUnion_SkPathOp);
+SkPath path = SkPathBuilder(SkPathFillType::kEvenOdd)
+              .moveTo(11.1722f, -8.10398f)
+              .conicTo(22.9143f, -10.3787f, 23.7764f, -7.72542f, 1.00863f)
+              .conicTo(24.6671f, -4.98406f, 13.8147f, 0.0166066f, 0.973016f)
+              .conicTo(24.6378f, 5.07425f, 23.7764f, 7.72542f, 1.00888f)
+              .conicTo(22.8777f, 10.4915f, 11.1648f, 8.13034f, 0.960143f)
+              .conicTo(16.9503f, 18.5866f, 14.6946f, 20.2254f, 1.00881f)
+              .conicTo(12.4417f, 21.8623f, 4.29722f, 13.1468f, 1.0092f)
+              .conicTo(2.92708f, 25, 0, 25, 0.955692f)
+              .conicTo(-2.79361f, 25, -4.258f, 13.1048f, 1.00818f)
+              .conicTo(-4.27813f, 13.1264f, -4.29822f, 13.1479f, 1.03158f)
+              .conicTo(-12.44f, 21.8635f, -14.6946f, 20.2254f, 1.00811f)
+              .conicTo(-16.9933f, 18.5554f, -11.1722f, 8.10398f, 0.989875f)
+              .conicTo(-22.9143f, 10.3787f, -23.7764f, 7.72542f, 1.00863f)
+              .conicTo(-24.6671f, 4.98406f, -13.8147f, -0.0166066f, 0.973016f)
+              .conicTo(-24.6378f, -5.07425f, -23.7764f, -7.72542f, 1.00888f)
+              .conicTo(-22.8777f, -10.4915f, -11.1648f, -8.13034f, 0.960143f)
+              .conicTo(-16.9503f, -18.5866f, -14.6946f, -20.2254f, 1.00881f)
+              .conicTo(-12.4417f, -21.8623f, -4.29722f, -13.1468f, 1.0092f)
+              .conicTo(-2.92708f, -25, 0, -25, 0.955692f)
+              .conicTo(2.79361f, -25, 4.258f, -13.1048f, 1.00818f)
+              .conicTo(4.27813f, -13.1264f, 4.29822f, -13.1479f, 1.03158f)
+              .conicTo(12.44f, -21.8635f, 14.6946f, -20.2254f, 1.00811f)
+              .conicTo(16.9933f, -18.5554f, 11.1722f, -8.10398f, 0.989875f)
+              .close()
+              .detach();
+    SkPath one(path);
+
+    path = SkPathBuilder(SkPathFillType::kWinding)
+           .moveTo(-1.54509f, -4.75528f)
+           .conicTo(22.2313f, -12.4807f, 23.7764f, -7.72543f, 0.707107f)
+           .conicTo(25.3215f, -2.97014f, 1.54509f, 4.75528f, 0.707107f)
+           .conicTo(-22.2313f, 12.4807f, -23.7764f, 7.72543f, 0.707107f)
+           .conicTo(-25.3215f, 2.97014f, -1.54509f, -4.75528f, 0.707107f)
+           .close()
+           .detach();
+    SkPath two(path);
+    std::ignore = Op(one, two, kUnion_SkPathOp);
 }
 
 DEF_TEST(SixtyOvalsAX, reporter) {
-SkPath path;
-path.setFillType(SkPathFillType::kEvenOdd);
-path.moveTo(SkBits2Float(0x4132c174), SkBits2Float(0xc101a9e5));  // 11.1722f, -8.10398f
-path.conicTo(SkBits2Float(0x41b7508a), SkBits2Float(0xc1260efe), SkBits2Float(0x41be3618), SkBits2Float(0xc0f736ad), SkBits2Float(0x3f811abd));  // 22.9143f, -10.3787f, 23.7764f, -7.72542f, 1.00863f
-path.conicTo(SkBits2Float(0x41c5564b), SkBits2Float(0xc09f7d6d), SkBits2Float(0x415d0934), SkBits2Float(0x3c880a93), SkBits2Float(0x3f79179a));  // 24.6671f, -4.98406f, 13.8147f, 0.0166066f, 0.973016f
-path.conicTo(SkBits2Float(0x41c51a48), SkBits2Float(0x40a2603c), SkBits2Float(0x41be3618), SkBits2Float(0x40f736ac), SkBits2Float(0x3f8122f3));  // 24.6378f, 5.07425f, 23.7764f, 7.72542f, 1.00888f
-path.conicTo(SkBits2Float(0x41b7056f), SkBits2Float(0x4127dd49), SkBits2Float(0x4132a328), SkBits2Float(0x410215e1), SkBits2Float(0x3f75cbec));  // 22.8777f, 10.4915f, 11.1648f, 8.13034f, 0.960143f
-path.conicTo(SkBits2Float(0x41879a3b), SkBits2Float(0x4194b151), SkBits2Float(0x416b1d34), SkBits2Float(0x41a1cdac), SkBits2Float(0x3f8120d4));  // 16.9503f, 18.5866f, 14.6946f, 20.2254f, 1.00881f
-path.conicTo(SkBits2Float(0x41471107), SkBits2Float(0x41aee601), SkBits2Float(0x408982d1), SkBits2Float(0x41525939), SkBits2Float(0x3f812d7f));  // 12.4417f, 21.8623f, 4.29722f, 13.1468f, 1.0092f
-path.conicTo(SkBits2Float(0x403b5543), SkBits2Float(0x41c80000), SkBits2Float(0x00000000), SkBits2Float(0x41c80000), SkBits2Float(0x3f74a837));  // 2.92708f, 25, 0, 25, 0.955692f
-path.conicTo(SkBits2Float(0xc032ca93), SkBits2Float(0x41c80000), SkBits2Float(0xc088418e), SkBits2Float(0x4151ad32), SkBits2Float(0x3f810c2d));  // -2.79361f, 25, -4.258f, 13.1048f, 1.00818f
-path.conicTo(SkBits2Float(0xc088e66c), SkBits2Float(0x4152058a), SkBits2Float(0xc0898afc), SkBits2Float(0x41525d9e), SkBits2Float(0x3f840adb));  // -4.27813f, 13.1264f, -4.29822f, 13.1479f, 1.03158f
-path.conicTo(SkBits2Float(0xc1470a56), SkBits2Float(0x41aee870), SkBits2Float(0xc16b1d36), SkBits2Float(0x41a1cdac), SkBits2Float(0x3f81099f));  // -12.44f, 21.8635f, -14.6946f, 20.2254f, 1.00811f
-path.conicTo(SkBits2Float(0xc187f23a), SkBits2Float(0x41947162), SkBits2Float(0xc132c174), SkBits2Float(0x4101a9e5), SkBits2Float(0x3f7d6873));  // -16.9933f, 18.5554f, -11.1722f, 8.10398f, 0.989875f
-path.conicTo(SkBits2Float(0xc1b7508a), SkBits2Float(0x41260efe), SkBits2Float(0xc1be3618), SkBits2Float(0x40f736ad), SkBits2Float(0x3f811abd));  // -22.9143f, 10.3787f, -23.7764f, 7.72542f, 1.00863f
-path.conicTo(SkBits2Float(0xc1c5564b), SkBits2Float(0x409f7d6d), SkBits2Float(0xc15d0934), SkBits2Float(0xbc880a93), SkBits2Float(0x3f79179a));  // -24.6671f, 4.98406f, -13.8147f, -0.0166066f, 0.973016f
-path.conicTo(SkBits2Float(0xc1c51a48), SkBits2Float(0xc0a2603c), SkBits2Float(0xc1be3618), SkBits2Float(0xc0f736ac), SkBits2Float(0x3f8122f3));  // -24.6378f, -5.07425f, -23.7764f, -7.72542f, 1.00888f
-path.conicTo(SkBits2Float(0xc1b7056f), SkBits2Float(0xc127dd49), SkBits2Float(0xc132a328), SkBits2Float(0xc10215e1), SkBits2Float(0x3f75cbec));  // -22.8777f, -10.4915f, -11.1648f, -8.13034f, 0.960143f
-path.conicTo(SkBits2Float(0xc1879a3b), SkBits2Float(0xc194b151), SkBits2Float(0xc16b1d34), SkBits2Float(0xc1a1cdac), SkBits2Float(0x3f8120d4));  // -16.9503f, -18.5866f, -14.6946f, -20.2254f, 1.00881f
-path.conicTo(SkBits2Float(0xc1471107), SkBits2Float(0xc1aee601), SkBits2Float(0xc08982d1), SkBits2Float(0xc1525939), SkBits2Float(0x3f812d7f));  // -12.4417f, -21.8623f, -4.29722f, -13.1468f, 1.0092f
-path.conicTo(SkBits2Float(0xc03b5543), SkBits2Float(0xc1c80000), SkBits2Float(0x00000000), SkBits2Float(0xc1c80000), SkBits2Float(0x3f74a837));  // -2.92708f, -25, 0, -25, 0.955692f
-path.conicTo(SkBits2Float(0x4032ca93), SkBits2Float(0xc1c80000), SkBits2Float(0x4088418e), SkBits2Float(0xc151ad32), SkBits2Float(0x3f810c2d));  // 2.79361f, -25, 4.258f, -13.1048f, 1.00818f
-path.conicTo(SkBits2Float(0x4088e66c), SkBits2Float(0xc152058a), SkBits2Float(0x40898afc), SkBits2Float(0xc1525d9e), SkBits2Float(0x3f840adb));  // 4.27813f, -13.1264f, 4.29822f, -13.1479f, 1.03158f
-path.conicTo(SkBits2Float(0x41470a56), SkBits2Float(0xc1aee870), SkBits2Float(0x416b1d36), SkBits2Float(0xc1a1cdac), SkBits2Float(0x3f81099f));  // 12.44f, -21.8635f, 14.6946f, -20.2254f, 1.00811f
-path.conicTo(SkBits2Float(0x4187f23a), SkBits2Float(0xc1947162), SkBits2Float(0x4132c174), SkBits2Float(0xc101a9e5), SkBits2Float(0x3f7d6873));  // 16.9933f, -18.5554f, 11.1722f, -8.10398f, 0.989875f
-path.close();
-path.close();
-SkPath one(path);
-path.reset();
-path.setFillType(SkPathFillType::kWinding);
-path.moveTo(SkBits2Float(0xbfc5c55c), SkBits2Float(0xc0982b46));  // -1.54509f, -4.75528f
-path.conicTo(SkBits2Float(0x41b1d9c2), SkBits2Float(0xc147b0fc), SkBits2Float(0x41be3618), SkBits2Float(0xc0f736b3), SkBits2Float(0x3f3504f3));  // 22.2313f, -12.4807f, 23.7764f, -7.72543f, 0.707107f
-path.conicTo(SkBits2Float(0x41ca926e), SkBits2Float(0xc03e16da), SkBits2Float(0x3fc5c55c), SkBits2Float(0x40982b46), SkBits2Float(0x3f3504f3));  // 25.3215f, -2.97014f, 1.54509f, 4.75528f, 0.707107f
-path.conicTo(SkBits2Float(0xc1b1d9c2), SkBits2Float(0x4147b0fc), SkBits2Float(0xc1be3618), SkBits2Float(0x40f736b3), SkBits2Float(0x3f3504f3));  // -22.2313f, 12.4807f, -23.7764f, 7.72543f, 0.707107f
-path.conicTo(SkBits2Float(0xc1ca926e), SkBits2Float(0x403e16da), SkBits2Float(0xbfc5c55c), SkBits2Float(0xc0982b46), SkBits2Float(0x3f3504f3));  // -25.3215f, 2.97014f, -1.54509f, -4.75528f, 0.707107f
-path.close();
-SkPath two(path);
-std::ignore = Op(one, two, kUnion_SkPathOp);
+    SkPath path = SkPathBuilder(SkPathFillType::kEvenOdd)
+    .moveTo(SkBits2Float(0x4132c174), SkBits2Float(0xc101a9e5))   // 11.1722f, -8.10398f
+    .conicTo(SkBits2Float(0x41b7508a), SkBits2Float(0xc1260efe), SkBits2Float(0x41be3618), SkBits2Float(0xc0f736ad), SkBits2Float(0x3f811abd))   // 22.9143f, -10.3787f, 23.7764f, -7.72542f, 1.00863f
+    .conicTo(SkBits2Float(0x41c5564b), SkBits2Float(0xc09f7d6d), SkBits2Float(0x415d0934), SkBits2Float(0x3c880a93), SkBits2Float(0x3f79179a))   // 24.6671f, -4.98406f, 13.8147f, 0.0166066f, 0.973016f
+    .conicTo(SkBits2Float(0x41c51a48), SkBits2Float(0x40a2603c), SkBits2Float(0x41be3618), SkBits2Float(0x40f736ac), SkBits2Float(0x3f8122f3))   // 24.6378f, 5.07425f, 23.7764f, 7.72542f, 1.00888f
+    .conicTo(SkBits2Float(0x41b7056f), SkBits2Float(0x4127dd49), SkBits2Float(0x4132a328), SkBits2Float(0x410215e1), SkBits2Float(0x3f75cbec))   // 22.8777f, 10.4915f, 11.1648f, 8.13034f, 0.960143f
+    .conicTo(SkBits2Float(0x41879a3b), SkBits2Float(0x4194b151), SkBits2Float(0x416b1d34), SkBits2Float(0x41a1cdac), SkBits2Float(0x3f8120d4))   // 16.9503f, 18.5866f, 14.6946f, 20.2254f, 1.00881f
+    .conicTo(SkBits2Float(0x41471107), SkBits2Float(0x41aee601), SkBits2Float(0x408982d1), SkBits2Float(0x41525939), SkBits2Float(0x3f812d7f))   // 12.4417f, 21.8623f, 4.29722f, 13.1468f, 1.0092f
+    .conicTo(SkBits2Float(0x403b5543), SkBits2Float(0x41c80000), SkBits2Float(0x00000000), SkBits2Float(0x41c80000), SkBits2Float(0x3f74a837))   // 2.92708f, 25, 0, 25, 0.955692f
+    .conicTo(SkBits2Float(0xc032ca93), SkBits2Float(0x41c80000), SkBits2Float(0xc088418e), SkBits2Float(0x4151ad32), SkBits2Float(0x3f810c2d))   // -2.79361f, 25, -4.258f, 13.1048f, 1.00818f
+    .conicTo(SkBits2Float(0xc088e66c), SkBits2Float(0x4152058a), SkBits2Float(0xc0898afc), SkBits2Float(0x41525d9e), SkBits2Float(0x3f840adb))   // -4.27813f, 13.1264f, -4.29822f, 13.1479f, 1.03158f
+    .conicTo(SkBits2Float(0xc1470a56), SkBits2Float(0x41aee870), SkBits2Float(0xc16b1d36), SkBits2Float(0x41a1cdac), SkBits2Float(0x3f81099f))   // -12.44f, 21.8635f, -14.6946f, 20.2254f, 1.00811f
+    .conicTo(SkBits2Float(0xc187f23a), SkBits2Float(0x41947162), SkBits2Float(0xc132c174), SkBits2Float(0x4101a9e5), SkBits2Float(0x3f7d6873))   // -16.9933f, 18.5554f, -11.1722f, 8.10398f, 0.989875f
+    .conicTo(SkBits2Float(0xc1b7508a), SkBits2Float(0x41260efe), SkBits2Float(0xc1be3618), SkBits2Float(0x40f736ad), SkBits2Float(0x3f811abd))   // -22.9143f, 10.3787f, -23.7764f, 7.72542f, 1.00863f
+    .conicTo(SkBits2Float(0xc1c5564b), SkBits2Float(0x409f7d6d), SkBits2Float(0xc15d0934), SkBits2Float(0xbc880a93), SkBits2Float(0x3f79179a))   // -24.6671f, 4.98406f, -13.8147f, -0.0166066f, 0.973016f
+    .conicTo(SkBits2Float(0xc1c51a48), SkBits2Float(0xc0a2603c), SkBits2Float(0xc1be3618), SkBits2Float(0xc0f736ac), SkBits2Float(0x3f8122f3))   // -24.6378f, -5.07425f, -23.7764f, -7.72542f, 1.00888f
+    .conicTo(SkBits2Float(0xc1b7056f), SkBits2Float(0xc127dd49), SkBits2Float(0xc132a328), SkBits2Float(0xc10215e1), SkBits2Float(0x3f75cbec))   // -22.8777f, -10.4915f, -11.1648f, -8.13034f, 0.960143f
+    .conicTo(SkBits2Float(0xc1879a3b), SkBits2Float(0xc194b151), SkBits2Float(0xc16b1d34), SkBits2Float(0xc1a1cdac), SkBits2Float(0x3f8120d4))   // -16.9503f, -18.5866f, -14.6946f, -20.2254f, 1.00881f
+    .conicTo(SkBits2Float(0xc1471107), SkBits2Float(0xc1aee601), SkBits2Float(0xc08982d1), SkBits2Float(0xc1525939), SkBits2Float(0x3f812d7f))   // -12.4417f, -21.8623f, -4.29722f, -13.1468f, 1.0092f
+    .conicTo(SkBits2Float(0xc03b5543), SkBits2Float(0xc1c80000), SkBits2Float(0x00000000), SkBits2Float(0xc1c80000), SkBits2Float(0x3f74a837))   // -2.92708f, -25, 0, -25, 0.955692f
+    .conicTo(SkBits2Float(0x4032ca93), SkBits2Float(0xc1c80000), SkBits2Float(0x4088418e), SkBits2Float(0xc151ad32), SkBits2Float(0x3f810c2d))   // 2.79361f, -25, 4.258f, -13.1048f, 1.00818f
+    .conicTo(SkBits2Float(0x4088e66c), SkBits2Float(0xc152058a), SkBits2Float(0x40898afc), SkBits2Float(0xc1525d9e), SkBits2Float(0x3f840adb))   // 4.27813f, -13.1264f, 4.29822f, -13.1479f, 1.03158f
+    .conicTo(SkBits2Float(0x41470a56), SkBits2Float(0xc1aee870), SkBits2Float(0x416b1d36), SkBits2Float(0xc1a1cdac), SkBits2Float(0x3f81099f))   // 12.44f, -21.8635f, 14.6946f, -20.2254f, 1.00811f
+    .conicTo(SkBits2Float(0x4187f23a), SkBits2Float(0xc1947162), SkBits2Float(0x4132c174), SkBits2Float(0xc101a9e5), SkBits2Float(0x3f7d6873))   // 16.9933f, -18.5554f, 11.1722f, -8.10398f, 0.989875f
+    .close()
+    .close()
+    .detach();
+    SkPath one(path);
+
+    path = SkPathBuilder(SkPathFillType::kWinding)
+    .moveTo(SkBits2Float(0xbfc5c55c), SkBits2Float(0xc0982b46))  // -1.54509f, -4.75528f
+    .conicTo(SkBits2Float(0x41b1d9c2), SkBits2Float(0xc147b0fc), SkBits2Float(0x41be3618), SkBits2Float(0xc0f736b3), SkBits2Float(0x3f3504f3))   // 22.2313f, -12.4807f, 23.7764f, -7.72543f, 0.707107f
+    .conicTo(SkBits2Float(0x41ca926e), SkBits2Float(0xc03e16da), SkBits2Float(0x3fc5c55c), SkBits2Float(0x40982b46), SkBits2Float(0x3f3504f3))   // 25.3215f, -2.97014f, 1.54509f, 4.75528f, 0.707107f
+    .conicTo(SkBits2Float(0xc1b1d9c2), SkBits2Float(0x4147b0fc), SkBits2Float(0xc1be3618), SkBits2Float(0x40f736b3), SkBits2Float(0x3f3504f3))   // -22.2313f, 12.4807f, -23.7764f, 7.72543f, 0.707107f
+    .conicTo(SkBits2Float(0xc1ca926e), SkBits2Float(0x403e16da), SkBits2Float(0xbfc5c55c), SkBits2Float(0xc0982b46), SkBits2Float(0x3f3504f3))   // -25.3215f, 2.97014f, -1.54509f, -4.75528f, 0.707107f
+    .close()
+    .detach();
+    SkPath two(path);
+
+    std::ignore = Op(one, two, kUnion_SkPathOp);
 }
 
 const char ovalsAsQuads[] = "M 146.4187316894531 136.5"
diff --git a/tests/PathOpsBuilderTest.cpp b/tests/PathOpsBuilderTest.cpp
index 05103b4..0e7b5d8 100644
--- a/tests/PathOpsBuilderTest.cpp
+++ b/tests/PathOpsBuilderTest.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "include/core/SkPath.h"
+#include "include/core/SkPathBuilder.h"
 #include "include/core/SkPathTypes.h"
 #include "include/core/SkRect.h"
 #include "include/pathops/SkPathOps.h"
@@ -29,9 +30,8 @@
     REPORTER_ASSERT(reporter, result.has_value());
     REPORTER_ASSERT(reporter, result->isEmpty());
 
-    SkPath rectPath;
-    rectPath.setFillType(SkPathFillType::kEvenOdd);
-    rectPath.addRect(0, 1, 2, 3, SkPathDirection::kCW);
+    SkPath rectPath = SkPath::Rect({0, 1, 2, 3}, SkPathDirection::kCW)
+                      .makeFillType(SkPathFillType::kEvenOdd);
     builder.add(rectPath, kUnion_SkPathOp);
     result = builder.resolve();
     REPORTER_ASSERT(reporter, result.has_value());
@@ -43,9 +43,8 @@
     int pixelDiff = comparePaths(reporter, __FUNCTION__, rectPath, *result);
     REPORTER_ASSERT(reporter, pixelDiff == 0);
 
-    rectPath.reset();
-    rectPath.setFillType(SkPathFillType::kEvenOdd);
-    rectPath.addRect(0, 1, 2, 3, SkPathDirection::kCCW);
+    rectPath = SkPath::Rect({0, 1, 2, 3}, SkPathDirection::kCCW)
+               .makeFillType(SkPathFillType::kEvenOdd);
     builder.add(rectPath, kUnion_SkPathOp);
     result = builder.resolve();
     REPORTER_ASSERT(reporter, result.has_value());
@@ -59,9 +58,8 @@
     REPORTER_ASSERT(reporter, result.has_value());
     REPORTER_ASSERT(reporter, result->isEmpty());
 
-    SkPath rect2, rect3;
-    rect2.addRect(2, 1, 4, 3, SkPathDirection::kCW);
-    rect3.addRect(4, 1, 5, 3, SkPathDirection::kCCW);
+    SkPath rect2 = SkPath::Rect({2, 1, 4, 3}, SkPathDirection::kCW),
+           rect3 = SkPath::Rect({4, 1, 5, 3}, SkPathDirection::kCCW);
     builder.add(rectPath, kUnion_SkPathOp);
     builder.add(rect2, kUnion_SkPathOp);
     builder.add(rect3, kUnion_SkPathOp);
@@ -73,10 +71,9 @@
     expected.setLTRB(0, 1, 5, 3);
     REPORTER_ASSERT(reporter, result->getBounds() == expected);
 
-    SkPath circle1, circle2, circle3;
-    circle1.addCircle(5, 6, 4, SkPathDirection::kCW);
-    circle2.addCircle(7, 4, 8, SkPathDirection::kCCW);
-    circle3.addCircle(6, 5, 6, SkPathDirection::kCW);
+    SkPath circle1 = SkPath::Circle(5, 6, 4, SkPathDirection::kCW),
+           circle2 = SkPath::Circle(7, 4, 8, SkPathDirection::kCCW),
+           circle3 = SkPath::Circle(6, 5, 6, SkPathDirection::kCW);
     SkPath opCompare = Op(circle1, circle2, kUnion_SkPathOp).value_or(SkPath());
     if (auto res = Op(opCompare, circle3, kDifference_SkPathOp)) {
         opCompare = *res;
@@ -91,19 +88,20 @@
 }
 
 DEF_TEST(BuilderIssue3838, reporter) {
-    SkPath path;
-    path.moveTo(200, 170);
-    path.lineTo(220, 170);
-    path.lineTo(220, 230);
-    path.lineTo(240, 230);
-    path.lineTo(240, 210);
-    path.lineTo(180, 210);
-    path.lineTo(180, 190);
-    path.lineTo(260, 190);
-    path.lineTo(260, 250);
-    path.lineTo(200, 250);
-    path.lineTo(200, 170);
-    path.close();
+    SkPath path = SkPathBuilder()
+                  .moveTo(200, 170)
+                  .lineTo(220, 170)
+                  .lineTo(220, 230)
+                  .lineTo(240, 230)
+                  .lineTo(240, 210)
+                  .lineTo(180, 210)
+                  .lineTo(180, 190)
+                  .lineTo(260, 190)
+                  .lineTo(260, 250)
+                  .lineTo(200, 250)
+                  .lineTo(200, 170)
+                  .close()
+                  .detach();
     SkOpBuilder builder;
     builder.add(path, kUnion_SkPathOp);
     auto path2 = builder.resolve();
@@ -112,8 +110,7 @@
 }
 
 DEF_TEST(BuilderIssue3838_2, reporter) {
-    SkPath path;
-    path.addCircle(100, 100, 50);
+    SkPath path = SkPath::Circle(100, 100, 50);
 
     SkOpBuilder builder;
     builder.add(path, kUnion_SkPathOp);
@@ -125,17 +122,18 @@
 }
 
 DEF_TEST(BuilderIssue3838_3, reporter) {
-    SkPath path;
-    path.moveTo(40, 10);
-    path.lineTo(60, 10);
-    path.lineTo(60, 30);
-    path.lineTo(40, 30);
-    path.lineTo(40, 10);
-    path.moveTo(41, 11);
-    path.lineTo(41, 29);
-    path.lineTo(59, 29);
-    path.lineTo(59, 11);
-    path.lineTo(41, 11);
+    SkPath path = SkPathBuilder()
+                  .moveTo(40, 10)
+                  .lineTo(60, 10)
+                  .lineTo(60, 30)
+                  .lineTo(40, 30)
+                  .lineTo(40, 10)
+                  .moveTo(41, 11)
+                  .lineTo(41, 29)
+                  .lineTo(59, 29)
+                  .lineTo(59, 11)
+                  .lineTo(41, 11)
+                  .detach();
 
     SkOpBuilder builder;
     builder.add(path, kUnion_SkPathOp);
@@ -145,13 +143,14 @@
 }
 
 DEF_TEST(BuilderIssue502792_2, reporter) {
-    SkPath path, pathB;
-    path.setFillType(SkPathFillType::kWinding);
-    path.addRect(0, 0, 1, 1, SkPathDirection::kCW);
-    path.addRect(2, 2, 3, 3, SkPathDirection::kCW);
-    pathB.setFillType(SkPathFillType::kEvenOdd);
-    pathB.addRect(3, 3, 4, 4, SkPathDirection::kCW);
-    pathB.addRect(3, 3, 4, 4, SkPathDirection::kCW);
+    SkPath path = SkPathBuilder(SkPathFillType::kWinding)
+                  .addRect({0, 0, 1, 1}, SkPathDirection::kCW)
+                  .addRect({2, 2, 3, 3}, SkPathDirection::kCW)
+                  .detach();
+    SkPath pathB = SkPathBuilder(SkPathFillType::kEvenOdd)
+                   .addRect({3, 3, 4, 4}, SkPathDirection::kCW)
+                   .addRect({3, 3, 4, 4}, SkPathDirection::kCW)
+                   .detach();
     SkOpBuilder builder;
     builder.add(path, kUnion_SkPathOp);
     builder.add(pathB, kDifference_SkPathOp);
@@ -215,91 +214,93 @@
     <rect x="10" y="30" width="100" height="60" />
     <rect x="757798030" y="30" width="100" height="60" />
 */
-    SkPath clipCircle, clipRect;
-    SkPath inner;
-    clipCircle.addCircle(60, 60, 50);             // <circle id="circle" cx="60" cy="60" r="50" />
+    SkPathBuilder clipRect;
+    SkPath clipCircle = SkPath::Circle(60, 60, 50);             // <circle id="circle" cx="60" cy="60" r="50" />
 
-    inner.addRect(10, 30, 10+0, 30+60);           // <rect x="10" y="30" width="0" height="60" />
-    inner.addRect(10, 30, 10+0, 30+60);           // <rect x="10" y="30" width="0" height="60" />
-    inner.addRect(10, 30, 10+100, 30+60);         // <rect x="10" y="30" width="100" height="60" />
-    inner.addRect(10, 30, 10+32668, 30+0);        // <rect x="10" y="30" width="32668" />
-    inner.addRect(10, 30, 10+100, 30+18446744073709551615.f); // <rect x="10" y="30" width="100" height="18446744073709551615" />
-    inner.addRect(10, 255, 10+100, 255+60);       // <rect x="10" y="255" width="100" height="60" />
-    inner.addRect(0, 0, 0+100, 0+60);             //  <rect width="100" height="60" />
-    inner.addRect(10, 30, 10+100, 30+60);         // <rect x="10" y="30" width="100" height="60" />
-    inner.addRect(10, 30, 10+100, 30+4294967236.f); // <rect x="10" y="30" width="100" height="4294967236" />
-    inner.addRect(10, 30, 10+100, 30+60);         // <rect x="10" y="30" width="100" height="60" />
-    clipRect.addPath(inner);
-    inner.reset();
-    inner.addRect(10, 30, 10+0, 30+60);           // <rect x="10" y="30" width="0" height="60" />
-    inner.addRect(10, 30, 10+0, 30+0.18093252719929986369568203f); // <rect x="10" y="30" width="0" height="0.18093252719929986369568203" />
-    inner.addRect(10, 30, 10+100, 30+60);         // <rect x="10" y="30" width="100" height="60" />
-    inner.addRect(10, 30, 10+32668, 30+60);       // <rect x="10" y="30" width="32668" height="60" />
-    inner.addRect(10, 30, 10+100, 30+18446744073709551615.f); // <rect x="10" y="30" width="100" height="18446744073709551615" />
-    inner.addRect(10, 255, 10+100, 255+60);       // <rect x="10" y="255" width="100" height="60" />
-    inner.addRect(2147483649.f, 30, 2147483649.f+100, 30+60); // <rect x="2147483649" y="30" width="100" height="60" />
-    inner.addRect(10, 30, 10+100, 30+60);         // <rect x="10" y="30" width="100" height="60" />
-    inner.addRect(10, 30, 10+100, 30+60);         // <rect x="10" y="30" width="100" height="60" />
-    inner.addRect(10, 30, 10+100, 30+60);         // <rect x="10" y="30" width="100" height="60" />
-    clipRect.addPath(inner);
-    inner.reset();
-    inner.addRect(10, 30, 10+0, 30+60);           // <rect x="10" y="30" width="0" height="60" />
-    inner.addRect(10, 30, 10+0, 30+60);           // <rect x="10" y="30" width="0" height="60" />
-    inner.addRect(10, 30, 10+100, 30+60);         // <rect x="10" y="30" width="100" height="60" />
-    inner.addRect(10, 30, 10+32668, 30+60);       // <rect x="10" y="30" width="32668" height="60" />
-    inner.addRect(10, 30, 10+100, 30+18446744073709551615.f); // <rect x="10" y="30" width="100" height="18446744073709551615" />
-    inner.addRect(10, 255, 10+100, 255+60);       // <rect x="10" y="255" width="100" height="60" />
-    inner.addRect(2147483649.f, 30, 2147483649.f+100, 30+60); // <rect x="2147483649" y="30" width="100" height="60" />
-    inner.addRect(10, 30, 10+100, 30+60);         // <rect x="10" y="30" width="100" height="60" />
-    inner.addRect(10, 2879753595.f, 10+100, 30+2879753595.f); // <rect x="10" y="2879753595" width="100" height="60" />
-    inner.addRect(10, 30, 10+100, 30+60);         // <rect x="10" y="30" width="100" height="60" />
-    clipRect.addPath(inner);
-    inner.reset();
-    inner.addRect(10, 30, 10+100, 30+60);         // <rect x="10" y="30" width="100" height="60" />
-    inner.addRect(10, 30, 10+0, 30+60);           // <rect x="10" y="30" width="0" height="60" />
-    inner.addRect(10, 30, 10+100, 30+60);         // <rect x="10" y="30" width="100" height="60" />
-    inner.addRect(10, 30, 10+32668, 30+60);       // <rect x="10" y="30" width="32668" height="60" />
-    inner.addRect(10, 30, 10+100, 30+18446744073709551615.f); // <rect x="10" y="30" width="100" height="18446744073709551615" />
-    inner.addRect(10, 255, 10+100, 255+60);       // <rect x="10" y="255" width="100" height="60" />
-    inner.addRect(2147483649.f, 30, 2147483649.f+100, 30+60); // <rect x="2147483649" y="30" width="100" height="60" />
-    inner.addRect(10, 30, 10+100, 30+60);         // <rect x="10" y="30" width="100" height="60" />
-    inner.addRect(10, 30, 10+100, 30+4294967236.f); // <rect x="10" y="30" width="100" height="4294967236" />
-    inner.addRect(10, 30, 10+100, 30+4294967236.f); // <rect x="10" y="30" width="100" height="4294967236" />
-    inner.addRect(10, 30, 10+100, 30+4294967236.f); // <rect x="10" y="30" width="100" height="4294967236" />
-    inner.addRect(10, 30, 10+100, 30+4294967236.f); // <rect x="10" y="30" width="100" height="4294967236" />
-    inner.addRect(10, 30, 10+100, 30+60);         // <rect x="10" y="30" width="100" height="60" />
-    inner.addRect(757798030.f, 30, 757798030.f+100, 30+60); // <rect x="757798030" y="30" width="100" height="60" />
-    clipRect.addPath(inner);
+    SkPathBuilder inner;
+    inner.addRect({10, 30, 10+0, 30+60});           // <rect x="10" y="30" width="0" height="60" />
+    inner.addRect({10, 30, 10+0, 30+60});           // <rect x="10" y="30" width="0" height="60" />
+    inner.addRect({10, 30, 10+100, 30+60});         // <rect x="10" y="30" width="100" height="60" />
+    inner.addRect({10, 30, 10+32668, 30+0});        // <rect x="10" y="30" width="32668" />
+    inner.addRect({10, 30, 10+100, 30+18446744073709551615.f}); // <rect x="10" y="30" width="100" height="18446744073709551615" />
+    inner.addRect({10, 255, 10+100, 255+60});       // <rect x="10" y="255" width="100" height="60" />
+    inner.addRect({0, 0, 0+100, 0+60});             //  <rect width="100" height="60" />
+    inner.addRect({10, 30, 10+100, 30+60});         // <rect x="10" y="30" width="100" height="60" />
+    inner.addRect({10, 30, 10+100, 30+4294967236.f}); // <rect x="10" y="30" width="100" height="4294967236" />
+    inner.addRect({10, 30, 10+100, 30+60});         // <rect x="10" y="30" width="100" height="60" />
+    clipRect.addPath(inner.detach());
+
+    inner.addRect({10, 30, 10+0, 30+60});           // <rect x="10" y="30" width="0" height="60" />
+    inner.addRect({10, 30, 10+0, 30+0.18093252719929986369568203f}); // <rect x="10" y="30" width="0" height="0.18093252719929986369568203" />
+    inner.addRect({10, 30, 10+100, 30+60});         // <rect x="10" y="30" width="100" height="60" />
+    inner.addRect({10, 30, 10+32668, 30+60});       // <rect x="10" y="30" width="32668" height="60" />
+    inner.addRect({10, 30, 10+100, 30+18446744073709551615.f}); // <rect x="10" y="30" width="100" height="18446744073709551615" />
+    inner.addRect({10, 255, 10+100, 255+60});       // <rect x="10" y="255" width="100" height="60" />
+    inner.addRect({2147483649.f, 30, 2147483649.f+100, 30+60}); // <rect x="2147483649" y="30" width="100" height="60" />
+    inner.addRect({10, 30, 10+100, 30+60});         // <rect x="10" y="30" width="100" height="60" />
+    inner.addRect({10, 30, 10+100, 30+60});         // <rect x="10" y="30" width="100" height="60" />
+    inner.addRect({10, 30, 10+100, 30+60});         // <rect x="10" y="30" width="100" height="60" />
+    clipRect.addPath(inner.detach());
+
+    inner.addRect({10, 30, 10+0, 30+60});           // <rect x="10" y="30" width="0" height="60" />
+    inner.addRect({10, 30, 10+0, 30+60});           // <rect x="10" y="30" width="0" height="60" />
+    inner.addRect({10, 30, 10+100, 30+60});         // <rect x="10" y="30" width="100" height="60" />
+    inner.addRect({10, 30, 10+32668, 30+60});       // <rect x="10" y="30" width="32668" height="60" />
+    inner.addRect({10, 30, 10+100, 30+18446744073709551615.f}); // <rect x="10" y="30" width="100" height="18446744073709551615" />
+    inner.addRect({10, 255, 10+100, 255+60});       // <rect x="10" y="255" width="100" height="60" />
+    inner.addRect({2147483649.f, 30, 2147483649.f+100, 30+60}); // <rect x="2147483649" y="30" width="100" height="60" />
+    inner.addRect({10, 30, 10+100, 30+60});         // <rect x="10" y="30" width="100" height="60" />
+    inner.addRect({10, 2879753595.f, 10+100, 30+2879753595.f}); // <rect x="10" y="2879753595" width="100" height="60" />
+    inner.addRect({10, 30, 10+100, 30+60});         // <rect x="10" y="30" width="100" height="60" />
+    clipRect.addPath(inner.detach());
+
+    inner.addRect({10, 30, 10+100, 30+60});         // <rect x="10" y="30" width="100" height="60" />
+    inner.addRect({10, 30, 10+0, 30+60});           // <rect x="10" y="30" width="0" height="60" />
+    inner.addRect({10, 30, 10+100, 30+60});         // <rect x="10" y="30" width="100" height="60" />
+    inner.addRect({10, 30, 10+32668, 30+60});       // <rect x="10" y="30" width="32668" height="60" />
+    inner.addRect({10, 30, 10+100, 30+18446744073709551615.f}); // <rect x="10" y="30" width="100" height="18446744073709551615" />
+    inner.addRect({10, 255, 10+100, 255+60});       // <rect x="10" y="255" width="100" height="60" />
+    inner.addRect({2147483649.f, 30, 2147483649.f+100, 30+60}); // <rect x="2147483649" y="30" width="100" height="60" />
+    inner.addRect({10, 30, 10+100, 30+60});         // <rect x="10" y="30" width="100" height="60" />
+    inner.addRect({10, 30, 10+100, 30+4294967236.f}); // <rect x="10" y="30" width="100" height="4294967236" />
+    inner.addRect({10, 30, 10+100, 30+4294967236.f}); // <rect x="10" y="30" width="100" height="4294967236" />
+    inner.addRect({10, 30, 10+100, 30+4294967236.f}); // <rect x="10" y="30" width="100" height="4294967236" />
+    inner.addRect({10, 30, 10+100, 30+4294967236.f}); // <rect x="10" y="30" width="100" height="4294967236" />
+    inner.addRect({10, 30, 10+100, 30+60});         // <rect x="10" y="30" width="100" height="60" />
+    inner.addRect({757798030.f, 30, 757798030.f+100, 30+60}); // <rect x="757798030" y="30" width="100" height="60" />
+    clipRect.addPath(inner.detach());
 
     SkOpBuilder builder;
     builder.add(clipCircle, kUnion_SkPathOp);
-    builder.add(clipRect, kDifference_SkPathOp);
+    builder.add(clipRect.detach(), kDifference_SkPathOp);
     (void)builder.resolve();
 }
 
 DEF_TEST(Issue569540, reporter) {
-    SkPath path1;
-    path1.moveTo(5, -225);
-    path1.lineTo(-225, 7425);
-    path1.lineTo(7425, 7425);
-    path1.lineTo(7425, -225);
-    path1.lineTo(-225, -225);
-    path1.lineTo(5, -225);
-    path1.close();
+    SkPath path1 = SkPathBuilder()
+                   .moveTo(5, -225)
+                   .lineTo(-225, 7425)
+                   .lineTo(7425, 7425)
+                   .lineTo(7425, -225)
+                   .lineTo(-225, -225)
+                   .lineTo(5, -225)
+                   .close()
+                   .detach();
 
-    SkPath path2;
-    path2.moveTo(5940, 2790);
-    path2.lineTo(5940, 2160);
-    path2.lineTo(5970, 1980);
-    path2.lineTo(5688, 773669888);
-    path2.lineTo(5688, 2160);
-    path2.lineTo(5688, 2430);
-    path2.lineTo(5400, 4590);
-    path2.lineTo(5220, 4590);
-    path2.lineTo(5220, 4920);
-    path2.cubicTo(5182.22900390625f, 4948.328125f, 5160, 4992.78662109375f, 5160, 5040.00048828125f);
-    path2.lineTo(5940, 2790);
-    path2.close();
+    SkPath path2 = SkPathBuilder()
+                   .moveTo(5940, 2790)
+                   .lineTo(5940, 2160)
+                   .lineTo(5970, 1980)
+                   .lineTo(5688, 773669888)
+                   .lineTo(5688, 2160)
+                   .lineTo(5688, 2430)
+                   .lineTo(5400, 4590)
+                   .lineTo(5220, 4590)
+                   .lineTo(5220, 4920)
+                   .cubicTo(5182.22900390625f, 4948.328125f, 5160, 4992.78662109375f, 5160, 5040.00048828125f)
+                   .lineTo(5940, 2790)
+                   .close()
+                   .detach();
 
     SkOpBuilder builder;
     builder.add(path1, kUnion_SkPathOp);
@@ -308,19 +309,19 @@
 }
 
 DEF_TEST(SkOpBuilderFuzz665, reporter) {
-    SkPath path;
-    path.setFillType(SkPathFillType::kEvenOdd);
-path.moveTo(SkBits2Float(0xcc4264a7), SkBits2Float(0x4bb12e50));  // -5.0959e+07f, 2.32235e+07f
-path.lineTo(SkBits2Float(0xcc4264b0), SkBits2Float(0x4bb12e48));  // -5.0959e+07f, 2.32234e+07f
-path.lineTo(SkBits2Float(0xcc4264a7), SkBits2Float(0x4bb12e50));  // -5.0959e+07f, 2.32235e+07f
-path.close();
+    SkPath path = SkPathBuilder(SkPathFillType::kEvenOdd)
+    .moveTo(SkBits2Float(0xcc4264a7), SkBits2Float(0x4bb12e50))   // -5.0959e+07f, 2.32235e+07f
+    .lineTo(SkBits2Float(0xcc4264b0), SkBits2Float(0x4bb12e48))   // -5.0959e+07f, 2.32234e+07f
+    .lineTo(SkBits2Float(0xcc4264a7), SkBits2Float(0x4bb12e50))   // -5.0959e+07f, 2.32235e+07f
+    .close()
+    .detach();
     SkPath path1(path);
-    path.reset();
-    path.setFillType(SkPathFillType::kWinding);
-path.moveTo(SkBits2Float(0x43213333), SkBits2Float(0x43080000));  // 161.2f, 136
-path.lineTo(SkBits2Float(0x43038000), SkBits2Float(0x43080000));  // 131.5f, 136
-path.cubicTo(SkBits2Float(0x43038000), SkBits2Float(0x42f00000), SkBits2Float(0x42f16666), SkBits2Float(0x42d53333), SkBits2Float(0x42d3cccd), SkBits2Float(0x42cd6666));  // 131.5f, 120, 120.7f, 106.6f, 105.9f, 102.7f
-path.lineTo(SkBits2Float(0x42e33333), SkBits2Float(0x42940000));  // 113.6f, 74
+    path = SkPathBuilder(SkPathFillType::kWinding)
+    .moveTo(SkBits2Float(0x43213333), SkBits2Float(0x43080000))   // 161.2f, 136
+    .lineTo(SkBits2Float(0x43038000), SkBits2Float(0x43080000))   // 131.5f, 136
+    .cubicTo(SkBits2Float(0x43038000), SkBits2Float(0x42f00000), SkBits2Float(0x42f16666), SkBits2Float(0x42d53333), SkBits2Float(0x42d3cccd), SkBits2Float(0x42cd6666))   // 131.5f, 120, 120.7f, 106.6f, 105.9f, 102.7f
+    .lineTo(SkBits2Float(0x42e33333), SkBits2Float(0x42940000))   // 113.6f, 74
+    .detach();
     SkPath path2(path);
     SkOpBuilder builder;
     builder.add(path1, kUnion_SkPathOp);
@@ -329,19 +330,21 @@
 }
 
 DEF_TEST(SkOpBuilder618991, reporter) {
-    SkPath path0;
-    path0.moveTo(140, 40);
-    path0.lineTo(200, 210);
-    path0.lineTo(40, 100);
-    path0.lineTo(2.22223e+07f, 2.22222e+14f);
-    path0.lineTo(2.22223e+07f, 2.22222e+14f);
+    SkPath path0 = SkPathBuilder()
+                   .moveTo(140, 40)
+                   .lineTo(200, 210)
+                   .lineTo(40, 100)
+                   .lineTo(2.22223e+07f, 2.22222e+14f)
+                   .lineTo(2.22223e+07f, 2.22222e+14f)
+                   .detach();
 
-    SkPath path1;
-    path1.moveTo(160, 60);
-    path1.lineTo(220, 230);
-    path1.lineTo(60, 120);
-    path1.lineTo(2.22223e+07f, 2.22222e+14f);
-    path1.lineTo(2.22223e+07f, 2.22222e+14f);
+    SkPath path1 = SkPathBuilder()
+                   .moveTo(160, 60)
+                   .lineTo(220, 230)
+                   .lineTo(60, 120)
+                   .lineTo(2.22223e+07f, 2.22222e+14f)
+                   .lineTo(2.22223e+07f, 2.22222e+14f)
+                   .detach();
 
     SkOpBuilder builder;
     builder.add(path0, SkPathOp::kUnion_SkPathOp);
@@ -350,15 +353,17 @@
 }
 
 DEF_TEST(SkOpBuilderKFuzz1, reporter) {
-    SkPath path;
-path.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000));  // 0, 0
-path.lineTo(SkBits2Float(0x39008001), SkBits2Float(0xd31fbc1d));  // 0.000122547f, -6.86056e+11f
-path.conicTo(SkBits2Float(0x246a205a), SkBits2Float(0x0080d3fb), SkBits2Float(0xce000001), SkBits2Float(0x04d31fbc), SkBits2Float(0x57a82c00));  // 5.07681e-17f, 1.1831e-38f, -5.36871e+08f, 4.9635e-36f, 3.69814e+14f
+    SkPath path = SkPathBuilder()
+    .moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000))   // 0, 0
+    .lineTo(SkBits2Float(0x39008001), SkBits2Float(0xd31fbc1d))   // 0.000122547f, -6.86056e+11f
+    .conicTo(SkBits2Float(0x246a205a), SkBits2Float(0x0080d3fb), SkBits2Float(0xce000001), SkBits2Float(0x04d31fbc), SkBits2Float(0x57a82c00))   // 5.07681e-17f, 1.1831e-38f, -5.36871e+08f, 4.9635e-36f, 3.69814e+14f
+    .detach();
     SkPath path0(path);
-    path.reset();
-path.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000));  // 0, 0
-path.cubicTo(SkBits2Float(0x80d3f924), SkBits2Float(0xcecece4f), SkBits2Float(0xcececece), SkBits2Float(0xcececece), SkBits2Float(0x9a9a9ace), SkBits2Float(0x9a9a9a9a));  // -1.94667e-38f, -1.73481e+09f, -1.73483e+09f, -1.73483e+09f, -6.3943e-23f, -6.39427e-23f
-path.moveTo(SkBits2Float(0x9a9a019a), SkBits2Float(0xa59a9a9a));  // -6.36955e-23f, -2.68195e-16f
+    path = SkPathBuilder()
+    .moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000))   // 0, 0
+    .cubicTo(SkBits2Float(0x80d3f924), SkBits2Float(0xcecece4f), SkBits2Float(0xcececece), SkBits2Float(0xcececece), SkBits2Float(0x9a9a9ace), SkBits2Float(0x9a9a9a9a))   // -1.94667e-38f, -1.73481e+09f, -1.73483e+09f, -1.73483e+09f, -6.3943e-23f, -6.39427e-23f
+    .moveTo(SkBits2Float(0x9a9a019a), SkBits2Float(0xa59a9a9a))   // -6.36955e-23f, -2.68195e-16f
+    .detach();
     SkPath path1(path);
     SkOpBuilder builder;
     builder.add(path0, SkPathOp::kUnion_SkPathOp);
diff --git a/tests/PathOpsChalkboardTest.cpp b/tests/PathOpsChalkboardTest.cpp
index 39040ba..15077de 100644
--- a/tests/PathOpsChalkboardTest.cpp
+++ b/tests/PathOpsChalkboardTest.cpp
@@ -5,6 +5,7 @@
  * found in the LICENSE file.
  */
 #include "include/core/SkPath.h"
+#include "include/core/SkPathBuilder.h"
 #include "include/core/SkString.h"
 #include "include/core/SkTypes.h"
 #include "include/private/base/SkTDArray.h"
@@ -24,7 +25,7 @@
 static std::atomic<int> gTestNo{0};
 
 static void chalkboard(skiatest::Reporter* reporter, uint64_t testlines) {
-    SkPath path;
+    SkPathBuilder path;
 uint64_t i = 0;
 path.moveTo(SkBits2Float(0x4470eed9), SkBits2Float(0x439c1ac1));  // 963.732f, 312.209f
 if (testlines & (1LL << i++)) path.lineTo(SkBits2Float(0x4470dde3), SkBits2Float(0x439c63d8));  // 963.467f, 312.78f
@@ -95,7 +96,7 @@
 path.close();
 SkString testName;
 testName.printf("chalkboard%d", ++gTestNo);
-testSimplify(reporter, path, testName.c_str());
+testSimplify(reporter, path.detach(), testName.c_str());
 }
 
 static void testChalkboard(PathOpsThreadState* data) {
diff --git a/tests/PathOpsExtendedTest.cpp b/tests/PathOpsExtendedTest.cpp
index a464e44..283a448 100644
--- a/tests/PathOpsExtendedTest.cpp
+++ b/tests/PathOpsExtendedTest.cpp
@@ -190,8 +190,8 @@
         SkPath& scaledTwo, int& error2x2) {
     SkMatrix scale;
     scaleMatrix(one, two, scale);
-    one.transform(scale, &scaledOne);
-    two.transform(scale, &scaledTwo);
+    scaledOne = one.makeTransform(scale);
+    scaledTwo = two.makeTransform(scale);
     return pathsDrawTheSame(bits, scaledOne, scaledTwo, error2x2);
 }
 
@@ -591,19 +591,14 @@
     SkMatrix scale;
     scaleMatrix(a, b, scale);
     SkRegion scaledRgnA, scaledRgnB, scaledRgnOut;
-    SkPath scaledA, scaledB;
-    scaledA.addPath(a, scale);
-    scaledA.setFillType(a.getFillType());
-    scaledB.addPath(b, scale);
-    scaledB.setFillType(b.getFillType());
+    SkPath scaledA = SkPathBuilder(a.getFillType()).addPath(a, scale).detach(),
+           scaledB = SkPathBuilder(b.getFillType()).addPath(b, scale).detach();
     scaledRgnA.setPath(scaledA, openClip);
     scaledRgnB.setPath(scaledB, openClip);
     scaledRgnOut.op(scaledRgnA, scaledRgnB, (SkRegion::Op) shapeOp);
     SkPath scaledPathOut = scaledRgnOut.getBoundaryPath();
     SkBitmap bitmap;
-    SkPath scaledOut;
-    scaledOut.addPath(*out, scale);
-    scaledOut.setFillType(out->getFillType());
+    SkPath scaledOut = SkPathBuilder(out->getFillType()).addPath(*out, scale).detach();
     int result = comparePaths(reporter, testName, pathOut, scaledPathOut, *out, scaledOut, bitmap,
             a, b, shapeOp, scale, expectMatch);
     reporter->bumpTestCount();
diff --git a/tests/PathTest.cpp b/tests/PathTest.cpp
index 30dbd09..d843dec 100644
--- a/tests/PathTest.cpp
+++ b/tests/PathTest.cpp
@@ -4103,6 +4103,7 @@
 }
 
 static void test_get_point(skiatest::Reporter* reporter) {
+#ifndef SK_HIDE_PATH_EDIT_METHODS
     SkPath p;
     SkPoint pt = p.getPoint(0);
     REPORTER_ASSERT(reporter, pt == SkPoint::Make(0, 0));
@@ -4114,16 +4115,18 @@
     REPORTER_ASSERT(reporter, p.getLastPt(nullptr));
     p.rMoveTo(10, 10);
     REPORTER_ASSERT(reporter, p.getLastPt(&pt) && pt == SkPoint::Make(20, 20));
+#endif
 }
 
 static void test_contains(skiatest::Reporter* reporter) {
-    SkPath p;
-    p.moveTo(SkBits2Float(0xe085e7b1), SkBits2Float(0x5f512c00));  // -7.7191e+19f, 1.50724e+19f
-    p.conicTo(SkBits2Float(0xdfdaa221), SkBits2Float(0x5eaac338), SkBits2Float(0x60342f13), SkBits2Float(0xdf0cbb58), SkBits2Float(0x3f3504f3));  // -3.15084e+19f, 6.15237e+18f, 5.19345e+19f, -1.01408e+19f, 0.707107f
-    p.conicTo(SkBits2Float(0x60ead799), SkBits2Float(0xdfb76c24), SkBits2Float(0x609b9872), SkBits2Float(0xdf730de8), SkBits2Float(0x3f3504f4));  // 1.35377e+20f, -2.6434e+19f, 8.96947e+19f, -1.75139e+19f, 0.707107f
-    p.lineTo(SkBits2Float(0x609b9872), SkBits2Float(0xdf730de8));  // 8.96947e+19f, -1.75139e+19f
-    p.conicTo(SkBits2Float(0x6018b296), SkBits2Float(0xdeee870d), SkBits2Float(0xe008cd8e), SkBits2Float(0x5ed5b2db), SkBits2Float(0x3f3504f3));  // 4.40121e+19f, -8.59386e+18f, -3.94308e+19f, 7.69931e+18f, 0.707107f
-    p.conicTo(SkBits2Float(0xe0d526d9), SkBits2Float(0x5fa67b31), SkBits2Float(0xe085e7b2), SkBits2Float(0x5f512c01), SkBits2Float(0x3f3504f3));  // -1.22874e+20f, 2.39925e+19f, -7.7191e+19f, 1.50724e+19f, 0.707107f
+    SkPath p = SkPathBuilder()
+               .moveTo(SkBits2Float(0xe085e7b1), SkBits2Float(0x5f512c00))  // -7.7191e+19f, 1.50724e+19f
+               .conicTo(SkBits2Float(0xdfdaa221), SkBits2Float(0x5eaac338), SkBits2Float(0x60342f13), SkBits2Float(0xdf0cbb58), SkBits2Float(0x3f3504f3))  // -3.15084e+19f, 6.15237e+18f, 5.19345e+19f, -1.01408e+19f, 0.707107f
+               .conicTo(SkBits2Float(0x60ead799), SkBits2Float(0xdfb76c24), SkBits2Float(0x609b9872), SkBits2Float(0xdf730de8), SkBits2Float(0x3f3504f4))  // 1.35377e+20f, -2.6434e+19f, 8.96947e+19f, -1.75139e+19f, 0.707107f
+               .lineTo(SkBits2Float(0x609b9872), SkBits2Float(0xdf730de8))  // 8.96947e+19f, -1.75139e+19f
+               .conicTo(SkBits2Float(0x6018b296), SkBits2Float(0xdeee870d), SkBits2Float(0xe008cd8e), SkBits2Float(0x5ed5b2db), SkBits2Float(0x3f3504f3))  // 4.40121e+19f, -8.59386e+18f, -3.94308e+19f, 7.69931e+18f, 0.707107f
+               .conicTo(SkBits2Float(0xe0d526d9), SkBits2Float(0x5fa67b31), SkBits2Float(0xe085e7b2), SkBits2Float(0x5f512c01), SkBits2Float(0x3f3504f3))  // -1.22874e+20f, 2.39925e+19f, -7.7191e+19f, 1.50724e+19f, 0.707107
+               .detach();
     // this may return true or false, depending on the platform's numerics, but it should not crash
     (void) p.contains(-77.2027664f, 15.3066053f);
 
@@ -4132,9 +4135,11 @@
     REPORTER_ASSERT(reporter, p.contains(0, 0));
     p.setFillType(SkPathFillType::kWinding);
     REPORTER_ASSERT(reporter, !p.contains(0, 0));
-    p.moveTo(4, 4);
-    p.lineTo(6, 8);
-    p.lineTo(8, 4);
+    p = SkPathBuilder(SkPathFillType::kWinding)
+        .moveTo(4, 4)
+        .lineTo(6, 8)
+        .lineTo(8, 4)
+        .detach();
     // test on edge
     REPORTER_ASSERT(reporter, p.contains(6, 4));
     REPORTER_ASSERT(reporter, p.contains(5, 6));
@@ -4148,10 +4153,11 @@
     REPORTER_ASSERT(reporter, !p.contains(5, 7));
     REPORTER_ASSERT(reporter, p.contains(6, 7));
     REPORTER_ASSERT(reporter, !p.contains(7, 7));
-    p.reset();
-    p.moveTo(4, 4);
-    p.lineTo(8, 6);
-    p.lineTo(4, 8);
+    p = SkPathBuilder()
+        .moveTo(4, 4)
+        .lineTo(8, 6)
+        .lineTo(4, 8)
+        .detach();
     // test on edge
     REPORTER_ASSERT(reporter, p.contains(4, 6));
     REPORTER_ASSERT(reporter, p.contains(6, 5));
@@ -4160,51 +4166,56 @@
     REPORTER_ASSERT(reporter, !p.contains(7, 5));
     REPORTER_ASSERT(reporter, p.contains(7, 6));
     REPORTER_ASSERT(reporter, !p.contains(7, 7));
-    p.reset();
-    p.moveTo(4, 4);
-    p.lineTo(8, 4);
-    p.lineTo(8, 8);
-    p.lineTo(4, 8);
+    p = SkPathBuilder()
+        .moveTo(4, 4)
+        .lineTo(8, 4)
+        .lineTo(8, 8)
+        .lineTo(4, 8)
+        .detach();
     // test on vertices
     REPORTER_ASSERT(reporter, p.contains(4, 4));
     REPORTER_ASSERT(reporter, p.contains(8, 4));
     REPORTER_ASSERT(reporter, p.contains(8, 8));
     REPORTER_ASSERT(reporter, p.contains(4, 8));
-    p.reset();
-    p.moveTo(4, 4);
-    p.lineTo(6, 8);
-    p.lineTo(2, 8);
+    p = SkPathBuilder()
+        .moveTo(4, 4)
+        .lineTo(6, 8)
+        .lineTo(2, 8)
+        .detach();
     // test on edge
     REPORTER_ASSERT(reporter, p.contains(5, 6));
     REPORTER_ASSERT(reporter, p.contains(4, 8));
     REPORTER_ASSERT(reporter, p.contains(3, 6));
-    p.reset();
-    p.moveTo(4, 4);
-    p.lineTo(0, 6);
-    p.lineTo(4, 8);
+    p = SkPathBuilder()
+        .moveTo(4, 4)
+        .lineTo(0, 6)
+        .lineTo(4, 8)
+        .detach();
     // test on edge
     REPORTER_ASSERT(reporter, p.contains(2, 5));
     REPORTER_ASSERT(reporter, p.contains(2, 7));
     REPORTER_ASSERT(reporter, p.contains(4, 6));
     // test canceling coincident edge (a smaller triangle is coincident with a larger one)
-    p.reset();
-    p.moveTo(4, 0);
-    p.lineTo(6, 4);
-    p.lineTo(2, 4);
-    p.moveTo(4, 0);
-    p.lineTo(0, 8);
-    p.lineTo(8, 8);
+    p = SkPathBuilder()
+        .moveTo(4, 0)
+        .lineTo(6, 4)
+        .lineTo(2, 4)
+        .moveTo(4, 0)
+        .lineTo(0, 8)
+        .lineTo(8, 8)
+        .detach();
     REPORTER_ASSERT(reporter, !p.contains(1, 2));
     REPORTER_ASSERT(reporter, !p.contains(3, 2));
     REPORTER_ASSERT(reporter, !p.contains(4, 0));
     REPORTER_ASSERT(reporter, p.contains(4, 4));
 
     // test quads
-    p.reset();
-    p.moveTo(4, 4);
-    p.quadTo(6, 6, 8, 8);
-    p.quadTo(6, 8, 4, 8);
-    p.quadTo(4, 6, 4, 4);
+    p = SkPathBuilder()
+        .moveTo(4, 4)
+        .quadTo(6, 6, 8, 8)
+        .quadTo(6, 8, 4, 8)
+        .quadTo(4, 6, 4, 4)
+        .detach();
     REPORTER_ASSERT(reporter, p.contains(5, 6));
     REPORTER_ASSERT(reporter, !p.contains(6, 5));
     // test quad edge
@@ -4216,12 +4227,13 @@
     REPORTER_ASSERT(reporter, p.contains(8, 8));
     REPORTER_ASSERT(reporter, p.contains(4, 8));
 
-    p.reset();
+    SkPathBuilder builder;
     const SkPoint qPts[] = {{6, 6}, {8, 8}, {6, 8}, {4, 8}, {4, 6}, {4, 4}, {6, 6}};
-    p.moveTo(qPts[0]);
+    builder.moveTo(qPts[0]);
     for (int index = 1; index < (int) std::size(qPts); index += 2) {
-        p.quadTo(qPts[index], qPts[index + 1]);
+        builder.quadTo(qPts[index], qPts[index + 1]);
     }
+    p = builder.detach();
     REPORTER_ASSERT(reporter, p.contains(5, 6));
     REPORTER_ASSERT(reporter, !p.contains(6, 5));
     // test quad edge
@@ -4232,12 +4244,13 @@
     }
 
     // test conics
-    p.reset();
+    builder.reset();
     const SkPoint kPts[] = {{4, 4}, {6, 6}, {8, 8}, {6, 8}, {4, 8}, {4, 6}, {4, 4}};
-    p.moveTo(kPts[0]);
+    builder.moveTo(kPts[0]);
     for (int index = 1; index < (int) std::size(kPts); index += 2) {
-        p.conicTo(kPts[index], kPts[index + 1], 0.5f);
+        builder.conicTo(kPts[index], kPts[index + 1], 0.5f);
     }
+    p = builder.detach();
     REPORTER_ASSERT(reporter, p.contains(5, 6));
     REPORTER_ASSERT(reporter, !p.contains(6, 5));
     // test conic edge
@@ -4254,12 +4267,12 @@
     // test cubics
     SkPoint pts[] = {{5, 4}, {6, 5}, {7, 6}, {6, 6}, {4, 6}, {5, 7}, {5, 5}, {5, 4}, {6, 5}, {7, 6}};
     for (int i = 0; i < 3; ++i) {
-        p.reset();
-        p.setFillType(SkPathFillType::kEvenOdd);
-        p.moveTo(pts[i].fX, pts[i].fY);
-        p.cubicTo(pts[i + 1].fX, pts[i + 1].fY, pts[i + 2].fX, pts[i + 2].fY, pts[i + 3].fX, pts[i + 3].fY);
-        p.cubicTo(pts[i + 4].fX, pts[i + 4].fY, pts[i + 5].fX, pts[i + 5].fY, pts[i + 6].fX, pts[i + 6].fY);
-        p.close();
+        p = SkPathBuilder(SkPathFillType::kEvenOdd)
+            .moveTo(pts[i].fX, pts[i].fY)
+            .cubicTo(pts[i + 1], pts[i + 2], pts[i + 3])
+            .cubicTo(pts[i + 4], pts[i + 5], pts[i + 6])
+            .close()
+            .detach();
         REPORTER_ASSERT(reporter, p.contains(5.5f, 5.5f));
         REPORTER_ASSERT(reporter, !p.contains(4.5f, 5.5f));
         // test cubic edge
@@ -4357,15 +4370,14 @@
     REPORTER_ASSERT(reporter, a != b);
     a.reset();
     REPORTER_ASSERT(reporter, a == b);
-    a.lineTo(1, 1);
+    a = SkPathBuilder().lineTo(1, 1).detach();
     REPORTER_ASSERT(reporter, a != b);
     a.reset();
     REPORTER_ASSERT(reporter, a == b);
-    a.lineTo(1, 1);
-    b.lineTo(1, 2);
+    a = SkPathBuilder().lineTo(1, 1).detach();
+    b = SkPathBuilder().lineTo(1, 2).detach();
     REPORTER_ASSERT(reporter, a != b);
-    a.reset();
-    a.lineTo(1, 2);
+    a = SkPathBuilder().lineTo(1, 2).detach();
     REPORTER_ASSERT(reporter, a == b);
 }
 
@@ -4385,43 +4397,46 @@
 static void test_dump(skiatest::Reporter* reporter) {
     SkPath p;
     compare_dump(reporter, p, false, "path.setFillType(SkPathFillType::kWinding);\n");
-    p.moveTo(1, 2);
-    p.lineTo(3, 4);
+    p = SkPathBuilder()
+        .moveTo(1, 2)
+        .lineTo(3, 4)
+        .detach();
     compare_dump(reporter, p, false, "path.setFillType(SkPathFillType::kWinding);\n"
                                             "path.moveTo(1, 2);\n"
                                             "path.lineTo(3, 4);\n");
-    p.reset();
-    p.setFillType(SkPathFillType::kEvenOdd);
-    p.moveTo(1, 2);
-    p.quadTo(3, 4, 5, 6);
+    p = SkPathBuilder(SkPathFillType::kEvenOdd)
+        .moveTo(1, 2)
+        .quadTo(3, 4, 5, 6)
+        .detach();
     compare_dump(reporter, p, false, "path.setFillType(SkPathFillType::kEvenOdd);\n"
                                             "path.moveTo(1, 2);\n"
                                             "path.quadTo(3, 4, 5, 6);\n");
-    p.reset();
-    p.setFillType(SkPathFillType::kInverseWinding);
-    p.moveTo(1, 2);
-    p.conicTo(3, 4, 5, 6, 0.5f);
+    p = SkPathBuilder(SkPathFillType::kInverseWinding)
+        .moveTo(1, 2)
+        .conicTo(3, 4, 5, 6, 0.5f)
+        .detach();
     compare_dump(reporter, p, false, "path.setFillType(SkPathFillType::kInverseWinding);\n"
                                             "path.moveTo(1, 2);\n"
                                             "path.conicTo(3, 4, 5, 6, 0.5f);\n");
-    p.reset();
-    p.setFillType(SkPathFillType::kInverseEvenOdd);
-    p.moveTo(1, 2);
-    p.cubicTo(3, 4, 5, 6, 7, 8);
+    p = SkPathBuilder(SkPathFillType::kInverseEvenOdd)
+        .moveTo(1, 2)
+        .cubicTo(3, 4, 5, 6, 7, 8)
+        .detach();
     compare_dump(reporter, p, false, "path.setFillType(SkPathFillType::kInverseEvenOdd);\n"
                                             "path.moveTo(1, 2);\n"
                                             "path.cubicTo(3, 4, 5, 6, 7, 8);\n");
-    p.reset();
-    p.setFillType(SkPathFillType::kWinding);
-    p.moveTo(1, 2);
-    p.lineTo(3, 4);
+    p = SkPathBuilder(SkPathFillType::kWinding)
+        .moveTo(1, 2)
+        .lineTo(3, 4)
+        .detach();
     compare_dump(reporter, p, true,
                  "path.setFillType(SkPathFillType::kWinding);\n"
                  "path.moveTo(SkBits2Float(0x3f800000), SkBits2Float(0x40000000));  // 1, 2\n"
                  "path.lineTo(SkBits2Float(0x40400000), SkBits2Float(0x40800000));  // 3, 4\n");
-    p.reset();
-    p.moveTo(SkBits2Float(0x3f800000), SkBits2Float(0x40000000));
-    p.lineTo(SkBits2Float(0x40400000), SkBits2Float(0x40800000));
+    p = SkPathBuilder(SkPathFillType::kWinding)
+        .moveTo(SkBits2Float(0x3f800000), SkBits2Float(0x40000000))
+        .lineTo(SkBits2Float(0x40400000), SkBits2Float(0x40800000))
+        .detach();
     compare_dump(reporter, p, false, "path.setFillType(SkPathFillType::kWinding);\n"
                                             "path.moveTo(1, 2);\n"
                                             "path.lineTo(3, 4);\n");
@@ -4529,24 +4544,26 @@
 };
 
 static void test_crbug_629455(skiatest::Reporter* reporter) {
-    SkPath path;
-    path.moveTo(0, 0);
-    path.cubicTo(SkBits2Float(0xcdcdcd00), SkBits2Float(0xcdcdcdcd),
-                 SkBits2Float(0xcdcdcdcd), SkBits2Float(0xcdcdcdcd),
-                 SkBits2Float(0x423fcdcd), SkBits2Float(0x40ed9341));
+    SkPath path = SkPathBuilder()
+                  .moveTo(0, 0)
 //  AKA: cubicTo(-4.31596e+08f, -4.31602e+08f, -4.31602e+08f, -4.31602e+08f, 47.951f, 7.42423f);
-    path.lineTo(0, 0);
+                  .cubicTo(SkBits2Float(0xcdcdcd00), SkBits2Float(0xcdcdcdcd),
+                           SkBits2Float(0xcdcdcdcd), SkBits2Float(0xcdcdcdcd),
+                           SkBits2Float(0x423fcdcd), SkBits2Float(0x40ed9341))
+                  .lineTo(0, 0)
+                  .detach();
     test_draw_AA_path(100, 100, path);
 }
 
 static void test_fuzz_crbug_662952(skiatest::Reporter* reporter) {
-    SkPath path;
-    path.moveTo(SkBits2Float(0x4109999a), SkBits2Float(0x411c0000));  // 8.6f, 9.75f
-    path.lineTo(SkBits2Float(0x410a6666), SkBits2Float(0x411c0000));  // 8.65f, 9.75f
-    path.lineTo(SkBits2Float(0x410a6666), SkBits2Float(0x411e6666));  // 8.65f, 9.9f
-    path.lineTo(SkBits2Float(0x4109999a), SkBits2Float(0x411e6666));  // 8.6f, 9.9f
-    path.lineTo(SkBits2Float(0x4109999a), SkBits2Float(0x411c0000));  // 8.6f, 9.75f
-    path.close();
+    SkPath path = SkPathBuilder()
+                  .moveTo(SkBits2Float(0x4109999a), SkBits2Float(0x411c0000))  // 8.6f, 9.75f
+                  .lineTo(SkBits2Float(0x410a6666), SkBits2Float(0x411c0000))  // 8.65f, 9.75f
+                  .lineTo(SkBits2Float(0x410a6666), SkBits2Float(0x411e6666))  // 8.65f, 9.9f
+                  .lineTo(SkBits2Float(0x4109999a), SkBits2Float(0x411e6666))  // 8.6f, 9.9f
+                  .lineTo(SkBits2Float(0x4109999a), SkBits2Float(0x411c0000))  // 8.6f, 9.75f
+                  .close()
+                  .detach();
 
     auto surface = SkSurfaces::Raster(SkImageInfo::MakeN32Premul(100, 100));
     SkPaint paint;
@@ -4560,37 +4577,38 @@
     SkCanvas* canvas = surface->getCanvas();
     SkPaint paint;
     paint.setAntiAlias(true);
-    SkPath path;
-    path.moveTo(SkBits2Float(0x4325e666), SkBits2Float(0x42a1999a));  // 165.9f, 80.8f
-    path.lineTo(SkBits2Float(0x4325e666), SkBits2Float(0x42a2999a));  // 165.9f, 81.3f
-    path.lineTo(SkBits2Float(0x4325b333), SkBits2Float(0x42a2999a));  // 165.7f, 81.3f
-    path.lineTo(SkBits2Float(0x4325b333), SkBits2Float(0x42a16666));  // 165.7f, 80.7f
-    path.lineTo(SkBits2Float(0x4325b333), SkBits2Float(0x429f6666));  // 165.7f, 79.7f
-    // 165.7f, 79.7f, 165.8f, 79.7f, 165.8f, 79.7f
-    path.cubicTo(SkBits2Float(0x4325b333), SkBits2Float(0x429f6666), SkBits2Float(0x4325cccc),
-            SkBits2Float(0x429f6666), SkBits2Float(0x4325cccc), SkBits2Float(0x429f6666));
-    // 165.8f, 79.7f, 165.8f, 79.7f, 165.9f, 79.7f
-    path.cubicTo(SkBits2Float(0x4325cccc), SkBits2Float(0x429f6666), SkBits2Float(0x4325cccc),
-            SkBits2Float(0x429f6666), SkBits2Float(0x4325e666), SkBits2Float(0x429f6666));
-    path.lineTo(SkBits2Float(0x4325e666), SkBits2Float(0x42a1999a));  // 165.9f, 80.8f
-    path.close();
+    SkPath path = SkPathBuilder()
+                  .moveTo(SkBits2Float(0x4325e666), SkBits2Float(0x42a1999a))  // 165.9f, 80.8f
+                  .lineTo(SkBits2Float(0x4325e666), SkBits2Float(0x42a2999a))  // 165.9f, 81.3f
+                  .lineTo(SkBits2Float(0x4325b333), SkBits2Float(0x42a2999a))  // 165.7f, 81.3f
+                  .lineTo(SkBits2Float(0x4325b333), SkBits2Float(0x42a16666))  // 165.7f, 80.7f
+                  .lineTo(SkBits2Float(0x4325b333), SkBits2Float(0x429f6666))  // 165.7f, 79.7f
+                  // 165.7f, 79.7f, 165.8f, 79.7f, 165.8f, 79.7f
+                  .cubicTo(SkBits2Float(0x4325b333), SkBits2Float(0x429f6666), SkBits2Float(0x4325cccc),
+                            SkBits2Float(0x429f6666), SkBits2Float(0x4325cccc), SkBits2Float(0x429f6666))
+                  // 165.8f, 79.7f, 165.8f, 79.7f, 165.9f, 79.7f
+                  .cubicTo(SkBits2Float(0x4325cccc), SkBits2Float(0x429f6666), SkBits2Float(0x4325cccc),
+                            SkBits2Float(0x429f6666), SkBits2Float(0x4325e666), SkBits2Float(0x429f6666))
+                  .lineTo(SkBits2Float(0x4325e666), SkBits2Float(0x42a1999a))  // 165.9f, 80.8f
+                  .close()
+                  .detach();
     canvas->clipPath(path, true);
     canvas->drawRect(SkRect::MakeWH(500, 500), paint);
 }
 
 static void test_fuzz_crbug_662730(skiatest::Reporter* reporter) {
-    SkPath path;
-    path.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000));  // 0, 0
-    path.lineTo(SkBits2Float(0xd5394437), SkBits2Float(0x37373737));  // -1.2731e+13f, 1.09205e-05f
-    path.lineTo(SkBits2Float(0x37373737), SkBits2Float(0x37373737));  // 1.09205e-05f, 1.09205e-05f
-    path.lineTo(SkBits2Float(0x37373745), SkBits2Float(0x0001b800));  // 1.09205e-05f, 1.57842e-40f
-    path.close();
+    SkPath path = SkPathBuilder()
+                  .moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000))  // 0, 0
+                  .lineTo(SkBits2Float(0xd5394437), SkBits2Float(0x37373737))  // -1.2731e+13f, 1.09205e-05f
+                  .lineTo(SkBits2Float(0x37373737), SkBits2Float(0x37373737))  // 1.09205e-05f, 1.09205e-05f
+                  .lineTo(SkBits2Float(0x37373745), SkBits2Float(0x0001b800))  // 1.09205e-05f, 1.57842e-40f
+                  .close()
+                  .detach();
     test_draw_AA_path(100, 100, path);
 }
 
 static void test_skbug_6947() {
-    SkPath path;
-    SkPoint points[] =
+    const SkPoint points[] =
         {{125.126022f, -0.499872506f}, {125.288895f, -0.499338806f},
          {125.299316f, -0.499290764f}, {126.294594f, 0.505449712f},
          {125.999992f, 62.5047531f}, {124.0f, 62.4980202f},
@@ -4601,213 +4619,215 @@
          {124.294609f, 0.495946467f}, {125.294601f, 0.50069809f},
          {125.289886f, 1.50068688f}, {125.282349f, 1.50065041f},
          {125.119476f, 1.50011659f}};
-    constexpr SkPath::Verb kMove = SkPath::kMove_Verb;
-    constexpr SkPath::Verb kLine = SkPath::kLine_Verb;
-    constexpr SkPath::Verb kClose = SkPath::kClose_Verb;
-    SkPath::Verb verbs[] = {kMove, kLine, kLine, kLine, kLine, kLine, kLine, kLine, kClose,
+    constexpr SkPathVerb kMove = SkPathVerb::kMove;
+    constexpr SkPathVerb kLine = SkPathVerb::kLine;
+    constexpr SkPathVerb kClose = SkPathVerb::kClose;
+    const SkPathVerb verbs[] = {kMove, kLine, kLine, kLine, kLine, kLine, kLine, kLine, kClose,
             kMove, kLine, kLine, kLine, kLine, kLine, kLine, kLine, kLine, kLine, kLine, kClose};
     int pointIndex = 0;
+    SkPathBuilder builder;
     for(auto verb : verbs) {
         switch (verb) {
             case kMove:
-                path.moveTo(points[pointIndex++]);
+                builder.moveTo(points[pointIndex++]);
                 break;
             case kLine:
-                path.lineTo(points[pointIndex++]);
+                builder.lineTo(points[pointIndex++]);
                 break;
             case kClose:
             default:
-                path.close();
+                builder.close();
                 break;
         }
     }
-    test_draw_AA_path(250, 125, path);
+    test_draw_AA_path(250, 125, builder.detach());
 }
 
 static void test_skbug_7015() {
-    SkPath path;
-    path.setFillType(SkPathFillType::kWinding);
-    path.moveTo(SkBits2Float(0x4388c000), SkBits2Float(0x43947c08));  // 273.5f, 296.969f
-    path.lineTo(SkBits2Float(0x4386c000), SkBits2Float(0x43947c08));  // 269.5f, 296.969f
-    // 269.297f, 292.172f, 273.695f, 292.172f, 273.5f, 296.969f
-    path.cubicTo(SkBits2Float(0x4386a604), SkBits2Float(0x43921604),
-            SkBits2Float(0x4388d8f6), SkBits2Float(0x43921604),
-            SkBits2Float(0x4388c000), SkBits2Float(0x43947c08));
-    path.close();
+    SkPath path = SkPathBuilder(SkPathFillType::kWinding)
+                  .moveTo(SkBits2Float(0x4388c000), SkBits2Float(0x43947c08))  // 273.5f, 296.969f
+                  .lineTo(SkBits2Float(0x4386c000), SkBits2Float(0x43947c08))  // 269.5f, 296.969f
+                  // 269.297f, 292.172f, 273.695f, 292.172f, 273.5f, 296.969f
+                  .cubicTo(SkBits2Float(0x4386a604), SkBits2Float(0x43921604),
+                           SkBits2Float(0x4388d8f6), SkBits2Float(0x43921604),
+                           SkBits2Float(0x4388c000), SkBits2Float(0x43947c08))
+                  .close()
+                  .detach();
     test_draw_AA_path(500, 500, path);
 }
 
 static void test_skbug_7051() {
-    SkPath path;
-    path.moveTo(10, 10);
-    path.cubicTo(10, 20, 10, 30, 30, 30);
-    path.lineTo(50, 20);
-    path.lineTo(50, 10);
-    path.close();
+    SkPath path = SkPathBuilder()
+                  .moveTo(10, 10)
+                  .cubicTo(10, 20, 10, 30, 30, 30)
+                  .lineTo(50, 20)
+                  .lineTo(50, 10)
+                  .close()
+                  .detach();
     test_draw_AA_path(100, 100, path);
 }
 
 static void test_skbug_7435() {
     SkPaint paint;
-    SkPath path;
-    path.setFillType(SkPathFillType::kWinding);
-    path.moveTo(SkBits2Float(0x7f07a5af), SkBits2Float(0xff07ff1d));  // 1.80306e+38f, -1.8077e+38f
-    path.lineTo(SkBits2Float(0x7edf4b2d), SkBits2Float(0xfedffe0a));  // 1.48404e+38f, -1.48868e+38f
-    path.lineTo(SkBits2Float(0x7edf4585), SkBits2Float(0xfee003b2));  // 1.48389e+38f, -1.48883e+38f
-    path.lineTo(SkBits2Float(0x7ef348e9), SkBits2Float(0xfef403c6));  // 1.6169e+38f, -1.62176e+38f
-    path.lineTo(SkBits2Float(0x7ef74c4e), SkBits2Float(0xfef803cb));  // 1.64358e+38f, -1.64834e+38f
-    path.conicTo(SkBits2Float(0x7ef74f23), SkBits2Float(0xfef8069e), SkBits2Float(0x7ef751f6), SkBits2Float(0xfef803c9), SkBits2Float(0x3f3504f3));  // 1.64365e+38f, -1.64841e+38f, 1.64372e+38f, -1.64834e+38f, 0.707107f
-    path.conicTo(SkBits2Float(0x7ef754c8), SkBits2Float(0xfef800f5), SkBits2Float(0x7ef751f5), SkBits2Float(0xfef7fe22), SkBits2Float(0x3f353472));  // 1.6438e+38f, -1.64827e+38f, 1.64372e+38f, -1.64819e+38f, 0.707832f
-    path.lineTo(SkBits2Float(0x7edb57a9), SkBits2Float(0xfedbfe06));  // 1.45778e+38f, -1.4621e+38f
-    path.lineTo(SkBits2Float(0x7e875976), SkBits2Float(0xfe87fdb3));  // 8.99551e+37f, -9.03815e+37f
-    path.lineTo(SkBits2Float(0x7ded5c2b), SkBits2Float(0xfdeff59e));  // 3.94382e+37f, -3.98701e+37f
-    path.lineTo(SkBits2Float(0x7d7a78a7), SkBits2Float(0xfd7fda0f));  // 2.08083e+37f, -2.12553e+37f
-    path.lineTo(SkBits2Float(0x7d7a6403), SkBits2Float(0xfd7fe461));  // 2.08016e+37f, -2.12587e+37f
-    path.conicTo(SkBits2Float(0x7d7a4764), SkBits2Float(0xfd7ff2b0), SkBits2Float(0x7d7a55b4), SkBits2Float(0xfd8007a8), SkBits2Float(0x3f3504f3));  // 2.07924e+37f, -2.12633e+37f, 2.0797e+37f, -2.12726e+37f, 0.707107f
-    path.conicTo(SkBits2Float(0x7d7a5803), SkBits2Float(0xfd8009f7), SkBits2Float(0x7d7a5ba9), SkBits2Float(0xfd800bcc), SkBits2Float(0x3f7cba66));  // 2.07977e+37f, -2.12741e+37f, 2.07989e+37f, -2.12753e+37f, 0.987219f
-    path.lineTo(SkBits2Float(0x7d8d2067), SkBits2Float(0xfd900bdb));  // 2.34487e+37f, -2.39338e+37f
-    path.lineTo(SkBits2Float(0x7ddd137a), SkBits2Float(0xfde00c2d));  // 3.67326e+37f, -3.72263e+37f
-    path.lineTo(SkBits2Float(0x7ddd2a1b), SkBits2Float(0xfddff58e));  // 3.67473e+37f, -3.72116e+37f
-    path.lineTo(SkBits2Float(0x7c694ae5), SkBits2Float(0xfc7fa67c));  // 4.8453e+36f, -5.30965e+36f
-    path.lineTo(SkBits2Float(0xfc164a8b), SkBits2Float(0x7c005af5));  // -3.12143e+36f, 2.66584e+36f
-    path.lineTo(SkBits2Float(0xfc8ae983), SkBits2Float(0x7c802da7));  // -5.77019e+36f, 5.32432e+36f
-    path.lineTo(SkBits2Float(0xfc8b16d9), SkBits2Float(0x7c80007b));  // -5.77754e+36f, 5.31699e+36f
-    path.lineTo(SkBits2Float(0xfc8b029c), SkBits2Float(0x7c7f8788));  // -5.77426e+36f, 5.30714e+36f
-    path.lineTo(SkBits2Float(0xfc8b0290), SkBits2Float(0x7c7f8790));  // -5.77425e+36f, 5.30714e+36f
-    path.lineTo(SkBits2Float(0xfc8b16cd), SkBits2Float(0x7c80007f));  // -5.77753e+36f, 5.31699e+36f
-    path.lineTo(SkBits2Float(0xfc8b4409), SkBits2Float(0x7c7fa672));  // -5.78487e+36f, 5.30965e+36f
-    path.lineTo(SkBits2Float(0x7d7aa2ba), SkBits2Float(0xfd800bd1));  // 2.0822e+37f, -2.12753e+37f
-    path.lineTo(SkBits2Float(0x7e8757ee), SkBits2Float(0xfe88035b));  // 8.99512e+37f, -9.03962e+37f
-    path.lineTo(SkBits2Float(0x7ef7552d), SkBits2Float(0xfef803ca));  // 1.64381e+38f, -1.64834e+38f
-    path.lineTo(SkBits2Float(0x7f0fa653), SkBits2Float(0xff1001f9));  // 1.90943e+38f, -1.91419e+38f
-    path.lineTo(SkBits2Float(0x7f0fa926), SkBits2Float(0xff0fff24));  // 1.90958e+38f, -1.91404e+38f
-    path.lineTo(SkBits2Float(0x7f0da75c), SkBits2Float(0xff0dff22));  // 1.8829e+38f, -1.88746e+38f
-    path.lineTo(SkBits2Float(0x7f07a5af), SkBits2Float(0xff07ff1d));  // 1.80306e+38f, -1.8077e+38f
-    path.close();
-    path.moveTo(SkBits2Float(0x7f07a2db), SkBits2Float(0xff0801f1));  // 1.80291e+38f, -1.80785e+38f
-    path.lineTo(SkBits2Float(0x7f0da48a), SkBits2Float(0xff0e01f8));  // 1.88275e+38f, -1.88761e+38f
-    path.lineTo(SkBits2Float(0x7f0fa654), SkBits2Float(0xff1001fa));  // 1.90943e+38f, -1.91419e+38f
-    path.lineTo(SkBits2Float(0x7f0fa7bd), SkBits2Float(0xff10008f));  // 1.90951e+38f, -1.91412e+38f
-    path.lineTo(SkBits2Float(0x7f0fa927), SkBits2Float(0xff0fff25));  // 1.90958e+38f, -1.91404e+38f
-    path.lineTo(SkBits2Float(0x7ef75ad5), SkBits2Float(0xfef7fe22));  // 1.64395e+38f, -1.64819e+38f
-    path.lineTo(SkBits2Float(0x7e875d96), SkBits2Float(0xfe87fdb3));  // 8.99659e+37f, -9.03815e+37f
-    path.lineTo(SkBits2Float(0x7d7acff6), SkBits2Float(0xfd7fea5b));  // 2.08367e+37f, -2.12606e+37f
-    path.lineTo(SkBits2Float(0xfc8b0588), SkBits2Float(0x7c8049b7));  // -5.77473e+36f, 5.32887e+36f
-    path.lineTo(SkBits2Float(0xfc8b2b16), SkBits2Float(0x7c803d32));  // -5.78083e+36f, 5.32684e+36f
-    path.conicTo(SkBits2Float(0xfc8b395c), SkBits2Float(0x7c803870), SkBits2Float(0xfc8b4405), SkBits2Float(0x7c802dd1), SkBits2Float(0x3f79349d));  // -5.78314e+36f, 5.32607e+36f, -5.78487e+36f, 5.32435e+36f, 0.973459f
-    path.conicTo(SkBits2Float(0xfc8b715b), SkBits2Float(0x7c8000a5), SkBits2Float(0xfc8b442f), SkBits2Float(0x7c7fa69e), SkBits2Float(0x3f3504f3));  // -5.79223e+36f, 5.31702e+36f, -5.7849e+36f, 5.30966e+36f, 0.707107f
-    path.lineTo(SkBits2Float(0xfc16ffaa), SkBits2Float(0x7bff4c12));  // -3.13612e+36f, 2.65116e+36f
-    path.lineTo(SkBits2Float(0x7c6895e0), SkBits2Float(0xfc802dc0));  // 4.83061e+36f, -5.32434e+36f
-    path.lineTo(SkBits2Float(0x7ddd137b), SkBits2Float(0xfde00c2e));  // 3.67326e+37f, -3.72263e+37f
-    path.lineTo(SkBits2Float(0x7ddd1ecb), SkBits2Float(0xfde000de));  // 3.67399e+37f, -3.72189e+37f
-    path.lineTo(SkBits2Float(0x7ddd2a1c), SkBits2Float(0xfddff58f));  // 3.67473e+37f, -3.72116e+37f
-    path.lineTo(SkBits2Float(0x7d8d3711), SkBits2Float(0xfd8ff543));  // 2.34634e+37f, -2.39191e+37f
-    path.lineTo(SkBits2Float(0x7d7a88fe), SkBits2Float(0xfd7fea69));  // 2.08136e+37f, -2.12606e+37f
-    path.lineTo(SkBits2Float(0x7d7a7254), SkBits2Float(0xfd800080));  // 2.08063e+37f, -2.1268e+37f
-    path.lineTo(SkBits2Float(0x7d7a80a4), SkBits2Float(0xfd800ed0));  // 2.08109e+37f, -2.12773e+37f
-    path.lineTo(SkBits2Float(0x7d7a80a8), SkBits2Float(0xfd800ecf));  // 2.08109e+37f, -2.12773e+37f
-    path.lineTo(SkBits2Float(0x7d7a7258), SkBits2Float(0xfd80007f));  // 2.08063e+37f, -2.1268e+37f
-    path.lineTo(SkBits2Float(0x7d7a5bb9), SkBits2Float(0xfd800bd0));  // 2.0799e+37f, -2.12753e+37f
-    path.lineTo(SkBits2Float(0x7ded458b), SkBits2Float(0xfdf00c3e));  // 3.94235e+37f, -3.98848e+37f
-    path.lineTo(SkBits2Float(0x7e8753ce), SkBits2Float(0xfe88035b));  // 8.99405e+37f, -9.03962e+37f
-    path.lineTo(SkBits2Float(0x7edb5201), SkBits2Float(0xfedc03ae));  // 1.45763e+38f, -1.46225e+38f
-    path.lineTo(SkBits2Float(0x7ef74c4d), SkBits2Float(0xfef803ca));  // 1.64358e+38f, -1.64834e+38f
-    path.lineTo(SkBits2Float(0x7ef74f21), SkBits2Float(0xfef800f6));  // 1.64365e+38f, -1.64827e+38f
-    path.lineTo(SkBits2Float(0x7ef751f4), SkBits2Float(0xfef7fe21));  // 1.64372e+38f, -1.64819e+38f
-    path.lineTo(SkBits2Float(0x7ef34e91), SkBits2Float(0xfef3fe1e));  // 1.61705e+38f, -1.62161e+38f
-    path.lineTo(SkBits2Float(0x7edf4b2d), SkBits2Float(0xfedffe0a));  // 1.48404e+38f, -1.48868e+38f
-    path.lineTo(SkBits2Float(0x7edf4859), SkBits2Float(0xfee000de));  // 1.48397e+38f, -1.48876e+38f
-    path.lineTo(SkBits2Float(0x7edf4585), SkBits2Float(0xfee003b2));  // 1.48389e+38f, -1.48883e+38f
-    path.lineTo(SkBits2Float(0x7f07a2db), SkBits2Float(0xff0801f1));  // 1.80291e+38f, -1.80785e+38f
-    path.close();
-    path.moveTo(SkBits2Float(0xfab120db), SkBits2Float(0x77b50b4f));  // -4.59851e+35f, 7.34402e+33f
-    path.lineTo(SkBits2Float(0xfd6597e5), SkBits2Float(0x7d60177f));  // -1.90739e+37f, 1.86168e+37f
-    path.lineTo(SkBits2Float(0xfde2cea1), SkBits2Float(0x7de00c2e));  // -3.76848e+37f, 3.72263e+37f
-    path.lineTo(SkBits2Float(0xfe316511), SkBits2Float(0x7e300657));  // -5.89495e+37f, 5.84943e+37f
-    path.lineTo(SkBits2Float(0xfe415da1), SkBits2Float(0x7e400666));  // -6.42568e+37f, 6.38112e+37f
-    path.lineTo(SkBits2Float(0xfe41634a), SkBits2Float(0x7e4000be));  // -6.42641e+37f, 6.38039e+37f
-    path.lineTo(SkBits2Float(0xfe41634a), SkBits2Float(0x7e3ff8be));  // -6.42641e+37f, 6.37935e+37f
-    path.lineTo(SkBits2Float(0xfe416349), SkBits2Float(0x7e3ff8be));  // -6.42641e+37f, 6.37935e+37f
-    path.lineTo(SkBits2Float(0xfe415f69), SkBits2Float(0x7e3ff8be));  // -6.42591e+37f, 6.37935e+37f
-    path.lineTo(SkBits2Float(0xfe415bc9), SkBits2Float(0x7e3ff8be));  // -6.42544e+37f, 6.37935e+37f
-    path.lineTo(SkBits2Float(0xfe415bc9), SkBits2Float(0x7e4000be));  // -6.42544e+37f, 6.38039e+37f
-    path.lineTo(SkBits2Float(0xfe416171), SkBits2Float(0x7e3ffb16));  // -6.42617e+37f, 6.37966e+37f
-    path.lineTo(SkBits2Float(0xfe016131), SkBits2Float(0x7dfff5ae));  // -4.29938e+37f, 4.25286e+37f
-    path.lineTo(SkBits2Float(0xfe0155e2), SkBits2Float(0x7e000628));  // -4.29791e+37f, 4.25433e+37f
-    path.lineTo(SkBits2Float(0xfe0958ea), SkBits2Float(0x7e080630));  // -4.56415e+37f, 4.52018e+37f
-    path.lineTo(SkBits2Float(0xfe115c92), SkBits2Float(0x7e100638));  // -4.83047e+37f, 4.78603e+37f
-    path.conicTo(SkBits2Float(0xfe11623c), SkBits2Float(0x7e100bdf), SkBits2Float(0xfe1167e2), SkBits2Float(0x7e100636), SkBits2Float(0x3f3504f3));  // -4.8312e+37f, 4.78676e+37f, -4.83194e+37f, 4.78603e+37f, 0.707107f
-    path.conicTo(SkBits2Float(0xfe116d87), SkBits2Float(0x7e10008e), SkBits2Float(0xfe1167e2), SkBits2Float(0x7e0ffae8), SkBits2Float(0x3f35240a));  // -4.83267e+37f, 4.78529e+37f, -4.83194e+37f, 4.78456e+37f, 0.707581f
-    path.lineTo(SkBits2Float(0xfe016b92), SkBits2Float(0x7dfff5af));  // -4.30072e+37f, 4.25286e+37f
-    path.lineTo(SkBits2Float(0xfdc2d963), SkBits2Float(0x7dbff56e));  // -3.23749e+37f, 3.18946e+37f
-    path.lineTo(SkBits2Float(0xfd65ae25), SkBits2Float(0x7d5fea3d));  // -1.90811e+37f, 1.86021e+37f
-    path.lineTo(SkBits2Float(0xfab448de), SkBits2Float(0xf7b50a19));  // -4.68046e+35f, -7.34383e+33f
-    path.lineTo(SkBits2Float(0xfab174d9), SkBits2Float(0x43480000));  // -4.60703e+35f, 200
-    path.lineTo(SkBits2Float(0xfab174d9), SkBits2Float(0x7800007f));  // -4.60703e+35f, 1.03848e+34f
-    path.lineTo(SkBits2Float(0xfab3f4db), SkBits2Float(0x7800007f));  // -4.67194e+35f, 1.03848e+34f
-    path.lineTo(SkBits2Float(0xfab3f4db), SkBits2Float(0x43480000));  // -4.67194e+35f, 200
-    path.lineTo(SkBits2Float(0xfab120db), SkBits2Float(0x77b50b4f));  // -4.59851e+35f, 7.34402e+33f
-    path.close();
-    path.moveTo(SkBits2Float(0xfab59cf2), SkBits2Float(0xf800007e));  // -4.71494e+35f, -1.03847e+34f
-    path.lineTo(SkBits2Float(0xfaa7cc52), SkBits2Float(0xf800007f));  // -4.35629e+35f, -1.03848e+34f
-    path.lineTo(SkBits2Float(0xfd6580e5), SkBits2Float(0x7d60177f));  // -1.90664e+37f, 1.86168e+37f
-    path.lineTo(SkBits2Float(0xfdc2c2c1), SkBits2Float(0x7dc00c0f));  // -3.23602e+37f, 3.19093e+37f
-    path.lineTo(SkBits2Float(0xfe016040), SkBits2Float(0x7e000626));  // -4.29925e+37f, 4.25433e+37f
-    path.lineTo(SkBits2Float(0xfe115c90), SkBits2Float(0x7e100636));  // -4.83047e+37f, 4.78603e+37f
-    path.lineTo(SkBits2Float(0xfe116239), SkBits2Float(0x7e10008f));  // -4.8312e+37f, 4.78529e+37f
-    path.lineTo(SkBits2Float(0xfe1167e0), SkBits2Float(0x7e0ffae6));  // -4.83194e+37f, 4.78456e+37f
-    path.lineTo(SkBits2Float(0xfe096438), SkBits2Float(0x7e07fade));  // -4.56562e+37f, 4.51871e+37f
-    path.lineTo(SkBits2Float(0xfe016130), SkBits2Float(0x7dfff5ac));  // -4.29938e+37f, 4.25286e+37f
-    path.lineTo(SkBits2Float(0xfe015b89), SkBits2Float(0x7e00007f));  // -4.29864e+37f, 4.25359e+37f
-    path.lineTo(SkBits2Float(0xfe0155e1), SkBits2Float(0x7e000627));  // -4.29791e+37f, 4.25433e+37f
-    path.lineTo(SkBits2Float(0xfe415879), SkBits2Float(0x7e4008bf));  // -6.42501e+37f, 6.38143e+37f
-    path.lineTo(SkBits2Float(0xfe415f69), SkBits2Float(0x7e4008bf));  // -6.42591e+37f, 6.38143e+37f
-    path.lineTo(SkBits2Float(0xfe416349), SkBits2Float(0x7e4008bf));  // -6.42641e+37f, 6.38143e+37f
-    path.lineTo(SkBits2Float(0xfe41634a), SkBits2Float(0x7e4008bf));  // -6.42641e+37f, 6.38143e+37f
-    path.conicTo(SkBits2Float(0xfe416699), SkBits2Float(0x7e4008bf), SkBits2Float(0xfe4168f1), SkBits2Float(0x7e400668), SkBits2Float(0x3f6c8ed9));  // -6.42684e+37f, 6.38143e+37f, -6.42715e+37f, 6.38113e+37f, 0.924055f
-    path.conicTo(SkBits2Float(0xfe416e9a), SkBits2Float(0x7e4000c2), SkBits2Float(0xfe4168f3), SkBits2Float(0x7e3ffb17), SkBits2Float(0x3f3504f3));  // -6.42788e+37f, 6.38039e+37f, -6.42715e+37f, 6.37966e+37f, 0.707107f
-    path.lineTo(SkBits2Float(0xfe317061), SkBits2Float(0x7e2ffb07));  // -5.89642e+37f, 5.84796e+37f
-    path.lineTo(SkBits2Float(0xfde2e542), SkBits2Float(0x7ddff58e));  // -3.76995e+37f, 3.72116e+37f
-    path.lineTo(SkBits2Float(0xfd65c525), SkBits2Float(0x7d5fea3d));  // -1.90886e+37f, 1.86021e+37f
-    path.lineTo(SkBits2Float(0xfab6c8db), SkBits2Float(0xf7b50b4f));  // -4.74536e+35f, -7.34402e+33f
-    path.lineTo(SkBits2Float(0xfab59cf2), SkBits2Float(0xf800007e));  // -4.71494e+35f, -1.03847e+34f
-    path.close();
-    path.moveTo(SkBits2Float(0xfab3f4db), SkBits2Float(0x43480000));  // -4.67194e+35f, 200
-    path.lineTo(SkBits2Float(0xfab174d9), SkBits2Float(0x43480000));  // -4.60703e+35f, 200
-    path.quadTo(SkBits2Float(0xfd0593a5), SkBits2Float(0x7d00007f), SkBits2Float(0xfd659785), SkBits2Float(0x7d6000de));  // -1.10971e+37f, 1.0634e+37f, -1.90737e+37f, 1.86095e+37f
-    path.quadTo(SkBits2Float(0xfda2cdf2), SkBits2Float(0x7da0009f), SkBits2Float(0xfdc2ce12), SkBits2Float(0x7dc000be));  // -2.70505e+37f, 2.6585e+37f, -3.23675e+37f, 3.1902e+37f
-    path.quadTo(SkBits2Float(0xfde2ce31), SkBits2Float(0x7de000de), SkBits2Float(0xfe0165e9), SkBits2Float(0x7e00007f));  // -3.76845e+37f, 3.72189e+37f, -4.29999e+37f, 4.25359e+37f
-    path.quadTo(SkBits2Float(0xfe1164b9), SkBits2Float(0x7e10008f), SkBits2Float(0xfe116239), SkBits2Float(0x7e10008f));  // -4.83153e+37f, 4.78529e+37f, -4.8312e+37f, 4.78529e+37f
-    path.quadTo(SkBits2Float(0xfe116039), SkBits2Float(0x7e10008f), SkBits2Float(0xfe095e91), SkBits2Float(0x7e080087));  // -4.83094e+37f, 4.78529e+37f, -4.56488e+37f, 4.51944e+37f
-    path.quadTo(SkBits2Float(0xfe015d09), SkBits2Float(0x7e00007f), SkBits2Float(0xfe015b89), SkBits2Float(0x7e00007f));  // -4.29884e+37f, 4.25359e+37f, -4.29864e+37f, 4.25359e+37f
-    path.lineTo(SkBits2Float(0xfe415bc9), SkBits2Float(0x7e4000be));  // -6.42544e+37f, 6.38039e+37f
-    path.quadTo(SkBits2Float(0xfe415da9), SkBits2Float(0x7e4000be), SkBits2Float(0xfe415f69), SkBits2Float(0x7e4000be));  // -6.42568e+37f, 6.38039e+37f, -6.42591e+37f, 6.38039e+37f
-    path.quadTo(SkBits2Float(0xfe416149), SkBits2Float(0x7e4000be), SkBits2Float(0xfe416349), SkBits2Float(0x7e4000be));  // -6.42615e+37f, 6.38039e+37f, -6.42641e+37f, 6.38039e+37f
-    path.quadTo(SkBits2Float(0xfe416849), SkBits2Float(0x7e4000be), SkBits2Float(0xfe316ab9), SkBits2Float(0x7e3000af));  // -6.42706e+37f, 6.38039e+37f, -5.89569e+37f, 5.84869e+37f
-    path.quadTo(SkBits2Float(0xfe216d29), SkBits2Float(0x7e20009f), SkBits2Float(0xfde2d9f2), SkBits2Float(0x7de000de));  // -5.36431e+37f, 5.31699e+37f, -3.76921e+37f, 3.72189e+37f
-    path.quadTo(SkBits2Float(0xfda2d9b2), SkBits2Float(0x7da0009f), SkBits2Float(0xfd65ae85), SkBits2Float(0x7d6000de));  // -2.70582e+37f, 2.6585e+37f, -1.90812e+37f, 1.86095e+37f
-    path.quadTo(SkBits2Float(0xfd05a9a6), SkBits2Float(0x7d00007f), SkBits2Float(0xfab3f4db), SkBits2Float(0x43480000));  // -1.11043e+37f, 1.0634e+37f, -4.67194e+35f, 200
-    path.close();
-    path.moveTo(SkBits2Float(0x7f07a445), SkBits2Float(0xff080087));  // 1.80299e+38f, -1.80778e+38f
-    path.quadTo(SkBits2Float(0x7f0ba519), SkBits2Float(0xff0c008b), SkBits2Float(0x7f0da5f3), SkBits2Float(0xff0e008d));  // 1.8562e+38f, -1.86095e+38f, 1.88283e+38f, -1.88753e+38f
-    path.quadTo(SkBits2Float(0x7f0fa6d5), SkBits2Float(0xff10008f), SkBits2Float(0x7f0fa7bd), SkBits2Float(0xff10008f));  // 1.90946e+38f, -1.91412e+38f, 1.90951e+38f, -1.91412e+38f
-    path.quadTo(SkBits2Float(0x7f0faa7d), SkBits2Float(0xff10008f), SkBits2Float(0x7ef75801), SkBits2Float(0xfef800f6));  // 1.90965e+38f, -1.91412e+38f, 1.64388e+38f, -1.64827e+38f
-    path.quadTo(SkBits2Float(0x7ecf5b09), SkBits2Float(0xfed000ce), SkBits2Float(0x7e875ac2), SkBits2Float(0xfe880087));  // 1.37811e+38f, -1.38242e+38f, 8.99585e+37f, -9.03889e+37f
-    path.quadTo(SkBits2Float(0x7e0eb505), SkBits2Float(0xfe10008f), SkBits2Float(0x7d7ab958), SkBits2Float(0xfd80007f));  // 4.74226e+37f, -4.78529e+37f, 2.08293e+37f, -2.1268e+37f
-    path.quadTo(SkBits2Float(0xfc8ac1cd), SkBits2Float(0x7c80007f), SkBits2Float(0xfc8b16cd), SkBits2Float(0x7c80007f));  // -5.76374e+36f, 5.31699e+36f, -5.77753e+36f, 5.31699e+36f
-    path.quadTo(SkBits2Float(0xfc8b36cd), SkBits2Float(0x7c80007f), SkBits2Float(0xfc16a51a), SkBits2Float(0x7c00007f));  // -5.78273e+36f, 5.31699e+36f, -3.12877e+36f, 2.6585e+36f
-    path.quadTo(SkBits2Float(0xfab6e4de), SkBits2Float(0x43480000), SkBits2Float(0x7c68f062), SkBits2Float(0xfc80007f));  // -4.7482e+35f, 200, 4.83795e+36f, -5.31699e+36f
-    path.lineTo(SkBits2Float(0x7ddd1ecb), SkBits2Float(0xfde000de));  // 3.67399e+37f, -3.72189e+37f
-    path.quadTo(SkBits2Float(0x7d9d254b), SkBits2Float(0xfda0009f), SkBits2Float(0x7d8d2bbc), SkBits2Float(0xfd90008f));  // 2.61103e+37f, -2.6585e+37f, 2.3456e+37f, -2.39265e+37f
-    path.quadTo(SkBits2Float(0x7d7a64d8), SkBits2Float(0xfd80007f), SkBits2Float(0x7d7a7258), SkBits2Float(0xfd80007f));  // 2.08019e+37f, -2.1268e+37f, 2.08063e+37f, -2.1268e+37f
-    path.quadTo(SkBits2Float(0x7d7a9058), SkBits2Float(0xfd80007f), SkBits2Float(0x7ded50db), SkBits2Float(0xfdf000ee));  // 2.0816e+37f, -2.1268e+37f, 3.94309e+37f, -3.98774e+37f
-    path.quadTo(SkBits2Float(0x7e2eace5), SkBits2Float(0xfe3000af), SkBits2Float(0x7e8756a2), SkBits2Float(0xfe880087));  // 5.80458e+37f, -5.84869e+37f, 8.99478e+37f, -9.03889e+37f
-    path.quadTo(SkBits2Float(0x7ebf56d9), SkBits2Float(0xfec000be), SkBits2Float(0x7edb54d5), SkBits2Float(0xfedc00da));  // 1.27167e+38f, -1.27608e+38f, 1.45771e+38f, -1.46217e+38f
-    path.quadTo(SkBits2Float(0x7ef752e1), SkBits2Float(0xfef800f6), SkBits2Float(0x7ef74f21), SkBits2Float(0xfef800f6));  // 1.64375e+38f, -1.64827e+38f, 1.64365e+38f, -1.64827e+38f
-    path.quadTo(SkBits2Float(0x7ef74d71), SkBits2Float(0xfef800f6), SkBits2Float(0x7ef34bbd), SkBits2Float(0xfef400f2));  // 1.64361e+38f, -1.64827e+38f, 1.61698e+38f, -1.62168e+38f
-    path.quadTo(SkBits2Float(0x7eef4a19), SkBits2Float(0xfef000ee), SkBits2Float(0x7edf4859), SkBits2Float(0xfee000de));  // 1.59035e+38f, -1.5951e+38f, 1.48397e+38f, -1.48876e+38f
-    path.lineTo(SkBits2Float(0x7f07a445), SkBits2Float(0xff080087));  // 1.80299e+38f, -1.80778e+38f
-    path.close();
+    SkPath path = SkPathBuilder(SkPathFillType::kWinding)
+        .moveTo(SkBits2Float(0x7f07a5af), SkBits2Float(0xff07ff1d))  // 1.80306e+38f, -1.8077e+38f
+        .lineTo(SkBits2Float(0x7edf4b2d), SkBits2Float(0xfedffe0a))  // 1.48404e+38f, -1.48868e+38f
+        .lineTo(SkBits2Float(0x7edf4585), SkBits2Float(0xfee003b2))  // 1.48389e+38f, -1.48883e+38f
+        .lineTo(SkBits2Float(0x7ef348e9), SkBits2Float(0xfef403c6))  // 1.6169e+38f, -1.62176e+38f
+        .lineTo(SkBits2Float(0x7ef74c4e), SkBits2Float(0xfef803cb))  // 1.64358e+38f, -1.64834e+38f
+        .conicTo(SkBits2Float(0x7ef74f23), SkBits2Float(0xfef8069e), SkBits2Float(0x7ef751f6), SkBits2Float(0xfef803c9), SkBits2Float(0x3f3504f3))  // 1.64365e+38f, -1.64841e+38f, 1.64372e+38f, -1.64834e+38f, 0.707107f
+        .conicTo(SkBits2Float(0x7ef754c8), SkBits2Float(0xfef800f5), SkBits2Float(0x7ef751f5), SkBits2Float(0xfef7fe22), SkBits2Float(0x3f353472))  // 1.6438e+38f, -1.64827e+38f, 1.64372e+38f, -1.64819e+38f, 0.707832f
+        .lineTo(SkBits2Float(0x7edb57a9), SkBits2Float(0xfedbfe06))  // 1.45778e+38f, -1.4621e+38f
+        .lineTo(SkBits2Float(0x7e875976), SkBits2Float(0xfe87fdb3))  // 8.99551e+37f, -9.03815e+37f
+        .lineTo(SkBits2Float(0x7ded5c2b), SkBits2Float(0xfdeff59e))  // 3.94382e+37f, -3.98701e+37f
+        .lineTo(SkBits2Float(0x7d7a78a7), SkBits2Float(0xfd7fda0f))  // 2.08083e+37f, -2.12553e+37f
+        .lineTo(SkBits2Float(0x7d7a6403), SkBits2Float(0xfd7fe461))  // 2.08016e+37f, -2.12587e+37f
+        .conicTo(SkBits2Float(0x7d7a4764), SkBits2Float(0xfd7ff2b0), SkBits2Float(0x7d7a55b4), SkBits2Float(0xfd8007a8), SkBits2Float(0x3f3504f3))  // 2.07924e+37f, -2.12633e+37f, 2.0797e+37f, -2.12726e+37f, 0.707107f
+        .conicTo(SkBits2Float(0x7d7a5803), SkBits2Float(0xfd8009f7), SkBits2Float(0x7d7a5ba9), SkBits2Float(0xfd800bcc), SkBits2Float(0x3f7cba66))  // 2.07977e+37f, -2.12741e+37f, 2.07989e+37f, -2.12753e+37f, 0.987219f
+        .lineTo(SkBits2Float(0x7d8d2067), SkBits2Float(0xfd900bdb))  // 2.34487e+37f, -2.39338e+37f
+        .lineTo(SkBits2Float(0x7ddd137a), SkBits2Float(0xfde00c2d))  // 3.67326e+37f, -3.72263e+37f
+        .lineTo(SkBits2Float(0x7ddd2a1b), SkBits2Float(0xfddff58e))  // 3.67473e+37f, -3.72116e+37f
+        .lineTo(SkBits2Float(0x7c694ae5), SkBits2Float(0xfc7fa67c))  // 4.8453e+36f, -5.30965e+36f
+        .lineTo(SkBits2Float(0xfc164a8b), SkBits2Float(0x7c005af5))  // -3.12143e+36f, 2.66584e+36f
+        .lineTo(SkBits2Float(0xfc8ae983), SkBits2Float(0x7c802da7))  // -5.77019e+36f, 5.32432e+36f
+        .lineTo(SkBits2Float(0xfc8b16d9), SkBits2Float(0x7c80007b))  // -5.77754e+36f, 5.31699e+36f
+        .lineTo(SkBits2Float(0xfc8b029c), SkBits2Float(0x7c7f8788))  // -5.77426e+36f, 5.30714e+36f
+        .lineTo(SkBits2Float(0xfc8b0290), SkBits2Float(0x7c7f8790))  // -5.77425e+36f, 5.30714e+36f
+        .lineTo(SkBits2Float(0xfc8b16cd), SkBits2Float(0x7c80007f))  // -5.77753e+36f, 5.31699e+36f
+        .lineTo(SkBits2Float(0xfc8b4409), SkBits2Float(0x7c7fa672))  // -5.78487e+36f, 5.30965e+36f
+        .lineTo(SkBits2Float(0x7d7aa2ba), SkBits2Float(0xfd800bd1))  // 2.0822e+37f, -2.12753e+37f
+        .lineTo(SkBits2Float(0x7e8757ee), SkBits2Float(0xfe88035b))  // 8.99512e+37f, -9.03962e+37f
+        .lineTo(SkBits2Float(0x7ef7552d), SkBits2Float(0xfef803ca))  // 1.64381e+38f, -1.64834e+38f
+        .lineTo(SkBits2Float(0x7f0fa653), SkBits2Float(0xff1001f9))  // 1.90943e+38f, -1.91419e+38f
+        .lineTo(SkBits2Float(0x7f0fa926), SkBits2Float(0xff0fff24))  // 1.90958e+38f, -1.91404e+38f
+        .lineTo(SkBits2Float(0x7f0da75c), SkBits2Float(0xff0dff22))  // 1.8829e+38f, -1.88746e+38f
+        .lineTo(SkBits2Float(0x7f07a5af), SkBits2Float(0xff07ff1d))  // 1.80306e+38f, -1.8077e+38f
+        .close()
+        .moveTo(SkBits2Float(0x7f07a2db), SkBits2Float(0xff0801f1))  // 1.80291e+38f, -1.80785e+38f
+        .lineTo(SkBits2Float(0x7f0da48a), SkBits2Float(0xff0e01f8))  // 1.88275e+38f, -1.88761e+38f
+        .lineTo(SkBits2Float(0x7f0fa654), SkBits2Float(0xff1001fa))  // 1.90943e+38f, -1.91419e+38f
+        .lineTo(SkBits2Float(0x7f0fa7bd), SkBits2Float(0xff10008f))  // 1.90951e+38f, -1.91412e+38f
+        .lineTo(SkBits2Float(0x7f0fa927), SkBits2Float(0xff0fff25))  // 1.90958e+38f, -1.91404e+38f
+        .lineTo(SkBits2Float(0x7ef75ad5), SkBits2Float(0xfef7fe22))  // 1.64395e+38f, -1.64819e+38f
+        .lineTo(SkBits2Float(0x7e875d96), SkBits2Float(0xfe87fdb3))  // 8.99659e+37f, -9.03815e+37f
+        .lineTo(SkBits2Float(0x7d7acff6), SkBits2Float(0xfd7fea5b))  // 2.08367e+37f, -2.12606e+37f
+        .lineTo(SkBits2Float(0xfc8b0588), SkBits2Float(0x7c8049b7))  // -5.77473e+36f, 5.32887e+36f
+        .lineTo(SkBits2Float(0xfc8b2b16), SkBits2Float(0x7c803d32))  // -5.78083e+36f, 5.32684e+36f
+        .conicTo(SkBits2Float(0xfc8b395c), SkBits2Float(0x7c803870), SkBits2Float(0xfc8b4405), SkBits2Float(0x7c802dd1), SkBits2Float(0x3f79349d))  // -5.78314e+36f, 5.32607e+36f, -5.78487e+36f, 5.32435e+36f, 0.973459f
+        .conicTo(SkBits2Float(0xfc8b715b), SkBits2Float(0x7c8000a5), SkBits2Float(0xfc8b442f), SkBits2Float(0x7c7fa69e), SkBits2Float(0x3f3504f3))  // -5.79223e+36f, 5.31702e+36f, -5.7849e+36f, 5.30966e+36f, 0.707107f
+        .lineTo(SkBits2Float(0xfc16ffaa), SkBits2Float(0x7bff4c12))  // -3.13612e+36f, 2.65116e+36f
+        .lineTo(SkBits2Float(0x7c6895e0), SkBits2Float(0xfc802dc0))  // 4.83061e+36f, -5.32434e+36f
+        .lineTo(SkBits2Float(0x7ddd137b), SkBits2Float(0xfde00c2e))  // 3.67326e+37f, -3.72263e+37f
+        .lineTo(SkBits2Float(0x7ddd1ecb), SkBits2Float(0xfde000de))  // 3.67399e+37f, -3.72189e+37f
+        .lineTo(SkBits2Float(0x7ddd2a1c), SkBits2Float(0xfddff58f))  // 3.67473e+37f, -3.72116e+37f
+        .lineTo(SkBits2Float(0x7d8d3711), SkBits2Float(0xfd8ff543))  // 2.34634e+37f, -2.39191e+37f
+        .lineTo(SkBits2Float(0x7d7a88fe), SkBits2Float(0xfd7fea69))  // 2.08136e+37f, -2.12606e+37f
+        .lineTo(SkBits2Float(0x7d7a7254), SkBits2Float(0xfd800080))  // 2.08063e+37f, -2.1268e+37f
+        .lineTo(SkBits2Float(0x7d7a80a4), SkBits2Float(0xfd800ed0))  // 2.08109e+37f, -2.12773e+37f
+        .lineTo(SkBits2Float(0x7d7a80a8), SkBits2Float(0xfd800ecf))  // 2.08109e+37f, -2.12773e+37f
+        .lineTo(SkBits2Float(0x7d7a7258), SkBits2Float(0xfd80007f))  // 2.08063e+37f, -2.1268e+37f
+        .lineTo(SkBits2Float(0x7d7a5bb9), SkBits2Float(0xfd800bd0))  // 2.0799e+37f, -2.12753e+37f
+        .lineTo(SkBits2Float(0x7ded458b), SkBits2Float(0xfdf00c3e))  // 3.94235e+37f, -3.98848e+37f
+        .lineTo(SkBits2Float(0x7e8753ce), SkBits2Float(0xfe88035b))  // 8.99405e+37f, -9.03962e+37f
+        .lineTo(SkBits2Float(0x7edb5201), SkBits2Float(0xfedc03ae))  // 1.45763e+38f, -1.46225e+38f
+        .lineTo(SkBits2Float(0x7ef74c4d), SkBits2Float(0xfef803ca))  // 1.64358e+38f, -1.64834e+38f
+        .lineTo(SkBits2Float(0x7ef74f21), SkBits2Float(0xfef800f6))  // 1.64365e+38f, -1.64827e+38f
+        .lineTo(SkBits2Float(0x7ef751f4), SkBits2Float(0xfef7fe21))  // 1.64372e+38f, -1.64819e+38f
+        .lineTo(SkBits2Float(0x7ef34e91), SkBits2Float(0xfef3fe1e))  // 1.61705e+38f, -1.62161e+38f
+        .lineTo(SkBits2Float(0x7edf4b2d), SkBits2Float(0xfedffe0a))  // 1.48404e+38f, -1.48868e+38f
+        .lineTo(SkBits2Float(0x7edf4859), SkBits2Float(0xfee000de))  // 1.48397e+38f, -1.48876e+38f
+        .lineTo(SkBits2Float(0x7edf4585), SkBits2Float(0xfee003b2))  // 1.48389e+38f, -1.48883e+38f
+        .lineTo(SkBits2Float(0x7f07a2db), SkBits2Float(0xff0801f1))  // 1.80291e+38f, -1.80785e+38f
+        .close()
+        .moveTo(SkBits2Float(0xfab120db), SkBits2Float(0x77b50b4f))  // -4.59851e+35f, 7.34402e+33f
+        .lineTo(SkBits2Float(0xfd6597e5), SkBits2Float(0x7d60177f))  // -1.90739e+37f, 1.86168e+37f
+        .lineTo(SkBits2Float(0xfde2cea1), SkBits2Float(0x7de00c2e))  // -3.76848e+37f, 3.72263e+37f
+        .lineTo(SkBits2Float(0xfe316511), SkBits2Float(0x7e300657))  // -5.89495e+37f, 5.84943e+37f
+        .lineTo(SkBits2Float(0xfe415da1), SkBits2Float(0x7e400666))  // -6.42568e+37f, 6.38112e+37f
+        .lineTo(SkBits2Float(0xfe41634a), SkBits2Float(0x7e4000be))  // -6.42641e+37f, 6.38039e+37f
+        .lineTo(SkBits2Float(0xfe41634a), SkBits2Float(0x7e3ff8be))  // -6.42641e+37f, 6.37935e+37f
+        .lineTo(SkBits2Float(0xfe416349), SkBits2Float(0x7e3ff8be))  // -6.42641e+37f, 6.37935e+37f
+        .lineTo(SkBits2Float(0xfe415f69), SkBits2Float(0x7e3ff8be))  // -6.42591e+37f, 6.37935e+37f
+        .lineTo(SkBits2Float(0xfe415bc9), SkBits2Float(0x7e3ff8be))  // -6.42544e+37f, 6.37935e+37f
+        .lineTo(SkBits2Float(0xfe415bc9), SkBits2Float(0x7e4000be))  // -6.42544e+37f, 6.38039e+37f
+        .lineTo(SkBits2Float(0xfe416171), SkBits2Float(0x7e3ffb16))  // -6.42617e+37f, 6.37966e+37f
+        .lineTo(SkBits2Float(0xfe016131), SkBits2Float(0x7dfff5ae))  // -4.29938e+37f, 4.25286e+37f
+        .lineTo(SkBits2Float(0xfe0155e2), SkBits2Float(0x7e000628))  // -4.29791e+37f, 4.25433e+37f
+        .lineTo(SkBits2Float(0xfe0958ea), SkBits2Float(0x7e080630))  // -4.56415e+37f, 4.52018e+37f
+        .lineTo(SkBits2Float(0xfe115c92), SkBits2Float(0x7e100638))  // -4.83047e+37f, 4.78603e+37f
+        .conicTo(SkBits2Float(0xfe11623c), SkBits2Float(0x7e100bdf), SkBits2Float(0xfe1167e2), SkBits2Float(0x7e100636), SkBits2Float(0x3f3504f3))  // -4.8312e+37f, 4.78676e+37f, -4.83194e+37f, 4.78603e+37f, 0.707107f
+        .conicTo(SkBits2Float(0xfe116d87), SkBits2Float(0x7e10008e), SkBits2Float(0xfe1167e2), SkBits2Float(0x7e0ffae8), SkBits2Float(0x3f35240a))  // -4.83267e+37f, 4.78529e+37f, -4.83194e+37f, 4.78456e+37f, 0.707581f
+        .lineTo(SkBits2Float(0xfe016b92), SkBits2Float(0x7dfff5af))  // -4.30072e+37f, 4.25286e+37f
+        .lineTo(SkBits2Float(0xfdc2d963), SkBits2Float(0x7dbff56e))  // -3.23749e+37f, 3.18946e+37f
+        .lineTo(SkBits2Float(0xfd65ae25), SkBits2Float(0x7d5fea3d))  // -1.90811e+37f, 1.86021e+37f
+        .lineTo(SkBits2Float(0xfab448de), SkBits2Float(0xf7b50a19))  // -4.68046e+35f, -7.34383e+33f
+        .lineTo(SkBits2Float(0xfab174d9), SkBits2Float(0x43480000))  // -4.60703e+35f, 200
+        .lineTo(SkBits2Float(0xfab174d9), SkBits2Float(0x7800007f))  // -4.60703e+35f, 1.03848e+34f
+        .lineTo(SkBits2Float(0xfab3f4db), SkBits2Float(0x7800007f))  // -4.67194e+35f, 1.03848e+34f
+        .lineTo(SkBits2Float(0xfab3f4db), SkBits2Float(0x43480000))  // -4.67194e+35f, 200
+        .lineTo(SkBits2Float(0xfab120db), SkBits2Float(0x77b50b4f))  // -4.59851e+35f, 7.34402e+33f
+        .close()
+        .moveTo(SkBits2Float(0xfab59cf2), SkBits2Float(0xf800007e))  // -4.71494e+35f, -1.03847e+34f
+        .lineTo(SkBits2Float(0xfaa7cc52), SkBits2Float(0xf800007f))  // -4.35629e+35f, -1.03848e+34f
+        .lineTo(SkBits2Float(0xfd6580e5), SkBits2Float(0x7d60177f))  // -1.90664e+37f, 1.86168e+37f
+        .lineTo(SkBits2Float(0xfdc2c2c1), SkBits2Float(0x7dc00c0f))  // -3.23602e+37f, 3.19093e+37f
+        .lineTo(SkBits2Float(0xfe016040), SkBits2Float(0x7e000626))  // -4.29925e+37f, 4.25433e+37f
+        .lineTo(SkBits2Float(0xfe115c90), SkBits2Float(0x7e100636))  // -4.83047e+37f, 4.78603e+37f
+        .lineTo(SkBits2Float(0xfe116239), SkBits2Float(0x7e10008f))  // -4.8312e+37f, 4.78529e+37f
+        .lineTo(SkBits2Float(0xfe1167e0), SkBits2Float(0x7e0ffae6))  // -4.83194e+37f, 4.78456e+37f
+        .lineTo(SkBits2Float(0xfe096438), SkBits2Float(0x7e07fade))  // -4.56562e+37f, 4.51871e+37f
+        .lineTo(SkBits2Float(0xfe016130), SkBits2Float(0x7dfff5ac))  // -4.29938e+37f, 4.25286e+37f
+        .lineTo(SkBits2Float(0xfe015b89), SkBits2Float(0x7e00007f))  // -4.29864e+37f, 4.25359e+37f
+        .lineTo(SkBits2Float(0xfe0155e1), SkBits2Float(0x7e000627))  // -4.29791e+37f, 4.25433e+37f
+        .lineTo(SkBits2Float(0xfe415879), SkBits2Float(0x7e4008bf))  // -6.42501e+37f, 6.38143e+37f
+        .lineTo(SkBits2Float(0xfe415f69), SkBits2Float(0x7e4008bf))  // -6.42591e+37f, 6.38143e+37f
+        .lineTo(SkBits2Float(0xfe416349), SkBits2Float(0x7e4008bf))  // -6.42641e+37f, 6.38143e+37f
+        .lineTo(SkBits2Float(0xfe41634a), SkBits2Float(0x7e4008bf))  // -6.42641e+37f, 6.38143e+37f
+        .conicTo(SkBits2Float(0xfe416699), SkBits2Float(0x7e4008bf), SkBits2Float(0xfe4168f1), SkBits2Float(0x7e400668), SkBits2Float(0x3f6c8ed9))  // -6.42684e+37f, 6.38143e+37f, -6.42715e+37f, 6.38113e+37f, 0.924055f
+        .conicTo(SkBits2Float(0xfe416e9a), SkBits2Float(0x7e4000c2), SkBits2Float(0xfe4168f3), SkBits2Float(0x7e3ffb17), SkBits2Float(0x3f3504f3))  // -6.42788e+37f, 6.38039e+37f, -6.42715e+37f, 6.37966e+37f, 0.707107f
+        .lineTo(SkBits2Float(0xfe317061), SkBits2Float(0x7e2ffb07))  // -5.89642e+37f, 5.84796e+37f
+        .lineTo(SkBits2Float(0xfde2e542), SkBits2Float(0x7ddff58e))  // -3.76995e+37f, 3.72116e+37f
+        .lineTo(SkBits2Float(0xfd65c525), SkBits2Float(0x7d5fea3d))  // -1.90886e+37f, 1.86021e+37f
+        .lineTo(SkBits2Float(0xfab6c8db), SkBits2Float(0xf7b50b4f))  // -4.74536e+35f, -7.34402e+33f
+        .lineTo(SkBits2Float(0xfab59cf2), SkBits2Float(0xf800007e))  // -4.71494e+35f, -1.03847e+34f
+        .close()
+        .moveTo(SkBits2Float(0xfab3f4db), SkBits2Float(0x43480000))  // -4.67194e+35f, 200
+        .lineTo(SkBits2Float(0xfab174d9), SkBits2Float(0x43480000))  // -4.60703e+35f, 200
+        .quadTo(SkBits2Float(0xfd0593a5), SkBits2Float(0x7d00007f), SkBits2Float(0xfd659785), SkBits2Float(0x7d6000de))  // -1.10971e+37f, 1.0634e+37f, -1.90737e+37f, 1.86095e+37f
+        .quadTo(SkBits2Float(0xfda2cdf2), SkBits2Float(0x7da0009f), SkBits2Float(0xfdc2ce12), SkBits2Float(0x7dc000be))  // -2.70505e+37f, 2.6585e+37f, -3.23675e+37f, 3.1902e+37f
+        .quadTo(SkBits2Float(0xfde2ce31), SkBits2Float(0x7de000de), SkBits2Float(0xfe0165e9), SkBits2Float(0x7e00007f))  // -3.76845e+37f, 3.72189e+37f, -4.29999e+37f, 4.25359e+37f
+        .quadTo(SkBits2Float(0xfe1164b9), SkBits2Float(0x7e10008f), SkBits2Float(0xfe116239), SkBits2Float(0x7e10008f))  // -4.83153e+37f, 4.78529e+37f, -4.8312e+37f, 4.78529e+37f
+        .quadTo(SkBits2Float(0xfe116039), SkBits2Float(0x7e10008f), SkBits2Float(0xfe095e91), SkBits2Float(0x7e080087))  // -4.83094e+37f, 4.78529e+37f, -4.56488e+37f, 4.51944e+37f
+        .quadTo(SkBits2Float(0xfe015d09), SkBits2Float(0x7e00007f), SkBits2Float(0xfe015b89), SkBits2Float(0x7e00007f))  // -4.29884e+37f, 4.25359e+37f, -4.29864e+37f, 4.25359e+37f
+        .lineTo(SkBits2Float(0xfe415bc9), SkBits2Float(0x7e4000be))  // -6.42544e+37f, 6.38039e+37f
+        .quadTo(SkBits2Float(0xfe415da9), SkBits2Float(0x7e4000be), SkBits2Float(0xfe415f69), SkBits2Float(0x7e4000be))  // -6.42568e+37f, 6.38039e+37f, -6.42591e+37f, 6.38039e+37f
+        .quadTo(SkBits2Float(0xfe416149), SkBits2Float(0x7e4000be), SkBits2Float(0xfe416349), SkBits2Float(0x7e4000be))  // -6.42615e+37f, 6.38039e+37f, -6.42641e+37f, 6.38039e+37f
+        .quadTo(SkBits2Float(0xfe416849), SkBits2Float(0x7e4000be), SkBits2Float(0xfe316ab9), SkBits2Float(0x7e3000af))  // -6.42706e+37f, 6.38039e+37f, -5.89569e+37f, 5.84869e+37f
+        .quadTo(SkBits2Float(0xfe216d29), SkBits2Float(0x7e20009f), SkBits2Float(0xfde2d9f2), SkBits2Float(0x7de000de))  // -5.36431e+37f, 5.31699e+37f, -3.76921e+37f, 3.72189e+37f
+        .quadTo(SkBits2Float(0xfda2d9b2), SkBits2Float(0x7da0009f), SkBits2Float(0xfd65ae85), SkBits2Float(0x7d6000de))  // -2.70582e+37f, 2.6585e+37f, -1.90812e+37f, 1.86095e+37f
+        .quadTo(SkBits2Float(0xfd05a9a6), SkBits2Float(0x7d00007f), SkBits2Float(0xfab3f4db), SkBits2Float(0x43480000))  // -1.11043e+37f, 1.0634e+37f, -4.67194e+35f, 200
+        .close()
+        .moveTo(SkBits2Float(0x7f07a445), SkBits2Float(0xff080087))  // 1.80299e+38f, -1.80778e+38f
+        .quadTo(SkBits2Float(0x7f0ba519), SkBits2Float(0xff0c008b), SkBits2Float(0x7f0da5f3), SkBits2Float(0xff0e008d))  // 1.8562e+38f, -1.86095e+38f, 1.88283e+38f, -1.88753e+38f
+        .quadTo(SkBits2Float(0x7f0fa6d5), SkBits2Float(0xff10008f), SkBits2Float(0x7f0fa7bd), SkBits2Float(0xff10008f))  // 1.90946e+38f, -1.91412e+38f, 1.90951e+38f, -1.91412e+38f
+        .quadTo(SkBits2Float(0x7f0faa7d), SkBits2Float(0xff10008f), SkBits2Float(0x7ef75801), SkBits2Float(0xfef800f6))  // 1.90965e+38f, -1.91412e+38f, 1.64388e+38f, -1.64827e+38f
+        .quadTo(SkBits2Float(0x7ecf5b09), SkBits2Float(0xfed000ce), SkBits2Float(0x7e875ac2), SkBits2Float(0xfe880087))  // 1.37811e+38f, -1.38242e+38f, 8.99585e+37f, -9.03889e+37f
+        .quadTo(SkBits2Float(0x7e0eb505), SkBits2Float(0xfe10008f), SkBits2Float(0x7d7ab958), SkBits2Float(0xfd80007f))  // 4.74226e+37f, -4.78529e+37f, 2.08293e+37f, -2.1268e+37f
+        .quadTo(SkBits2Float(0xfc8ac1cd), SkBits2Float(0x7c80007f), SkBits2Float(0xfc8b16cd), SkBits2Float(0x7c80007f))  // -5.76374e+36f, 5.31699e+36f, -5.77753e+36f, 5.31699e+36f
+        .quadTo(SkBits2Float(0xfc8b36cd), SkBits2Float(0x7c80007f), SkBits2Float(0xfc16a51a), SkBits2Float(0x7c00007f))  // -5.78273e+36f, 5.31699e+36f, -3.12877e+36f, 2.6585e+36f
+        .quadTo(SkBits2Float(0xfab6e4de), SkBits2Float(0x43480000), SkBits2Float(0x7c68f062), SkBits2Float(0xfc80007f))  // -4.7482e+35f, 200, 4.83795e+36f, -5.31699e+36f
+        .lineTo(SkBits2Float(0x7ddd1ecb), SkBits2Float(0xfde000de))  // 3.67399e+37f, -3.72189e+37f
+        .quadTo(SkBits2Float(0x7d9d254b), SkBits2Float(0xfda0009f), SkBits2Float(0x7d8d2bbc), SkBits2Float(0xfd90008f))  // 2.61103e+37f, -2.6585e+37f, 2.3456e+37f, -2.39265e+37f
+        .quadTo(SkBits2Float(0x7d7a64d8), SkBits2Float(0xfd80007f), SkBits2Float(0x7d7a7258), SkBits2Float(0xfd80007f))  // 2.08019e+37f, -2.1268e+37f, 2.08063e+37f, -2.1268e+37f
+        .quadTo(SkBits2Float(0x7d7a9058), SkBits2Float(0xfd80007f), SkBits2Float(0x7ded50db), SkBits2Float(0xfdf000ee))  // 2.0816e+37f, -2.1268e+37f, 3.94309e+37f, -3.98774e+37f
+        .quadTo(SkBits2Float(0x7e2eace5), SkBits2Float(0xfe3000af), SkBits2Float(0x7e8756a2), SkBits2Float(0xfe880087))  // 5.80458e+37f, -5.84869e+37f, 8.99478e+37f, -9.03889e+37f
+        .quadTo(SkBits2Float(0x7ebf56d9), SkBits2Float(0xfec000be), SkBits2Float(0x7edb54d5), SkBits2Float(0xfedc00da))  // 1.27167e+38f, -1.27608e+38f, 1.45771e+38f, -1.46217e+38f
+        .quadTo(SkBits2Float(0x7ef752e1), SkBits2Float(0xfef800f6), SkBits2Float(0x7ef74f21), SkBits2Float(0xfef800f6))  // 1.64375e+38f, -1.64827e+38f, 1.64365e+38f, -1.64827e+38f
+        .quadTo(SkBits2Float(0x7ef74d71), SkBits2Float(0xfef800f6), SkBits2Float(0x7ef34bbd), SkBits2Float(0xfef400f2))  // 1.64361e+38f, -1.64827e+38f, 1.61698e+38f, -1.62168e+38f
+        .quadTo(SkBits2Float(0x7eef4a19), SkBits2Float(0xfef000ee), SkBits2Float(0x7edf4859), SkBits2Float(0xfee000de))  // 1.59035e+38f, -1.5951e+38f, 1.48397e+38f, -1.48876e+38f
+        .lineTo(SkBits2Float(0x7f07a445), SkBits2Float(0xff080087))  // 1.80299e+38f, -1.80778e+38f
+        .close()
+        .detach();
     SkSurfaces::Raster(SkImageInfo::MakeN32Premul(250, 250), nullptr)
             ->getCanvas()
             ->drawPath(path, paint);
@@ -4820,12 +4840,10 @@
     REPORTER_ASSERT(reporter, p1 == out);
     REPORTER_ASSERT(reporter, p1.interpolate(p2, 1, &out));
     REPORTER_ASSERT(reporter, p1 == out);
-    p1.moveTo(0, 2);
-    p1.lineTo(0, 4);
+    p1 = SkPathBuilder().moveTo(0, 2).lineTo(0, 4).detach();
     REPORTER_ASSERT(reporter, !p1.isInterpolatable(p2));
     REPORTER_ASSERT(reporter, !p1.interpolate(p2, 1, &out));
-    p2.moveTo(6, 0);
-    p2.lineTo(8, 0);
+    p2 = SkPathBuilder().moveTo(6, 0).lineTo(8, 0).detach();
     REPORTER_ASSERT(reporter, p1.isInterpolatable(p2));
     REPORTER_ASSERT(reporter, p1.interpolate(p2, 0, &out));
     REPORTER_ASSERT(reporter, p2 == out);
@@ -4833,22 +4851,26 @@
     REPORTER_ASSERT(reporter, p1 == out);
     REPORTER_ASSERT(reporter, p1.interpolate(p2, 0.5f, &out));
     REPORTER_ASSERT(reporter, out.getBounds() == SkRect::MakeLTRB(3, 1, 4, 2));
-    p1.reset();
-    p1.moveTo(4, 4);
-    p1.conicTo(5, 4, 5, 5, 1 / SkScalarSqrt(2));
-    p2.reset();
-    p2.moveTo(4, 2);
-    p2.conicTo(7, 2, 7, 5, 1 / SkScalarSqrt(2));
+    p1 = SkPathBuilder()
+         .moveTo(4, 4)
+         .conicTo(5, 4, 5, 5, 1 / SkScalarSqrt(2))
+         .detach();
+    p2 = SkPathBuilder()
+         .moveTo(4, 2)
+         .conicTo(7, 2, 7, 5, 1 / SkScalarSqrt(2))
+         .detach();
     REPORTER_ASSERT(reporter, p1.isInterpolatable(p2));
     REPORTER_ASSERT(reporter, p1.interpolate(p2, 0.5f, &out));
     REPORTER_ASSERT(reporter, out.getBounds() == SkRect::MakeLTRB(4, 3, 6, 5));
-    p2.reset();
-    p2.moveTo(4, 2);
-    p2.conicTo(6, 3, 6, 5, 1);
+    p2 = SkPathBuilder()
+         .moveTo(4, 2)
+         .conicTo(6, 3, 6, 5, 1)
+         .detach();
     REPORTER_ASSERT(reporter, !p1.isInterpolatable(p2));
-    p2.reset();
-    p2.moveTo(4, 4);
-    p2.conicTo(5, 4, 5, 5, 0.5f);
+    p2 = SkPathBuilder()
+         .moveTo(4, 4)
+         .conicTo(5, 4, 5, 5, 0.5f)
+         .detach();
     REPORTER_ASSERT(reporter, !p1.isInterpolatable(p2));
 }
 
@@ -4856,6 +4878,7 @@
     test_interp(reporter);
 }
 
+#ifndef SK_HIDE_PATH_EDIT_METHODS
 DEF_TEST(Path_multipleMoveTos, reporter) {
     SkPath path;
     REPORTER_ASSERT(reporter, path.isEmpty());
@@ -4874,13 +4897,17 @@
     path.moveTo(7, 8);
     REPORTER_ASSERT(reporter, check_last_pt(7, 8));
 }
+#endif
 
 DEF_TEST(PathBigCubic, reporter) {
-    SkPath path;
-    path.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000));  // 0, 0
-    path.moveTo(SkBits2Float(0x44000000), SkBits2Float(0x373938b8));  // 512, 1.10401e-05f
-    path.cubicTo(SkBits2Float(0x00000001), SkBits2Float(0xdf000052), SkBits2Float(0x00000100), SkBits2Float(0x00000000), SkBits2Float(0x00000100), SkBits2Float(0x00000000));  // 1.4013e-45f, -9.22346e+18f, 3.58732e-43f, 0, 3.58732e-43f, 0
-    path.moveTo(0, 512);
+    SkPath path = SkPathBuilder()
+                  .moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000))  // 0, 0
+                  .moveTo(SkBits2Float(0x44000000), SkBits2Float(0x373938b8))  // 512, 1.10401e-05f
+                  .cubicTo(SkBits2Float(0x00000001), SkBits2Float(0xdf000052),
+                           SkBits2Float(0x00000100), SkBits2Float(0x00000000),
+                           SkBits2Float(0x00000100), SkBits2Float(0x00000000))  // 1.4013e-45f, -9.22346e+18f, 3.58732e-43f, 0, 3.58732e-43f, 0
+                  .moveTo(0, 512)
+                  .detach();
 
     // this call should not assert
     SkSurfaces::Raster(SkImageInfo::MakeN32Premul(255, 255), nullptr)
@@ -4914,7 +4941,6 @@
     SkSize::Make(3, 4);
 
     SkPath  p, empty;
-    SkRect  bounds, bounds2;
     test_empty(reporter, p);
 
     REPORTER_ASSERT(reporter, p.getBounds().isEmpty());
@@ -4926,9 +4952,11 @@
     // this triggers a code path in SkPath::swap which is otherwise unexercised
     p.swap(self);
 
-    bounds.setLTRB(0, 0, SK_Scalar1, SK_Scalar1);
+#ifndef SK_HIDE_PATH_EDIT_METHODS
+    SkRect  bounds, bounds2;
+    bounds.setLTRB(0, 0, 1, 1);
 
-    p.addRoundRect(bounds, SK_Scalar1, SK_Scalar1);
+    p.addRoundRect(bounds, 1, 1);
     check_convex_bounds(reporter, p, bounds);
     // we have quads or cubics
     REPORTER_ASSERT(reporter,
@@ -5000,6 +5028,7 @@
         REPORTER_ASSERT(reporter, p.isRect(&r));
         REPORTER_ASSERT(reporter, r == bounds);
     }
+#endif
 
     test_operatorEqual(reporter);
     test_isLine(reporter);
@@ -5070,14 +5099,14 @@
 }
 
 DEF_TEST(conservatively_contains_rect, reporter) {
-    SkPath path;
-
-    path.moveTo(SkBits2Float(0x44000000), SkBits2Float(0x373938b8));  // 512, 1.10401e-05f
-    // 1.4013e-45f, -9.22346e+18f, 3.58732e-43f, 0, 3.58732e-43f, 0
-    path.cubicTo(SkBits2Float(0x00000001), SkBits2Float(0xdf000052),
-                 SkBits2Float(0x00000100), SkBits2Float(0x00000000),
-                 SkBits2Float(0x00000100), SkBits2Float(0x00000000));
-    path.moveTo(0, 0);
+    SkPath path = SkPathBuilder()
+                  .moveTo(SkBits2Float(0x44000000), SkBits2Float(0x373938b8))  // 512, 1.10401e-05f
+                  // 1.4013e-45f, -9.22346e+18f, 3.58732e-43f, 0, 3.58732e-43f, 0
+                  .cubicTo(SkBits2Float(0x00000001), SkBits2Float(0xdf000052),
+                           SkBits2Float(0x00000100), SkBits2Float(0x00000000),
+                           SkBits2Float(0x00000100), SkBits2Float(0x00000000))
+                  .moveTo(0, 0)
+                  .detach();
 
     // this should not assert
     path.conservativelyContainsRect({ -211747, 12.1115f, -197893, 25.0321f });
@@ -5107,6 +5136,7 @@
     SkMakeNullCanvas()->drawDRRect(orr, irr, SkPaint());
 }
 
+#ifndef SK_HIDE_PATH_EDIT_METHODS
 DEF_TEST(PathRefSerialization, reporter) {
     SkPath path;
 
@@ -5139,10 +5169,12 @@
         REPORTER_ASSERT(reporter, !readBack.has_value());
     }
 }
+#endif
 
 DEF_TEST(NonFinitePathIteration, reporter) {
-    SkPath path;
-    path.moveTo(SK_ScalarInfinity, SK_ScalarInfinity);
+    SkPath path = SkPathBuilder()
+                  .moveTo(SK_ScalarInfinity, SK_ScalarInfinity)
+                  .detach();
     SkPathPriv::Iterate iterate(path);
     REPORTER_ASSERT(reporter, iterate.begin() == iterate.end());
 }
@@ -5220,10 +5252,7 @@
                     if (bits & 4) p1.fX = bad;
                     if (bits & 8) p1.fY = bad;
 
-                    SkPath path;
-                    path.moveTo(p0);
-                    path.lineTo(p1);
-                    path.setFillType(ft);
+                    SkPath path = SkPath::Line(p0, p1).makeFillType(ft);
                     canvas->save();
                     canvas->clipPath(path, aa);
                     REPORTER_ASSERT(reporter, canvas->isClipEmpty() == !path.isInverseFillType());
@@ -5238,33 +5267,33 @@
 // skbug.com/40039046
 DEF_TEST(Path_isRect, reporter) {
     auto makePath = [](const SkPoint* points, size_t count, bool close) -> SkPath {
-        SkPath path;
+        SkPathBuilder builder;
         for (size_t index = 0; index < count; ++index) {
-            index < 2 ? path.moveTo(points[index]) : path.lineTo(points[index]);
+            index < 2 ? builder.moveTo(points[index]) : builder.lineTo(points[index]);
         }
         if (close) {
-            path.close();
+            builder.close();
         }
-        return path;
+        return builder.detach();
     };
     auto makePath2 = [](const SkPoint* points, const SkPath::Verb* verbs, size_t count) -> SkPath {
-        SkPath path;
+        SkPathBuilder builder;
         for (size_t index = 0; index < count; ++index) {
             switch (verbs[index]) {
                 case SkPath::kMove_Verb:
-                    path.moveTo(*points++);
+                    builder.moveTo(*points++);
                     break;
                 case SkPath::kLine_Verb:
-                    path.lineTo(*points++);
+                    builder.lineTo(*points++);
                     break;
                 case SkPath::kClose_Verb:
-                    path.close();
+                    builder.close();
                     break;
                 default:
                     SkASSERT(0);
             }
         }
-        return path;
+        return builder.detach();
     };
     // isolated from skbug.com/40039046 (bug description)
     SkRect rect;
@@ -5389,6 +5418,7 @@
     REPORTER_ASSERT(reporter, rect == compare);
 }
 
+#ifndef SK_HIDE_PATH_EDIT_METHODS
 // Be sure we can safely add ourselves
 DEF_TEST(Path_self_add, reporter) {
     // The possible problem is that during path.add() we may have to grow the dst buffers as
@@ -5411,6 +5441,7 @@
         path.addPath(path, 3, 4);
     }
 }
+#endif
 
 static void draw_triangle(SkCanvas* canvas, const SkPoint pts[]) {
     // draw in different ways, looking for an assert
@@ -5452,25 +5483,26 @@
     draw_triangle(surface->getCanvas(), pts);
 }
 
-static void add_verbs(SkPath* path, int count) {
-    path->moveTo(0, 0);
+static SkPath add_verbs(int count) {
+    SkPathBuilder builder;
+    builder.moveTo(0, 0);
     for (int i = 0; i < count; ++i) {
         switch (i & 3) {
-            case 0: path->lineTo(10, 20); break;
-            case 1: path->quadTo(5, 6, 7, 8); break;
-            case 2: path->conicTo(1, 2, 3, 4, 0.5f); break;
-            case 3: path->cubicTo(2, 4, 6, 8, 10, 12); break;
+            case 0: builder.lineTo(10, 20); break;
+            case 1: builder.quadTo(5, 6, 7, 8); break;
+            case 2: builder.conicTo(1, 2, 3, 4, 0.5f); break;
+            case 3: builder.cubicTo(2, 4, 6, 8, 10, 12); break;
         }
     }
+    return builder.detach();
 }
 
 // Make sure when we call shrinkToFit() that we always shrink (or stay the same)
 // and that if we call twice, we stay the same.
 DEF_TEST(Path_shrinkToFit, reporter) {
     for (int verbs = 0; verbs < 100; ++verbs) {
-        SkPath unique_path, shared_path;
-        add_verbs(&unique_path, verbs);
-        add_verbs(&shared_path, verbs);
+        SkPath unique_path = add_verbs(verbs),
+               shared_path = add_verbs(verbs);
 
         const SkPath copy = shared_path;
 
@@ -5500,6 +5532,7 @@
     }
 }
 
+#ifndef SK_HIDE_PATH_EDIT_METHODS
 DEF_TEST(Path_setLastPt, r) {
     // There was a time where SkPath::setLastPoint() didn't invalidate cached path bounds.
     SkPath p;
@@ -5514,17 +5547,18 @@
 
     REPORTER_ASSERT(r, p.isValid());
 }
+#endif
 
 DEF_TEST(Path_increserve_handle_neg_crbug_883666, r) {
-    SkPath path;
+    SkPathBuilder builder;
 
-    path.conicTo({0, 0}, {1, 1}, SK_FloatNegativeInfinity);
+    builder.conicTo({0, 0}, {1, 1}, SK_FloatNegativeInfinity);
 
     // <== use a copy path object to force SkPathRef::copy() and SkPathRef::resetToSize()
-    SkPath shallowPath = path;
+    SkPathBuilder shallowBuilder = builder;
 
     // make sure we don't assert/crash on this.
-    shallowPath.incReserve(0xffffffff);
+    shallowBuilder.incReserve(0xffffffff);
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////
@@ -5560,47 +5594,35 @@
     // force the issue (computing convexity) the first time.
     REPORTER_ASSERT(reporter, path->isConvex());
 
-    SkPath path2;
-
     // a path's isa and convexity should survive assignment
-    path2 = *path;
-    REPORTER_ASSERT(reporter, isa_proc(path2));
-    REPORTER_ASSERT(reporter, nocompute_isconvex(path2));
+    {
+        SkPath path2 = *path;
+        REPORTER_ASSERT(reporter, isa_proc(path2));
+        REPORTER_ASSERT(reporter, nocompute_isconvex(path2));
+    }
 
     // a path's isa and convexity should identity transform
-    path->transform(x.fIM, &path2);
-    path->transform(x.fIM);
-    REPORTER_ASSERT(reporter, isa_proc(path2));
-    REPORTER_ASSERT(reporter, nocompute_isconvex(path2));
+    *path = path->makeTransform(x.fIM);
     REPORTER_ASSERT(reporter, isa_proc(*path));
     REPORTER_ASSERT(reporter, nocompute_isconvex(*path));
 
     // a path's isa should survive translation, convexity depends on axis alignment
-    path->transform(x.fTM, &path2);
-    path->transform(x.fTM);
-    REPORTER_ASSERT(reporter, isa_proc(path2));
+    *path = path->makeTransform(x.fTM);
     REPORTER_ASSERT(reporter, isa_proc(*path));
-    REPORTER_ASSERT(reporter, nocompute_isconvex(path2) == isAxisAligned);
     REPORTER_ASSERT(reporter, nocompute_isconvex(*path) == isAxisAligned);
 
     // a path's isa should survive scaling, convexity depends on axis alignment
-    path->transform(x.fSM, &path2);
-    path->transform(x.fSM);
-    REPORTER_ASSERT(reporter, isa_proc(path2));
+    *path = path->makeTransform(x.fSM);
     REPORTER_ASSERT(reporter, isa_proc(*path));
-    REPORTER_ASSERT(reporter, nocompute_isconvex(path2) == isAxisAligned);
     REPORTER_ASSERT(reporter, nocompute_isconvex(*path) == isAxisAligned);
 
     // For security, post-rotation, we can't assume we're still convex. It might prove to be,
     // in fact, still be convex, be we can't have cached that setting, hence the call to
     // getConvexityOrUnknown() instead of getConvexity().
-    path->transform(x.fRM, &path2);
-    path->transform(x.fRM);
-    REPORTER_ASSERT(reporter, !nocompute_isconvex(path2));
+    *path = path->makeTransform(x.fRM);
     REPORTER_ASSERT(reporter, !nocompute_isconvex(*path));
 
     if (isAxisAligned) {
-        REPORTER_ASSERT(reporter, !isa_proc(path2));
         REPORTER_ASSERT(reporter, !isa_proc(*path));
     }
 }
@@ -5608,25 +5630,24 @@
 DEF_TEST(Path_survive_transform, r) {
     const Xforms x;
 
-    SkPath path;
-    path.addRect({10, 10, 40, 50});
+    SkPath path = SkPath::Rect({10, 10, 40, 50});
     survive(&path, x, true, r, [](const SkPath& p) { return p.isRect(nullptr); });
 
-    path.reset();
-    path.addOval({10, 10, 40, 50});
+    path = SkPath::Oval({10, 10, 40, 50});
     survive(&path, x, true, r, [](const SkPath& p) { return p.isOval(nullptr); });
 
-    path.reset();
-    path.addRRect(SkRRect::MakeRectXY({10, 10, 40, 50}, 5, 5));
+    path = SkPath::RRect(SkRRect::MakeRectXY({10, 10, 40, 50}, 5, 5));
     survive(&path, x, true, r, [](const SkPath& p) { return p.isRRect(nullptr); });
 
     // make a trapazoid; definitely convex, but not marked as axis-aligned (e.g. oval, rrect)
-    path.reset();
-    path.moveTo(0, 0).lineTo(100, 0).lineTo(70, 100).lineTo(30, 100);
+    path = SkPathBuilder()
+           .moveTo(0, 0).lineTo(100, 0).lineTo(70, 100).lineTo(30, 100)
+           .detach();
     REPORTER_ASSERT(r, path.isConvex());
     survive(&path, x, false, r, [](const SkPath& p) { return true; });
 }
 
+#ifndef SK_HIDE_PATH_EDIT_METHODS
 DEF_TEST(path_last_move_to_index, r) {
     // Make sure that copyPath is safe after the call to path.offset().
     // Previously, we would leave its fLastMoveToIndex alone after the copy, but now we should
@@ -5653,20 +5674,22 @@
 
     copyPath.rConicTo(1, 1, 3, 3, 0.707107f);
 }
+#endif
 
 static void test_edger(skiatest::Reporter* r,
                        const std::initializer_list<SkPathVerb>& in,
                        const std::initializer_list<SkPathVerb>& expected) {
-    SkPath path;
+    SkPathBuilder builder;
     SkScalar x = 0, y = 0;
     for (auto v : in) {
         switch (v) {
-            case SkPathVerb::kMove: path.moveTo(x++, y++); break;
-            case SkPathVerb::kLine: path.lineTo(x++, y++); break;
-            case SkPathVerb::kClose: path.close(); break;
+            case SkPathVerb::kMove: builder.moveTo(x++, y++); break;
+            case SkPathVerb::kLine: builder.lineTo(x++, y++); break;
+            case SkPathVerb::kClose: builder.close(); break;
             default: SkASSERT(false);
         }
     }
+    SkPath path = builder.detach();
 
     SkPathEdgeIter iter(path);
     for (auto v : expected) {
@@ -5703,8 +5726,9 @@
     for (auto dir : {SkPathDirection::kCW, SkPathDirection::kCCW}) {
         int increment = dir == SkPathDirection::kCW ? 1 : 3;
         for (int i = 0; i < 4; ++i) {
-            path.reset();
-            path.addRect(r, dir, i);
+            SkPathBuilder builder;
+            builder.addRect(r, dir, i);
+            path = builder.snapshot();
 
             // check that we return the 4 ponts in the expected order
             SkPoint e[4];
@@ -5717,7 +5741,8 @@
             });
 
             // check that the new line begins where the rect began
-            path.lineTo(7,8);
+            builder.lineTo(7,8);
+            path = builder.snapshot();
             assert_points(reporter, path, {
                 e[0], e[1], e[2], e[3],
                 e[0], {7,8},
@@ -5727,10 +5752,11 @@
 
     // now add a moveTo before the rect, just to be sure we don't always look at
     // the "first" point in the path when we handle the trailing lineTo
-    path.reset();
-    path.moveTo(7, 8);  // will be replaced by rect's first moveTo
-    path.addRect(r, SkPathDirection::kCW, 2);
-    path.lineTo(5, 6);
+    path = SkPathBuilder()
+           .moveTo(7, 8)  // will be replaced by rect's first moveTo
+           .addRect(r, SkPathDirection::kCW, 2)
+           .lineTo(5, 6)
+           .detach();
 
     assert_points(reporter, path, {
         p[2], p[3], p[0], p[1], // rect
@@ -5753,6 +5779,7 @@
  *      // after lineTo,  the path's verbs are: M M ... C M L
  */
 static void test_addPath_and_injected_moveTo(skiatest::Reporter* reporter) {
+#ifndef SK_HIDE_PATH_EDIT_METHODS
     /*
      *  Given a path, and the expected last-point and last-move-to in it,
      *  assert that, after a lineTo(), that the injected moveTo corresponds
@@ -5807,6 +5834,7 @@
     test_before_after_lineto(path1, {20,50}, {20,50});
     test_before_after_lineto(path3, {20,50}, {20,50});
     test_before_after_lineto(path3c, {20,50}, {20,50});
+#endif
 }
 
 DEF_TEST(pathedger, r) {
@@ -5830,6 +5858,7 @@
 }
 
 DEF_TEST(path_addpath_crbug_1153516, r) {
+#ifndef SK_HIDE_PATH_EDIT_METHODS
     // When we add a closed path to another path, verify
     // that the result has the right value for last contour start point.
     SkPath p1, p2;
@@ -5851,6 +5880,7 @@
     REPORTER_ASSERT(r, actualMoveTo == rectangleStart );
     actualLineTo = p1.getPoint(p1.countPoints() - 1);
     REPORTER_ASSERT(r, actualLineTo == lineEnd);
+#endif
  }
 
 DEF_TEST(path_convexity_scale_way_down, r) {
@@ -5859,9 +5889,8 @@
                                  .detach();
 
     REPORTER_ASSERT(r, path.isConvex());
-    SkPath path2;
     const SkScalar scale = 1e-8f;
-    path.transform(SkMatrix::Scale(scale, scale), &path2);
+    SkPath path2 = path.makeTransform(SkMatrix::Scale(scale, scale));
     SkPathPriv::ForceComputeConvexity(path2);
     REPORTER_ASSERT(r, path2.isConvex());
 }
@@ -5874,13 +5903,14 @@
 
     for (SkRect rect: rects) {
         for (int numExtraMoveTos : {0, 1, 2, 3}) {
-            SkPath path;
+            SkPathBuilder builder;
             // Convexity and contains functions treat the path as a simple fill, so consecutive
             // moveTos are collapsed together.
             for (int i = 0; i < numExtraMoveTos; ++i) {
-                path.moveTo(i, i);
+                builder.moveTo(i, i);
             }
-            path.addRect(rect); // this will replace the prev moveTos
+            builder.addRect(rect); // this will replace the prev moveTos
+            SkPath path = builder.detach();
 
             // addRect should mark the path as known convex automatically (i.e. it wasn't set
             // to unknown after edits)
@@ -5905,18 +5935,18 @@
     // There had been a bug when the last moveTo index > 0, the calculated point count was incorrect
     // and the BySign convexity pass would not evaluate the entire path, effectively only using the
     // winding rule for determining convexity.
-    SkPath path;
-    path.setFillType(SkPathFillType::kWinding);
-    path.moveTo(3.25f, 115.5f);
-    path.conicTo(9.98099e+17f, 2.83874e+15f, 1.75098e-30f, 1.75097e-30f, 1.05385e+18f);
-    path.conicTo(9.96938e+17f, 6.3804e+19f, 9.96934e+17f, 1.75096e-30f, 1.75096e-30f);
-    path.quadTo(1.28886e+10f, 9.9647e+17f, 9.98101e+17f, 2.61006e+15f);
+    SkPath path = SkPathBuilder(SkPathFillType::kWinding)
+                  .moveTo(3.25f, 115.5f)
+                  .conicTo(9.98099e+17f, 2.83874e+15f, 1.75098e-30f, 1.75097e-30f, 1.05385e+18f)
+                  .conicTo(9.96938e+17f, 6.3804e+19f, 9.96934e+17f, 1.75096e-30f, 1.75096e-30f)
+                  .quadTo(1.28886e+10f, 9.9647e+17f, 9.98101e+17f, 2.61006e+15f)
+                  .detach();
     REPORTER_ASSERT(r, !path.isConvex());
 
-    SkPath pathWithExtraMoveTo;
-    pathWithExtraMoveTo.setFillType(SkPathFillType::kWinding);
-    pathWithExtraMoveTo.moveTo(5.90043e-39f, 1.34525e-43f);
-    pathWithExtraMoveTo.addPath(path);
+    SkPath pathWithExtraMoveTo = SkPathBuilder(SkPathFillType::kWinding)
+                                 .moveTo(5.90043e-39f, 1.34525e-43f)
+                                 .addPath(path)
+                                 .detach();
     REPORTER_ASSERT(r, !pathWithExtraMoveTo.isConvex());
 }
 
@@ -5925,14 +5955,14 @@
     // Drawing this path triggered an assert in walk_simple_edges:
     auto surface = SkSurfaces::Raster(SkImageInfo::MakeN32Premul(32, 32));
 
-    SkPath path;
-    path.setFillType(SkPathFillType::kWinding);
-    path.moveTo(0.00665998459f, 2);
-    path.quadTo(0.00665998459f, 4, -1.99334002f, 4);
-    path.quadTo(-3.99334002f, 4, -3.99334002f, 2);
-    path.quadTo(-3.99334002f, 0, -1.99334002f, 0);
-    path.quadTo(0.00665998459f, 0, 0.00665998459f, 2);
-    path.close();
+    SkPath path = SkPathBuilder(SkPathFillType::kWinding)
+                  .moveTo(0.00665998459f, 2)
+                  .quadTo(0.00665998459f, 4, -1.99334002f, 4)
+                  .quadTo(-3.99334002f, 4, -3.99334002f, 2)
+                  .quadTo(-3.99334002f, 0, -1.99334002f, 0)
+                  .quadTo(0.00665998459f, 0, 0.00665998459f, 2)
+                  .close()
+                  .detach();
 
     SkPaint paint;
     paint.setAntiAlias(true);
@@ -5947,10 +5977,11 @@
     // more easily capture the numerical instability with the algorithm.
     auto surface = SkSurfaces::Raster(SkImageInfo::MakeN32Premul(900, 700));
 
-    SkPath path;
-    path.lineTo(100, 400);
-    path.lineTo(90, 600);
-    path.quadTo(35000, 200, 35000, 200);
+    SkPath path = SkPathBuilder()
+                  .lineTo(100, 400)
+                  .lineTo(90, 600)
+                  .quadTo(35000, 200, 35000, 200)
+                  .detach();
 
     SkPaint paint;
     paint.setAntiAlias(true);
@@ -5959,10 +5990,11 @@
 }
 
 DEF_TEST(path_filltype_utils, r) {
-    SkPath p1;
-    p1.lineTo(42, 42);
-    p1.lineTo(42, 0);
-    p1.close();
+    SkPath p1 = SkPathBuilder()
+                .lineTo(42, 42)
+                .lineTo(42, 0)
+                .close()
+                .detach();
 
     REPORTER_ASSERT(r, p1.getFillType() == SkPathFillType::kWinding);
 
diff --git a/tests/SkPathRangeIterTest.cpp b/tests/SkPathRangeIterTest.cpp
index 0e944c0..b8524bb 100644
--- a/tests/SkPathRangeIterTest.cpp
+++ b/tests/SkPathRangeIterTest.cpp
@@ -53,41 +53,42 @@
     }
 
     // Build the path.
-    SkPath path;
+    SkPathBuilder builder;
     for (Verb verb : verbs) {
         switch (verb) {
             case Verb::kImplicitMove:
                 break;
             case Verb::kMove:
-                path.moveTo(genData.p());
+                builder.moveTo(genData.p());
                 break;
             case Verb::kLine:
-                path.lineTo(genData.p());
+                builder.lineTo(genData.p());
                 break;
             case Verb::kQuad: {
                 auto a = genData.p();
                 auto b = genData.p();
-                path.quadTo(a, b);
+                builder.quadTo(a, b);
                 break;
             }
             case Verb::kCubic: {
                 auto a = genData.p();
                 auto b = genData.p();
                 auto c = genData.p();
-                path.cubicTo(a, b, c);
+                builder.cubicTo(a, b, c);
                 break;
             }
             case Verb::kConic: {
                 auto a = genData.p();
                 auto b = genData.p();
-                path.conicTo(a, b, genData.w());
+                builder.conicTo(a, b, genData.w());
                 break;
             }
             case Verb::kClose:
-                path.close();
+                builder.close();
                 break;
         }
     }
+    SkPath path = builder.detach();
 
     // Verify sure the RangeIter works as expected.
     SkPathPriv::Iterate iterate(path);
diff --git a/tests/SkStrikeTest.cpp b/tests/SkStrikeTest.cpp
index 5da9f5b..56c02e8 100644
--- a/tests/SkStrikeTest.cpp
+++ b/tests/SkStrikeTest.cpp
@@ -226,8 +226,7 @@
     const SkPackedGlyphID pathPackedGlyphID((SkGlyphID)11);
     SkGlyph pathGlyph{pathPackedGlyphID};
     SkGlyphTestPeer::SetGlyph(&pathGlyph);
-    SkPath path;
-    path.addRect(pathGlyph.rect());
+    SkPath path = SkPath::Rect(pathGlyph.rect());
     pathGlyph.setPath(&alloc, &path, false, false);
     pathsToSend.emplace_back(pathGlyph);
 
diff --git a/tests/StrokerTest.cpp b/tests/StrokerTest.cpp
index dab43cf..f1f5704 100644
--- a/tests/StrokerTest.cpp
+++ b/tests/StrokerTest.cpp
@@ -7,6 +7,7 @@
 
 #include "include/core/SkPaint.h"
 #include "include/core/SkPath.h"
+#include "include/core/SkPathBuilder.h"
 #include "include/core/SkPathUtils.h"
 #include "include/core/SkPoint.h"
 #include "include/core/SkScalar.h"
@@ -52,16 +53,18 @@
 }
 
 static void cubicTest(const SkPoint c[4]) {
-    SkPath path;
-    path.moveTo(c[0].fX, c[0].fY);
-    path.cubicTo(c[1].fX, c[1].fY, c[2].fX, c[2].fY, c[3].fX, c[3].fY);
+    SkPath path = SkPathBuilder()
+                  .moveTo(c[0])
+                  .cubicTo(c[1], c[2], c[3])
+                  .detach();
     pathTest(path);
 }
 
 static void quadTest(const SkPoint c[3]) {
-    SkPath path;
-    path.moveTo(c[0].fX, c[0].fY);
-    path.quadTo(c[1].fX, c[1].fY, c[2].fX, c[2].fY);
+    SkPath path = SkPathBuilder()
+                  .moveTo(c[0])
+                  .quadTo(c[1], c[2])
+                  .detach();
     pathTest(path);
 }
 
@@ -167,9 +170,10 @@
 #endif
     skiatest::Timer timer;
     for (int i = 0; i < 1000000; ++i) {
-        SkPath path;
-        path.moveTo(unbounded(r), unbounded(r));
-        path.quadTo(unbounded(r), unbounded(r), unbounded(r), unbounded(r));
+        SkPath path = SkPathBuilder()
+                      .moveTo(unbounded(r), unbounded(r))
+                      .quadTo(unbounded(r), unbounded(r), unbounded(r), unbounded(r))
+                      .detach();
         p.setStrokeWidth(unboundedPos(r));
         SkPath fill = skpathutils::FillPathWithPaint(path, p);
 #if defined(SK_DEBUG) && QUAD_STROKE_APPROX_EXTENDED_DEBUGGING
@@ -206,10 +210,11 @@
 #endif
     skiatest::Timer timer;
     for (int i = 0; i < 1000000; ++i) {
-        SkPath path;
-        path.moveTo(unbounded(r), unbounded(r));
-        path.cubicTo(unbounded(r), unbounded(r), unbounded(r), unbounded(r),
-                unbounded(r), unbounded(r));
+        SkPath path = SkPathBuilder()
+                      .moveTo(unbounded(r), unbounded(r))
+                      .cubicTo(unbounded(r), unbounded(r), unbounded(r), unbounded(r),
+                               unbounded(r), unbounded(r))
+                      .detach();
         p.setStrokeWidth(unboundedPos(r));
         SkPath fill = skpathutils::FillPathWithPaint(path, p);
     #if defined(SK_DEBUG) && QUAD_STROKE_APPROX_EXTENDED_DEBUGGING
@@ -246,7 +251,6 @@
 #endif
     skiatest::Timer timer;
     for (int i = 0; i < 1000000; ++i) {
-        SkPath path;
         SkPoint quad[3];
         quad[0].fX = r.nextRangeF(0, 500);
         quad[0].fY = r.nextRangeF(0, 500);
@@ -260,8 +264,10 @@
             quad[2].fY = r.nextRangeF(0, 500);
         } while (SkPointPriv::DistanceToSqd(quad[0], quad[2]) < halfSquared
                 || SkPointPriv::DistanceToSqd(quad[1], quad[2]) < halfSquared);
-        path.moveTo(quad[0].fX, quad[0].fY);
-        path.quadTo(quad[1].fX, quad[1].fY, quad[2].fX, quad[2].fY);
+        SkPath path = SkPathBuilder()
+                      .moveTo(quad[0])
+                      .quadTo(quad[1], quad[2])
+                      .detach();
         p.setStrokeWidth(r.nextRangeF(0, 500));
         SkPath fill = skpathutils::FillPathWithPaint(path, p);
 #if defined(SK_DEBUG) && QUAD_STROKE_APPROX_EXTENDED_DEBUGGING
@@ -298,7 +304,6 @@
 #endif
     skiatest::Timer timer;
     for (int i = 0; i < 1000000; ++i) {
-        SkPath path;
         SkPoint cubic[4];
         cubic[0].fX = r.nextRangeF(0, 500);
         cubic[0].fY = r.nextRangeF(0, 500);
@@ -318,8 +323,10 @@
         } while (  SkPointPriv::DistanceToSqd(cubic[0], cubic[3]) < halfSquared
                 || SkPointPriv::DistanceToSqd(cubic[1], cubic[3]) < halfSquared
                 || SkPointPriv::DistanceToSqd(cubic[2], cubic[3]) < halfSquared);
-        path.moveTo(cubic[0].fX, cubic[0].fY);
-        path.cubicTo(cubic[1].fX, cubic[1].fY, cubic[2].fX, cubic[2].fY, cubic[3].fX, cubic[3].fY);
+        SkPath path = SkPathBuilder()
+                      .moveTo(cubic[0])
+                      .cubicTo(cubic[1], cubic[2], cubic[3])
+                      .detach();
         p.setStrokeWidth(r.nextRangeF(0, 500));
         SkPath fill = skpathutils::FillPathWithPaint(path, p);
 #if defined(SK_DEBUG) && QUAD_STROKE_APPROX_EXTENDED_DEBUGGING
@@ -356,7 +363,6 @@
 #endif
     skiatest::Timer timer;
     for (int i = 0; i < 1000000; ++i) {
-        SkPath path;
         SkPoint quad[3];
         quad[0].fX = r.nextRangeF(0, 500);
         quad[0].fY = r.nextRangeF(0, 500);
@@ -364,8 +370,10 @@
         quad[1].fY = r.nextRangeF(0, 500);
         quad[2].fX = r.nextRangeF(0, 500);
         quad[2].fY = r.nextRangeF(0, 500);
-        path.moveTo(quad[0].fX, quad[0].fY);
-        path.quadTo(quad[1].fX, quad[1].fY, quad[2].fX, quad[2].fY);
+        SkPath path = SkPathBuilder()
+                      .moveTo(quad[0])
+                      .quadTo(quad[1], quad[2])
+                      .detach();
         p.setStrokeWidth(r.nextRangeF(0, 500));
         SkPath fill = skpathutils::FillPathWithPaint(path, p);
 #if defined(SK_DEBUG) && QUAD_STROKE_APPROX_EXTENDED_DEBUGGING
@@ -401,10 +409,11 @@
 #endif
     skiatest::Timer timer;
     for (int i = 0; i < 1000000; ++i) {
-        SkPath path;
-        path.moveTo(r.nextRangeF(0, 500), r.nextRangeF(0, 500));
-        path.cubicTo(r.nextRangeF(0, 500), r.nextRangeF(0, 500), r.nextRangeF(0, 500),
-                r.nextRangeF(0, 500), r.nextRangeF(0, 500), r.nextRangeF(0, 500));
+        SkPath path = SkPathBuilder()
+                      .moveTo(r.nextRangeF(0, 500), r.nextRangeF(0, 500))
+                      .cubicTo(r.nextRangeF(0, 500), r.nextRangeF(0, 500), r.nextRangeF(0, 500),
+                               r.nextRangeF(0, 500), r.nextRangeF(0, 500), r.nextRangeF(0, 500))
+                      .detach();
         p.setStrokeWidth(r.nextRangeF(0, 100));
         SkPath fill = skpathutils::FillPathWithPaint(path, p);
 #if defined(SK_DEBUG) && QUAD_STROKE_APPROX_EXTENDED_DEBUGGING
@@ -440,9 +449,10 @@
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SkDoubleToScalar(164.683548));
 
-    SkPath path;
-path.moveTo(SkBits2Float(0x43c99223), SkBits2Float(0x42b7417e));
-path.quadTo(SkBits2Float(0x4285d839), SkBits2Float(0x43ed6645), SkBits2Float(0x43c941c8), SkBits2Float(0x42b3ace3));
+    SkPath path = SkPathBuilder()
+                  .moveTo(SkBits2Float(0x43c99223), SkBits2Float(0x42b7417e))
+                  .quadTo(SkBits2Float(0x4285d839), SkBits2Float(0x43ed6645), SkBits2Float(0x43c941c8), SkBits2Float(0x42b3ace3))
+                  .detach();
     SkPath fill = skpathutils::FillPathWithPaint(path, p);
     if (reporter->verbose()) {
         SkDebugf("\n%s path\n", __FUNCTION__);
@@ -465,9 +475,10 @@
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SkDoubleToScalar(42.835968));
 
-    SkPath path;
-path.moveTo(SkBits2Float(0x433f5370), SkBits2Float(0x43d1f4b3));
-path.cubicTo(SkBits2Float(0x4331cb76), SkBits2Float(0x43ea3340), SkBits2Float(0x4388f498), SkBits2Float(0x42f7f08d), SkBits2Float(0x43f1cd32), SkBits2Float(0x42802ec1));
+    SkPath path = SkPathBuilder()
+                  .moveTo(SkBits2Float(0x433f5370), SkBits2Float(0x43d1f4b3))
+                  .cubicTo(SkBits2Float(0x4331cb76), SkBits2Float(0x43ea3340), SkBits2Float(0x4388f498), SkBits2Float(0x42f7f08d), SkBits2Float(0x43f1cd32), SkBits2Float(0x42802ec1))
+                  .detach();
     SkPath fill = skpathutils::FillPathWithPaint(path, p);
     if (reporter->verbose()) {
         SkDebugf("\n%s path\n", __FUNCTION__);
diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp
index 1b600cf..7f065a3 100644
--- a/tests/SurfaceTest.cpp
+++ b/tests/SurfaceTest.cpp
@@ -499,10 +499,7 @@
     const SkRect testRect =
         SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0),
                          SkIntToScalar(4), SkIntToScalar(5));
-    SkPath testPath;
-    testPath.addRect(SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0),
-                                      SkIntToScalar(2), SkIntToScalar(1)));
-
+    SkPath testPath = SkPath::Rect(SkRect::MakeXYWH(0, 0, 2, 1));
     const SkIRect testIRect = SkIRect::MakeXYWH(0, 0, 2, 1);
 
     SkRegion testRegion;