Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(133)

Unified Diff: src/pathops/SkIntersections.h

Issue 1002693002: pathops version two (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix arm 64 inspired coincident handling Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/pathops/SkIntersectionHelper.h ('k') | src/pathops/SkIntersections.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/pathops/SkIntersections.h
diff --git a/src/pathops/SkIntersections.h b/src/pathops/SkIntersections.h
index a1bde512db075a813facec448336968e0ca646c3..15bac19defdf2a45078187f587751ba1d3ede028 100644
--- a/src/pathops/SkIntersections.h
+++ b/src/pathops/SkIntersections.h
@@ -16,7 +16,6 @@ class SkIntersections {
public:
SkIntersections()
: fSwap(0)
- , fFlatMeasure(false)
#ifdef SK_DEBUG
, fDepth(0)
#endif
@@ -24,7 +23,6 @@ public:
sk_bzero(fPt, sizeof(fPt));
sk_bzero(fPt2, sizeof(fPt2));
sk_bzero(fT, sizeof(fT));
- sk_bzero(fIsCoincident, sizeof(fIsCoincident));
sk_bzero(fNearlySame, sizeof(fNearlySame));
reset();
fMax = 0; // require that the caller set the max
@@ -32,7 +30,7 @@ public:
class TArray {
public:
- explicit TArray(const double ts[9]) : fTArray(ts) {}
+ explicit TArray(const double ts[10]) : fTArray(ts) {}
double operator[](int n) const {
return fTArray[n];
}
@@ -40,28 +38,15 @@ public:
};
TArray operator[](int n) const { return TArray(fT[n]); }
- void allowFlatMeasure(bool flatAllowed) {
- fFlatMeasure = flatAllowed;
- }
-
void allowNear(bool nearAllowed) {
fAllowNear = nearAllowed;
}
- int cubic(const SkPoint a[4]) {
- SkDCubic cubic;
- cubic.set(a);
- fMax = 1; // self intersect
- return intersect(cubic);
- }
-
- int cubicCubic(const SkPoint a[4], const SkPoint b[4]) {
- SkDCubic aCubic;
- aCubic.set(a);
- SkDCubic bCubic;
- bCubic.set(b);
- fMax = 9;
- return intersect(aCubic, bCubic);
+ void clearCoincidence(int index) {
+ SkASSERT(index >= 0);
+ int bit = 1 << index;
+ fIsCoincident[0] &= ~bit;
+ fIsCoincident[1] &= ~bit;
}
int cubicHorizontal(const SkPoint a[4], SkScalar left, SkScalar right, SkScalar y,
@@ -88,19 +73,6 @@ public:
return intersect(cubic, line);
}
- int cubicQuad(const SkPoint a[4], const SkPoint b[3]) {
- SkDCubic cubic;
- cubic.set(a);
- SkDQuad quad;
- quad.set(b);
- fMax = 7;
- return intersect(cubic, quad);
- }
-
- bool flatMeasure() const {
- return fFlatMeasure;
- }
-
bool hasT(double t) const {
SkASSERT(t == 0 || t == 1);
return fUsed > 0 && (t == 0 ? fT[0][0] == 0 : fT[0][fUsed - 1] == 1);
@@ -178,19 +150,11 @@ public:
return intersect(quad, line);
}
- int quadQuad(const SkPoint a[3], const SkPoint b[3]) {
- SkDQuad aQuad;
- aQuad.set(a);
- SkDQuad bQuad;
- bQuad.set(b);
- fMax = 4;
- return intersect(aQuad, bQuad);
- }
-
// leaves swap, max alone
void reset() {
fAllowNear = true;
fUsed = 0;
+ sk_bzero(fIsCoincident, sizeof(fIsCoincident));
}
void set(bool swap, int tIndex, double t) {
@@ -205,8 +169,6 @@ public:
fSwap ^= true;
}
- void swapPts();
-
bool swapped() const {
return fSwap;
}
@@ -219,19 +181,27 @@ public:
SkASSERT(--fDepth >= 0);
}
+ bool unBumpT(int index) {
+ SkASSERT(fUsed == 1);
+ fT[0][index] = fT[0][index] * (1 + BUMP_EPSILON * 2) - BUMP_EPSILON;
+ if (!between(0, fT[0][index], 1)) {
+ fUsed = 0;
+ return false;
+ }
+ return true;
+ }
+
void upDepth() {
SkASSERT(++fDepth < 16);
}
void alignQuadPts(const SkPoint a[3], const SkPoint b[3]);
- void append(const SkIntersections& );
int cleanUpCoincidence();
+ int closestTo(double rangeStart, double rangeEnd, const SkDPoint& testPt, double* dist) const;
int coincidentUsed() const;
void cubicInsert(double one, double two, const SkDPoint& pt, const SkDCubic& c1,
const SkDCubic& c2);
- int cubicRay(const SkPoint pts[4], const SkDLine& line);
void flip();
- int horizontal(const SkDLine&, double y);
int horizontal(const SkDLine&, double left, double right, double y, bool flipped);
int horizontal(const SkDQuad&, double left, double right, double y, bool flipped);
int horizontal(const SkDQuad&, double left, double right, double y, double tRange[2]);
@@ -242,25 +212,20 @@ public:
int insert(double one, double two, const SkDPoint& pt);
void insertNear(double one, double two, const SkDPoint& pt1, const SkDPoint& pt2);
// start if index == 0 : end if index == 1
- void insertCoincident(double one, double two, const SkDPoint& pt);
+ int insertCoincident(double one, double two, const SkDPoint& pt);
int intersect(const SkDLine&, const SkDLine&);
int intersect(const SkDQuad&, const SkDLine&);
int intersect(const SkDQuad&, const SkDQuad&);
- int intersect(const SkDCubic&); // return true if cubic self-intersects
int intersect(const SkDCubic&, const SkDLine&);
- int intersect(const SkDCubic&, const SkDQuad&);
int intersect(const SkDCubic&, const SkDCubic&);
int intersectRay(const SkDLine&, const SkDLine&);
int intersectRay(const SkDQuad&, const SkDLine&);
int intersectRay(const SkDCubic&, const SkDLine&);
- static SkDPoint Line(const SkDLine&, const SkDLine&);
- int lineRay(const SkPoint pts[2], const SkDLine& line);
- void offset(int base, double start, double end);
+ void merge(const SkIntersections& , int , const SkIntersections& , int );
+ int mostOutside(double rangeStart, double rangeEnd, const SkDPoint& origin) const;
void quickRemoveOne(int index, int replace);
- int quadRay(const SkPoint pts[3], const SkDLine& line);
void removeOne(int index);
- static bool Test(const SkDLine& , const SkDLine&);
- int vertical(const SkDLine&, double x);
+ void setCoincident(int index);
int vertical(const SkDLine&, double top, double bottom, double x, bool flipped);
int vertical(const SkDQuad&, double top, double bottom, double x, bool flipped);
int vertical(const SkDCubic&, double top, double bottom, double x, bool flipped);
@@ -276,6 +241,8 @@ public:
#endif
}
+ void dump() const; // implemented for testing only
+
private:
bool cubicCheckCoincidence(const SkDCubic& c1, const SkDCubic& c2);
bool cubicExactEnd(const SkDCubic& cubic1, bool start, const SkDCubic& cubic2);
@@ -283,22 +250,20 @@ private:
void cleanUpParallelLines(bool parallel);
void computePoints(const SkDLine& line, int used);
- SkDPoint fPt[9]; // FIXME: since scans store points as SkPoint, this should also
- SkDPoint fPt2[9]; // used by nearly same to store alternate intersection point
- double fT[2][9];
+ SkDPoint fPt[10]; // FIXME: since scans store points as SkPoint, this should also
+ SkDPoint fPt2[2]; // used by nearly same to store alternate intersection point
+ double fT[2][10];
uint16_t fIsCoincident[2]; // bit set for each curve's coincident T
bool fNearlySame[2]; // true if end points nearly match
unsigned char fUsed;
unsigned char fMax;
bool fAllowNear;
bool fSwap;
- bool fFlatMeasure; // backwards-compatibility when cubics uses quad intersection
#ifdef SK_DEBUG
int fDepth;
#endif
};
-extern int (SkIntersections::* const CurveRay[])(const SkPoint[], const SkDLine& );
extern int (SkIntersections::* const CurveVertical[])(const SkPoint[], SkScalar top, SkScalar bottom,
SkScalar x, bool flipped);
« no previous file with comments | « src/pathops/SkIntersectionHelper.h ('k') | src/pathops/SkIntersections.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698