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;
}