Flutter Engine
The Flutter Engine
SkOpSpan.h
Go to the documentation of this file.
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 SkOpSpan_DEFINED
8#define SkOpSpan_DEFINED
9
15
16class SkOpAngle;
17class SkOpCoincidence;
18class SkOpContour;
19class SkOpSegment;
20class SkOpSpan;
21class SkOpSpanBase;
22
23// subset of op span used by terminal span (when t is equal to one)
24class SkOpPtT {
25public:
26 enum {
28 kIsDuplicate = 1
29 };
30
31 const SkOpPtT* active() const;
32
33 // please keep in sync with debugAddOpp()
35 SkOpPtT* oldNext = this->fNext;
36 SkASSERT(this != opp);
37 this->fNext = opp;
38 SkASSERT(oppPrev != oldNext);
39 oppPrev->fNext = oldNext;
40 }
41
42 bool alias() const;
43 bool coincident() const { return fCoincident; }
44 bool contains(const SkOpPtT* ) const;
45 bool contains(const SkOpSegment*, const SkPoint& ) const;
46 bool contains(const SkOpSegment*, double t) const;
47 const SkOpPtT* contains(const SkOpSegment* ) const;
48 SkOpContour* contour() const;
49
50 int debugID() const {
51 return SkDEBUGRELEASE(fID, -1);
52 }
53
54 void debugAddOpp(const SkOpPtT* opp, const SkOpPtT* oppPrev) const;
55 const SkOpAngle* debugAngle(int id) const;
56 const SkOpCoincidence* debugCoincidence() const;
57 bool debugContains(const SkOpPtT* ) const;
58 const SkOpPtT* debugContains(const SkOpSegment* check) const;
59 SkOpContour* debugContour(int id) const;
60 const SkOpPtT* debugEnder(const SkOpPtT* end) const;
61 int debugLoopLimit(bool report) const;
62 bool debugMatchID(int id) const;
63 const SkOpPtT* debugOppPrev(const SkOpPtT* opp) const;
64 const SkOpPtT* debugPtT(int id) const;
65 void debugResetCoinT() const;
66 const SkOpSegment* debugSegment(int id) const;
67 void debugSetCoinT(int ) const;
68 const SkOpSpanBase* debugSpan(int id) const;
69 void debugValidate() const;
70
71 bool deleted() const {
72 return fDeleted;
73 }
74
75 bool duplicate() const {
76 return fDuplicatePt;
77 }
78
79 void dump() const; // available to testing only
80 void dumpAll() const;
81 void dumpBase() const;
82
83 const SkOpPtT* find(const SkOpSegment* ) const;
85 void init(SkOpSpanBase* , double t, const SkPoint& , bool dup);
86
88 SkASSERT(span != this);
89 span->fNext = fNext;
90 fNext = span;
91 }
92
93 const SkOpPtT* next() const {
94 return fNext;
95 }
96
98 return fNext;
99 }
100
101 bool onEnd() const;
102
103 // returns nullptr if this is already in the opp ptT loop
104 SkOpPtT* oppPrev(const SkOpPtT* opp) const {
105 // find the fOpp ptr to opp
106 SkOpPtT* oppPrev = opp->fNext;
107 if (oppPrev == this) {
108 return nullptr;
109 }
110 while (oppPrev->fNext != opp) {
112 if (oppPrev == this) {
113 return nullptr;
114 }
115 }
116 return oppPrev;
117 }
118
119 static bool Overlaps(const SkOpPtT* s1, const SkOpPtT* e1, const SkOpPtT* s2,
120 const SkOpPtT* e2, const SkOpPtT** sOut, const SkOpPtT** eOut) {
121 const SkOpPtT* start1 = s1->fT < e1->fT ? s1 : e1;
122 const SkOpPtT* start2 = s2->fT < e2->fT ? s2 : e2;
123 *sOut = between(s1->fT, start2->fT, e1->fT) ? start2
124 : between(s2->fT, start1->fT, e2->fT) ? start1 : nullptr;
125 const SkOpPtT* end1 = s1->fT < e1->fT ? e1 : s1;
126 const SkOpPtT* end2 = s2->fT < e2->fT ? e2 : s2;
127 *eOut = between(s1->fT, end2->fT, e1->fT) ? end2
128 : between(s2->fT, end1->fT, e2->fT) ? end1 : nullptr;
129 if (*sOut == *eOut) {
130 SkOPOBJASSERT(s1, start1->fT >= end2->fT || start2->fT >= end1->fT);
131 return false;
132 }
133 SkASSERT(!*sOut || *sOut != *eOut);
134 return *sOut && *eOut;
135 }
136
137 bool ptAlreadySeen(const SkOpPtT* head) const;
138 SkOpPtT* prev();
139
140 const SkOpSegment* segment() const;
142
143 void setCoincident() const {
145 fCoincident = true;
146 }
147
148 void setDeleted();
149
150 void setSpan(const SkOpSpanBase* span) {
151 fSpan = const_cast<SkOpSpanBase*>(span);
152 }
153
154 const SkOpSpanBase* span() const {
155 return fSpan;
156 }
157
159 return fSpan;
160 }
161
162 const SkOpPtT* starter(const SkOpPtT* end) const {
163 return fT < end->fT ? this : end;
164 }
165
166 double fT;
167 SkPoint fPt; // cache of point value at this t
168protected:
169 SkOpSpanBase* fSpan; // contains winding data
170 SkOpPtT* fNext; // intersection on opposite curve or alias on this curve
171 bool fDeleted; // set if removed from span list
172 bool fDuplicatePt; // set if identical pt is somewhere in the next loop
173 // below mutable since referrer is otherwise always const
174 mutable bool fCoincident; // set if at some point a coincident span pointed here
175 SkDEBUGCODE(int fID;)
176};
177
179public:
180 enum class Collapsed {
181 kNo,
182 kYes,
183 kError,
184 };
185
186 bool addOpp(SkOpSpanBase* opp);
187
189 ++fSpanAdds;
190 }
191
192 bool chased() const {
193 return fChased;
194 }
195
197
198 const SkOpSpanBase* coinEnd() const {
199 return fCoinEnd;
200 }
201
202 Collapsed collapsed(double s, double e) const;
203 bool contains(const SkOpSpanBase* ) const;
204 const SkOpPtT* contains(const SkOpSegment* ) const;
205
206 bool containsCoinEnd(const SkOpSpanBase* coin) const {
207 SkASSERT(this != coin);
208 const SkOpSpanBase* next = this;
209 while ((next = next->fCoinEnd) != this) {
210 if (next == coin) {
211 return true;
212 }
213 }
214 return false;
215 }
216
217 bool containsCoinEnd(const SkOpSegment* ) const;
218 SkOpContour* contour() const;
219
221 return SkDEBUGRELEASE(++fCount, -1);
222 }
223
224 int debugID() const {
225 return SkDEBUGRELEASE(fID, -1);
226 }
227
228#if DEBUG_COIN
229 void debugAddOpp(SkPathOpsDebug::GlitchLog* , const SkOpSpanBase* opp) const;
230#endif
231 bool debugAlignedEnd(double t, const SkPoint& pt) const;
232 bool debugAlignedInner() const;
233 const SkOpAngle* debugAngle(int id) const;
234#if DEBUG_COIN
235 void debugCheckForCollapsedCoincidence(SkPathOpsDebug::GlitchLog* ) const;
236#endif
237 const SkOpCoincidence* debugCoincidence() const;
238 bool debugCoinEndLoopCheck() const;
239 SkOpContour* debugContour(int id) const;
240#ifdef SK_DEBUG
241 bool debugDeleted() const { return fDebugDeleted; }
242#endif
243#if DEBUG_COIN
244 void debugInsertCoinEnd(SkPathOpsDebug::GlitchLog* ,
245 const SkOpSpanBase* ) const;
246 void debugMergeMatches(SkPathOpsDebug::GlitchLog* log,
247 const SkOpSpanBase* opp) const;
248#endif
249 const SkOpPtT* debugPtT(int id) const;
250 void debugResetCoinT() const;
251 const SkOpSegment* debugSegment(int id) const;
252 void debugSetCoinT(int ) const;
253#ifdef SK_DEBUG
254 void debugSetDeleted() { fDebugDeleted = true; }
255#endif
256 const SkOpSpanBase* debugSpan(int id) const;
257 const SkOpSpan* debugStarter(SkOpSpanBase const** endPtr) const;
259 void debugValidate() const;
260
261 bool deleted() const {
262 return fPtT.deleted();
263 }
264
265 void dump() const; // available to testing only
266 void dumpCoin() const;
267 void dumpAll() const;
268 void dumpBase() const;
269 void dumpHead() const;
270
271 bool final() const {
272 return fPtT.fT == 1;
273 }
274
276 return fFromAngle;
277 }
278
279 void initBase(SkOpSegment* parent, SkOpSpan* prev, double t, const SkPoint& pt);
280
281 // Please keep this in sync with debugInsertCoinEnd()
283 if (containsCoinEnd(coin)) {
284 SkASSERT(coin->containsCoinEnd(this));
285 return;
286 }
288 SkASSERT(this != coin);
289 SkOpSpanBase* coinNext = coin->fCoinEnd;
290 coin->fCoinEnd = this->fCoinEnd;
291 this->fCoinEnd = coinNext;
293 }
294
295 void merge(SkOpSpan* span);
296 bool mergeMatches(SkOpSpanBase* opp);
297
298 const SkOpSpan* prev() const {
299 return fPrev;
300 }
301
303 return fPrev;
304 }
305
306 const SkPoint& pt() const {
307 return fPtT.fPt;
308 }
309
310 const SkOpPtT* ptT() const {
311 return &fPtT;
312 }
313
315 return &fPtT;
316 }
317
319 return fSegment;
320 }
321
322 void setAligned() {
323 fAligned = true;
324 }
325
326 void setChased(bool chased) {
327 fChased = chased;
328 }
329
330 void setFromAngle(SkOpAngle* angle) {
331 fFromAngle = angle;
332 }
333
335 fPrev = prev;
336 }
337
338 bool simple() const {
340 return fPtT.next()->next() == &fPtT;
341 }
342
343 int spanAddsCount() const {
344 return fSpanAdds;
345 }
346
347 const SkOpSpan* starter(const SkOpSpanBase* end) const {
348 const SkOpSpanBase* result = t() < end->t() ? this : end;
349 return result->upCast();
350 }
351
353 SkASSERT(this->segment() == end->segment());
354 SkOpSpanBase* result = t() < end->t() ? this : end;
355 return result->upCast();
356 }
357
359 SkOpSpanBase* end = *endPtr;
360 SkASSERT(this->segment() == end->segment());
362 if (t() < end->t()) {
363 result = this;
364 } else {
365 result = end;
366 *endPtr = this;
367 }
368 return result->upCast();
369 }
370
371 int step(const SkOpSpanBase* end) const {
372 return t() < end->t() ? 1 : -1;
373 }
374
375 double t() const {
376 return fPtT.fT;
377 }
378
379 void unaligned() {
380 fAligned = false;
381 }
382
384 SkASSERT(!final());
385 return (SkOpSpan*) this;
386 }
387
388 const SkOpSpan* upCast() const {
389 SkOPASSERT(!final());
390 return (const SkOpSpan*) this;
391 }
392
394 return final() ? nullptr : upCast();
395 }
396
397 const SkOpSpan* upCastable() const {
398 return final() ? nullptr : upCast();
399 }
400
401private:
402 void alignInner();
403
404protected: // no direct access to internals to avoid treating a span base as a span
405 SkOpPtT fPtT; // list of points and t values associated with the start of this span
406 SkOpSegment* fSegment; // segment that contains this span
407 SkOpSpanBase* fCoinEnd; // linked list of coincident spans that end here (may point to itself)
408 SkOpAngle* fFromAngle; // points to next angle from span start to end
409 SkOpSpan* fPrev; // previous intersection point
410 int fSpanAdds; // number of times intersections have been added to span
412 bool fChased; // set after span has been added to chase array
413 SkDEBUGCODE(int fCount;) // number of pt/t pairs added
414 SkDEBUGCODE(int fID;)
415 SkDEBUGCODE(bool fDebugDeleted;) // set when span was merged with another span
416};
417
418class SkOpSpan : public SkOpSpanBase {
419public:
420 bool alreadyAdded() const {
421 if (fAlreadyAdded) {
422 return true;
423 }
424 return false;
425 }
426
428 SkASSERT(!final());
429 if (fCoincident == this) {
430 return false;
431 }
432 fCoincident = this;
433 return true;
434 }
435
436 int computeWindSum();
437 bool containsCoincidence(const SkOpSegment* ) const;
438
439 bool containsCoincidence(const SkOpSpan* coin) const {
440 SkASSERT(this != coin);
441 const SkOpSpan* next = this;
442 while ((next = next->fCoincident) != this) {
443 if (next == coin) {
444 return true;
445 }
446 }
447 return false;
448 }
449
450 bool debugCoinLoopCheck() const;
451#if DEBUG_COIN
452 void debugInsertCoincidence(SkPathOpsDebug::GlitchLog* , const SkOpSpan* ) const;
453 void debugInsertCoincidence(SkPathOpsDebug::GlitchLog* ,
454 const SkOpSegment* , bool flipped, bool ordered) const;
455#endif
456 void dumpCoin() const;
457 bool dumpSpan() const;
458
459 bool done() const {
460 SkASSERT(!final());
461 return fDone;
462 }
463
464 void init(SkOpSegment* parent, SkOpSpan* prev, double t, const SkPoint& pt);
465 bool insertCoincidence(const SkOpSegment* , bool flipped, bool ordered);
466
467 // Please keep this in sync with debugInsertCoincidence()
469 if (containsCoincidence(coin)) {
470 SkASSERT(coin->containsCoincidence(this));
471 return;
472 }
474 SkASSERT(this != coin);
475 SkOpSpan* coinNext = coin->fCoincident;
476 coin->fCoincident = this->fCoincident;
477 this->fCoincident = coinNext;
479 }
480
481 bool isCanceled() const {
482 SkASSERT(!final());
483 return fWindValue == 0 && fOppValue == 0;
484 }
485
486 bool isCoincident() const {
487 SkASSERT(!final());
488 return fCoincident != this;
489 }
490
491 void markAdded() {
492 fAlreadyAdded = true;
493 }
494
496 SkASSERT(!final());
497 return fNext;
498 }
499
500 int oppSum() const {
501 SkASSERT(!final());
502 return fOppSum;
503 }
504
505 int oppValue() const {
506 SkASSERT(!final());
507 return fOppValue;
508 }
509
510 void release(const SkOpPtT* );
511
512 SkOpPtT* setCoinStart(SkOpSpan* oldCoinStart, SkOpSegment* oppSegment);
513
514 void setDone(bool done) {
515 SkASSERT(!final());
516 fDone = done;
517 }
518
519 void setNext(SkOpSpanBase* nextT) {
520 SkASSERT(!final());
521 fNext = nextT;
522 }
523
524 void setOppSum(int oppSum);
525
527 SkASSERT(!final());
528 SkASSERT(fOppSum == SK_MinS32);
529 SkOPASSERT(!oppValue || !fDone);
530 fOppValue = oppValue;
531 }
532
533 void setToAngle(SkOpAngle* angle) {
534 SkASSERT(!final());
535 fToAngle = angle;
536 }
537
538 void setWindSum(int windSum);
539
541 SkASSERT(!final());
542 SkASSERT(windValue >= 0);
543 SkASSERT(fWindSum == SK_MinS32);
544 SkOPASSERT(!windValue || !fDone);
545 fWindValue = windValue;
546 }
547
548 bool sortableTop(SkOpContour* );
549
551 SkASSERT(!final());
552 return fToAngle;
553 }
554
555 int windSum() const {
556 SkASSERT(!final());
557 return fWindSum;
558 }
559
560 int windValue() const {
561 SkOPASSERT(!final());
562 return fWindValue;
563 }
564
565private: // no direct access to internals to avoid treating a span base as a span
566 SkOpSpan* fCoincident; // linked list of spans coincident with this one (may point to itself)
567 SkOpAngle* fToAngle; // points to next angle from span start to end
568 SkOpSpanBase* fNext; // next intersection point
569 int fWindSum; // accumulated from contours surrounding this one.
570 int fOppSum; // for binary operators: the opposite winding sum
571 int fWindValue; // 0 == canceled; 1 == normal; >1 == coincident
572 int fOppValue; // normally 0 -- when binary coincident edges combine, opp value goes here
573 int fTopTTry; // specifies direction and t value to try next
574 bool fDone; // if set, this span to next higher T has been processed
575 bool fAlreadyAdded;
576};
577
578#endif
Instance * fNext
static float next(float f)
float e1
#define check(reporter, ref, unref, make, kill)
Definition: RefCntTest.cpp:85
#define SkASSERT(cond)
Definition: SkAssert.h:116
static constexpr int32_t SK_MinS32
Definition: SkMath.h:22
@ kYes
Do pre-clip the geometry before applying the (perspective) matrix.
@ kNo
Don't pre-clip the geometry before applying the (perspective) matrix.
#define SkDEBUGRELEASE(a, b)
#define SkOPOBJASSERT(obj, cond)
bool between(double a, double b, double c)
#define SkOPASSERT(cond)
SkDEBUGCODE(SK_SPI) SkThreadID SkGetThreadID()
const SkOpSpanBase * span() const
Definition: SkOpSpan.h:154
void dump() const
void setCoincident() const
Definition: SkOpSpan.h:143
SkOpPtT * next()
Definition: SkOpSpan.h:97
SkPoint fPt
Definition: SkOpSpan.h:167
bool fDeleted
Definition: SkOpSpan.h:171
static bool Overlaps(const SkOpPtT *s1, const SkOpPtT *e1, const SkOpPtT *s2, const SkOpPtT *e2, const SkOpPtT **sOut, const SkOpPtT **eOut)
Definition: SkOpSpan.h:119
const SkOpPtT * next() const
Definition: SkOpSpan.h:93
double fT
Definition: SkOpSpan.h:166
bool deleted() const
Definition: SkOpSpan.h:71
SkOpGlobalState * globalState() const
Definition: SkOpSpan.cpp:100
SkOpSpanBase * span()
Definition: SkOpSpan.h:158
int debugLoopLimit(bool report) const
void debugValidate() const
SkOpPtT * oppPrev(const SkOpPtT *opp) const
Definition: SkOpSpan.h:104
bool debugContains(const SkOpPtT *) const
const SkOpCoincidence * debugCoincidence() const
void addOpp(SkOpPtT *opp, SkOpPtT *oppPrev)
Definition: SkOpSpan.h:34
const SkOpSpanBase * debugSpan(int id) const
void setSpan(const SkOpSpanBase *span)
Definition: SkOpSpan.h:150
bool ptAlreadySeen(const SkOpPtT *head) const
Definition: SkOpSpan.cpp:124
int debugID() const
Definition: SkOpSpan.h:50
const SkOpSegment * segment() const
Definition: SkOpSpan.cpp:144
bool fDuplicatePt
Definition: SkOpSpan.h:172
@ kIsAlias
Definition: SkOpSpan.h:27
@ kIsDuplicate
Definition: SkOpSpan.h:28
const SkOpPtT * active() const
Definition: SkOpSpan.cpp:22
void debugSetCoinT(int) const
bool alias() const
Definition: SkOpSpan.cpp:18
bool fCoincident
Definition: SkOpSpan.h:174
void debugResetCoinT() const
bool debugMatchID(int id) const
const SkOpPtT * debugPtT(int id) const
void insert(SkOpPtT *span)
Definition: SkOpSpan.h:87
bool coincident() const
Definition: SkOpSpan.h:43
SkOpContour * contour() const
Definition: SkOpSpan.cpp:83
void dumpBase() const
SkOpSpanBase * fSpan
Definition: SkOpSpan.h:169
SkOpContour * debugContour(int id) const
void debugAddOpp(const SkOpPtT *opp, const SkOpPtT *oppPrev) const
void init(SkOpSpanBase *, double t, const SkPoint &, bool dup)
Definition: SkOpSpan.cpp:104
bool onEnd() const
Definition: SkOpSpan.cpp:115
SkOpPtT * prev()
Definition: SkOpSpan.cpp:134
void setDeleted()
Definition: SkOpSpan.cpp:152
SkOpPtT * fNext
Definition: SkOpSpan.h:170
const SkOpPtT * debugEnder(const SkOpPtT *end) const
const SkOpPtT * find(const SkOpSegment *) const
Definition: SkOpSpan.cpp:87
const SkOpPtT * debugOppPrev(const SkOpPtT *opp) const
bool contains(const SkOpPtT *) const
Definition: SkOpSpan.cpp:36
bool duplicate() const
Definition: SkOpSpan.h:75
const SkOpPtT * starter(const SkOpPtT *end) const
Definition: SkOpSpan.h:162
void dumpAll() const
const SkOpSegment * debugSegment(int id) const
const SkOpAngle * debugAngle(int id) const
int step(const SkOpSpanBase *end) const
Definition: SkOpSpan.h:371
bool simple() const
Definition: SkOpSpan.h:338
const SkPoint & pt() const
Definition: SkOpSpan.h:306
Collapsed collapsed(double s, double e) const
Definition: SkOpSpan.cpp:169
SkOpAngle * fFromAngle
Definition: SkOpSpan.h:408
const SkOpSpan * prev() const
Definition: SkOpSpan.h:298
SkOpSpan * starter(SkOpSpanBase *end)
Definition: SkOpSpan.h:352
bool fAligned
Definition: SkOpSpan.h:411
void debugValidate() const
bool containsCoinEnd(const SkOpSpanBase *coin) const
Definition: SkOpSpan.h:206
SkOpSpanBase * fCoinEnd
Definition: SkOpSpan.h:407
void merge(SkOpSpan *span)
Definition: SkOpSpan.cpp:259
const SkOpAngle * debugAngle(int id) const
const SkOpSpanBase * coinEnd() const
Definition: SkOpSpan.h:198
bool mergeMatches(SkOpSpanBase *opp)
Definition: SkOpSpan.cpp:313
SkOpPtT fPtT
Definition: SkOpSpan.h:405
void insertCoinEnd(SkOpSpanBase *coin)
Definition: SkOpSpan.h:282
const SkOpCoincidence * debugCoincidence() const
void setFromAngle(SkOpAngle *angle)
Definition: SkOpSpan.h:330
SkOpContour * contour() const
Definition: SkOpSpan.cpp:235
int spanAddsCount() const
Definition: SkOpSpan.h:343
void setChased(bool chased)
Definition: SkOpSpan.h:326
SkOpSpan * prev()
Definition: SkOpSpan.h:302
SkOpGlobalState * globalState() const
Definition: SkOpSpan.cpp:239
void dumpHead() const
void initBase(SkOpSegment *parent, SkOpSpan *prev, double t, const SkPoint &pt)
Definition: SkOpSpan.cpp:243
bool addOpp(SkOpSpanBase *opp)
Definition: SkOpSpan.cpp:158
const SkOpSegment * debugSegment(int id) const
SkOpAngle * fromAngle() const
Definition: SkOpSpan.h:275
void unaligned()
Definition: SkOpSpan.h:379
void bumpSpanAdds()
Definition: SkOpSpan.h:188
int debugID() const
Definition: SkOpSpan.h:224
bool debugAlignedEnd(double t, const SkPoint &pt) const
void setAligned()
Definition: SkOpSpan.h:322
const SkOpSpanBase * debugSpan(int id) const
SkOpContour * debugContour(int id) const
bool fChased
Definition: SkOpSpan.h:412
void dumpBase() const
const SkOpSpan * debugStarter(SkOpSpanBase const **endPtr) const
void debugResetCoinT() const
void dumpCoin() const
bool debugCoinEndLoopCheck() const
const SkOpSpan * upCastable() const
Definition: SkOpSpan.h:397
bool deleted() const
Definition: SkOpSpan.h:261
int debugBumpCount()
Definition: SkOpSpan.h:220
SkOpPtT * ptT()
Definition: SkOpSpan.h:314
SkOpSpan * fPrev
Definition: SkOpSpan.h:409
SkOpSpan * starter(SkOpSpanBase **endPtr)
Definition: SkOpSpan.h:358
bool contains(const SkOpSpanBase *) const
Definition: SkOpSpan.cpp:197
const SkOpPtT * debugPtT(int id) const
void dump() const
SkDEBUGCODE(int fCount;) SkDEBUGCODE(int fID
bool debugAlignedInner() const
void setPrev(SkOpSpan *prev)
Definition: SkOpSpan.h:334
SkOpSegment * fSegment
Definition: SkOpSpan.h:406
const SkOpSpan * upCast() const
Definition: SkOpSpan.h:388
void dumpAll() const
const SkOpSpan * starter(const SkOpSpanBase *end) const
Definition: SkOpSpan.h:347
double t() const
Definition: SkOpSpan.h:375
void checkForCollapsedCoincidence()
Definition: SkOpSpan.cpp:288
SkOpSpan * upCastable()
Definition: SkOpSpan.h:393
SkOpSpan * upCast()
Definition: SkOpSpan.h:383
int fSpanAdds
Definition: SkOpSpan.h:410
bool chased() const
Definition: SkOpSpan.h:192
void debugSetCoinT(int) const
SkOpSegment * segment() const
Definition: SkOpSpan.h:318
const SkOpPtT * ptT() const
Definition: SkOpSpan.h:310
void setToAngle(SkOpAngle *angle)
Definition: SkOpSpan.h:533
bool sortableTop(SkOpContour *)
int windSum() const
Definition: SkOpSpan.h:555
void setWindValue(int windValue)
Definition: SkOpSpan.h:540
int computeWindSum()
Definition: SkOpSpan.cpp:378
bool insertCoincidence(const SkOpSegment *, bool flipped, bool ordered)
Definition: SkOpSpan.cpp:413
SkOpSpanBase * next() const
Definition: SkOpSpan.h:495
bool containsCoincidence(const SkOpSpan *coin) const
Definition: SkOpSpan.h:439
void setNext(SkOpSpanBase *nextT)
Definition: SkOpSpan.h:519
void insertCoincidence(SkOpSpan *coin)
Definition: SkOpSpan.h:468
void dumpCoin() const
void setOppValue(int oppValue)
Definition: SkOpSpan.h:526
bool alreadyAdded() const
Definition: SkOpSpan.h:420
int oppValue() const
Definition: SkOpSpan.h:505
void setWindSum(int windSum)
Definition: SkOpSpan.cpp:482
bool isCanceled() const
Definition: SkOpSpan.h:481
int oppSum() const
Definition: SkOpSpan.h:500
bool clearCoincident()
Definition: SkOpSpan.h:427
SkOpPtT * setCoinStart(SkOpSpan *oldCoinStart, SkOpSegment *oppSegment)
bool isCoincident() const
Definition: SkOpSpan.h:486
bool done() const
Definition: SkOpSpan.h:459
SkOpAngle * toAngle() const
Definition: SkOpSpan.h:550
bool containsCoincidence(const SkOpSegment *) const
Definition: SkOpSpan.cpp:387
void markAdded()
Definition: SkOpSpan.h:491
bool debugCoinLoopCheck() const
bool dumpSpan() const
void setDone(bool done)
Definition: SkOpSpan.h:514
void setOppSum(int oppSum)
Definition: SkOpSpan.cpp:472
void release(const SkOpPtT *)
Definition: SkOpSpan.cpp:446
int windValue() const
Definition: SkOpSpan.h:560
void init(SkOpSegment *parent, SkOpSpan *prev, double t, const SkPoint &pt)
Definition: SkOpSpan.cpp:398
struct MyStruct s
glong glong end
GAsyncResult * result