| 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) {
|
|
|