checkpoint for shape ops

at minimum, the unit tests in SimplyNew_Test pass

git-svn-id: http://skia.googlecode.com/svn/trunk@5860 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/Intersection/QuarticRoot.cpp b/experimental/Intersection/QuarticRoot.cpp
index 839c3b9..b2e73cb 100644
--- a/experimental/Intersection/QuarticRoot.cpp
+++ b/experimental/Intersection/QuarticRoot.cpp
@@ -120,7 +120,7 @@
     if (approximately_zero(A)) {  // we're just a quadratic
         return quadraticRootsX(B, C, D, s);
     }
-    if (approximately_zero(D)) {
+    if (approximately_zero(D)) { // 0 is one root
         int num = quadraticRootsX(A, B, C, s);
         for (int i = 0; i < num; ++i) {
             if (approximately_zero(s[i])) {
@@ -130,6 +130,16 @@
         s[num++] = 0;
         return num;
     }
+    if (approximately_zero(A + B + C + D)) { // 1 is one root
+        int num = quadraticRootsX(A, A + B, -D, s);
+        for (int i = 0; i < num; ++i) {
+            if (approximately_equal(s[i], 1)) {
+                return num;
+            }
+        }
+        s[num++] = 1;
+        return num;
+    }
     double a, b, c;
     {
         double invA = 1 / A;
@@ -197,7 +207,7 @@
     }
     int num;
     int i;
-    if (approximately_zero(E)) {
+    if (approximately_zero(E)) { // 0 is one root
         num = cubicRootsX(A, B, C, D, s);
         for (i = 0; i < num; ++i) {
             if (approximately_zero(s[i])) {
@@ -207,6 +217,16 @@
         s[num++] = 0;
         return num;
     }
+    if (approximately_zero(A + B + C + D + E)) { // 1 is one root
+        num = cubicRootsX(A, A + B, -(D + E), -E, s); // note that -C==A+B+D+E
+        for (i = 0; i < num; ++i) {
+            if (approximately_equal(s[i], 1)) {
+                return num;
+            }
+        }
+        s[num++] = 1;
+        return num;
+    }
     double  u, v;
     /* normal form: x^4 + Ax^3 + Bx^2 + Cx + D = 0 */
     const double invA = 1 / A;