| /* | |
| * Copyright 2012 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #ifndef SkIntersectionHelper_DEFINED | |
| #define SkIntersectionHelper_DEFINED | |
| #include "SkOpContour.h" | |
| #include "SkOpSegment.h" | |
| #include "SkPath.h" | |
| #ifdef SK_DEBUG | |
| #include "SkPathOpsPoint.h" | |
| #endif | |
| class SkIntersectionHelper { | |
| public: | |
| enum SegmentType { | |
| kHorizontalLine_Segment = -1, | |
| kVerticalLine_Segment = 0, | |
| kLine_Segment = SkPath::kLine_Verb, | |
| kQuad_Segment = SkPath::kQuad_Verb, | |
| kConic_Segment = SkPath::kConic_Verb, | |
| kCubic_Segment = SkPath::kCubic_Verb, | |
| }; | |
| bool advance() { | |
| fSegment = fSegment->next(); | |
| return fSegment != nullptr; | |
| } | |
| SkScalar bottom() const { | |
| return bounds().fBottom; | |
| } | |
| const SkPathOpsBounds& bounds() const { | |
| return fSegment->bounds(); | |
| } | |
| SkOpContour* contour() const { | |
| return fSegment->contour(); | |
| } | |
| void init(SkOpContour* contour) { | |
| fSegment = contour->first(); | |
| } | |
| SkScalar left() const { | |
| return bounds().fLeft; | |
| } | |
| const SkPoint* pts() const { | |
| return fSegment->pts(); | |
| } | |
| SkScalar right() const { | |
| return bounds().fRight; | |
| } | |
| SkOpSegment* segment() const { | |
| return fSegment; | |
| } | |
| SegmentType segmentType() const { | |
| SegmentType type = (SegmentType) fSegment->verb(); | |
| if (type != kLine_Segment) { | |
| return type; | |
| } | |
| if (fSegment->isHorizontal()) { | |
| return kHorizontalLine_Segment; | |
| } | |
| if (fSegment->isVertical()) { | |
| return kVerticalLine_Segment; | |
| } | |
| return kLine_Segment; | |
| } | |
| bool startAfter(const SkIntersectionHelper& after) { | |
| fSegment = after.fSegment->next(); | |
| return fSegment != nullptr; | |
| } | |
| SkScalar top() const { | |
| return bounds().fTop; | |
| } | |
| SkScalar weight() const { | |
| return fSegment->weight(); | |
| } | |
| SkScalar x() const { | |
| return bounds().fLeft; | |
| } | |
| bool xFlipped() const { | |
| return x() != pts()[0].fX; | |
| } | |
| SkScalar y() const { | |
| return bounds().fTop; | |
| } | |
| bool yFlipped() const { | |
| return y() != pts()[0].fY; | |
| } | |
| private: | |
| SkOpSegment* fSegment; | |
| }; | |
| #endif |