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