SkOpAngle.h revision eed356d281adbf93ecbd89cb23913a7861cd8578
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 SkOpAngle_DEFINED
8#define SkOpAngle_DEFINED
9
10#include "SkLineParameters.h"
11#include "SkPathOpsCurve.h"
12#if DEBUG_ANGLE
13#include "SkString.h"
14#endif
15
16class SkOpContour;
17class SkOpPtT;
18class SkOpSegment;
19class SkOpSpanBase;
20class SkOpSpan;
21
22class SkOpAngle {
23public:
24    enum IncludeType {
25        kUnaryWinding,
26        kUnaryXor,
27        kBinarySingle,
28        kBinaryOpp,
29    };
30
31    const SkOpAngle* debugAngle(int id) const;
32    const SkOpCoincidence* debugCoincidence() const;
33    SkOpContour* debugContour(int id) const;
34
35    int debugID() const {
36        return SkDEBUGRELEASE(fID, -1);
37    }
38
39#if DEBUG_SORT
40    void debugLoop() const;
41#endif
42
43#if DEBUG_ANGLE
44    bool debugCheckCoincidence() const { return fCheckCoincidence; }
45    void debugCheckNearCoincidence() const;
46    SkString debugPart() const;
47#endif
48    const SkOpPtT* debugPtT(int id) const;
49    const SkOpSegment* debugSegment(int id) const;
50    int debugSign() const;
51    const SkOpSpanBase* debugSpan(int id) const;
52    void debugValidate() const;
53    void debugValidateNext() const;  // in debug builds, verify that angle loop is uncorrupted
54    double distEndRatio(double dist) const;
55    // available to testing only
56    void dump() const;
57    void dumpCurves() const;
58    void dumpLoop() const;
59    void dumpOne(bool functionHeader) const;
60    void dumpTo(const SkOpSegment* fromSeg, const SkOpAngle* ) const;
61    void dumpTest() const;
62
63    SkOpSpanBase* end() const {
64        return fEnd;
65    }
66
67    void insert(SkOpAngle* );
68    SkOpSpanBase* lastMarked() const;
69    bool loopContains(const SkOpAngle* ) const;
70    int loopCount() const;
71
72    SkOpAngle* next() const {
73        return fNext;
74    }
75
76    SkOpAngle* previous() const;
77    SkOpSegment* segment() const;
78    void set(SkOpSpanBase* start, SkOpSpanBase* end);
79
80    void setLastMarked(SkOpSpanBase* marked) {
81        fLastMarked = marked;
82    }
83
84    SkOpSpanBase* start() const {
85        return fStart;
86    }
87
88    SkOpSpan* starter();
89
90    bool unorderable() const {
91        return fUnorderable;
92    }
93
94private:
95    bool after(SkOpAngle* test);
96    int allOnOneSide(const SkOpAngle* test);
97    bool checkCrossesZero() const;
98    bool checkParallel(SkOpAngle* );
99    bool computeSector();
100    int convexHullOverlaps(const SkOpAngle* ) const;
101    bool endToSide(const SkOpAngle* rh, bool* inside) const;
102    bool endsIntersect(SkOpAngle* );
103    int findSector(SkPath::Verb verb, double x, double y) const;
104    SkOpGlobalState* globalState() const;
105    bool merge(SkOpAngle* );
106    double midT() const;
107    bool midToSide(const SkOpAngle* rh, bool* inside) const;
108    bool oppositePlanes(const SkOpAngle* rh) const;
109    bool orderable(SkOpAngle* rh);  // false == this < rh ; true == this > rh
110    void setSector();
111    void setSpans();
112    bool tangentsDiverge(const SkOpAngle* rh, double s0xt0) const;
113
114    SkDCurve fOriginalCurvePart;  // the curve from start to end
115    SkDCurveSweep fPart;  // the curve from start to end offset as needed
116    double fSide;
117    SkLineParameters fTangentHalf;  // used only to sort a pair of lines or line-like sections
118    SkOpAngle* fNext;
119    SkOpSpanBase* fLastMarked;
120    SkOpSpanBase* fStart;
121    SkOpSpanBase* fEnd;
122    SkOpSpanBase* fComputedEnd;
123    int fSectorMask;
124    int8_t fSectorStart;  // in 32nds of a circle
125    int8_t fSectorEnd;
126    bool fUnorderable;
127    bool fComputeSector;
128    bool fComputedSector;
129    bool fCheckCoincidence;
130    SkDEBUGCODE(int fID);
131
132    friend class PathOpsAngleTester;
133};
134
135
136
137#endif
138