Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/pathops/SkPathOpsQuadSect.h

Issue 853223002: new files for pathops geometric intersection (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: remove visualizer tool so cl contains only pure adds Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/pathops/SkPathOpsPostSect.cpp ('k') | src/pathops/SkPathOpsTCubicSect.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright 2014 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 SkQuadSpan_DEFINE
8 #define SkQuadSpan_DEFINE
9
10 #include "SkChunkAlloc.h"
11 #include "SkPathOpsRect.h"
12 #include "SkPathOpsQuad.h"
13 #include "SkTArray.h"
14
15 class SkIntersections;
16
17 class SkQuadCoincident {
18 public:
19 bool isCoincident() const {
20 return fCoincident;
21 }
22
23 void init() {
24 fCoincident = false;
25 SkDEBUGCODE(fPerpPt.fX = fPerpPt.fY = SK_ScalarNaN);
26 SkDEBUGCODE(fPerpT = SK_ScalarNaN);
27 }
28
29 void markCoincident() {
30 if (!fCoincident) {
31 fPerpT = -1;
32 }
33 fCoincident = true;
34 }
35
36 const SkDPoint& perpPt() const {
37 return fPerpPt;
38 }
39
40 double perpT() const {
41 return fPerpT;
42 }
43
44 void setPerp(const SkDQuad& quad1, double t, const SkDPoint& qPt, const SkDQ uad& quad2);
45
46 private:
47 SkDPoint fPerpPt;
48 double fPerpT; // perpendicular intersection on opposite quad
49 bool fCoincident;
50 };
51
52 class SkQuadSect; // used only by debug id
53
54 class SkQuadSpan {
55 public:
56 void init(const SkDQuad& quad);
57 void initBounds(const SkDQuad& quad);
58
59 bool contains(double t) const {
60 return !! const_cast<SkQuadSpan*>(this)->innerFind(t);
61 }
62
63 bool contains(const SkQuadSpan* span) const;
64
65 SkQuadSpan* find(double t) {
66 SkQuadSpan* result = innerFind(t);
67 SkASSERT(result);
68 return result;
69 }
70
71 bool intersects(const SkQuadSpan* span) const;
72
73 const SkQuadSpan* next() const {
74 return fNext;
75 }
76
77 void reset() {
78 fBounded.reset();
79 }
80
81 bool split(SkQuadSpan* work) {
82 return splitAt(work, (work->fStartT + work->fEndT) * 0.5);
83 }
84
85 bool splitAt(SkQuadSpan* work, double t);
86 bool tightBoundsIntersects(const SkQuadSpan* span) const;
87
88 // implementation is for testing only
89 void dump() const;
90
91 private:
92 bool hullIntersects(const SkDQuad& q2) const;
93 SkQuadSpan* innerFind(double t);
94 bool linearIntersects(const SkDQuad& q2) const;
95
96 // implementation is for testing only
97 #if DEBUG_BINARY_QUAD
98 int debugID(const SkQuadSect* ) const { return fDebugID; }
99 #else
100 int debugID(const SkQuadSect* ) const;
101 #endif
102 void dump(const SkQuadSect* ) const;
103 void dumpID(const SkQuadSect* ) const;
104
105 #if DEBUG_BINARY_QUAD
106 void validate() const;
107 #endif
108
109 SkDQuad fPart;
110 SkQuadCoincident fCoinStart;
111 SkQuadCoincident fCoinEnd;
112 SkSTArray<4, SkQuadSpan*, true> fBounded;
113 SkQuadSpan* fPrev;
114 SkQuadSpan* fNext;
115 SkDRect fBounds;
116 double fStartT;
117 double fEndT;
118 double fBoundsMax;
119 bool fCollapsed;
120 bool fHasPerp;
121 mutable bool fIsLinear;
122 #if DEBUG_BINARY_QUAD
123 int fDebugID;
124 bool fDebugDeleted;
125 #endif
126 friend class SkQuadSect;
127 };
128
129 class SkQuadSect {
130 public:
131 SkQuadSect(const SkDQuad& quad PATH_OPS_DEBUG_PARAMS(int id));
132 static void BinarySearch(SkQuadSect* sect1, SkQuadSect* sect2, SkIntersectio ns* intersections);
133
134 // for testing only
135 void dumpQuads() const;
136 private:
137 SkQuadSpan* addOne();
138 bool binarySearchCoin(const SkQuadSect& , double tStart, double tStep, doubl e* t, double* oppT);
139 SkQuadSpan* boundsMax() const;
140 void coincidentCheck(SkQuadSect* sect2);
141 bool intersects(const SkQuadSpan* span, const SkQuadSect* opp, const SkQuadS pan* oppSpan) const;
142 void onCurveCheck(SkQuadSect* sect2, SkQuadSpan* first, SkQuadSpan* last);
143 void recoverCollapsed();
144 void removeSpan(SkQuadSpan* span);
145 void removeOne(const SkQuadSpan* test, SkQuadSpan* span);
146 void removeSpans(SkQuadSpan* span, SkQuadSect* opp);
147 void setPerp(const SkDQuad& opp, SkQuadSpan* first, SkQuadSpan* last);
148 const SkQuadSpan* tail() const;
149 void trim(SkQuadSpan* span, SkQuadSect* opp);
150
151 // for testing only
152 void dump() const;
153 void dumpBoth(const SkQuadSect& opp) const;
154 void dumpBoth(const SkQuadSect* opp) const;
155
156 #if DEBUG_BINARY_QUAD
157 int debugID() const { return fDebugID; }
158 void validate() const;
159 #else
160 int debugID() const { return 0; }
161 #endif
162 const SkDQuad& fQuad;
163 SkChunkAlloc fHeap;
164 SkQuadSpan* fHead;
165 SkQuadSpan* fDeleted;
166 int fActiveCount;
167 #if DEBUG_BINARY_QUAD
168 int fDebugID;
169 int fDebugCount;
170 int fDebugAllocatedCount;
171 #endif
172 friend class SkQuadSpan; // only used by debug id
173 };
174
175 #endif
OLDNEW
« no previous file with comments | « src/pathops/SkPathOpsPostSect.cpp ('k') | src/pathops/SkPathOpsTCubicSect.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698