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 
advance()29     bool advance() {
30         fSegment = fSegment->next();
31         return fSegment != nullptr;
32     }
33 
bottom()34     SkScalar bottom() const {
35         return bounds().fBottom;
36     }
37 
bounds()38     const SkPathOpsBounds& bounds() const {
39         return fSegment->bounds();
40     }
41 
contour()42     SkOpContour* contour() const {
43         return fSegment->contour();
44     }
45 
init(SkOpContour * contour)46     void init(SkOpContour* contour) {
47         fSegment = contour->first();
48     }
49 
left()50     SkScalar left() const {
51         return bounds().fLeft;
52     }
53 
pts()54     const SkPoint* pts() const {
55         return fSegment->pts();
56     }
57 
right()58     SkScalar right() const {
59         return bounds().fRight;
60     }
61 
segment()62     SkOpSegment* segment() const {
63         return fSegment;
64     }
65 
segmentType()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 
startAfter(const SkIntersectionHelper & after)80     bool startAfter(const SkIntersectionHelper& after) {
81         fSegment = after.fSegment->next();
82         return fSegment != nullptr;
83     }
84 
top()85     SkScalar top() const {
86         return bounds().fTop;
87     }
88 
weight()89     SkScalar weight() const {
90         return fSegment->weight();
91     }
92 
x()93     SkScalar x() const {
94         return bounds().fLeft;
95     }
96 
xFlipped()97     bool xFlipped() const {
98         return x() != pts()[0].fX;
99     }
100 
y()101     SkScalar y() const {
102         return bounds().fTop;
103     }
104 
yFlipped()105     bool yFlipped() const {
106         return y() != pts()[0].fY;
107     }
108 
109 private:
110     SkOpSegment* fSegment;
111 };
112 
113 #endif
114