1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
/*
* Copyright 2012 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkOpAngle_DEFINED
#define SkOpAngle_DEFINED
#include "SkLineParameters.h"
class SkOpSegment;
struct SkOpSpan;
// sorting angles
// given angles of {dx dy ddx ddy dddx dddy} sort them
class SkOpAngle {
public:
enum { kStackBasedCount = 8 }; // FIXME: determine what this should be
enum IncludeType {
kUnaryWinding,
kUnaryXor,
kBinarySingle,
kBinaryOpp,
};
int end() const {
return fEnd;
}
const SkOpAngle* findFirst() const;
bool inLoop() const {
return !!fNext;
}
void insert(SkOpAngle* );
bool isHorizontal() const;
SkOpSpan* lastMarked() const;
int loopCount() const;
void markStops();
bool merge(SkOpAngle* );
SkOpAngle* next() const {
return fNext;
}
SkOpAngle* previous() const;
void set(const SkOpSegment* segment, int start, int end);
void setLastMarked(SkOpSpan* marked) {
fLastMarked = marked;
}
SkOpSegment* segment() const {
return const_cast<SkOpSegment*>(fSegment);
}
int sign() const {
return SkSign32(fStart - fEnd);
}
bool small() const;
int start() const {
return fStart;
}
bool unorderable() const {
return fUnorderable;
}
// available to testing only
#if DEBUG_SORT
void debugLoop() const; // called by code during run
#endif
#if DEBUG_ANGLE
void debugSameAs(const SkOpAngle* compare) const;
#endif
void dump() const;
void dumpFromTo(const SkOpSegment* fromSeg, int from, int to) const;
#if DEBUG_ANGLE
void setID(int id) {
fID = id;
}
#endif
#if DEBUG_VALIDATE
void debugValidateLoop() const;
#endif
private:
bool after(const SkOpAngle* test) const;
int allOnOneSide(const SkOpAngle& test) const;
bool calcSlop(double x, double y, double rx, double ry, bool* result) const;
bool checkCrossesZero() const;
bool checkParallel(const SkOpAngle& ) const;
bool computeSector();
int convexHullOverlaps(const SkOpAngle& ) const;
double distEndRatio(double dist) const;
int findSector(SkPath::Verb verb, double x, double y) const;
bool endsIntersect(const SkOpAngle& ) const;
double midT() const;
bool oppositePlanes(const SkOpAngle& rh) const;
bool orderable(const SkOpAngle& rh) const; // false == this < rh ; true == this > rh
void setCurveHullSweep();
void setSector();
void setSpans();
bool tangentsDiverge(const SkOpAngle& rh, double s0xt0) const;
SkDCubic fCurvePart; // the curve from start to end
double fSide;
SkLineParameters fTangentHalf; // used only to sort a pair of lines or line-like sections
const SkOpSegment* fSegment;
SkOpAngle* fNext;
SkOpSpan* fLastMarked;
SkDVector fSweep[2];
int fStart;
int fEnd;
int fSectorMask;
char fSectorStart; // in 32nds of a circle
char fSectorEnd;
bool fIsCurve;
bool fStop; // set if ordered angle is greater than the previous
mutable bool fUnorderable; // this is editable by orderable()
bool fUnorderedSweep; // set when a cubic's first control point between the sweep vectors
bool fComputeSector;
bool fComputedSector;
#if DEBUG_SORT
void debugOne(bool showFunc) const; // available to testing only
#endif
#if DEBUG_ANGLE
int debugID() const { return fID; }
int fID;
#endif
#if DEBUG_VALIDATE
void debugValidateNext() const; // in debug builds, verify that angle loop is uncorrupted
#else
void debugValidateNext() const {}
#endif
void dumpLoop() const; // utility to be called by user from debugger
void dumpPartials() const; // utility to be called by user from debugger
friend class PathOpsAngleTester;
};
#endif
|