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