| /* |
| * 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 |