shape ops work in progress

git-svn-id: http://skia.googlecode.com/svn/trunk@7758 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/Intersection/QuadraticReduceOrder.cpp b/experimental/Intersection/QuadraticReduceOrder.cpp
index 700d4c5..27c7a29 100644
--- a/experimental/Intersection/QuadraticReduceOrder.cpp
+++ b/experimental/Intersection/QuadraticReduceOrder.cpp
@@ -21,10 +21,14 @@
     return 1;
 }
 
-static int vertical_line(const Quadratic& quad, Quadratic& reduction) {
+static int vertical_line(const Quadratic& quad, ReduceOrder_Styles reduceStyle,
+        Quadratic& reduction) {
     double tValue;
     reduction[0] = quad[0];
     reduction[1] = quad[2];
+    if (reduceStyle == kReduceOrder_TreatAsFill) {
+        return 2;
+    }
     int smaller = reduction[1].y > reduction[0].y;
     int larger = smaller ^ 1;
     if (findExtrema(quad[0].y, quad[1].y, quad[2].y, &tValue)) {
@@ -38,10 +42,14 @@
     return 2;
 }
 
-static int horizontal_line(const Quadratic& quad, Quadratic& reduction) {
+static int horizontal_line(const Quadratic& quad, ReduceOrder_Styles reduceStyle,
+        Quadratic& reduction) {
     double tValue;
     reduction[0] = quad[0];
     reduction[1] = quad[2];
+    if (reduceStyle == kReduceOrder_TreatAsFill) {
+        return 2;
+    }
     int smaller = reduction[1].x > reduction[0].x;
     int larger = smaller ^ 1;
     if (findExtrema(quad[0].x, quad[1].x, quad[2].x, &tValue)) {
@@ -55,8 +63,8 @@
     return 2;
 }
 
-static int check_linear(const Quadratic& quad, Quadratic& reduction,
-        int minX, int maxX, int minY, int maxY) {
+static int check_linear(const Quadratic& quad, ReduceOrder_Styles reduceStyle,
+        int minX, int maxX, int minY, int maxY, Quadratic& reduction) {
     int startIndex = 0;
     int endIndex = 2;
     while (quad[startIndex].approximatelyEqual(quad[endIndex])) {
@@ -72,6 +80,9 @@
     // four are colinear: return line formed by outside
     reduction[0] = quad[0];
     reduction[1] = quad[2];
+    if (reduceStyle == kReduceOrder_TreatAsFill) {
+        return 2;
+    }
     int sameSide;
     bool useX = quad[maxX].x - quad[minX].x >= quad[maxY].y - quad[minY].y;
     if (useX) {
@@ -128,7 +139,7 @@
     // note that three points in a line doesn't simplify a cubic
 // look for approximation with single quadratic
     // save approximation with multiple quadratics for later
-int reduceOrder(const Quadratic& quad, Quadratic& reduction) {
+int reduceOrder(const Quadratic& quad, Quadratic& reduction, ReduceOrder_Styles reduceStyle) {
     int index, minX, maxX, minY, maxY;
     int minXSet, minYSet;
     minX = maxX = minY = maxY = 0;
@@ -159,12 +170,12 @@
         if (minYSet == 0x7) { // return 1 if all four are coincident
             return coincident_line(quad, reduction);
         }
-        return vertical_line(quad, reduction);
+        return vertical_line(quad, reduceStyle, reduction);
     }
     if (minYSet == 0xF) { // test for horizontal line
-        return horizontal_line(quad, reduction);
+        return horizontal_line(quad, reduceStyle, reduction);
     }
-    int result = check_linear(quad, reduction, minX, maxX, minY, maxY);
+    int result = check_linear(quad, reduceStyle, minX, maxX, minY, maxY, reduction);
     if (result) {
         return result;
     }