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

Unified Diff: src/pathops/SkIntersectionHelper.h

Issue 1029993002: Revert of pathops version two (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: 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/SkDQuadLineIntersection.cpp ('k') | src/pathops/SkIntersections.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
};
« no previous file with comments | « src/pathops/SkDQuadLineIntersection.cpp ('k') | src/pathops/SkIntersections.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698