| Index: src/pathops/SkIntersections.h
|
| diff --git a/src/pathops/SkIntersections.h b/src/pathops/SkIntersections.h
|
| index 389098d84e67136dff4160f9d2635879e7fc4c71..f63a023ef0a5ef26c21c42ecfc8bd5b0c2a88fc3 100644
|
| --- a/src/pathops/SkIntersections.h
|
| +++ b/src/pathops/SkIntersections.h
|
| @@ -25,6 +25,7 @@ public:
|
| sk_bzero(fIsCoincident, sizeof(fIsCoincident));
|
| sk_bzero(&fIsNear, sizeof(fIsNear));
|
| reset();
|
| + fMax = 0; // require that the caller set the max
|
| }
|
|
|
| class TArray {
|
| @@ -43,6 +44,7 @@ public:
|
| memcpy(fIsCoincident, i.fIsCoincident, sizeof(fIsCoincident));
|
| memcpy(&fIsNear, &i.fIsNear, sizeof(fIsNear));
|
| fUsed = i.fUsed;
|
| + fMax = i.fMax;
|
| fSwap = i.fSwap;
|
| SkDEBUGCODE(fDepth = i.fDepth);
|
| }
|
| @@ -54,6 +56,7 @@ public:
|
| int cubic(const SkPoint a[4]) {
|
| SkDCubic cubic;
|
| cubic.set(a);
|
| + fMax = 1; // self intersect
|
| return intersect(cubic);
|
| }
|
|
|
| @@ -62,6 +65,7 @@ public:
|
| aCubic.set(a);
|
| SkDCubic bCubic;
|
| bCubic.set(b);
|
| + fMax = 9;
|
| return intersect(aCubic, bCubic);
|
| }
|
|
|
| @@ -69,12 +73,14 @@ public:
|
| bool flipped) {
|
| SkDCubic cubic;
|
| cubic.set(a);
|
| + fMax = 3;
|
| return horizontal(cubic, left, right, y, flipped);
|
| }
|
|
|
| int cubicVertical(const SkPoint a[4], SkScalar top, SkScalar bottom, SkScalar x, bool flipped) {
|
| SkDCubic cubic;
|
| cubic.set(a);
|
| + fMax = 3;
|
| return vertical(cubic, top, bottom, x, flipped);
|
| }
|
|
|
| @@ -83,6 +89,7 @@ public:
|
| cubic.set(a);
|
| SkDLine line;
|
| line.set(b);
|
| + fMax = 3;
|
| return intersect(cubic, line);
|
| }
|
|
|
| @@ -91,6 +98,7 @@ public:
|
| cubic.set(a);
|
| SkDQuad quad;
|
| quad.set(b);
|
| + fMax = 6;
|
| return intersect(cubic, quad);
|
| }
|
|
|
| @@ -119,12 +127,14 @@ public:
|
| bool flipped) {
|
| SkDLine line;
|
| line.set(a);
|
| + fMax = 2;
|
| return horizontal(line, left, right, y, flipped);
|
| }
|
|
|
| int lineVertical(const SkPoint a[2], SkScalar top, SkScalar bottom, SkScalar x, bool flipped) {
|
| SkDLine line;
|
| line.set(a);
|
| + fMax = 2;
|
| return vertical(line, top, bottom, x, flipped);
|
| }
|
|
|
| @@ -132,6 +142,7 @@ public:
|
| SkDLine aLine, bLine;
|
| aLine.set(a);
|
| bLine.set(b);
|
| + fMax = 2;
|
| return intersect(aLine, bLine);
|
| }
|
|
|
| @@ -143,12 +154,14 @@ public:
|
| bool flipped) {
|
| SkDQuad quad;
|
| quad.set(a);
|
| + fMax = 2;
|
| return horizontal(quad, left, right, y, flipped);
|
| }
|
|
|
| int quadVertical(const SkPoint a[3], SkScalar top, SkScalar bottom, SkScalar x, bool flipped) {
|
| SkDQuad quad;
|
| quad.set(a);
|
| + fMax = 2;
|
| return vertical(quad, top, bottom, x, flipped);
|
| }
|
|
|
| @@ -157,6 +170,7 @@ public:
|
| quad.set(a);
|
| SkDLine line;
|
| line.set(b);
|
| + fMax = 2;
|
| return intersect(quad, line);
|
| }
|
|
|
| @@ -165,18 +179,23 @@ public:
|
| aQuad.set(a);
|
| SkDQuad bQuad;
|
| bQuad.set(b);
|
| + fMax = 4;
|
| return intersect(aQuad, bQuad);
|
| }
|
|
|
| int quadRay(const SkPoint pts[3], const SkDLine& line);
|
| void removeOne(int index);
|
|
|
| - // leaves flip, swap alone
|
| + // leaves flip, swap, max alone
|
| void reset() {
|
| fAllowNear = true;
|
| fUsed = 0;
|
| }
|
|
|
| + void setMax(int max) {
|
| + fMax = max;
|
| + }
|
| +
|
| void swap() {
|
| fSwap ^= true;
|
| }
|
| @@ -200,6 +219,7 @@ public:
|
| }
|
|
|
| static double Axial(const SkDQuad& , const SkDPoint& , bool vertical);
|
| + void cleanUpCoincidence();
|
| int coincidentUsed() const;
|
| int cubicRay(const SkPoint pts[4], const SkDLine& line);
|
| void flip();
|
| @@ -246,7 +266,11 @@ public:
|
| }
|
|
|
| private:
|
| - int computePoints(const SkDLine& line, int used);
|
| + bool cubicCheckCoincidence(const SkDCubic& c1, const SkDCubic& c2);
|
| + bool cubicExactEnd(const SkDCubic& cubic1, bool start, const SkDCubic& cubic2);
|
| + void cubicNearEnd(const SkDCubic& cubic1, bool start, const SkDCubic& cubic2, const SkDRect& );
|
| + void cleanUpParallelLines(bool parallel);
|
| + void computePoints(const SkDLine& line, int used);
|
| // used by addCoincident to remove ordinary intersections in range
|
| // void remove(double one, double two, const SkDPoint& startPt, const SkDPoint& endPt);
|
|
|
| @@ -255,6 +279,7 @@ private:
|
| uint16_t fIsCoincident[2]; // bit set for each curve's coincident T
|
| uint16_t fIsNear; // bit set for each T if 2nd curve's point is near but not equal to 1st
|
| unsigned char fUsed;
|
| + unsigned char fMax;
|
| bool fAllowNear;
|
| bool fSwap;
|
| #ifdef SK_DEBUG
|
|
|