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
18class SkIntersectionHelper {
19public:
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
109private:
110 SkOpSegment* fSegment;
111};
112
113#endif
114