diff --git a/tests/PathOpsSimplifyTest.cpp b/tests/PathOpsSimplifyTest.cpp
index ba92af7..0004b12 100644
--- a/tests/PathOpsSimplifyTest.cpp
+++ b/tests/PathOpsSimplifyTest.cpp
@@ -8,23 +8,23 @@
 
 #define TEST(name) { name, #name }
 
-static void testLine1(skiatest::Reporter* reporter) {
+static void testLine1(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(2,0);
     path.lineTo(1,1);
     path.lineTo(0,0);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine1x(skiatest::Reporter* reporter) {
+static void testLine1x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(2,0);
     path.lineTo(1,1);
     path.lineTo(0,0);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
 static void addInnerCWTriangle(SkPath& path) {
@@ -55,99 +55,97 @@
     path.close();
 }
 
-static void testLine2(skiatest::Reporter* reporter) {
+static void testLine2(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    addInnerCWTriangle(path);
+    addOuterCWTriangle(path);
+    testSimplify(reporter, path, filename);
+}
+
+static void testLine2x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     addInnerCWTriangle(path);
     addOuterCWTriangle(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine2x(skiatest::Reporter* reporter) {
+static void testLine3(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
-    path.setFillType(SkPath::kEvenOdd_FillType);
-    addInnerCWTriangle(path);
+    addInnerCCWTriangle(path);
     addOuterCWTriangle(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine3(skiatest::Reporter* reporter) {
+static void testLine3x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     addInnerCCWTriangle(path);
     addOuterCWTriangle(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine3x(skiatest::Reporter* reporter) {
-    SkPath path;
-    path.setFillType(SkPath::kEvenOdd_FillType);
-    addInnerCCWTriangle(path);
-    addOuterCWTriangle(path);
-    testSimplify(reporter, path);
-}
-
-static void testLine3a(skiatest::Reporter* reporter) {
+static void testLine3a(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     addInnerCWTriangle(path);
     addOuterCCWTriangle(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine3ax(skiatest::Reporter* reporter) {
+static void testLine3ax(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     addInnerCWTriangle(path);
     addOuterCCWTriangle(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine3b(skiatest::Reporter* reporter) {
+static void testLine3b(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     addInnerCCWTriangle(path);
     addOuterCCWTriangle(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine3bx(skiatest::Reporter* reporter) {
+static void testLine3bx(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     addInnerCCWTriangle(path);
     addOuterCCWTriangle(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine4(skiatest::Reporter* reporter) {
+static void testLine4(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     addOuterCCWTriangle(path);
     addOuterCWTriangle(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine4x(skiatest::Reporter* reporter) {
+static void testLine4x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     addOuterCCWTriangle(path);
     addOuterCWTriangle(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine5(skiatest::Reporter* reporter) {
+static void testLine5(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     addOuterCWTriangle(path);
     addOuterCWTriangle(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine5x(skiatest::Reporter* reporter) {
+static void testLine5x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     addOuterCWTriangle(path);
     addOuterCWTriangle(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine6(skiatest::Reporter* reporter) {
+static void testLine6(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0,0);
     path.lineTo(4,0);
@@ -157,10 +155,10 @@
     path.lineTo(6,0);
     path.lineTo(4,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine6x(skiatest::Reporter* reporter) {
+static void testLine6x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0,0);
@@ -171,10 +169,10 @@
     path.lineTo(6,0);
     path.lineTo(4,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine7(skiatest::Reporter* reporter) {
+static void testLine7(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0,0);
     path.lineTo(4,0);
@@ -184,10 +182,10 @@
     path.lineTo(2,0);
     path.lineTo(4,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine7x(skiatest::Reporter* reporter) {
+static void testLine7x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0,0);
@@ -198,29 +196,29 @@
     path.lineTo(2,0);
     path.lineTo(4,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine7a(skiatest::Reporter* reporter) {
+static void testLine7a(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0,0);
     path.lineTo(4,0);
     path.lineTo(2,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine7ax(skiatest::Reporter* reporter) {
+static void testLine7ax(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0,0);
     path.lineTo(4,0);
     path.lineTo(2,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine7b(skiatest::Reporter* reporter) {
+static void testLine7b(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0,0);
     path.lineTo(4,0);
@@ -229,10 +227,10 @@
     path.lineTo(2,0);
     path.lineTo(4,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine7bx(skiatest::Reporter* reporter) {
+static void testLine7bx(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0,0);
@@ -242,10 +240,10 @@
     path.lineTo(2,0);
     path.lineTo(4,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine8(skiatest::Reporter* reporter) {
+static void testLine8(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0,4);
     path.lineTo(4,4);
@@ -255,10 +253,10 @@
     path.lineTo(6,4);
     path.lineTo(4,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine8x(skiatest::Reporter* reporter) {
+static void testLine8x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0,4);
@@ -269,10 +267,10 @@
     path.lineTo(6,4);
     path.lineTo(4,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine9(skiatest::Reporter* reporter) {
+static void testLine9(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0,4);
     path.lineTo(4,4);
@@ -282,10 +280,10 @@
     path.lineTo(2,4);
     path.lineTo(4,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine9x(skiatest::Reporter* reporter) {
+static void testLine9x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0,4);
@@ -296,10 +294,10 @@
     path.lineTo(2,4);
     path.lineTo(4,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine10(skiatest::Reporter* reporter) {
+static void testLine10(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0,4);
     path.lineTo(4,4);
@@ -309,10 +307,10 @@
     path.lineTo(3,4);
     path.lineTo(6,1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine10x(skiatest::Reporter* reporter) {
+static void testLine10x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0,4);
@@ -323,10 +321,10 @@
     path.lineTo(3,4);
     path.lineTo(6,1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine10a(skiatest::Reporter* reporter) {
+static void testLine10a(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0,4);
     path.lineTo(8,4);
@@ -336,10 +334,10 @@
     path.lineTo(3,3);
     path.lineTo(4,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine10ax(skiatest::Reporter* reporter) {
+static void testLine10ax(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0,4);
@@ -350,7 +348,7 @@
     path.lineTo(3,3);
     path.lineTo(4,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
 static void addCWContainer(SkPath& path) {
@@ -381,200 +379,200 @@
     path.close();
 }
 
-static void testLine11(skiatest::Reporter* reporter) {
+static void testLine11(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     addCWContainer(path);
     addCWContents(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine11x(skiatest::Reporter* reporter) {
+static void testLine11x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     addCWContainer(path);
     addCWContents(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine12(skiatest::Reporter* reporter) {
+static void testLine12(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     addCCWContainer(path);
     addCWContents(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine12x(skiatest::Reporter* reporter) {
+static void testLine12x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     addCCWContainer(path);
     addCWContents(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine13(skiatest::Reporter* reporter) {
+static void testLine13(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     addCWContainer(path);
     addCCWContents(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine13x(skiatest::Reporter* reporter) {
+static void testLine13x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     addCWContainer(path);
     addCCWContents(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine14(skiatest::Reporter* reporter) {
+static void testLine14(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     addCCWContainer(path);
     addCCWContents(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine14x(skiatest::Reporter* reporter) {
+static void testLine14x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     addCCWContainer(path);
     addCCWContents(path);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine15(skiatest::Reporter* reporter) {
+static void testLine15(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine15x(skiatest::Reporter* reporter) {
+static void testLine15x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine16(skiatest::Reporter* reporter) {
+static void testLine16(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 4, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine16x(skiatest::Reporter* reporter) {
+static void testLine16x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 4, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine17(skiatest::Reporter* reporter) {
+static void testLine17(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine17x(skiatest::Reporter* reporter) {
+static void testLine17x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine18(skiatest::Reporter* reporter) {
+static void testLine18(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(12, 4, 21, 21, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine18x(skiatest::Reporter* reporter) {
+static void testLine18x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(12, 4, 21, 21, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine19(skiatest::Reporter* reporter) {
+static void testLine19(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(12, 16, 21, 21, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine19x(skiatest::Reporter* reporter) {
+static void testLine19x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(12, 16, 21, 21, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine20(skiatest::Reporter* reporter) {
+static void testLine20(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 12, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 12, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine20x(skiatest::Reporter* reporter) {
+static void testLine20x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 12, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 12, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine21(skiatest::Reporter* reporter) {
+static void testLine21(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 12, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 16, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine21x(skiatest::Reporter* reporter) {
+static void testLine21x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 12, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 16, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine22(skiatest::Reporter* reporter) {
+static void testLine22(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 12, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine22x(skiatest::Reporter* reporter) {
+static void testLine22x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 12, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine23(skiatest::Reporter* reporter) {
+static void testLine23(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 12, 12, 12, SkPath::kCW_Direction);
     path.addRect(12, 0, 21, 21, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine23x(skiatest::Reporter* reporter) {
+static void testLine23x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 12, 12, 12, SkPath::kCW_Direction);
     path.addRect(12, 0, 21, 21, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine24a(skiatest::Reporter* reporter) {
+static void testLine24a(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(2,0);
     path.lineTo(4,4);
@@ -584,10 +582,10 @@
     path.lineTo(1,2);
     path.lineTo(2,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine24ax(skiatest::Reporter* reporter) {
+static void testLine24ax(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(2,0);
@@ -598,851 +596,851 @@
     path.lineTo(1,2);
     path.lineTo(2,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine24(skiatest::Reporter* reporter) {
+static void testLine24(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 18, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine24x(skiatest::Reporter* reporter) {
+static void testLine24x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 18, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine25(skiatest::Reporter* reporter) {
+static void testLine25(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 6, 12, 12, SkPath::kCW_Direction);
     path.addRect(12, 0, 21, 21, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine25x(skiatest::Reporter* reporter) {
+static void testLine25x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 6, 12, 12, SkPath::kCW_Direction);
     path.addRect(12, 0, 21, 21, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine26(skiatest::Reporter* reporter) {
+static void testLine26(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 18, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 12, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine26x(skiatest::Reporter* reporter) {
+static void testLine26x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 18, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 12, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine27(skiatest::Reporter* reporter) {
+static void testLine27(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 18, 12, 12, SkPath::kCW_Direction);
     path.addRect(12, 8, 21, 21, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine27x(skiatest::Reporter* reporter) {
+static void testLine27x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 18, 12, 12, SkPath::kCW_Direction);
     path.addRect(12, 8, 21, 21, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine28(skiatest::Reporter* reporter) {
+static void testLine28(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 6, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 0, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine28x(skiatest::Reporter* reporter) {
+static void testLine28x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 6, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 0, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine29(skiatest::Reporter* reporter) {
+static void testLine29(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 18, 12, 12, SkPath::kCW_Direction);
     path.addRect(12, 12, 21, 21, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine29x(skiatest::Reporter* reporter) {
+static void testLine29x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 18, 12, 12, SkPath::kCW_Direction);
     path.addRect(12, 12, 21, 21, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine30(skiatest::Reporter* reporter) {
+static void testLine30(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 4, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine30x(skiatest::Reporter* reporter) {
+static void testLine30x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 4, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine31(skiatest::Reporter* reporter) {
+static void testLine31(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 4, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine31x(skiatest::Reporter* reporter) {
+static void testLine31x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 4, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine32(skiatest::Reporter* reporter) {
+static void testLine32(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine32x(skiatest::Reporter* reporter) {
+static void testLine32x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine33(skiatest::Reporter* reporter) {
+static void testLine33(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 16, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine33x(skiatest::Reporter* reporter) {
+static void testLine33x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 16, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine34(skiatest::Reporter* reporter) {
+static void testLine34(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 6, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine34x(skiatest::Reporter* reporter) {
+static void testLine34x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 6, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine35(skiatest::Reporter* reporter) {
+static void testLine35(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(6, 0, 18, 18, SkPath::kCW_Direction);
     path.addRect(4, 16, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine35x(skiatest::Reporter* reporter) {
+static void testLine35x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(6, 0, 18, 18, SkPath::kCW_Direction);
     path.addRect(4, 16, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine36(skiatest::Reporter* reporter) {
+static void testLine36(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 10, 20, 20, SkPath::kCW_Direction);
     path.addRect(6, 12, 18, 18, SkPath::kCW_Direction);
     path.addRect(4, 16, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine36x(skiatest::Reporter* reporter) {
+static void testLine36x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 10, 20, 20, SkPath::kCW_Direction);
     path.addRect(6, 12, 18, 18, SkPath::kCW_Direction);
     path.addRect(4, 16, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine37(skiatest::Reporter* reporter) {
+static void testLine37(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 20, 20, 20, SkPath::kCW_Direction);
     path.addRect(18, 24, 30, 30, SkPath::kCW_Direction);
     path.addRect(0, 0, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine37x(skiatest::Reporter* reporter) {
+static void testLine37x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 20, 20, 20, SkPath::kCW_Direction);
     path.addRect(18, 24, 30, 30, SkPath::kCW_Direction);
     path.addRect(0, 0, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine38(skiatest::Reporter* reporter) {
+static void testLine38(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(10, 0, 30, 30, SkPath::kCW_Direction);
     path.addRect(6, 12, 18, 18, SkPath::kCW_Direction);
     path.addRect(12, 12, 21, 21, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine38x(skiatest::Reporter* reporter) {
+static void testLine38x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(10, 0, 30, 30, SkPath::kCW_Direction);
     path.addRect(6, 12, 18, 18, SkPath::kCW_Direction);
     path.addRect(12, 12, 21, 21, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine40(skiatest::Reporter* reporter) {
+static void testLine40(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(10, 0, 30, 30, SkPath::kCW_Direction);
     path.addRect(12, 18, 24, 24, SkPath::kCW_Direction);
     path.addRect(4, 16, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine40x(skiatest::Reporter* reporter) {
+static void testLine40x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(10, 0, 30, 30, SkPath::kCW_Direction);
     path.addRect(12, 18, 24, 24, SkPath::kCW_Direction);
     path.addRect(4, 16, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine41(skiatest::Reporter* reporter) {
+static void testLine41(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(18, 24, 30, 30, SkPath::kCW_Direction);
     path.addRect(12, 0, 21, 21, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine41x(skiatest::Reporter* reporter) {
+static void testLine41x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(18, 24, 30, 30, SkPath::kCW_Direction);
     path.addRect(12, 0, 21, 21, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine42(skiatest::Reporter* reporter) {
+static void testLine42(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(8, 16, 17, 17, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine42x(skiatest::Reporter* reporter) {
+static void testLine42x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(8, 16, 17, 17, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine43(skiatest::Reporter* reporter) {
+static void testLine43(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(6, 24, 18, 18, SkPath::kCW_Direction);
     path.addRect(0, 32, 9, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine43x(skiatest::Reporter* reporter) {
+static void testLine43x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(6, 24, 18, 18, SkPath::kCW_Direction);
     path.addRect(0, 32, 9, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine44(skiatest::Reporter* reporter) {
+static void testLine44(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(10, 40, 30, 30, SkPath::kCW_Direction);
     path.addRect(18, 0, 30, 30, SkPath::kCW_Direction);
     path.addRect(18, 32, 27, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine44x(skiatest::Reporter* reporter) {
+static void testLine44x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(10, 40, 30, 30, SkPath::kCW_Direction);
     path.addRect(18, 0, 30, 30, SkPath::kCW_Direction);
     path.addRect(18, 32, 27, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine45(skiatest::Reporter* reporter) {
+static void testLine45(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(10, 0, 30, 30, SkPath::kCW_Direction);
     path.addRect(18, 0, 30, 30, SkPath::kCW_Direction);
     path.addRect(24, 32, 33, 36, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine45x(skiatest::Reporter* reporter) {
+static void testLine45x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(10, 0, 30, 30, SkPath::kCW_Direction);
     path.addRect(18, 0, 30, 30, SkPath::kCW_Direction);
     path.addRect(24, 32, 33, 36, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine46(skiatest::Reporter* reporter) {
+static void testLine46(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(10, 40, 30, 30, SkPath::kCW_Direction);
     path.addRect(24, 0, 36, 36, SkPath::kCW_Direction);
     path.addRect(24, 32, 33, 36, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine46x(skiatest::Reporter* reporter) {
+static void testLine46x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(10, 40, 30, 30, SkPath::kCW_Direction);
     path.addRect(24, 0, 36, 36, SkPath::kCW_Direction);
     path.addRect(24, 32, 33, 36, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine47(skiatest::Reporter* reporter) {
+static void testLine47(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 0, 9, 9, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine47x(skiatest::Reporter* reporter) {
+static void testLine47x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 0, 9, 9, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine48(skiatest::Reporter* reporter) {
+static void testLine48(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 6, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 0, 9, 9, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine48x(skiatest::Reporter* reporter) {
+static void testLine48x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 6, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 0, 9, 9, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine49(skiatest::Reporter* reporter) {
+static void testLine49(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 0, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine49x(skiatest::Reporter* reporter) {
+static void testLine49x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(0, 0, 9, 9, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine50(skiatest::Reporter* reporter) {
+static void testLine50(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(10, 30, 30, 30, SkPath::kCW_Direction);
     path.addRect(24, 20, 36, 30, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine50x(skiatest::Reporter* reporter) {
+static void testLine50x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(10, 30, 30, 30, SkPath::kCW_Direction);
     path.addRect(24, 20, 36, 30, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine51(skiatest::Reporter* reporter) {
+static void testLine51(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 12, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine51x(skiatest::Reporter* reporter) {
+static void testLine51x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 12, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine52(skiatest::Reporter* reporter) {
+static void testLine52(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 30, 20, 20, SkPath::kCW_Direction);
     path.addRect(6, 20, 18, 30, SkPath::kCW_Direction);
     path.addRect(32, 0, 36, 41, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine52x(skiatest::Reporter* reporter) {
+static void testLine52x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 30, 20, 20, SkPath::kCW_Direction);
     path.addRect(6, 20, 18, 30, SkPath::kCW_Direction);
     path.addRect(32, 0, 36, 41, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine53(skiatest::Reporter* reporter) {
+static void testLine53(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(10, 30, 30, 30, SkPath::kCW_Direction);
     path.addRect(12, 20, 24, 30, SkPath::kCW_Direction);
     path.addRect(12, 32, 21, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine53x(skiatest::Reporter* reporter) {
+static void testLine53x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(10, 30, 30, 30, SkPath::kCW_Direction);
     path.addRect(12, 20, 24, 30, SkPath::kCW_Direction);
     path.addRect(12, 32, 21, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine54(skiatest::Reporter* reporter) {
+static void testLine54(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(6, 0, 18, 18, SkPath::kCW_Direction);
     path.addRect(8, 4, 17, 17, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine54x(skiatest::Reporter* reporter) {
+static void testLine54x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(6, 0, 18, 18, SkPath::kCW_Direction);
     path.addRect(8, 4, 17, 17, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine55(skiatest::Reporter* reporter) {
+static void testLine55(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(6, 6, 18, 18, SkPath::kCW_Direction);
     path.addRect(4, 4, 13, 13, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine55x(skiatest::Reporter* reporter) {
+static void testLine55x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(6, 6, 18, 18, SkPath::kCW_Direction);
     path.addRect(4, 4, 13, 13, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine56(skiatest::Reporter* reporter) {
+static void testLine56(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 20, 20, 20, SkPath::kCW_Direction);
     path.addRect(18, 20, 30, 30, SkPath::kCW_Direction);
     path.addRect(12, 0, 21, 21, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine56x(skiatest::Reporter* reporter) {
+static void testLine56x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 20, 20, 20, SkPath::kCW_Direction);
     path.addRect(18, 20, 30, 30, SkPath::kCW_Direction);
     path.addRect(12, 0, 21, 21, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine57(skiatest::Reporter* reporter) {
+static void testLine57(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(20, 0, 40, 40, SkPath::kCW_Direction);
     path.addRect(20, 0, 30, 40, SkPath::kCW_Direction);
     path.addRect(12, 0, 21, 21, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine57x(skiatest::Reporter* reporter) {
+static void testLine57x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(20, 0, 40, 40, SkPath::kCW_Direction);
     path.addRect(20, 0, 30, 40, SkPath::kCW_Direction);
     path.addRect(12, 0, 21, 21, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine58(skiatest::Reporter* reporter) {
+static void testLine58(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 0, 12, 12, SkPath::kCCW_Direction);
     path.addRect(0, 12, 9, 9, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine58x(skiatest::Reporter* reporter) {
+static void testLine58x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 0, 12, 12, SkPath::kCCW_Direction);
     path.addRect(0, 12, 9, 9, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine59(skiatest::Reporter* reporter) {
+static void testLine59(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(6, 6, 18, 18, SkPath::kCCW_Direction);
     path.addRect(4, 4, 13, 13, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine59x(skiatest::Reporter* reporter) {
+static void testLine59x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(6, 6, 18, 18, SkPath::kCCW_Direction);
     path.addRect(4, 4, 13, 13, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine60(skiatest::Reporter* reporter) {
+static void testLine60(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(6, 12, 18, 18, SkPath::kCCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine60x(skiatest::Reporter* reporter) {
+static void testLine60x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(6, 12, 18, 18, SkPath::kCCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine61(skiatest::Reporter* reporter) {
+static void testLine61(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(12, 0, 24, 24, SkPath::kCCW_Direction);
     path.addRect(12, 0, 21, 21, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine61x(skiatest::Reporter* reporter) {
+static void testLine61x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(12, 0, 24, 24, SkPath::kCCW_Direction);
     path.addRect(12, 0, 21, 21, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine62(skiatest::Reporter* reporter) {
+static void testLine62(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 12, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine62x(skiatest::Reporter* reporter) {
+static void testLine62x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 12, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine63(skiatest::Reporter* reporter) {
+static void testLine63(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(0, 10, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 6, 12, 12, SkPath::kCCW_Direction);
     path.addRect(0, 32, 9, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine63x(skiatest::Reporter* reporter) {
+static void testLine63x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(0, 10, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 6, 12, 12, SkPath::kCCW_Direction);
     path.addRect(0, 32, 9, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine64(skiatest::Reporter* reporter) {
+static void testLine64(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(10, 40, 30, 30, SkPath::kCW_Direction);
     path.addRect(18, 6, 30, 30, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine64x(skiatest::Reporter* reporter) {
+static void testLine64x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(10, 40, 30, 30, SkPath::kCW_Direction);
     path.addRect(18, 6, 30, 30, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine65(skiatest::Reporter* reporter) {
+static void testLine65(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(10, 0, 30, 30, SkPath::kCW_Direction);
     path.addRect(24, 0, 36, 36, SkPath::kCW_Direction);
     path.addRect(32, 6, 36, 41, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine65x(skiatest::Reporter* reporter) {
+static void testLine65x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(10, 0, 30, 30, SkPath::kCW_Direction);
     path.addRect(24, 0, 36, 36, SkPath::kCW_Direction);
     path.addRect(32, 6, 36, 41, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine66(skiatest::Reporter* reporter) {
+static void testLine66(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(0, 30, 20, 20, SkPath::kCW_Direction);
     path.addRect(12, 20, 24, 30, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine66x(skiatest::Reporter* reporter) {
+static void testLine66x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(0, 30, 20, 20, SkPath::kCW_Direction);
     path.addRect(12, 20, 24, 30, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine67(skiatest::Reporter* reporter) {
+static void testLine67(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(10, 40, 30, 30, SkPath::kCW_Direction);
     path.addRect(24, 20, 36, 30, SkPath::kCW_Direction);
     path.addRect(32, 0, 36, 41, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine67x(skiatest::Reporter* reporter) {
+static void testLine67x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(10, 40, 30, 30, SkPath::kCW_Direction);
     path.addRect(24, 20, 36, 30, SkPath::kCW_Direction);
     path.addRect(32, 0, 36, 41, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine68a(skiatest::Reporter* reporter) {
+static void testLine68a(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 8, 8, SkPath::kCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCW_Direction);
     path.addRect(1, 2, 4, 2, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine68ax(skiatest::Reporter* reporter) {
+static void testLine68ax(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 8, 8, SkPath::kCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCW_Direction);
     path.addRect(1, 2, 4, 2, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine68b(skiatest::Reporter* reporter) {
+static void testLine68b(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 8, 8, SkPath::kCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(1, 2, 2, 2, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine68bx(skiatest::Reporter* reporter) {
+static void testLine68bx(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 8, 8, SkPath::kCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(1, 2, 2, 2, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine68c(skiatest::Reporter* reporter) {
+static void testLine68c(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 8, 8, SkPath::kCCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCW_Direction);
     path.addRect(1, 2, 4, 2, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine68cx(skiatest::Reporter* reporter) {
+static void testLine68cx(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 8, 8, SkPath::kCCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCW_Direction);
     path.addRect(1, 2, 4, 2, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine68d(skiatest::Reporter* reporter) {
+static void testLine68d(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 8, 8, SkPath::kCCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(1, 2, 4, 2, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine68dx(skiatest::Reporter* reporter) {
+static void testLine68dx(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 8, 8, SkPath::kCCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(1, 2, 4, 2, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine68e(skiatest::Reporter* reporter) {
+static void testLine68e(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 8, 8, SkPath::kCW_Direction);
     path.addRect(0, 0, 8, 8, SkPath::kCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(1, 2, 2, 2, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine68ex(skiatest::Reporter* reporter) {
+static void testLine68ex(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 8, 8, SkPath::kCW_Direction);
     path.addRect(0, 0, 8, 8, SkPath::kCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(1, 2, 2, 2, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine68f(skiatest::Reporter* reporter) {
+static void testLine68f(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 8, 8, SkPath::kCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(1, 2, 2, 2, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine68fx(skiatest::Reporter* reporter) {
+static void testLine68fx(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 8, 8, SkPath::kCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(1, 2, 2, 2, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine68g(skiatest::Reporter* reporter) {
+static void testLine68g(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 8, 8, SkPath::kCW_Direction);
     path.addRect(0, 0, 8, 8, SkPath::kCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(1, 2, 2, 2, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine68gx(skiatest::Reporter* reporter) {
+static void testLine68gx(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 8, 8, SkPath::kCW_Direction);
@@ -1450,20 +1448,20 @@
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(1, 2, 2, 2, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine68h(skiatest::Reporter* reporter) {
+static void testLine68h(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 8, 8, SkPath::kCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(1, 2, 2, 2, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine68hx(skiatest::Reporter* reporter) {
+static void testLine68hx(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 8, 8, SkPath::kCW_Direction);
@@ -1471,217 +1469,217 @@
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(2, 2, 6, 6, SkPath::kCCW_Direction);
     path.addRect(1, 2, 2, 2, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine69(skiatest::Reporter* reporter) {
+static void testLine69(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 20, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 20, 12, 30, SkPath::kCW_Direction);
     path.addRect(12, 32, 21, 36, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine69x(skiatest::Reporter* reporter) {
+static void testLine69x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 20, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 20, 12, 30, SkPath::kCW_Direction);
     path.addRect(12, 32, 21, 36, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine70(skiatest::Reporter* reporter) {
+static void testLine70(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 24, 12, 12, SkPath::kCW_Direction);
     path.addRect(12, 32, 21, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine70x(skiatest::Reporter* reporter) {
+static void testLine70x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 24, 12, 12, SkPath::kCW_Direction);
     path.addRect(12, 32, 21, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine71(skiatest::Reporter* reporter) {
+static void testLine71(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(12, 0, 24, 24, SkPath::kCW_Direction);
     path.addRect(12, 32, 21, 36, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine71x(skiatest::Reporter* reporter) {
+static void testLine71x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 20, 20, SkPath::kCW_Direction);
     path.addRect(12, 0, 24, 24, SkPath::kCW_Direction);
     path.addRect(12, 32, 21, 36, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine72(skiatest::Reporter* reporter) {
+static void testLine72(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(10, 40, 30, 30, SkPath::kCW_Direction);
     path.addRect(6, 20, 18, 30, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine72x(skiatest::Reporter* reporter) {
+static void testLine72x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(10, 40, 30, 30, SkPath::kCW_Direction);
     path.addRect(6, 20, 18, 30, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine73(skiatest::Reporter* reporter) {
+static void testLine73(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(0, 40, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 20, 12, 30, SkPath::kCW_Direction);
     path.addRect(0, 0, 9, 9, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine73x(skiatest::Reporter* reporter) {
+static void testLine73x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(0, 40, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 20, 12, 30, SkPath::kCW_Direction);
     path.addRect(0, 0, 9, 9, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine74(skiatest::Reporter* reporter) {
+static void testLine74(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(20, 30, 40, 40, SkPath::kCW_Direction);
     path.addRect(24, 20, 36, 30, SkPath::kCCW_Direction);
     path.addRect(32, 24, 36, 41, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine74x(skiatest::Reporter* reporter) {
+static void testLine74x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(20, 30, 40, 40, SkPath::kCW_Direction);
     path.addRect(24, 20, 36, 30, SkPath::kCCW_Direction);
     path.addRect(32, 24, 36, 41, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine75(skiatest::Reporter* reporter) {
+static void testLine75(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(10, 0, 30, 30, SkPath::kCCW_Direction);
     path.addRect(18, 0, 30, 30, SkPath::kCCW_Direction);
     path.addRect(12, 0, 21, 21, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine75x(skiatest::Reporter* reporter) {
+static void testLine75x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 60, 60, SkPath::kCW_Direction);
     path.addRect(10, 0, 30, 30, SkPath::kCCW_Direction);
     path.addRect(18, 0, 30, 30, SkPath::kCCW_Direction);
     path.addRect(12, 0, 21, 21, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine76(skiatest::Reporter* reporter) {
+static void testLine76(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(36, 0, 66, 60, SkPath::kCW_Direction);
     path.addRect(10, 20, 40, 30, SkPath::kCW_Direction);
     path.addRect(24, 20, 36, 30, SkPath::kCCW_Direction);
     path.addRect(32, 6, 36, 41, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine76x(skiatest::Reporter* reporter) {
+static void testLine76x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(36, 0, 66, 60, SkPath::kCW_Direction);
     path.addRect(10, 20, 40, 30, SkPath::kCW_Direction);
     path.addRect(24, 20, 36, 30, SkPath::kCCW_Direction);
     path.addRect(32, 6, 36, 41, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine77(skiatest::Reporter* reporter) {
+static void testLine77(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(20, 0, 40, 40, SkPath::kCW_Direction);
     path.addRect(24, 6, 36, 36, SkPath::kCCW_Direction);
     path.addRect(24, 32, 33, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine77x(skiatest::Reporter* reporter) {
+static void testLine77x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(20, 0, 40, 40, SkPath::kCW_Direction);
     path.addRect(24, 6, 36, 36, SkPath::kCCW_Direction);
     path.addRect(24, 32, 33, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine78(skiatest::Reporter* reporter) {
+static void testLine78(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 30, 60, SkPath::kCW_Direction);
     path.addRect(10, 20, 30, 30, SkPath::kCCW_Direction);
     path.addRect(18, 20, 30, 30, SkPath::kCCW_Direction);
     path.addRect(32, 0, 36, 41, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine78x(skiatest::Reporter* reporter) {
+static void testLine78x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 30, 60, SkPath::kCW_Direction);
     path.addRect(10, 20, 30, 30, SkPath::kCCW_Direction);
     path.addRect(18, 20, 30, 30, SkPath::kCCW_Direction);
     path.addRect(32, 0, 36, 41, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine79(skiatest::Reporter* reporter) {
+static void testLine79(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 36, 60, 30, SkPath::kCW_Direction);
     path.addRect(10, 30, 40, 30, SkPath::kCW_Direction);
     path.addRect(0, 20, 12, 30, SkPath::kCCW_Direction);
     path.addRect(0, 32, 9, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine79x(skiatest::Reporter* reporter) {
+static void testLine79x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 36, 60, 30, SkPath::kCW_Direction);
     path.addRect(10, 30, 40, 30, SkPath::kCW_Direction);
     path.addRect(0, 20, 12, 30, SkPath::kCCW_Direction);
     path.addRect(0, 32, 9, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine81(skiatest::Reporter* reporter) {
+static void testLine81(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(-1, -1, 3, 3, SkPath::kCW_Direction);
     path.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
     path.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
     path.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
     path.addRect(1, 1, 2, 2, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testDegenerate1(skiatest::Reporter* reporter) {
+static void testDegenerate1(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(0, 0);
@@ -1691,10 +1689,10 @@
     path.lineTo(1, 0);
     path.lineTo(2, 0);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testDegenerate1x(skiatest::Reporter* reporter) {
+static void testDegenerate1x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -1705,10 +1703,10 @@
     path.lineTo(1, 0);
     path.lineTo(2, 0);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testDegenerate2(skiatest::Reporter* reporter) {
+static void testDegenerate2(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(0, 0);
@@ -1718,10 +1716,10 @@
     path.lineTo(1, 0);
     path.lineTo(0, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testDegenerate2x(skiatest::Reporter* reporter) {
+static void testDegenerate2x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -1732,10 +1730,10 @@
     path.lineTo(1, 0);
     path.lineTo(0, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testDegenerate3(skiatest::Reporter* reporter) {
+static void testDegenerate3(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(2, 0);
@@ -1745,10 +1743,10 @@
     path.lineTo(0, 0);
     path.lineTo(3, 0);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testDegenerate3x(skiatest::Reporter* reporter) {
+static void testDegenerate3x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -1759,10 +1757,10 @@
     path.lineTo(0, 0);
     path.lineTo(3, 0);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testDegenerate4(skiatest::Reporter* reporter) {
+static void testDegenerate4(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(1, 0);
@@ -1772,10 +1770,10 @@
     path.lineTo(1, 1);
     path.lineTo(1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testDegenerate4x(skiatest::Reporter* reporter) {
+static void testDegenerate4x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -1786,10 +1784,10 @@
     path.lineTo(1, 1);
     path.lineTo(1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testNondegenerate1(skiatest::Reporter* reporter) {
+static void testNondegenerate1(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(3, 0);
@@ -1799,10 +1797,10 @@
     path.lineTo(2, 1);
     path.lineTo(1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testNondegenerate1x(skiatest::Reporter* reporter) {
+static void testNondegenerate1x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -1813,10 +1811,10 @@
     path.lineTo(2, 1);
     path.lineTo(1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testNondegenerate2(skiatest::Reporter* reporter) {
+static void testNondegenerate2(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(1, 0);
     path.lineTo(0, 1);
@@ -1826,10 +1824,10 @@
     path.lineTo(0, 3);
     path.lineTo(1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testNondegenerate2x(skiatest::Reporter* reporter) {
+static void testNondegenerate2x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(1, 0);
@@ -1840,10 +1838,10 @@
     path.lineTo(0, 3);
     path.lineTo(1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testNondegenerate3(skiatest::Reporter* reporter) {
+static void testNondegenerate3(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(1, 0);
@@ -1853,10 +1851,10 @@
     path.lineTo(1, 1);
     path.lineTo(0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testNondegenerate3x(skiatest::Reporter* reporter) {
+static void testNondegenerate3x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -1867,10 +1865,10 @@
     path.lineTo(1, 1);
     path.lineTo(0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testNondegenerate4(skiatest::Reporter* reporter) {
+static void testNondegenerate4(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(1, 0);
     path.lineTo(0, 1);
@@ -1880,10 +1878,10 @@
     path.lineTo(0, 3);
     path.lineTo(1, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testNondegenerate4x(skiatest::Reporter* reporter) {
+static void testNondegenerate4x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(1, 0);
@@ -1894,10 +1892,10 @@
     path.lineTo(0, 3);
     path.lineTo(1, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadralateral5(skiatest::Reporter* reporter) {
+static void testQuadralateral5(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(0, 0);
@@ -1909,10 +1907,10 @@
     path.lineTo(3, 2);
     path.lineTo(3, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadralateral5x(skiatest::Reporter* reporter) {
+static void testQuadralateral5x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -1925,10 +1923,10 @@
     path.lineTo(3, 2);
     path.lineTo(3, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadralateral6(skiatest::Reporter* reporter) {
+static void testQuadralateral6(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(0, 0);
@@ -1940,10 +1938,10 @@
     path.lineTo(0, 2);
     path.lineTo(2, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadralateral6x(skiatest::Reporter* reporter) {
+static void testQuadralateral6x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -1956,10 +1954,10 @@
     path.lineTo(0, 2);
     path.lineTo(2, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testFauxQuadralateral6(skiatest::Reporter* reporter) {
+static void testFauxQuadralateral6(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(1, 0);
@@ -1973,10 +1971,10 @@
     path.lineTo(0, 2);
     path.lineTo(2, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testFauxQuadralateral6x(skiatest::Reporter* reporter) {
+static void testFauxQuadralateral6x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -1991,10 +1989,10 @@
     path.lineTo(0, 2);
     path.lineTo(2, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testFauxQuadralateral6a(skiatest::Reporter* reporter) {
+static void testFauxQuadralateral6a(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(3, 0);
@@ -2008,10 +2006,10 @@
     path.lineTo(0, 6);
     path.lineTo(6, 6);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testFauxQuadralateral6ax(skiatest::Reporter* reporter) {
+static void testFauxQuadralateral6ax(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -2026,10 +2024,10 @@
     path.lineTo(0, 6);
     path.lineTo(6, 6);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testFauxQuadralateral6b(skiatest::Reporter* reporter) {
+static void testFauxQuadralateral6b(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(3, 0);
@@ -2043,10 +2041,10 @@
     path.lineTo(6, 6);
     path.lineTo(0, 6);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testFauxQuadralateral6bx(skiatest::Reporter* reporter) {
+static void testFauxQuadralateral6bx(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -2061,10 +2059,10 @@
     path.lineTo(6, 6);
     path.lineTo(0, 6);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testFauxQuadralateral6c(skiatest::Reporter* reporter) {
+static void testFauxQuadralateral6c(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(3, 3);
@@ -2078,10 +2076,10 @@
     path.lineTo(0, 6);
     path.lineTo(6, 6);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testFauxQuadralateral6cx(skiatest::Reporter* reporter) {
+static void testFauxQuadralateral6cx(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -2096,10 +2094,10 @@
     path.lineTo(0, 6);
     path.lineTo(6, 6);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testFauxQuadralateral6d(skiatest::Reporter* reporter) {
+static void testFauxQuadralateral6d(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(3, 3);
@@ -2113,10 +2111,10 @@
     path.lineTo(6, 6);
     path.lineTo(0, 6);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testFauxQuadralateral6dx(skiatest::Reporter* reporter) {
+static void testFauxQuadralateral6dx(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -2131,10 +2129,10 @@
     path.lineTo(6, 6);
     path.lineTo(0, 6);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadralateral6a(skiatest::Reporter* reporter) {
+static void testQuadralateral6a(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(0, 0);
@@ -2146,10 +2144,10 @@
     path.lineTo(0, 6);
     path.lineTo(6, 6);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadralateral6ax(skiatest::Reporter* reporter) {
+static void testQuadralateral6ax(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -2162,10 +2160,10 @@
     path.lineTo(0, 6);
     path.lineTo(6, 6);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadralateral7(skiatest::Reporter* reporter) {
+static void testQuadralateral7(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(0, 0);
@@ -2177,10 +2175,10 @@
     path.lineTo(2, 2);
     path.lineTo(1, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadralateral7x(skiatest::Reporter* reporter) {
+static void testQuadralateral7x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -2193,10 +2191,10 @@
     path.lineTo(2, 2);
     path.lineTo(1, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadralateral8(skiatest::Reporter* reporter) {
+static void testQuadralateral8(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(3, 1);
@@ -2208,10 +2206,10 @@
     path.lineTo(3, 2);
     path.lineTo(2, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadralateral8x(skiatest::Reporter* reporter) {
+static void testQuadralateral8x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -2224,10 +2222,10 @@
     path.lineTo(3, 2);
     path.lineTo(2, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadralateral9(skiatest::Reporter* reporter) {
+static void testQuadralateral9(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(1, 0);
@@ -2239,10 +2237,10 @@
     path.lineTo(1, 3);
     path.lineTo(2, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadralateral9x(skiatest::Reporter* reporter) {
+static void testQuadralateral9x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -2255,53 +2253,53 @@
     path.lineTo(1, 3);
     path.lineTo(2, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine1a(skiatest::Reporter* reporter) {
+static void testLine1a(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kWinding_FillType);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 0, 13, 13, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine1ax(skiatest::Reporter* reporter) {
+static void testLine1ax(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 0, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 0, 13, 13, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine2ax(skiatest::Reporter* reporter) {
+static void testLine2ax(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 20, 20, 20, SkPath::kCW_Direction);
     path.addRect(0, 20, 12, 30, SkPath::kCW_Direction);
     path.addRect(12, 0, 21, 21, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine3aax(skiatest::Reporter* reporter) {
+static void testLine3aax(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(10, 30, 30, 30, SkPath::kCW_Direction);
     path.addRect(18, 20, 30, 30, SkPath::kCCW_Direction);
     path.addRect(0, 32, 9, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine4ax(skiatest::Reporter* reporter) {
+static void testLine4ax(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(10, 30, 30, 30, SkPath::kCW_Direction);
     path.addRect(24, 20, 36, 30, SkPath::kCCW_Direction);
     path.addRect(0, 32, 9, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic1(skiatest::Reporter* reporter) {
+static void testQuadratic1(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 0, 0);
@@ -2311,10 +2309,10 @@
     path.lineTo(0, 0);
     path.quadTo(0, 0, 0, 0);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic1x(skiatest::Reporter* reporter) {
+static void testQuadratic1x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -2325,10 +2323,10 @@
     path.lineTo(0, 0);
     path.quadTo(0, 0, 0, 0);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic2(skiatest::Reporter* reporter) {
+static void testQuadratic2(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 0, 0);
@@ -2338,10 +2336,10 @@
     path.lineTo(0, 0);
     path.quadTo(1, 0, 0, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic2x(skiatest::Reporter* reporter) {
+static void testQuadratic2x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -2352,10 +2350,10 @@
     path.lineTo(0, 0);
     path.quadTo(1, 0, 0, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic3(skiatest::Reporter* reporter) {
+static void testQuadratic3(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 1, 0);
@@ -2365,10 +2363,10 @@
     path.lineTo(0, 0);
     path.quadTo(1, 0, 0, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic3x(skiatest::Reporter* reporter) {
+static void testQuadratic3x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -2379,10 +2377,10 @@
     path.lineTo(0, 0);
     path.quadTo(1, 0, 0, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic4(skiatest::Reporter* reporter) {
+static void testQuadratic4(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 1, 0);
@@ -2392,10 +2390,10 @@
     path.lineTo(0, 0);
     path.quadTo(1, 0, 0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic4x(skiatest::Reporter* reporter) {
+static void testQuadratic4x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -2406,10 +2404,10 @@
     path.lineTo(0, 0);
     path.quadTo(1, 0, 0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic5(skiatest::Reporter* reporter) {
+static void testQuadratic5(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 0, 0);
@@ -2419,10 +2417,10 @@
     path.lineTo(1, 0);
     path.quadTo(0, 1, 0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic6(skiatest::Reporter* reporter) {
+static void testQuadratic6(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 1, 0);
@@ -2432,10 +2430,10 @@
     path.lineTo(0, 0);
     path.quadTo(2, 0, 0, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic7(skiatest::Reporter* reporter) {
+static void testQuadratic7(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 1, 0);
@@ -2445,10 +2443,10 @@
     path.lineTo(0, 0);
     path.quadTo(3, 0, 1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic8(skiatest::Reporter* reporter) {
+static void testQuadratic8(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 1, 0);
@@ -2458,10 +2456,10 @@
     path.lineTo(1, 0);
     path.quadTo(0, 1, 1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic9(skiatest::Reporter* reporter) {
+static void testQuadratic9(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 1, 0);
@@ -2471,10 +2469,10 @@
     path.lineTo(1, 0);
     path.quadTo(1, 2, 3, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic14(skiatest::Reporter* reporter) {
+static void testQuadratic14(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 1, 0);
@@ -2484,10 +2482,10 @@
     path.lineTo(1, 0);
     path.quadTo(3, 2, 3, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic15(skiatest::Reporter* reporter) {
+static void testQuadratic15(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 1, 0);
@@ -2497,10 +2495,10 @@
     path.lineTo(0, 1);
     path.quadTo(1, 1, 0, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic17x(skiatest::Reporter* reporter) {
+static void testQuadratic17x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -2511,10 +2509,10 @@
     path.lineTo(1, 0);
     path.quadTo(3, 1, 0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic18(skiatest::Reporter* reporter) {
+static void testQuadratic18(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 0, 1);
@@ -2524,10 +2522,10 @@
     path.lineTo(0, 0);
     path.quadTo(1, 0, 1, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic19(skiatest::Reporter* reporter) {
+static void testQuadratic19(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 0, 1);
@@ -2537,10 +2535,10 @@
     path.lineTo(0, 0);
     path.quadTo(2, 0, 0, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic20(skiatest::Reporter* reporter) {
+static void testQuadratic20(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 0, 1);
@@ -2550,10 +2548,10 @@
     path.lineTo(0, 0);
     path.quadTo(1, 0, 0, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic21(skiatest::Reporter* reporter) {
+static void testQuadratic21(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 0, 1);
@@ -2563,10 +2561,10 @@
     path.lineTo(0, 0);
     path.quadTo(1, 0, 0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic22(skiatest::Reporter* reporter) {
+static void testQuadratic22(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 0, 1);
@@ -2576,10 +2574,10 @@
     path.lineTo(0, 0);
     path.quadTo(0, 1, 2, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic23(skiatest::Reporter* reporter) {
+static void testQuadratic23(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 0, 1);
@@ -2589,10 +2587,10 @@
     path.lineTo(0, 0);
     path.quadTo(0, 2, 1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic24(skiatest::Reporter* reporter) {
+static void testQuadratic24(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 0, 1);
@@ -2602,10 +2600,10 @@
     path.lineTo(1, 0);
     path.quadTo(2, 0, 0, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic25(skiatest::Reporter* reporter) {
+static void testQuadratic25(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 1, 1);
@@ -2615,10 +2613,10 @@
     path.lineTo(0, 0);
     path.quadTo(2, 1, 0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic26(skiatest::Reporter* reporter) {
+static void testQuadratic26(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 1, 1);
@@ -2628,10 +2626,10 @@
     path.lineTo(0, 0);
     path.quadTo(1, 0, 0, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic27(skiatest::Reporter* reporter) {
+static void testQuadratic27(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 1, 1);
@@ -2641,10 +2639,10 @@
     path.lineTo(0, 0);
     path.quadTo(2, 1, 0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic28(skiatest::Reporter* reporter) {
+static void testQuadratic28(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 0, 1);
@@ -2654,10 +2652,10 @@
     path.lineTo(0, 2);
     path.quadTo(1, 2, 0, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic29(skiatest::Reporter* reporter) {
+static void testQuadratic29(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 2, 1);
@@ -2667,10 +2665,10 @@
     path.lineTo(0, 0);
     path.quadTo(1, 0, 0, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic30(skiatest::Reporter* reporter) {
+static void testQuadratic30(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 1, 2);
@@ -2680,10 +2678,10 @@
     path.lineTo(1, 0);
     path.quadTo(0, 1, 1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic31(skiatest::Reporter* reporter) {
+static void testQuadratic31(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 1, 2);
@@ -2693,10 +2691,10 @@
     path.lineTo(1, 0);
     path.quadTo(0, 1, 1, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic32(skiatest::Reporter* reporter) {
+static void testQuadratic32(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 2, 3);
@@ -2706,10 +2704,10 @@
     path.lineTo(0, 0);
     path.quadTo(3, 1, 0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic33(skiatest::Reporter* reporter) {
+static void testQuadratic33(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(2, 0, 0, 1);
@@ -2719,10 +2717,10 @@
     path.lineTo(1, 1);
     path.quadTo(2, 1, 2, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic34(skiatest::Reporter* reporter) {
+static void testQuadratic34(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(2, 0, 0, 1);
@@ -2732,10 +2730,10 @@
     path.lineTo(1, 1);
     path.quadTo(2, 1, 1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic35(skiatest::Reporter* reporter) {
+static void testQuadratic35(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 1, 1, 1);
@@ -2745,10 +2743,10 @@
     path.lineTo(3, 0);
     path.quadTo(0, 1, 1, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic36(skiatest::Reporter* reporter) {
+static void testQuadratic36(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(2, 1, 2, 3);
@@ -2758,10 +2756,10 @@
     path.lineTo(1, 2);
     path.quadTo(3, 2, 1, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic37(skiatest::Reporter* reporter) {
+static void testQuadratic37(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 2, 1, 2);
@@ -2771,10 +2769,10 @@
     path.lineTo(3, 1);
     path.quadTo(0, 2, 1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic38(skiatest::Reporter* reporter) {
+static void testQuadratic38(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(1, 0);
     path.quadTo(0, 1, 1, 1);
@@ -2784,10 +2782,10 @@
     path.lineTo(1, 2);
     path.quadTo(2, 2, 1, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic51(skiatest::Reporter* reporter) {
+static void testQuadratic51(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(369.863983f, 145.645813f);
     path.quadTo(382.380371f, 121.254936f, 406.236359f, 121.254936f);
@@ -2797,10 +2795,10 @@
     path.quadTo(383.98465f, 121.254936f, 406.235992f, 121.254936f);
     path.lineTo(369.970581f, 137.94342f);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic53(skiatest::Reporter* reporter) {
+static void testQuadratic53(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(303.12088f, 141.299606f);
     path.lineTo(330.463562f, 217.659027f);
@@ -2811,10 +2809,10 @@
     path.quadTo(329.104431f, 231.663818f, 351.512085f, 231.663818f);
     path.lineTo(371.919067f, 205.854996f);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic55(skiatest::Reporter* reporter) {
+static void testQuadratic55(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
 path.moveTo(303.12088f, 141.299606f);
 path.lineTo(330.463562f, 217.659027f);
@@ -2825,10 +2823,10 @@
 path.quadTo(329.104431f, 231.663818f, 351.512085f, 231.663818f);
 path.lineTo(326.236786f, 205.854996f);
 path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic56(skiatest::Reporter* reporter) {
+static void testQuadratic56(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
 path.moveTo(366.608826f, 151.196014f);
 path.quadTo(378.803101f, 136.674606f, 398.164948f, 136.674606f);
@@ -2841,10 +2839,10 @@
 path.lineTo(350, 120);
 path.lineTo(366.608826f, 151.196014f);
 path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine80(skiatest::Reporter* reporter) {
+static void testLine80(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
 path.moveTo(4, 0);
 path.lineTo(3, 7);
@@ -2855,10 +2853,10 @@
 path.lineTo(6, 12);
 path.lineTo(8, 3);
 path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic58(skiatest::Reporter* reporter) {
+static void testQuadratic58(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(283.714233f, 240);
     path.lineTo(283.714233f, 141.299606f);
@@ -2887,10 +2885,10 @@
     path.quadTo(358.78125f, 175.778046f, 343.709442f, 175.778046f);
     path.quadTo(328.570923f, 175.778046f, 326.837006f, 195.984955f);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic59x(skiatest::Reporter* reporter) {
+static void testQuadratic59x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -2901,10 +2899,10 @@
     path.lineTo(2, 0);
     path.quadTo(3, 1, 1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic59(skiatest::Reporter* reporter) {
+static void testQuadratic59(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kWinding_FillType);
     path.moveTo(0, 0);
@@ -2915,10 +2913,10 @@
     path.lineTo(2, 0);
     path.quadTo(3, 1, 1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic63(skiatest::Reporter* reporter) {
+static void testQuadratic63(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 0, 0);
@@ -2928,10 +2926,10 @@
     path.lineTo(2, 1);
     path.quadTo(2, 1, 2, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic64(skiatest::Reporter* reporter) {
+static void testQuadratic64(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 0, 0);
@@ -2941,10 +2939,10 @@
     path.lineTo(2, 2);
     path.quadTo(0, 3, 3, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic65(skiatest::Reporter* reporter) {
+static void testQuadratic65(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 0, 0);
@@ -2954,10 +2952,10 @@
     path.lineTo(2, 2);
     path.quadTo(0, 3, 1, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic67x(skiatest::Reporter* reporter) {
+static void testQuadratic67x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -2968,10 +2966,10 @@
     path.lineTo(2, 0);
     path.quadTo(1, 1, 3, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic68(skiatest::Reporter* reporter) {
+static void testQuadratic68(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 0, 1);
@@ -2981,10 +2979,10 @@
     path.lineTo(0, 0);
     path.quadTo(0, 1, 2, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic69(skiatest::Reporter* reporter) {
+static void testQuadratic69(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 0, 1);
@@ -2994,10 +2992,10 @@
     path.lineTo(1, 1);
     path.quadTo(3, 2, 2, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic70x(skiatest::Reporter* reporter) {
+static void testQuadratic70x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -3008,10 +3006,10 @@
     path.lineTo(0, 0);
     path.quadTo(0, 1, 2, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic71(skiatest::Reporter* reporter) {
+static void testQuadratic71(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 1, 1);
@@ -3021,10 +3019,10 @@
     path.lineTo(0, 0);
     path.quadTo(1, 1, 3, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic72(skiatest::Reporter* reporter) {
+static void testQuadratic72(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 1, 2);
@@ -3034,10 +3032,10 @@
     path.lineTo(1, 0);
     path.quadTo(0, 1, 3, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic73(skiatest::Reporter* reporter) {
+static void testQuadratic73(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 0, 3);
@@ -3047,10 +3045,10 @@
     path.lineTo(1, 0);
     path.quadTo(0, 1, 1, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic74(skiatest::Reporter* reporter) {
+static void testQuadratic74(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 1, 3);
@@ -3060,10 +3058,10 @@
     path.lineTo(0, 1);
     path.quadTo(3, 2, 2, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic75(skiatest::Reporter* reporter) {
+static void testQuadratic75(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 1, 3);
@@ -3073,10 +3071,10 @@
     path.lineTo(0, 1);
     path.quadTo(3, 2, 2, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic76(skiatest::Reporter* reporter) {
+static void testQuadratic76(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 0, 0);
@@ -3086,10 +3084,10 @@
     path.lineTo(1, 2);
     path.quadTo(1, 2, 2, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic77(skiatest::Reporter* reporter) {
+static void testQuadratic77(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 1, 1);
@@ -3099,10 +3097,10 @@
     path.lineTo(1, 0);
     path.quadTo(0, 1, 3, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic78(skiatest::Reporter* reporter) {
+static void testQuadratic78(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 1, 2);
@@ -3112,10 +3110,10 @@
     path.lineTo(0, 0);
     path.quadTo(2, 1, 0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic79(skiatest::Reporter* reporter) {
+static void testQuadratic79(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 1, 2);
@@ -3125,110 +3123,110 @@
     path.lineTo(1, 0);
     path.quadTo(0, 1, 3, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testEight1(skiatest::Reporter* reporter) {
+static void testEight1(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(2, 2);
     path.lineTo(0, 2);
     path.lineTo(2, 0);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testEight2(skiatest::Reporter* reporter) {
+static void testEight2(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(2, 0);
     path.lineTo(0, 2);
     path.lineTo(2, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testEight3(skiatest::Reporter* reporter) {
+static void testEight3(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(0, 2);
     path.lineTo(2, 0);
     path.lineTo(2, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testEight4(skiatest::Reporter* reporter) {
+static void testEight4(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(2, 2);
     path.lineTo(2, 0);
     path.lineTo(0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testEight5(skiatest::Reporter* reporter) {
+static void testEight5(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(1, 0);
     path.lineTo(1, 2);
     path.lineTo(0, 2);
     path.lineTo(2, 0);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testEight6(skiatest::Reporter* reporter) {
+static void testEight6(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(1, 0);
     path.lineTo(2, 0);
     path.lineTo(0, 2);
     path.lineTo(1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testEight7(skiatest::Reporter* reporter) {
+static void testEight7(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(0, 1);
     path.lineTo(2, 1);
     path.lineTo(2, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testEight8(skiatest::Reporter* reporter) {
+static void testEight8(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(2, 2);
     path.lineTo(2, 1);
     path.lineTo(0, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testEight9(skiatest::Reporter* reporter) {
+static void testEight9(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(1, 0);
     path.lineTo(1, 2);
     path.lineTo(2, 1);
     path.lineTo(0, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testEight10(skiatest::Reporter* reporter) {
+static void testEight10(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(1, 0);
     path.lineTo(0, 1);
     path.lineTo(2, 1);
     path.lineTo(1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic80(skiatest::Reporter* reporter) {
+static void testQuadratic80(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(1, 0, 2, 3);
@@ -3238,10 +3236,10 @@
     path.lineTo(3, 0);
     path.quadTo(0, 1, 1, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic81(skiatest::Reporter* reporter) {
+static void testQuadratic81(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(2, 0, 1, 1);
@@ -3251,10 +3249,10 @@
     path.lineTo(0, 0);
     path.quadTo(2, 1, 0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic82(skiatest::Reporter* reporter) {
+static void testQuadratic82(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(2, 0, 1, 1);
@@ -3264,10 +3262,10 @@
     path.lineTo(0, 0);
     path.quadTo(2, 1, 0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic83(skiatest::Reporter* reporter) {
+static void testQuadratic83(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 0, 2, 0);
@@ -3277,10 +3275,10 @@
     path.lineTo(0, 2);
     path.quadTo(2, 2, 1, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic84(skiatest::Reporter* reporter) {
+static void testQuadratic84(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(2, 0, 1, 1);
@@ -3290,10 +3288,10 @@
     path.lineTo(2, 0);
     path.quadTo(0, 1, 2, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic85(skiatest::Reporter* reporter) {
+static void testQuadratic85(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(3, 0, 1, 1);
@@ -3303,10 +3301,10 @@
     path.lineTo(3, 0);
     path.quadTo(0, 1, 1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic86(skiatest::Reporter* reporter) {
+static void testQuadratic86(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(0, 1, 1, 1);
@@ -3316,10 +3314,10 @@
     path.lineTo(0, 0);
     path.quadTo(1, 1, 1, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic87(skiatest::Reporter* reporter) {
+static void testQuadratic87(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(2, 1, 0, 2);
@@ -3329,10 +3327,10 @@
     path.lineTo(1, 1);
     path.quadTo(0, 2, 3, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic88(skiatest::Reporter* reporter) {
+static void testQuadratic88(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(2, 1, 0, 2);
@@ -3342,10 +3340,10 @@
     path.lineTo(1, 1);
     path.quadTo(0, 2, 2, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic89x(skiatest::Reporter* reporter) {
+static void testQuadratic89x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -3356,10 +3354,10 @@
     path.lineTo(2, 1);
     path.quadTo(3, 1, 3, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic90x(skiatest::Reporter* reporter) {
+static void testQuadratic90x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -3370,10 +3368,10 @@
     path.lineTo(0, 1);
     path.quadTo(3, 2, 2, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic91(skiatest::Reporter* reporter) {
+static void testQuadratic91(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(3, 2, 2, 3);
@@ -3383,10 +3381,10 @@
     path.lineTo(1, 1);
     path.quadTo(2, 1, 2, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic92x(skiatest::Reporter* reporter) {
+static void testQuadratic92x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(1, 0);
@@ -3397,118 +3395,118 @@
     path.lineTo(0, 1);
     path.quadTo(3, 2, 2, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine82(skiatest::Reporter* reporter) {
+static void testLine82(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(20, 0, 40, 40, SkPath::kCCW_Direction);
     path.addRect(24, 20, 36, 30, SkPath::kCCW_Direction);
     path.addRect(24, 32, 33, 36, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine82a(skiatest::Reporter* reporter) {
+static void testLine82a(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 6, 10, SkPath::kCW_Direction);
     path.addRect(2, 2, 4, 4, SkPath::kCW_Direction);
     path.addRect(2, 6, 4, 8, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine82b(skiatest::Reporter* reporter) {
+static void testLine82b(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 6, 10, SkPath::kCW_Direction);
     path.addRect(2, 2, 4, 4, SkPath::kCW_Direction);
     path.addRect(2, 6, 4, 8, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine82c(skiatest::Reporter* reporter) {
+static void testLine82c(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 6, 10, SkPath::kCW_Direction);
     path.addRect(2, 2, 4, 4, SkPath::kCCW_Direction);
     path.addRect(2, 6, 4, 8, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine82d(skiatest::Reporter* reporter) {
+static void testLine82d(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 6, 10, SkPath::kCW_Direction);
     path.addRect(2, 2, 4, 4, SkPath::kCCW_Direction);
     path.addRect(2, 6, 4, 8, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine82e(skiatest::Reporter* reporter) {
+static void testLine82e(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 6, 10, SkPath::kCCW_Direction);
     path.addRect(2, 2, 4, 4, SkPath::kCW_Direction);
     path.addRect(2, 6, 4, 8, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine82f(skiatest::Reporter* reporter) {
+static void testLine82f(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 6, 10, SkPath::kCCW_Direction);
     path.addRect(2, 2, 4, 4, SkPath::kCW_Direction);
     path.addRect(2, 6, 4, 8, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine82g(skiatest::Reporter* reporter) {
+static void testLine82g(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 6, 10, SkPath::kCCW_Direction);
     path.addRect(2, 2, 4, 4, SkPath::kCCW_Direction);
     path.addRect(2, 6, 4, 8, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine82h(skiatest::Reporter* reporter) {
+static void testLine82h(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 6, 10, SkPath::kCCW_Direction);
     path.addRect(2, 2, 4, 4, SkPath::kCCW_Direction);
     path.addRect(2, 6, 4, 8, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine83(skiatest::Reporter* reporter) {
+static void testLine83(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
 path.addRect(10, 30, 30, 40, SkPath::kCCW_Direction);
 path.addRect(0, 12, 12, 18, SkPath::kCCW_Direction);
 path.addRect(4, 13, 13, 16, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine84(skiatest::Reporter* reporter) {
+static void testLine84(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 12, 60, 30, SkPath::kCCW_Direction);
     path.addRect(10, 20, 40, 30, SkPath::kCW_Direction);
     path.addRect(0, 12, 12, 12, SkPath::kCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine84x(skiatest::Reporter* reporter) {
+static void testLine84x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.addRect(0, 12, 60, 30, SkPath::kCCW_Direction);
     path.addRect(10, 20, 40, 30, SkPath::kCCW_Direction);
     path.addRect(0, 12, 12, 12, SkPath::kCCW_Direction);
     path.addRect(4, 12, 13, 13, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testLine85(skiatest::Reporter* reporter) {
+static void testLine85(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(36, 0, 66, 60, SkPath::kCCW_Direction);
     path.addRect(20, 0, 40, 40, SkPath::kCCW_Direction);
     path.addRect(12, 0, 24, 24, SkPath::kCCW_Direction);
     path.addRect(32, 0, 36, 41, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadralateral1(skiatest::Reporter* reporter) {
+static void testQuadralateral1(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(0, 0);
@@ -3520,10 +3518,10 @@
     path.lineTo(2, 2);
     path.lineTo(2, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testCubic1(skiatest::Reporter* reporter) {
+static void testCubic1(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.cubicTo(0, 1, 1, 1, 1, 0);
@@ -3531,10 +3529,10 @@
     path.moveTo(1, 0);
     path.cubicTo(0, 0, 0, 1, 1, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic93(skiatest::Reporter* reporter) {
+static void testQuadratic93(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(3, 0);
     path.quadTo(0, 1, 3, 2);
@@ -3544,10 +3542,10 @@
     path.lineTo(2, 0);
     path.quadTo(1, 1, 2, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testCubic2(skiatest::Reporter* reporter) {
+static void testCubic2(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0,2);
     path.cubicTo(0,3, 2,1, 4,0);
@@ -3555,10 +3553,10 @@
     path.moveTo(1,2);
     path.cubicTo(0,4, 2,0, 3,0);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuad1(skiatest::Reporter* reporter) {
+static void testQuad1(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0,0);
     path.quadTo(0,0, 0,1);
@@ -3567,10 +3565,10 @@
     path.moveTo(0,0);
     path.quadTo(1,1, 0,2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadralateral2(skiatest::Reporter* reporter) {
+static void testQuadralateral2(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(2, 2);
@@ -3582,50 +3580,50 @@
     path.lineTo(0, 1);
     path.lineTo(1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic94(skiatest::Reporter* reporter) {
+static void testQuadratic94(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(8, 8);
     path.quadTo(8, 4, 4, 4);
     path.quadTo(4, 0, 0, 0);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic95(skiatest::Reporter* reporter) {
+static void testQuadratic95(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(8, 8);
     path.lineTo(0, 0);
     path.quadTo(4, 0, 4, 4);
     path.quadTo(8, 4, 8, 8);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic96(skiatest::Reporter* reporter) {
+static void testQuadratic96(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(8, 0);
     path.lineTo(0, 8);
     path.quadTo(0, 4, 4, 4);
     path.quadTo(4, 0, 8, 0);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadratic97(skiatest::Reporter* reporter) {
+static void testQuadratic97(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 8);
     path.lineTo(8, 0);
     path.quadTo(4, 0, 4, 4);
     path.quadTo(0, 4, 0, 8);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testTriangles1(skiatest::Reporter* reporter) {
+static void testTriangles1(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(1, 0);
@@ -3635,10 +3633,10 @@
     path.lineTo(1, 2);
     path.lineTo(1, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testTriangles2(skiatest::Reporter* reporter) {
+static void testTriangles2(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(1, 0);
@@ -3648,7 +3646,7 @@
     path.lineTo(2, 3);
     path.lineTo(1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
 // A test this for this case:
@@ -3657,7 +3655,7 @@
 // each ends up with +2/0 pairs for winding count
 // since logic in OpSegment::addTCoincident doesn't transfer count (only increments/decrements)
 // can this be resolved to +4/0 ?
-static void testAddTCoincident1(skiatest::Reporter* reporter) {
+static void testAddTCoincident1(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(2, 0);
     path.lineTo(2, 2);
@@ -3673,11 +3671,11 @@
     path.lineTo(2, 2);
     path.lineTo(3, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
 // test with implicit close
-static void testAddTCoincident2(skiatest::Reporter* reporter) {
+static void testAddTCoincident2(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(2, 0);
     path.lineTo(2, 2);
@@ -3691,10 +3689,10 @@
     path.lineTo(2, 0);
     path.lineTo(2, 2);
     path.lineTo(3, 1);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuad2(skiatest::Reporter* reporter) {
+static void testQuad2(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(1, 0);
     path.quadTo(0, 1, 3, 2);
@@ -3706,7 +3704,7 @@
     path.close();
 }
 
-static void testQuad3(skiatest::Reporter* reporter) {
+static void testQuad3(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(1, 0);
     path.quadTo(0, 1, 3, 2);
@@ -3716,10 +3714,10 @@
     path.lineTo(1, 0);
     path.quadTo(0, 1, 1, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuad4(skiatest::Reporter* reporter) {
+static void testQuad4(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(2, 0);
     path.quadTo(0, 1, 1, 1);
@@ -3729,10 +3727,10 @@
     path.lineTo(2, 0);
     path.quadTo(0, 1, 2, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuad5(skiatest::Reporter* reporter) {
+static void testQuad5(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(2, 0);
     path.quadTo(0, 1, 2, 2);
@@ -3742,10 +3740,10 @@
     path.lineTo(2, 0);
     path.quadTo(0, 1, 1, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuad6(skiatest::Reporter* reporter) {
+static void testQuad6(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(2, 0);
     path.quadTo(0, 1, 2, 2);
@@ -3755,10 +3753,10 @@
     path.lineTo(2, 0);
     path.quadTo(0, 1, 1, 1);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuad7(skiatest::Reporter* reporter) {
+static void testQuad7(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(3, 0);
     path.quadTo(0, 1, 1, 1);
@@ -3768,10 +3766,10 @@
     path.lineTo(3, 0);
     path.quadTo(0, 1, 1, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadLineIntersect1(skiatest::Reporter* reporter) {
+static void testQuadLineIntersect1(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(3, 1, 0, 3);
@@ -3781,10 +3779,10 @@
     path.lineTo(0, 1);
     path.quadTo(3, 1, 0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadLineIntersect2(skiatest::Reporter* reporter) {
+static void testQuadLineIntersect2(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(3, 1, 0, 3);
@@ -3794,10 +3792,10 @@
     path.lineTo(0, 1);
     path.quadTo(3, 1, 0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuadLineIntersect3(skiatest::Reporter* reporter) {
+static void testQuadLineIntersect3(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.quadTo(3, 1, 0, 3);
@@ -3807,10 +3805,10 @@
     path.lineTo(0, 1);
     path.quadTo(3, 1, 0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void skphealth_com76(skiatest::Reporter* reporter) {
+static void skphealth_com76(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kWinding_FillType);
     path.moveTo(708.099182f, 7.09919119f);
@@ -3826,10 +3824,10 @@
     path.lineTo(704.000000f, 33.0000000f);
     path.lineTo(705.000000f, 33.0000000f);
     path.lineTo(719.500000f, 3.00000000f);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void tooCloseTest(skiatest::Reporter* reporter) {
+static void tooCloseTest(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(0, 0);
     path.lineTo(1, 1);
@@ -3840,19 +3838,19 @@
     path.lineTo(1, 2);
     path.lineTo(2, 0);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testRect1(skiatest::Reporter* reporter) {
+static void testRect1(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.addRect(0, 0, 60, 60, SkPath::kCCW_Direction);
     path.addRect(30, 20, 50, 50, SkPath::kCCW_Direction);
     path.addRect(24, 20, 36, 30, SkPath::kCCW_Direction);
     path.addRect(32, 24, 36, 41, SkPath::kCCW_Direction);
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testRect2(skiatest::Reporter* reporter) {
+static void testRect2(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kWinding_FillType);
     path.moveTo(0, 0);
@@ -3875,10 +3873,10 @@
     path.lineTo(36, 41);
     path.lineTo(36, 24);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testTriangles3x(skiatest::Reporter* reporter) {
+static void testTriangles3x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(1, 0);
@@ -3889,10 +3887,10 @@
     path.lineTo(1, 1);
     path.quadTo(2, 1, 0, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuad8(skiatest::Reporter* reporter) {
+static void testQuad8(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(3, 0);
     path.quadTo(0, 1, 3, 2);
@@ -3902,10 +3900,10 @@
     path.lineTo(3, 0);
     path.quadTo(1, 1, 2, 2);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testTriangles4x(skiatest::Reporter* reporter) {
+static void testTriangles4x(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(0, 0);
@@ -3916,10 +3914,10 @@
     path.lineTo(0, 1);
     path.quadTo(3, 2, 2, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuad9(skiatest::Reporter* reporter) {
+static void testQuad9(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.setFillType(SkPath::kEvenOdd_FillType);
     path.moveTo(1, 0);
@@ -3930,10 +3928,10 @@
     path.lineTo(1, 1);
     path.quadTo(2, 1, 1, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuad10(skiatest::Reporter* reporter) {
+static void testQuad10(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(1, 0);
     path.quadTo(0, 1, 3, 2);
@@ -3943,10 +3941,10 @@
     path.lineTo(2, 0);
     path.quadTo(2, 3, 3, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void testQuad11(skiatest::Reporter* reporter) {
+static void testQuad11(skiatest::Reporter* reporter, const char* filename) {
     SkPath path;
     path.moveTo(2, 0);
     path.quadTo(0, 1, 1, 2);
@@ -3956,17 +3954,768 @@
     path.lineTo(1, 1);
     path.quadTo(1, 3, 3, 3);
     path.close();
-    testSimplify(reporter, path);
+    testSimplify(reporter, path, filename);
 }
 
-static void (*firstTest)(skiatest::Reporter* ) = 0;
+static void testQuad12(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 0, 0);
+    path.lineTo(0, 1);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(1, 0, 0, 1);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuadralateral3(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.setFillType(SkPath::kEvenOdd_FillType);
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.lineTo(0, 0);
+    path.lineTo(1, 0);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.lineTo(1, 0);
+    path.lineTo(0, 1);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+
+static void testDegenerate5(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.lineTo(1, 0);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(1, 0);
+    path.lineTo(0, 1);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuadralateral4(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.lineTo(0, 0);
+    path.lineTo(3, 1);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.lineTo(0, 1);
+    path.lineTo(3, 1);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testDegenerates1(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 1, 1);
+    path.lineTo(2, 3);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(3, 2, 2, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuad13(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 1, 1);
+    path.lineTo(2, 3);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(3, 2, 2, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuad14(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.setFillType(SkPath::kWinding_FillType);
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 1, 1);
+    path.lineTo(1, 2);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(3, 1, 1, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuad15(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 1, 1);
+    path.lineTo(1, 3);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(2, 0, 1, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads16(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 1, 1);
+    path.lineTo(3, 2);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(0, 1, 3, 2);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads17(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 1, 1);
+    path.lineTo(3, 2);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(0, 2, 3, 2);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads18(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 1, 1);
+    path.lineTo(3, 2);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(1, 2, 3, 2);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads19(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 2, 1);
+    path.lineTo(1, 2);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(2, 1, 1, 2);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads20(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 2, 1);
+    path.lineTo(1, 3);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(2, 1, 1, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads21(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 1, 1);
+    path.lineTo(2, 1);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(3, 0, 2, 3);
+    path.close();    
+	testSimplify(reporter, path, filename);
+}
+
+static void testQuads22(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 2, 0);
+    path.lineTo(1, 1);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(0, 1, 3, 2);
+    path.close();    
+	testSimplify(reporter, path, filename);
+}
+
+static void testQuads23(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 1, 0);
+    path.lineTo(1, 1);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(0, 1, 3, 2);
+    path.close();    
+	testSimplify(reporter, path, filename);
+}
+
+static void testQuads24(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 0, 1);
+    path.lineTo(1, 2);
+    path.close();
+    path.moveTo(0, 1);
+    path.lineTo(0, 1);
+    path.quadTo(0, 2, 3, 3);
+    path.close();    
+	testSimplify(reporter, path, filename);
+}
+
+static void testQuads25(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 0, 1);
+    path.lineTo(2, 1);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(3, 0, 2, 3);
+    path.close();    
+	testSimplify(reporter, path, filename);
+}
+
+static void testQuads26(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 3, 0);
+    path.lineTo(1, 1);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(0, 1, 3, 2);
+    path.close();    
+	testSimplify(reporter, path, filename);
+}
+
+static void testQuads27(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 2, 0);
+    path.lineTo(2, 1);
+    path.close();
+    path.moveTo(2, 0);
+    path.lineTo(2, 0);
+    path.quadTo(3, 0, 1, 3);
+    path.close();    
+	testSimplify(reporter, path, filename);
+}
+
+static void testQuads28(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 0, 1);
+    path.lineTo(2, 2);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(3, 0, 2, 3);
+    path.close();    
+	testSimplify(reporter, path, filename);
+}
+
+static void testQuads29(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 3, 0);
+    path.lineTo(2, 1);
+    path.close();
+    path.moveTo(3, 0);
+    path.lineTo(3, 0);
+    path.quadTo(3, 1, 0, 2);
+    path.close();    
+	testSimplify(reporter, path, filename);
+}
+
+static void testQuads30(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+
+    path.quadTo(0, 0, 2, 0);
+    path.lineTo(2, 2);
+    path.close();
+    path.moveTo(2, 0);
+    path.lineTo(2, 0);
+    path.quadTo(3, 2, 1, 3);
+    path.close();    
+	testSimplify(reporter, path, filename);
+}
+
+static void testQuads31(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 2, 1);
+    path.lineTo(1, 3);
+    path.close();
+    path.moveTo(3, 0);
+    path.lineTo(0, 1);
+
+    path.quadTo(2, 1, 1, 3);
+    path.close();    
+	testSimplify(reporter, path, filename);
+}
+
+static void testQuads32(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 1, 1);
+    path.lineTo(1, 2);
+    path.close();
+    path.moveTo(1, 1);
+    path.lineTo(1, 1);
+    path.quadTo(3, 1, 0, 3);
+    path.close();    
+	testSimplify(reporter, path, filename);
+}
+
+static void testQuads33(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 1, 1);
+    path.lineTo(2, 1);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(3, 0, 2, 3);
+    path.close();    
+	testSimplify(reporter, path, filename);
+}
+
+static void testQuads34(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 1, 0);
+    path.lineTo(2, 1);
+    path.close();
+    path.moveTo(1, 0);
+    path.lineTo(1, 0);
+    path.quadTo(2, 0, 3, 3);
+    path.close();    
+	testSimplify(reporter, path, filename);
+}
+
+static void testQuads35(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 1, 0);
+    path.lineTo(1, 2);
+    path.close();
+    path.moveTo(1, 0);
+    path.lineTo(1, 0);
+    path.quadTo(3, 1, 0, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads36(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(1, 0);
+    path.quadTo(2, 0, 1, 2);
+    path.lineTo(2, 2);
+    path.close();
+    path.moveTo(1, 0);
+    path.lineTo(1, 0);
+    path.quadTo(3, 0, 2, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads37(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.setFillType(SkPath::kEvenOdd_FillType);
+    path.moveTo(1, 0);
+    path.quadTo(2, 0, 1, 2);
+    path.lineTo(2, 2);
+    path.close();
+    path.moveTo(1, 0);
+    path.lineTo(1, 0);
+    path.quadTo(3, 0, 2, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads38(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(1, 0);
+    path.quadTo(3, 0, 0, 2);
+    path.lineTo(3, 2);
+    path.close();
+    path.moveTo(1, 0);
+    path.lineTo(1, 0);
+    path.quadTo(2, 1, 3, 1);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads39(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(1, 0);
+    path.quadTo(3, 0, 0, 3);
+    path.lineTo(0, 3);
+    path.close();
+    path.moveTo(1, 1);
+    path.lineTo(0, 2);
+    path.quadTo(1, 2, 0, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+static void testQuads40(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(1, 0);
+    path.quadTo(3, 0, 3, 3);
+    path.lineTo(3, 3);
+    path.close();
+    path.moveTo(2, 1);
+    path.lineTo(2, 2);
+    path.quadTo(3, 2, 3, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads41(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 1, 0);
+    path.lineTo(2, 1);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(0, 1, 1, 2);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+
+static void testQuads54(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(1, 0);
+    path.quadTo(2, 0, 1, 1);
+    path.lineTo(3, 1);
+    path.close();
+    path.moveTo(2, 0);
+    path.lineTo(1, 1);
+    path.quadTo(1, 1, 2, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+static void testQuads53(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(1, 0);
+    path.quadTo(2, 0, 1, 1);
+    path.lineTo(3, 1);
+    path.close();
+    path.moveTo(2, 0);
+    path.lineTo(1, 1);
+    path.quadTo(2, 3, 2, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+static void testQuads52(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(1, 0);
+    path.quadTo(2, 0, 1, 1);
+    path.lineTo(3, 1);
+    path.close();
+    path.moveTo(2, 0);
+    path.lineTo(1, 1);
+    path.quadTo(2, 3, 3, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+static void testQuads51(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(2, 0);
+    path.quadTo(3, 0, 2, 1);
+    path.lineTo(3, 2);
+    path.close();
+    path.moveTo(3, 0);
+    path.lineTo(3, 1);
+    path.quadTo(3, 1, 1, 2);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+static void testQuads50(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(2, 0);
+    path.quadTo(3, 0, 2, 1);
+    path.lineTo(3, 2);
+    path.close();
+    path.moveTo(3, 0);
+    path.lineTo(3, 1);
+    path.quadTo(1, 2, 1, 2);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+static void testQuads49(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(2, 0);
+    path.quadTo(3, 0, 2, 1);
+    path.lineTo(3, 2);
+    path.close();
+    path.moveTo(3, 0);
+    path.lineTo(2, 2);
+    path.quadTo(2, 2, 0, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+static void testQuads48(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(2, 0);
+    path.quadTo(3, 0, 2, 1);
+    path.lineTo(3, 2);
+    path.close();
+    path.moveTo(3, 0);
+    path.lineTo(2, 2);
+    path.quadTo(3, 2, 0, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+static void testQuads47(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(2, 0);
+    path.quadTo(3, 0, 2, 1);
+    path.lineTo(3, 2);
+    path.close();
+    path.moveTo(3, 0);
+    path.lineTo(2, 2);
+    path.quadTo(0, 3, 0, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+// this fails because there is a short unorderable segment and the unordered state isn't handled
+// correctly later on. 
+static void testQuads46x(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.setFillType(SkPath::kEvenOdd_FillType);
+    path.moveTo(2, 0);
+    path.quadTo(0, 1, 3, 2);
+    path.lineTo(1, 3);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(1, 1);
+    path.quadTo(3, 2, 1, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads45(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(2, 0);
+    path.quadTo(3, 2, 3, 3);
+    path.lineTo(3, 3);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 2);
+    path.quadTo(3, 2, 3, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads44(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(2, 0);
+    path.quadTo(3, 2, 3, 3);
+    path.lineTo(3, 3);
+    path.close();
+    path.moveTo(1, 0);
+    path.lineTo(0, 2);
+    path.quadTo(3, 2, 3, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads43(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(2, 0);
+    path.quadTo(2, 3, 3, 3);
+    path.lineTo(3, 3);
+    path.close();
+    path.moveTo(0, 2);
+    path.lineTo(0, 2);
+    path.quadTo(2, 3, 3, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads42(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(2, 0);
+    path.quadTo(3, 2, 3, 3);
+    path.lineTo(3, 3);
+    path.close();
+    path.moveTo(2, 0);
+    path.lineTo(0, 2);
+    path.quadTo(3, 2, 3, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads56(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(2, 0);
+    path.quadTo(3, 1, 0, 2);
+    path.lineTo(3, 2);
+    path.close();
+    path.moveTo(3, 0);
+    path.lineTo(2, 1);
+    path.quadTo(2, 1, 3, 3);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads57(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(1, 0);
+    path.quadTo(3, 0, 3, 1);
+    path.lineTo(2, 2);
+    path.close();
+    path.moveTo(2, 0);
+    path.lineTo(3, 1);
+    path.quadTo(2, 2, 3, 2);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads58(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(1, 0);
+    path.quadTo(3, 0, 3, 1);
+    path.lineTo(1, 3);
+    path.close();
+    path.moveTo(2, 0);
+    path.lineTo(3, 1);
+    path.quadTo(2, 2, 3, 2);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads59(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(3, 0);
+    path.quadTo(3, 1, 3, 1);
+    path.lineTo(2, 2);
+    path.close();
+    path.moveTo(2, 0);
+    path.lineTo(3, 1);
+    path.quadTo(2, 2, 3, 2);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads60(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.moveTo(2, 1);
+    path.quadTo(0, 2, 3, 2);
+    path.lineTo(2, 3);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(2, 0);
+    path.quadTo(1, 1, 2, 2);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void testQuads61(skiatest::Reporter* reporter, const char* filename) {
+    SkPath path;
+    path.setFillType(SkPath::kEvenOdd_FillType);
+    path.moveTo(0, 0);
+    path.quadTo(0, 0, 2, 0);
+    path.lineTo(1, 1);
+    path.close();
+    path.moveTo(0, 0);
+    path.lineTo(0, 0);
+    path.quadTo(1, 0, 2, 2);
+    path.close();
+    testSimplify(reporter, path, filename);
+}
+
+static void (*firstTest)(skiatest::Reporter* , const char* filename) = testQuadratic56;
 
 static TestDesc tests[] = {
+    TEST(testQuads61),
+    TEST(testQuads60),
+    TEST(testQuads59),
+    TEST(testQuads58),
+    TEST(testQuads57),
+    TEST(testQuads56),
+    TEST(testQuads54),
+    TEST(testQuads53),
+    TEST(testQuads52),
+    TEST(testQuads51),
+    TEST(testQuads50),
+    TEST(testQuads49),
+    TEST(testQuads48),
+    TEST(testQuads47),
+    TEST(testQuads46x),
+    TEST(testQuads45),
+    TEST(testQuads44),
+    TEST(testQuads43),
+    TEST(testQuads42),
+    TEST(testQuads41),
+    TEST(testQuads36),
+    TEST(testQuads37),
+    TEST(testQuads38),
+    TEST(testQuads39),
+    TEST(testQuads40),
+    TEST(testQuads16),
+    TEST(testQuads17),
+    TEST(testQuads18),
+    TEST(testQuads19),
+    TEST(testQuads20),
+    TEST(testQuads21),
+    TEST(testQuads22),
+    TEST(testQuads23),
+    TEST(testQuads24),
+    TEST(testQuads25),
+    TEST(testQuads26),
+    TEST(testQuads27),
+    TEST(testQuads28),
+    TEST(testQuads29),
+    TEST(testQuads30),
+    TEST(testQuads31),
+    TEST(testQuads32),
+    TEST(testQuads33),
+    TEST(testQuads34),
+    TEST(testQuads35),
+    TEST(testDegenerates1),
+    TEST(testQuad13),
+    TEST(testQuad14),
+    TEST(testQuad15),
+    TEST(testQuadratic56),
+    TEST(testQuadralateral4),
+    TEST(testQuadralateral3),
+    TEST(testDegenerate5),
+    TEST(testQuad12),
+    TEST(testQuadratic51),  // has unorderable angles
+    TEST(testQuad8),
     TEST(testQuad11),
     TEST(testQuad10),
     TEST(testQuad9),
     TEST(testTriangles4x),
-    TEST(testQuad8),
     TEST(testTriangles3x),
     TEST(testRect2),
     TEST(testRect1),
@@ -4052,10 +4801,8 @@
     TEST(testQuadratic59),
     TEST(testQuadratic59x),
     TEST(testQuadratic58),
-    TEST(testQuadratic56),
     TEST(testQuadratic55),
     TEST(testQuadratic53),
-    TEST(testQuadratic51),
     TEST(testQuadratic38),
     TEST(testQuadratic37),
     TEST(testQuadratic36),
@@ -4331,22 +5078,23 @@
 
 static const size_t subTestCount = SK_ARRAY_COUNT(subTests);
 
-static void (*firstSubTest)(skiatest::Reporter* ) = 0;
+static void (*firstSubTest)(skiatest::Reporter* , const char* filename) = 0;
 
+static bool runSubTests = false;
 static bool runSubTestsFirst = false;
 static bool runReverse = false;
-static void (*stopTest)(skiatest::Reporter* ) = 0;
+static void (*stopTest)(skiatest::Reporter* , const char* filename) = 0;
 
 DEF_TEST(PathOpsSimplify, reporter) {
 #ifdef SK_DEBUG
     SkPathOpsDebug::gMaxWindSum = 4;
     SkPathOpsDebug::gMaxWindValue = 4;
 #endif
-    if (runSubTestsFirst) {
+    if (runSubTests && runSubTestsFirst) {
         RunTestSet(reporter, subTests, subTestCount, firstSubTest, stopTest, runReverse);
     }
     RunTestSet(reporter, tests, testCount, firstTest, stopTest, runReverse);
-    if (!runSubTestsFirst) {
+    if (runSubTests && !runSubTestsFirst) {
         RunTestSet(reporter, subTests, subTestCount, firstSubTest, stopTest, runReverse);
     }
 #ifdef SK_DEBUG
