1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2012 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkIntersectionHelper_DEFINED 8*c8dee2aaSAndroid Build Coastguard Worker #define SkIntersectionHelper_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkOpContour.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkOpSegment.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsPoint.h" 16*c8dee2aaSAndroid Build Coastguard Worker #endif 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker class SkIntersectionHelper { 19*c8dee2aaSAndroid Build Coastguard Worker public: 20*c8dee2aaSAndroid Build Coastguard Worker enum SegmentType { 21*c8dee2aaSAndroid Build Coastguard Worker kHorizontalLine_Segment = -1, 22*c8dee2aaSAndroid Build Coastguard Worker kVerticalLine_Segment = 0, 23*c8dee2aaSAndroid Build Coastguard Worker kLine_Segment = SkPath::kLine_Verb, 24*c8dee2aaSAndroid Build Coastguard Worker kQuad_Segment = SkPath::kQuad_Verb, 25*c8dee2aaSAndroid Build Coastguard Worker kConic_Segment = SkPath::kConic_Verb, 26*c8dee2aaSAndroid Build Coastguard Worker kCubic_Segment = SkPath::kCubic_Verb, 27*c8dee2aaSAndroid Build Coastguard Worker }; 28*c8dee2aaSAndroid Build Coastguard Worker advance()29*c8dee2aaSAndroid Build Coastguard Worker bool advance() { 30*c8dee2aaSAndroid Build Coastguard Worker fSegment = fSegment->next(); 31*c8dee2aaSAndroid Build Coastguard Worker return fSegment != nullptr; 32*c8dee2aaSAndroid Build Coastguard Worker } 33*c8dee2aaSAndroid Build Coastguard Worker bottom()34*c8dee2aaSAndroid Build Coastguard Worker SkScalar bottom() const { 35*c8dee2aaSAndroid Build Coastguard Worker return bounds().fBottom; 36*c8dee2aaSAndroid Build Coastguard Worker } 37*c8dee2aaSAndroid Build Coastguard Worker bounds()38*c8dee2aaSAndroid Build Coastguard Worker const SkPathOpsBounds& bounds() const { 39*c8dee2aaSAndroid Build Coastguard Worker return fSegment->bounds(); 40*c8dee2aaSAndroid Build Coastguard Worker } 41*c8dee2aaSAndroid Build Coastguard Worker contour()42*c8dee2aaSAndroid Build Coastguard Worker SkOpContour* contour() const { 43*c8dee2aaSAndroid Build Coastguard Worker return fSegment->contour(); 44*c8dee2aaSAndroid Build Coastguard Worker } 45*c8dee2aaSAndroid Build Coastguard Worker init(SkOpContour * contour)46*c8dee2aaSAndroid Build Coastguard Worker void init(SkOpContour* contour) { 47*c8dee2aaSAndroid Build Coastguard Worker fSegment = contour->first(); 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker left()50*c8dee2aaSAndroid Build Coastguard Worker SkScalar left() const { 51*c8dee2aaSAndroid Build Coastguard Worker return bounds().fLeft; 52*c8dee2aaSAndroid Build Coastguard Worker } 53*c8dee2aaSAndroid Build Coastguard Worker pts()54*c8dee2aaSAndroid Build Coastguard Worker const SkPoint* pts() const { 55*c8dee2aaSAndroid Build Coastguard Worker return fSegment->pts(); 56*c8dee2aaSAndroid Build Coastguard Worker } 57*c8dee2aaSAndroid Build Coastguard Worker right()58*c8dee2aaSAndroid Build Coastguard Worker SkScalar right() const { 59*c8dee2aaSAndroid Build Coastguard Worker return bounds().fRight; 60*c8dee2aaSAndroid Build Coastguard Worker } 61*c8dee2aaSAndroid Build Coastguard Worker segment()62*c8dee2aaSAndroid Build Coastguard Worker SkOpSegment* segment() const { 63*c8dee2aaSAndroid Build Coastguard Worker return fSegment; 64*c8dee2aaSAndroid Build Coastguard Worker } 65*c8dee2aaSAndroid Build Coastguard Worker segmentType()66*c8dee2aaSAndroid Build Coastguard Worker SegmentType segmentType() const { 67*c8dee2aaSAndroid Build Coastguard Worker SegmentType type = (SegmentType) fSegment->verb(); 68*c8dee2aaSAndroid Build Coastguard Worker if (type != kLine_Segment) { 69*c8dee2aaSAndroid Build Coastguard Worker return type; 70*c8dee2aaSAndroid Build Coastguard Worker } 71*c8dee2aaSAndroid Build Coastguard Worker if (fSegment->isHorizontal()) { 72*c8dee2aaSAndroid Build Coastguard Worker return kHorizontalLine_Segment; 73*c8dee2aaSAndroid Build Coastguard Worker } 74*c8dee2aaSAndroid Build Coastguard Worker if (fSegment->isVertical()) { 75*c8dee2aaSAndroid Build Coastguard Worker return kVerticalLine_Segment; 76*c8dee2aaSAndroid Build Coastguard Worker } 77*c8dee2aaSAndroid Build Coastguard Worker return kLine_Segment; 78*c8dee2aaSAndroid Build Coastguard Worker } 79*c8dee2aaSAndroid Build Coastguard Worker startAfter(const SkIntersectionHelper & after)80*c8dee2aaSAndroid Build Coastguard Worker bool startAfter(const SkIntersectionHelper& after) { 81*c8dee2aaSAndroid Build Coastguard Worker fSegment = after.fSegment->next(); 82*c8dee2aaSAndroid Build Coastguard Worker return fSegment != nullptr; 83*c8dee2aaSAndroid Build Coastguard Worker } 84*c8dee2aaSAndroid Build Coastguard Worker top()85*c8dee2aaSAndroid Build Coastguard Worker SkScalar top() const { 86*c8dee2aaSAndroid Build Coastguard Worker return bounds().fTop; 87*c8dee2aaSAndroid Build Coastguard Worker } 88*c8dee2aaSAndroid Build Coastguard Worker weight()89*c8dee2aaSAndroid Build Coastguard Worker SkScalar weight() const { 90*c8dee2aaSAndroid Build Coastguard Worker return fSegment->weight(); 91*c8dee2aaSAndroid Build Coastguard Worker } 92*c8dee2aaSAndroid Build Coastguard Worker x()93*c8dee2aaSAndroid Build Coastguard Worker SkScalar x() const { 94*c8dee2aaSAndroid Build Coastguard Worker return bounds().fLeft; 95*c8dee2aaSAndroid Build Coastguard Worker } 96*c8dee2aaSAndroid Build Coastguard Worker xFlipped()97*c8dee2aaSAndroid Build Coastguard Worker bool xFlipped() const { 98*c8dee2aaSAndroid Build Coastguard Worker return x() != pts()[0].fX; 99*c8dee2aaSAndroid Build Coastguard Worker } 100*c8dee2aaSAndroid Build Coastguard Worker y()101*c8dee2aaSAndroid Build Coastguard Worker SkScalar y() const { 102*c8dee2aaSAndroid Build Coastguard Worker return bounds().fTop; 103*c8dee2aaSAndroid Build Coastguard Worker } 104*c8dee2aaSAndroid Build Coastguard Worker yFlipped()105*c8dee2aaSAndroid Build Coastguard Worker bool yFlipped() const { 106*c8dee2aaSAndroid Build Coastguard Worker return y() != pts()[0].fY; 107*c8dee2aaSAndroid Build Coastguard Worker } 108*c8dee2aaSAndroid Build Coastguard Worker 109*c8dee2aaSAndroid Build Coastguard Worker private: 110*c8dee2aaSAndroid Build Coastguard Worker SkOpSegment* fSegment; 111*c8dee2aaSAndroid Build Coastguard Worker }; 112*c8dee2aaSAndroid Build Coastguard Worker 113*c8dee2aaSAndroid Build Coastguard Worker #endif 114