Index: src/pathops/SkPathOpsQuad.cpp |
diff --git a/src/pathops/SkPathOpsQuad.cpp b/src/pathops/SkPathOpsQuad.cpp |
index 054509b3e2feb60b37899bc3ba07a0ac755c6949..397a3ce98ab1023ea2ff5a1baeb4ba9ca6e10839 100644 |
--- a/src/pathops/SkPathOpsQuad.cpp |
+++ b/src/pathops/SkPathOpsQuad.cpp |
@@ -7,6 +7,7 @@ |
#include "SkIntersections.h" |
#include "SkLineParameters.h" |
#include "SkPathOpsCubic.h" |
+#include "SkPathOpsCurve.h" |
#include "SkPathOpsQuad.h" |
/* started with at_most_end_pts_in_common from SkDQuadIntersection.cpp */ |
@@ -105,25 +106,6 @@ double SkDQuad::nearestT(const SkDPoint& pt) const { |
return d0 < d2 ? 0 : 1; |
} |
-SkDPoint SkDQuad::top(double startT, double endT) const { |
- SkDQuad sub = subDivide(startT, endT); |
- SkDPoint topPt = sub[0]; |
- if (topPt.fY > sub[2].fY || (topPt.fY == sub[2].fY && topPt.fX > sub[2].fX)) { |
- topPt = sub[2]; |
- } |
- if (!between(sub[0].fY, sub[1].fY, sub[2].fY)) { |
- double extremeT; |
- if (FindExtrema(sub[0].fY, sub[1].fY, sub[2].fY, &extremeT)) { |
- extremeT = startT + (endT - startT) * extremeT; |
- SkDPoint test = ptAtT(extremeT); |
- if (topPt.fY > test.fY || (topPt.fY == test.fY && topPt.fX > test.fX)) { |
- topPt = test; |
- } |
- } |
- } |
- return topPt; |
-} |
- |
int SkDQuad::AddValidTs(double s[], int realRoots, double* t) { |
int foundRoots = 0; |
for (int index = 0; index < realRoots; ++index) { |
@@ -341,6 +323,28 @@ SkDPoint SkDQuad::subDivide(const SkDPoint& a, const SkDPoint& c, double t1, dou |
return b; |
} |
+SkDPoint SkDQuad::top(double startT, double endT, double* topT) const { |
+ SkDQuad sub = subDivide(startT, endT); |
+ SkDPoint topPt = sub[0]; |
+ *topT = startT; |
+ if (topPt.fY > sub[2].fY || (topPt.fY == sub[2].fY && topPt.fX > sub[2].fX)) { |
+ *topT = endT; |
+ topPt = sub[2]; |
+ } |
+ if (!between(sub[0].fY, sub[1].fY, sub[2].fY)) { |
+ double extremeT; |
+ if (FindExtrema(sub[0].fY, sub[1].fY, sub[2].fY, &extremeT)) { |
+ extremeT = startT + (endT - startT) * extremeT; |
+ SkDPoint test = ptAtT(extremeT); |
+ if (topPt.fY > test.fY || (topPt.fY == test.fY && topPt.fX > test.fX)) { |
+ *topT = extremeT; |
+ topPt = test; |
+ } |
+ } |
+ } |
+ return topPt; |
+} |
+ |
/* classic one t subdivision */ |
static void interp_quad_coords(const double* src, double* dst, double t) { |
double ab = SkDInterp(src[0], src[2], t); |
@@ -360,6 +364,17 @@ SkDQuadPair SkDQuad::chopAt(double t) const |
return dst; |
} |
+bool SkDQuad::Clockwise(const SkOpCurve& edge, bool* swap) { |
+ SkDQuad temp; |
+ double sum = (edge[0].fX - edge[kPointLast].fX) * (edge[0].fY + edge[kPointLast].fY); |
+ for (int idx = 0; idx < kPointLast; ++idx){ |
+ sum += (edge[idx + 1].fX - edge[idx].fX) * (edge[idx + 1].fY + edge[idx].fY); |
+ } |
+ temp.set(edge.fPts); |
+ *swap = sum > 0 && !temp.monotonicInY(); |
+ return sum <= 0; |
+} |
+ |
static int valid_unit_divide(double numer, double denom, double* ratio) |
{ |
if (numer < 0) { |