Index: src/pathops/SkIntersectionHelper.h |
diff --git a/src/pathops/SkIntersectionHelper.h b/src/pathops/SkIntersectionHelper.h |
index c633fd02dfdffbb397a18206bd4fdd83a6b4bc54..3569c934de14a29d17224d2330d8bdfb8ce3676f 100644 |
--- a/src/pathops/SkIntersectionHelper.h |
+++ b/src/pathops/SkIntersectionHelper.h |
@@ -5,7 +5,6 @@ |
* found in the LICENSE file. |
*/ |
#include "SkOpContour.h" |
-#include "SkOpSegment.h" |
#include "SkPath.h" |
#ifdef SK_DEBUG |
@@ -22,9 +21,42 @@ |
kCubic_Segment = SkPath::kCubic_Verb, |
}; |
+ bool addCoincident(SkIntersectionHelper& other, const SkIntersections& ts, bool swap) { |
+ return fContour->addCoincident(fIndex, other.fContour, other.fIndex, ts, swap); |
+ } |
+ |
+ // FIXME: does it make sense to write otherIndex now if we're going to |
+ // fix it up later? |
+ void addOtherT(int index, double otherT, int otherIndex) { |
+ fContour->addOtherT(fIndex, index, otherT, otherIndex); |
+ } |
+ |
+ bool addPartialCoincident(SkIntersectionHelper& other, const SkIntersections& ts, int index, |
+ bool swap) { |
+ return fContour->addPartialCoincident(fIndex, other.fContour, other.fIndex, ts, index, |
+ swap); |
+ } |
+ |
+ // Avoid collapsing t values that are close to the same since |
+ // we walk ts to describe consecutive intersections. Since a pair of ts can |
+ // be nearly equal, any problems caused by this should be taken care |
+ // of later. |
+ // On the edge or out of range values are negative; add 2 to get end |
+ int addT(const SkIntersectionHelper& other, const SkPoint& pt, double newT) { |
+ return fContour->addT(fIndex, other.fContour, other.fIndex, pt, newT); |
+ } |
+ |
+ int addSelfT(const SkPoint& pt, double newT) { |
+ return fContour->addSelfT(fIndex, pt, newT); |
+ } |
+ |
bool advance() { |
- fSegment = fSegment->next(); |
- return fSegment != NULL; |
+ return ++fIndex < fLast; |
+ } |
+ |
+ void alignTPt(SkIntersectionHelper& other, bool swap, int index, |
+ SkIntersections* ts, SkPoint* point) { |
+ fContour->alignTPt(fIndex, other.fContour, other.fIndex, swap, index, ts, point); |
} |
SkScalar bottom() const { |
@@ -32,15 +64,30 @@ |
} |
const SkPathOpsBounds& bounds() const { |
- return fSegment->bounds(); |
- } |
- |
- SkOpContour* contour() const { |
- return fSegment->contour(); |
+ return fContour->segments()[fIndex].bounds(); |
} |
void init(SkOpContour* contour) { |
- fSegment = contour->first(); |
+ fContour = contour; |
+ fIndex = 0; |
+ fLast = contour->segments().count(); |
+ } |
+ |
+ bool isAdjacent(const SkIntersectionHelper& next) { |
+ return fContour == next.fContour && fIndex + 1 == next.fIndex; |
+ } |
+ |
+ bool isFirstLast(const SkIntersectionHelper& next) { |
+ return fContour == next.fContour && fIndex == 0 |
+ && next.fIndex == fLast - 1; |
+ } |
+ |
+ bool isPartial(double t1, double t2, const SkDPoint& pt1, const SkDPoint& pt2) const { |
+ const SkOpSegment& segment = fContour->segments()[fIndex]; |
+ double mid = (t1 + t2) / 2; |
+ SkDPoint midPtByT = segment.dPtAtT(mid); |
+ SkDPoint midPtByAvg = SkDPoint::Mid(pt1, pt2); |
+ return midPtByT.approximatelyPEqual(midPtByAvg); |
} |
SkScalar left() const { |
@@ -48,38 +95,39 @@ |
} |
const SkPoint* pts() const { |
- return fSegment->pts(); |
+ return fContour->segments()[fIndex].pts(); |
} |
SkScalar right() const { |
return bounds().fRight; |
} |
- SkOpSegment* segment() const { |
- return fSegment; |
- } |
- |
SegmentType segmentType() const { |
- SegmentType type = (SegmentType) fSegment->verb(); |
+ const SkOpSegment& segment = fContour->segments()[fIndex]; |
+ SegmentType type = (SegmentType) segment.verb(); |
if (type != kLine_Segment) { |
return type; |
} |
- if (fSegment->isHorizontal()) { |
+ if (segment.isHorizontal()) { |
return kHorizontalLine_Segment; |
} |
- if (fSegment->isVertical()) { |
+ if (segment.isVertical()) { |
return kVerticalLine_Segment; |
} |
return kLine_Segment; |
} |
bool startAfter(const SkIntersectionHelper& after) { |
- fSegment = after.fSegment->next(); |
- return fSegment != NULL; |
+ fIndex = after.fIndex; |
+ return advance(); |
} |
SkScalar top() const { |
return bounds().fTop; |
+ } |
+ |
+ SkPath::Verb verb() const { |
+ return fContour->segments()[fIndex].verb(); |
} |
SkScalar x() const { |
@@ -99,5 +147,10 @@ |
} |
private: |
- SkOpSegment* fSegment; |
+ // utility callable by the user from the debugger when the implementation code is linked in |
+ void dump() const; |
+ |
+ SkOpContour* fContour; |
+ int fIndex; |
+ int fLast; |
}; |