diff --git a/fuzz/FuzzCommon.h b/fuzz/FuzzCommon.h
index c908606..bea5a30 100644
--- a/fuzz/FuzzCommon.h
+++ b/fuzz/FuzzCommon.h
@@ -5,12 +5,15 @@
  * found in the LICENSE file.
  */
 
+#ifndef FuzzCommon_DEFINED
+#define FuzzCommon_DEFINED
+
 #include "Fuzz.h"
 #include "SkPath.h"
 #include "SkRegion.h"
 
 // We don't always want to test NaNs and infinities.
-static void fuzz_nice_float(Fuzz* fuzz, float* f) {
+static inline void fuzz_nice_float(Fuzz* fuzz, float* f) {
     float v;
     fuzz->next(&v);
     constexpr float kLimit = 1.0e35f;  // FLT_MAX?
@@ -23,54 +26,6 @@
     fuzz_nice_float(fuzz, rest...);
 }
 
-static void fuzz_path(Fuzz* fuzz, SkPath* path, int maxOps) {
-    if (maxOps < 2) {
-        maxOps = 2;
-    }
-    uint8_t fillType;
-    fuzz->nextRange(&fillType, 0, (uint8_t)SkPath::kInverseEvenOdd_FillType);
-    path->setFillType((SkPath::FillType)fillType);
-    uint8_t numOps;
-    fuzz->nextRange(&numOps, 2, maxOps);
-    for (uint8_t i = 0; i < numOps; ++i) {
-        uint8_t op;
-        fuzz->nextRange(&op, 0, 6);
-        SkScalar a, b, c, d, e, f;
-        switch (op) {
-            case 0:
-                fuzz_nice_float(fuzz, &a, &b);
-                path->moveTo(a, b);
-                break;
-            case 1:
-                fuzz_nice_float(fuzz, &a, &b);
-                path->lineTo(a, b);
-                break;
-            case 2:
-                fuzz_nice_float(fuzz, &a, &b, &c, &d);
-                path->quadTo(a, b, c, d);
-                break;
-            case 3:
-                fuzz_nice_float(fuzz, &a, &b, &c, &d, &e);
-                path->conicTo(a, b, c, d, e);
-                break;
-            case 4:
-                fuzz_nice_float(fuzz, &a, &b, &c, &d, &e, &f);
-                path->cubicTo(a, b, c, d, e, f);
-                break;
-            case 5:
-                fuzz_nice_float(fuzz, &a, &b, &c, &d, &e);
-                path->arcTo(a, b, c, d, e);
-                break;
-            case 6:
-                path->close();
-                break;
-            default:
-                SkASSERT(false);
-                break;
-        }
-    }
-}
-
 template <>
 inline void Fuzz::next(SkRegion* region) {
     uint8_t N;
@@ -86,3 +41,10 @@
         }
     }
 }
+
+// allows some float values for path points
+void FuzzPath(Fuzz* fuzz, SkPath* path, int maxOps);
+// allows all float values for path points
+void BuildPath(Fuzz* fuzz, SkPath* path, int last_verb);
+
+#endif
