[pathbuilder] Enforce immutable SkPath APIs globally

Path-editing methods in Skia's SkPath are being deprecated.  This is the
final step in migrating Chromium to SkPathBuilder.

Turn on SK_HIDE_PATH_EDIT_METHODS to enforce non-editing SkPath APIs.

Refactor remaining call sites (that were missed in previous cleanup CLs)
to use SkPathBuilder or named factories.

No functional changes.

Bug: 378688986
Change-Id: Ib088b78a7ac798fe83004252694d7c3a867531f2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7101838
Reviewed-by: Mike Reed <[email protected]>
Reviewed-by: Ali Hijazi <[email protected]>
Reviewed-by: Dana Fried <[email protected]>
Reviewed-by: Toni Barzic <[email protected]>
Reviewed-by: Mitsuru Oshima <[email protected]>
Reviewed-by: Thomas Anderson <[email protected]>
Reviewed-by: Ted Choc <[email protected]>
Commit-Queue: Florin Malita <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1539408}
NOKEYCHECK=True
GitOrigin-RevId: 63267f2f424009cfa9a3f5e05877b9c2a0647ede
diff --git a/fuzzers/skia_path_common.cc b/fuzzers/skia_path_common.cc
index 6f9b6c2..77bc93c 100644
--- a/fuzzers/skia_path_common.cc
+++ b/fuzzers/skia_path_common.cc
@@ -5,27 +5,26 @@
 #include "testing/libfuzzer/fuzzers/skia_path_common.h"
 
 #include "third_party/skia/include/core/SkPath.h"
+#include "third_party/skia/include/core/SkPathBuilder.h"
 
 // This is needed because SkPath::readFromMemory does not seem to be able to
 // be able to handle arbitrary input.
-void BuildPath(const uint8_t** data,
-               size_t* size,
-               SkPath* path,
-               int last_verb) {
+SkPath BuildPath(const uint8_t** data, size_t* size, int last_verb) {
   uint8_t operation;
   SkScalar a, b, c, d, e, f;
+  SkPathBuilder path;
   while (read<uint8_t>(data, size, &operation)) {
     switch (operation % (last_verb + 1)) {
       case SkPath::Verb::kMove_Verb:
         if (!read<SkScalar>(data, size, &a) || !read<SkScalar>(data, size, &b))
-          return;
-        path->moveTo(a, b);
+          return path.detach();
+        path.moveTo(a, b);
         break;
 
       case SkPath::Verb::kLine_Verb:
         if (!read<SkScalar>(data, size, &a) || !read<SkScalar>(data, size, &b))
-          return;
-        path->lineTo(a, b);
+          return path.detach();
+        path.lineTo(a, b);
         break;
 
       case SkPath::Verb::kQuad_Verb:
@@ -33,8 +32,8 @@
             !read<SkScalar>(data, size, &b) ||
             !read<SkScalar>(data, size, &c) ||
             !read<SkScalar>(data, size, &d))
-          return;
-        path->quadTo(a, b, c, d);
+          return path.detach();
+        path.quadTo(a, b, c, d);
         break;
 
       case SkPath::Verb::kConic_Verb:
@@ -43,8 +42,8 @@
             !read<SkScalar>(data, size, &c) ||
             !read<SkScalar>(data, size, &d) ||
             !read<SkScalar>(data, size, &e))
-          return;
-        path->conicTo(a, b, c, d, e);
+          return path.detach();
+        path.conicTo(a, b, c, d, e);
         break;
 
       case SkPath::Verb::kCubic_Verb:
@@ -54,17 +53,18 @@
             !read<SkScalar>(data, size, &d) ||
             !read<SkScalar>(data, size, &e) ||
             !read<SkScalar>(data, size, &f))
-          return;
-        path->cubicTo(a, b, c, d, e, f);
+          return path.detach();
+        path.cubicTo(a, b, c, d, e, f);
         break;
 
       case SkPath::Verb::kClose_Verb:
-        path->close();
+        path.close();
         break;
 
       case SkPath::Verb::kDone_Verb:
         // In this case, simply exit.
-        return;
+        return path.detach();
     }
   }
+  return path.detach();
 }
diff --git a/fuzzers/skia_path_common.h b/fuzzers/skia_path_common.h
index ed75d9b..3222fbe 100644
--- a/fuzzers/skia_path_common.h
+++ b/fuzzers/skia_path_common.h
@@ -23,9 +23,6 @@
   return true;
 }
 
-void BuildPath(const uint8_t** data,
-               size_t* size,
-               SkPath* path,
-               int last_verb);
+SkPath BuildPath(const uint8_t** data, size_t* size, int last_verb);
 
 #endif  // TESTING_LIBFUZZER_FUZZERS_SKIA_PATH_COMMON_H_
diff --git a/fuzzers/skia_path_fuzzer.cc b/fuzzers/skia_path_fuzzer.cc
index b3deb28..d97d686 100644
--- a/fuzzers/skia_path_fuzzer.cc
+++ b/fuzzers/skia_path_fuzzer.cc
@@ -33,8 +33,7 @@
     return 0;
 
   // In this case, we specifically don't want to include kDone_Verb.
-  SkPath path;
-  BuildPath(&data, &size, &path, SkPath::Verb::kClose_Verb);
+  const SkPath path = BuildPath(&data, &size, SkPath::Verb::kClose_Verb);
 
   // Try a few potentially interesting things with our path.
   path.contains(a, b);
diff --git a/fuzzers/skia_pathop_fuzzer.cc b/fuzzers/skia_pathop_fuzzer.cc
index e4dc901..920fb69 100644
--- a/fuzzers/skia_pathop_fuzzer.cc
+++ b/fuzzers/skia_pathop_fuzzer.cc
@@ -25,12 +25,11 @@
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   SkOpBuilder builder;
   while (size > 0) {
-    SkPath path;
     uint8_t op;
     if (!read<uint8_t>(&data, &size, &op))
       break;
 
-    BuildPath(&data, &size, &path, SkPath::Verb::kDone_Verb);
+    const SkPath path = BuildPath(&data, &size, SkPath::Verb::kDone_Verb);
     builder.add(path, static_cast<SkPathOp>(op % (kLastOp + 1)));
   }