Index: src/pathops/SkPathOpsQuad.h |
diff --git a/src/pathops/SkPathOpsQuad.h b/src/pathops/SkPathOpsQuad.h |
index 932c5fbe75d9b7519ff720eeae30aafca09692d4..81638cf0bc012c33d5a1b303680091fa410de25c 100644 |
--- a/src/pathops/SkPathOpsQuad.h |
+++ b/src/pathops/SkPathOpsQuad.h |
@@ -17,43 +17,61 @@ struct SkDQuadPair { |
}; |
struct SkDQuad { |
- SkDPoint fPts[3]; |
+ static const int kPointCount = 3; |
+ static const int kPointLast = kPointCount - 1; |
+ static const int kMaxIntersections = 4; |
+ |
+ SkDPoint fPts[kPointCount]; |
+ |
+ bool collapsed() const { |
+ return fPts[0].approximatelyEqual(fPts[1]) && fPts[0].approximatelyEqual(fPts[2]); |
+ } |
+ |
+ bool controlsInside() const { |
+ SkDVector v01 = fPts[0] - fPts[1]; |
+ SkDVector v02 = fPts[0] - fPts[2]; |
+ SkDVector v12 = fPts[1] - fPts[2]; |
+ return v02.dot(v01) > 0 && v02.dot(v12) > 0; |
+ } |
SkDQuad flip() const { |
SkDQuad result = {{fPts[2], fPts[1], fPts[0]}}; |
return result; |
} |
- void set(const SkPoint pts[3]) { |
+ static bool IsCubic() { return false; } |
+ |
+ void set(const SkPoint pts[kPointCount]) { |
fPts[0] = pts[0]; |
fPts[1] = pts[1]; |
fPts[2] = pts[2]; |
} |
- const SkDPoint& operator[](int n) const { SkASSERT(n >= 0 && n < 3); return fPts[n]; } |
- SkDPoint& operator[](int n) { SkASSERT(n >= 0 && n < 3); return fPts[n]; } |
+ const SkDPoint& operator[](int n) const { SkASSERT(n >= 0 && n < kPointCount); return fPts[n]; } |
+ SkDPoint& operator[](int n) { SkASSERT(n >= 0 && n < kPointCount); return fPts[n]; } |
static int AddValidTs(double s[], int realRoots, double* t); |
void align(int endIndex, SkDPoint* dstPt) const; |
SkDQuadPair chopAt(double t) const; |
SkDVector dxdyAtT(double t) const; |
static int FindExtrema(double a, double b, double c, double tValue[1]); |
+ bool hullIntersects(const SkDQuad& , bool* isLinear) const; |
bool isLinear(int startIndex, int endIndex) const; |
bool monotonicInY() const; |
double nearestT(const SkDPoint&) const; |
- bool pointInHull(const SkDPoint&) const; |
+ void otherPts(int oddMan, const SkDPoint* endPt[2]) const; |
SkDPoint ptAtT(double t) const; |
static int RootsReal(double A, double B, double C, double t[2]); |
static int RootsValidT(const double A, const double B, const double C, double s[2]); |
static void SetABC(const double* quad, double* a, double* b, double* c); |
SkDQuad subDivide(double t1, double t2) const; |
- static SkDQuad SubDivide(const SkPoint a[3], double t1, double t2) { |
+ static SkDQuad SubDivide(const SkPoint a[kPointCount], double t1, double t2) { |
SkDQuad quad; |
quad.set(a); |
return quad.subDivide(t1, t2); |
} |
SkDPoint subDivide(const SkDPoint& a, const SkDPoint& c, double t1, double t2) const; |
- static SkDPoint SubDivide(const SkPoint pts[3], const SkDPoint& a, const SkDPoint& c, |
+ static SkDPoint SubDivide(const SkPoint pts[kPointCount], const SkDPoint& a, const SkDPoint& c, |
double t1, double t2) { |
SkDQuad quad; |
quad.set(pts); |
@@ -64,7 +82,8 @@ struct SkDQuad { |
// utilities callable by the user from the debugger when the implementation code is linked in |
void dump() const; |
- void dumpComma(const char*) const; |
+ void dumpID(int id) const; |
+ void dumpInner() const; |
private: |
// static double Tangent(const double* quadratic, double t); // uncalled |