Flutter Engine
The Flutter Engine
SkOpSegment.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 SkOpSegment_DEFINE
8#define SkOpSegment_DEFINE
9
10#include "include/core/SkPath.h"
27
28enum class SkOpRayDir;
29class SkOpCoincidence;
30class SkOpContour;
31class SkPathWriter;
32struct SkOpRayHit;
33template <typename T> class SkTDArray;
34
36public:
37 bool operator<(const SkOpSegment& rh) const {
38 return fBounds.fTop < rh.fBounds.fTop;
39 }
40
42 bool* done);
44 SkOpSpanBase** endPtr, bool* done);
46 SkOpSpanBase** endPtr, bool* done);
47 bool activeOp(SkOpSpanBase* start, SkOpSpanBase* end, int xorMiMask, int xorSuMask,
48 SkPathOp op);
49 bool activeOp(int xorMiMask, int xorSuMask, SkOpSpanBase* start, SkOpSpanBase* end, SkPathOp op,
50 int* sumMiWinding, int* sumSuWinding);
51
53 bool activeWinding(SkOpSpanBase* start, SkOpSpanBase* end, int* sumWinding);
54
57 SkDCurve curve;
58 curve.fConic.set(pts, weight);
59 curve.setConicBounds(pts, weight, 0, 1, &fBounds);
60 return this;
61 }
62
64 init(pts, 1, parent, SkPath::kCubic_Verb);
65 SkDCurve curve;
66 curve.fCubic.set(pts);
67 curve.setCubicBounds(pts, 1, 0, 1, &fBounds);
68 return this;
69 }
70
71 bool addCurveTo(const SkOpSpanBase* start, const SkOpSpanBase* end, SkPathWriter* path) const;
72
74 SkOpAngle* angle = this->globalState()->allocator()->make<SkOpAngle>();
75 angle->set(&fTail, fTail.prev());
76 fTail.setFromAngle(angle);
77 return angle;
78 }
79
80 bool addExpanded(double newT, const SkOpSpanBase* test, bool* startOver);
81
83 SkASSERT(pts[0] != pts[1]);
84 init(pts, 1, parent, SkPath::kLine_Verb);
85 fBounds.setBounds(pts, 2);
86 return this;
87 }
88
89 SkOpPtT* addMissing(double t, SkOpSegment* opp, bool* allExist);
90
92 SkOpAngle* angle = this->globalState()->allocator()->make<SkOpAngle>();
93 angle->set(&fHead, fHead.next());
94 fHead.setToAngle(angle);
95 return angle;
96 }
97
99 init(pts, 1, parent, SkPath::kQuad_Verb);
100 SkDCurve curve;
101 curve.fQuad.set(pts);
102 curve.setQuadBounds(pts, 1, 0, 1, &fBounds);
103 return this;
104 }
105
106 SkOpPtT* addT(double t);
107 SkOpPtT* addT(double t, const SkPoint& pt);
108
109 const SkPathOpsBounds& bounds() const {
110 return fBounds;
111 }
112
113 void bumpCount() {
114 ++fCount;
115 }
116
117 void calcAngles();
118 SkOpSpanBase::Collapsed collapsed(double startT, double endT) const;
119 static bool ComputeOneSum(const SkOpAngle* baseAngle, SkOpAngle* nextAngle,
121 static bool ComputeOneSumReverse(SkOpAngle* baseAngle, SkOpAngle* nextAngle,
124
125 void clearAll();
126 void clearOne(SkOpSpan* span);
127 static void ClearVisited(SkOpSpanBase* span);
128 bool contains(double t) const;
129
131 return fContour;
132 }
133
134 int count() const {
135 return fCount;
136 }
137
138 void debugAddAngle(double startT, double endT);
139#if DEBUG_COIN
140 const SkOpPtT* debugAddT(double t, SkPathOpsDebug::GlitchLog* ) const;
141#endif
142 const SkOpAngle* debugAngle(int id) const;
143#if DEBUG_ANGLE
144 void debugCheckAngleCoin() const;
145#endif
146#if DEBUG_COIN
147 void debugCheckHealth(SkPathOpsDebug::GlitchLog* ) const;
148 void debugClearAll(SkPathOpsDebug::GlitchLog* glitches) const;
149 void debugClearOne(const SkOpSpan* span, SkPathOpsDebug::GlitchLog* glitches) const;
150#endif
151 const SkOpCoincidence* debugCoincidence() const;
152 SkOpContour* debugContour(int id) const;
153
154 int debugID() const {
155 return SkDEBUGRELEASE(fID, -1);
156 }
157
159#if DEBUG_COIN
160 void debugMissingCoincidence(SkPathOpsDebug::GlitchLog* glitches) const;
161 void debugMoveMultiples(SkPathOpsDebug::GlitchLog* glitches) const;
162 void debugMoveNearby(SkPathOpsDebug::GlitchLog* glitches) const;
163#endif
164 const SkOpPtT* debugPtT(int id) const;
165 void debugReset();
166 const SkOpSegment* debugSegment(int id) const;
167
168#if DEBUG_ACTIVE_SPANS
169 void debugShowActiveSpans(SkString* str) const;
170#endif
171#if DEBUG_MARK_DONE
172 void debugShowNewWinding(const char* fun, const SkOpSpan* span, int winding);
173 void debugShowNewWinding(const char* fun, const SkOpSpan* span, int winding, int oppWinding);
174#endif
175
176 const SkOpSpanBase* debugSpan(int id) const;
177 void debugValidate() const;
178
179#if DEBUG_COINCIDENCE_ORDER
180 void debugResetCoinT() const;
181 void debugSetCoinT(int, SkScalar ) const;
182#endif
183
184#if DEBUG_COIN
185 static void DebugClearVisited(const SkOpSpanBase* span);
186
187 bool debugVisited() const {
188 if (!fDebugVisited) {
189 fDebugVisited = true;
190 return false;
191 }
192 return true;
193 }
194#endif
195
196#if DEBUG_ANGLE
197 double distSq(double t, const SkOpAngle* opp) const;
198#endif
199
200 bool done() const {
201 SkOPASSERT(fDoneCount <= fCount);
202 return fDoneCount == fCount;
203 }
204
205 bool done(const SkOpAngle* angle) const {
206 return angle->start()->starter(angle->end())->done();
207 }
208
209 SkDPoint dPtAtT(double mid) const {
210 return (*CurveDPointAtT[fVerb])(fPts, fWeight, mid);
211 }
212
213 SkDVector dSlopeAtT(double mid) const {
214 return (*CurveDSlopeAtT[fVerb])(fPts, fWeight, mid);
215 }
216
217 void dump() const;
218 void dumpAll() const;
219 void dumpAngles() const;
220 void dumpCoin() const;
221 void dumpPts(const char* prefix = "seg") const;
222 void dumpPtsInner(const char* prefix = "seg") const;
223
224 const SkOpPtT* existing(double t, const SkOpSegment* opp) const;
226 SkOpSpanBase** nextEnd, bool* unsortable, bool* simple,
227 SkPathOp op, int xorMiMask, int xorSuMask);
229 SkOpSpanBase** nextEnd, bool* unsortable);
230 SkOpSegment* findNextXor(SkOpSpanBase** nextStart, SkOpSpanBase** nextEnd, bool* unsortable);
233
234 const SkOpSpan* head() const {
235 return &fHead;
236 }
237
239 return &fHead;
240 }
241
243
246 globalState->setAllocatedOpSpan();
249 result->setPrev(prev);
251 SkDEBUGCODE(result->ptT()->fT = 0);
252 result->setNext(next);
253 if (next) {
255 }
256 return result;
257 }
258
259 bool isClose(double t, const SkOpSegment* opp) const;
260
261 bool isHorizontal() const {
262 return fBounds.fTop == fBounds.fBottom;
263 }
264
266 return nextChase(end, step, nullptr, nullptr);
267 }
268
269 bool isVertical() const {
270 return fBounds.fLeft == fBounds.fRight;
271 }
272
274 return (*CurveIsVertical[fVerb])(fPts, fWeight, start->t(), end->t());
275 }
276
277 bool isXor() const;
278
280 fTail.ptT()->addOpp(start->fHead.ptT(), start->fHead.ptT());
281 }
282
283 const SkPoint& lastPt() const {
284 return fPts[SkPathOpsVerbToPoints(fVerb)];
285 }
286
287 void markAllDone();
290 SkOpSpanBase** lastPtr);
292 int oppWinding, SkOpSpanBase** lastPtr);
293 bool markAngle(int maxWinding, int sumWinding, const SkOpAngle* angle, SkOpSpanBase** result);
294 bool markAngle(int maxWinding, int sumWinding, int oppMaxWinding, int oppSumWinding,
295 const SkOpAngle* angle, SkOpSpanBase** result);
296 void markDone(SkOpSpan* );
297 bool markWinding(SkOpSpan* , int winding);
298 bool markWinding(SkOpSpan* , int winding, int oppWinding);
299 bool match(const SkOpPtT* span, const SkOpSegment* parent, double t, const SkPoint& pt) const;
300 bool missingCoincidence();
301 bool moveMultiples();
302 bool moveNearby();
303
304 SkOpSegment* next() const {
305 return fNext;
306 }
307
308 SkOpSegment* nextChase(SkOpSpanBase** , int* step, SkOpSpan** , SkOpSpanBase** last) const;
309 bool operand() const;
310
311 static int OppSign(const SkOpSpanBase* start, const SkOpSpanBase* end) {
312 int result = start->t() < end->t() ? -start->upCast()->oppValue()
313 : end->upCast()->oppValue();
314 return result;
315 }
316
317 bool oppXor() const;
318
319 const SkOpSegment* prev() const {
320 return fPrev;
321 }
322
323 SkPoint ptAtT(double mid) const {
324 return (*CurvePointAtT[fVerb])(fPts, fWeight, mid);
325 }
326
327 const SkPoint* pts() const {
328 return fPts;
329 }
330
331 bool ptsDisjoint(const SkOpPtT& span, const SkOpPtT& test) const {
332 SkASSERT(this == span.segment());
333 SkASSERT(this == test.segment());
334 return ptsDisjoint(span.fT, span.fPt, test.fT, test.fPt);
335 }
336
337 bool ptsDisjoint(const SkOpPtT& span, double t, const SkPoint& pt) const {
338 SkASSERT(this == span.segment());
339 return ptsDisjoint(span.fT, span.fPt, t, pt);
340 }
341
342 bool ptsDisjoint(double t1, const SkPoint& pt1, double t2, const SkPoint& pt2) const;
343
345 void release(const SkOpSpan* );
346
347#if DEBUG_COIN
348 void resetDebugVisited() const {
349 fDebugVisited = false;
350 }
351#endif
352
354 fVisited = false;
355 }
356
358 fContour = contour;
359 }
360
362 fNext = next;
363 }
364
366 fPrev = prev;
367 }
368
369 void setUpWinding(SkOpSpanBase* start, SkOpSpanBase* end, int* maxWinding, int* sumWinding) {
370 int deltaSum = SpanSign(start, end);
371 *maxWinding = *sumWinding;
372 if (*sumWinding == SK_MinS32) {
373 return;
374 }
375 *sumWinding -= deltaSum;
376 }
377
378 void setUpWindings(SkOpSpanBase* start, SkOpSpanBase* end, int* sumMiWinding,
379 int* maxWinding, int* sumWinding);
380 void setUpWindings(SkOpSpanBase* start, SkOpSpanBase* end, int* sumMiWinding, int* sumSuWinding,
381 int* maxWinding, int* sumWinding, int* oppMaxWinding, int* oppSumWinding);
382 bool sortAngles();
383 bool spansNearby(const SkOpSpanBase* ref, const SkOpSpanBase* check, bool* found) const;
384
385 static int SpanSign(const SkOpSpanBase* start, const SkOpSpanBase* end) {
386 int result = start->t() < end->t() ? -start->upCast()->windValue()
387 : end->upCast()->windValue();
388 return result;
389 }
390
392 SkASSERT(start != end);
393 return start->t() < end->t() ? start->upCast()->toAngle() : start->fromAngle();
394 }
395
396 bool subDivide(const SkOpSpanBase* start, const SkOpSpanBase* end, SkDCurve* result) const;
397
398 const SkOpSpanBase* tail() const {
399 return &fTail;
400 }
401
403 return &fTail;
404 }
405
406 bool testForCoincidence(const SkOpPtT* priorPtT, const SkOpPtT* ptT, const SkOpSpanBase* prior,
407 const SkOpSpanBase* spanBase, const SkOpSegment* opp) const;
408
410 int updateOppWinding(const SkOpSpanBase* start, const SkOpSpanBase* end) const;
411 int updateOppWinding(const SkOpAngle* angle) const;
412 int updateOppWindingReverse(const SkOpAngle* angle) const;
414 int updateWinding(SkOpAngle* angle);
415 int updateWindingReverse(const SkOpAngle* angle);
416
417 static bool UseInnerWinding(int outerWinding, int innerWinding);
418
420 return fVerb;
421 }
422
423 // look for two different spans that point to the same opposite segment
424 bool visited() {
425 if (!fVisited) {
426 fVisited = true;
427 return false;
428 }
429 return true;
430 }
431
432 SkScalar weight() const {
433 return fWeight;
434 }
435
436 SkOpSpan* windingSpanAtT(double tHit);
437 int windSum(const SkOpAngle* angle) const;
438
439private:
440 SkOpSpan fHead; // the head span always has its t set to zero
441 SkOpSpanBase fTail; // the tail span always has its t set to one
442 SkOpContour* fContour;
443 SkOpSegment* fNext; // forward-only linked list used by contour to walk the segments
444 const SkOpSegment* fPrev;
445 SkPoint* fPts; // pointer into array of points owned by edge builder that may be tweaked
446 SkPathOpsBounds fBounds; // tight bounds
447 SkScalar fWeight;
448 int fCount; // number of spans (one for a non-intersecting segment)
449 int fDoneCount; // number of processed spans (zero initially)
450 SkPath::Verb fVerb;
451 bool fVisited; // used by missing coincidence check
452#if DEBUG_COIN
453 mutable bool fDebugVisited; // used by debug missing coincidence check
454#endif
455#if DEBUG_COINCIDENCE_ORDER
456 mutable int fDebugBaseIndex;
457 mutable SkScalar fDebugBaseMin; // if > 0, the 1st t value in this seg vis-a-vis the ref seg
458 mutable SkScalar fDebugBaseMax;
459 mutable int fDebugLastIndex;
460 mutable SkScalar fDebugLastMin; // if > 0, the last t -- next t val - base has same sign
461 mutable SkScalar fDebugLastMax;
462#endif
463 SkDEBUGCODE(int fID;)
464};
465
466#endif
static int step(int x, SkScalar min, SkScalar max)
Definition: BlurTest.cpp:215
#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
static SkDPoint(*const CurveDPointAtT[])(const SkPoint[], SkScalar, double)
static bool(*const CurveIsVertical[])(const SkPoint[], SkScalar, double, double)
static SkDVector(*const CurveDSlopeAtT[])(const SkPoint[], SkScalar, double)
static SkPoint(*const CurvePointAtT[])(const SkPoint[], SkScalar, double)
#define SkDEBUGRELEASE(a, b)
#define SkOPASSERT(cond)
int SkPathOpsVerbToPoints(SkPath::Verb verb)
SkOpRayDir
SkPathOp
Definition: SkPathOps.h:22
SkDEBUGCODE(SK_SPI) SkThreadID SkGetThreadID()
auto make(Ctor &&ctor) -> decltype(ctor(nullptr))
Definition: SkArenaAlloc.h:120
SkOpSpanBase * end() const
Definition: SkOpAngle.h:73
void set(SkOpSpanBase *start, SkOpSpanBase *end)
Definition: SkOpAngle.cpp:973
SkOpSpanBase * start() const
Definition: SkOpAngle.h:94
SkArenaAlloc * allocator()
void setAllocatedOpSpan()
SkPoint fPt
Definition: SkOpSpan.h:167
double fT
Definition: SkOpSpan.h:166
void addOpp(SkOpPtT *opp, SkOpPtT *oppPrev)
Definition: SkOpSpan.h:34
const SkOpSegment * segment() const
Definition: SkOpSpan.cpp:144
SkDVector dSlopeAtT(double mid) const
Definition: SkOpSegment.h:213
bool markWinding(SkOpSpan *, int winding)
bool isVertical(SkOpSpanBase *start, SkOpSpanBase *end) const
Definition: SkOpSegment.h:273
SkOpContour * debugContour(int id) const
void dumpPtsInner(const char *prefix="seg") const
int computeSum(SkOpSpanBase *start, SkOpSpanBase *end, SkOpAngle::IncludeType includeType)
SkOpSegment * addConic(SkPoint pts[3], SkScalar weight, SkOpContour *parent)
Definition: SkOpSegment.h:55
void debugValidate() const
const SkOpPtT * debugPtT(int id) const
bool visited()
Definition: SkOpSegment.h:424
void joinEnds(SkOpSegment *start)
Definition: SkOpSegment.h:279
int count() const
Definition: SkOpSegment.h:134
bool done(const SkOpAngle *angle) const
Definition: SkOpSegment.h:205
void dumpAngles() const
SkOpSpanBase::Collapsed collapsed(double startT, double endT) const
bool match(const SkOpPtT *span, const SkOpSegment *parent, double t, const SkPoint &pt) const
SkOpPtT * addMissing(double t, SkOpSegment *opp, bool *allExist)
SkPath::Verb verb() const
Definition: SkOpSegment.h:419
SkOpSegment * addLine(SkPoint pts[2], SkOpContour *parent)
Definition: SkOpSegment.h:82
bool operand() const
const SkPoint & lastPt() const
Definition: SkOpSegment.h:283
void dumpCoin() const
void setContour(SkOpContour *contour)
Definition: SkOpSegment.h:357
const SkOpCoincidence * debugCoincidence() const
bool testForCoincidence(const SkOpPtT *priorPtT, const SkOpPtT *ptT, const SkOpSpanBase *prior, const SkOpSpanBase *spanBase, const SkOpSegment *opp) const
SkOpSpan * findSortableTop(SkOpContour *)
bool done() const
Definition: SkOpSegment.h:200
bool sortAngles()
int windSum(const SkOpAngle *angle) const
SkOpSpan * head()
Definition: SkOpSegment.h:238
SkOpSegment * findNextOp(SkTDArray< SkOpSpanBase * > *chase, SkOpSpanBase **nextStart, SkOpSpanBase **nextEnd, bool *unsortable, bool *simple, SkPathOp op, int xorMiMask, int xorSuMask)
bool operator<(const SkOpSegment &rh) const
Definition: SkOpSegment.h:37
bool ptsDisjoint(const SkOpPtT &span, const SkOpPtT &test) const
Definition: SkOpSegment.h:331
bool isClose(double t, const SkOpSegment *opp) const
SkPoint ptAtT(double mid) const
Definition: SkOpSegment.h:323
void setPrev(SkOpSegment *prev)
Definition: SkOpSegment.h:365
SkOpSegment * nextChase(SkOpSpanBase **, int *step, SkOpSpan **, SkOpSpanBase **last) const
void rayCheck(const SkOpRayHit &base, SkOpRayDir dir, SkOpRayHit **hits, SkArenaAlloc *)
SkOpSegment * isSimple(SkOpSpanBase **end, int *step) const
Definition: SkOpSegment.h:265
const SkPathOpsBounds & bounds() const
Definition: SkOpSegment.h:109
bool moveMultiples()
const SkOpSegment * prev() const
Definition: SkOpSegment.h:319
SkOpAngle * activeAngleOther(SkOpSpanBase *start, SkOpSpanBase **startPtr, SkOpSpanBase **endPtr, bool *done)
void clearAll()
const SkOpSpanBase * tail() const
Definition: SkOpSegment.h:398
bool activeWinding(SkOpSpanBase *start, SkOpSpanBase *end)
void dump() const
int updateWindingReverse(const SkOpAngle *angle)
static int SpanSign(const SkOpSpanBase *start, const SkOpSpanBase *end)
Definition: SkOpSegment.h:385
SkOpSpanBase * tail()
Definition: SkOpSegment.h:402
SkOpSpan * undoneSpan()
void init(SkPoint pts[], SkScalar weight, SkOpContour *parent, SkPath::Verb verb)
void resetVisited()
Definition: SkOpSegment.h:353
bool markAndChaseDone(SkOpSpanBase *start, SkOpSpanBase *end, SkOpSpanBase **found)
void setUpWindings(SkOpSpanBase *start, SkOpSpanBase *end, int *sumMiWinding, int *maxWinding, int *sumWinding)
bool markAndChaseWinding(SkOpSpanBase *start, SkOpSpanBase *end, int winding, SkOpSpanBase **lastPtr)
int debugID() const
Definition: SkOpSegment.h:154
SkOpAngle * debugLastAngle()
SkScalar weight() const
Definition: SkOpSegment.h:432
SkOpGlobalState * globalState() const
SkOpAngle * activeAngleInner(SkOpSpanBase *start, SkOpSpanBase **startPtr, SkOpSpanBase **endPtr, bool *done)
Definition: SkOpSegment.cpp:65
SkOpSpan * insert(SkOpSpan *prev)
Definition: SkOpSegment.h:244
void markAllDone()
void setUpWinding(SkOpSpanBase *start, SkOpSpanBase *end, int *maxWinding, int *sumWinding)
Definition: SkOpSegment.h:369
SkOpPtT * addT(double t)
void release(const SkOpSpan *)
static void ClearVisited(SkOpSpanBase *span)
bool moveNearby()
static int OppSign(const SkOpSpanBase *start, const SkOpSpanBase *end)
Definition: SkOpSegment.h:311
int updateWinding(SkOpSpanBase *start, SkOpSpanBase *end)
void calcAngles()
bool subDivide(const SkOpSpanBase *start, const SkOpSpanBase *end, SkDCurve *result) const
const SkOpPtT * existing(double t, const SkOpSegment *opp) const
static bool ComputeOneSum(const SkOpAngle *baseAngle, SkOpAngle *nextAngle, SkOpAngle::IncludeType)
const SkOpSpan * head() const
Definition: SkOpSegment.h:234
bool addCurveTo(const SkOpSpanBase *start, const SkOpSpanBase *end, SkPathWriter *path) const
SkOpSegment * addCubic(SkPoint pts[4], SkOpContour *parent)
Definition: SkOpSegment.h:63
void debugAddAngle(double startT, double endT)
bool ptsDisjoint(const SkOpPtT &span, double t, const SkPoint &pt) const
Definition: SkOpSegment.h:337
SkOpAngle * activeAngle(SkOpSpanBase *start, SkOpSpanBase **startPtr, SkOpSpanBase **endPtr, bool *done)
Definition: SkOpSegment.cpp:54
static bool UseInnerWinding(int outerWinding, int innerWinding)
void setNext(SkOpSegment *next)
Definition: SkOpSegment.h:361
bool activeOp(SkOpSpanBase *start, SkOpSpanBase *end, int xorMiMask, int xorSuMask, SkPathOp op)
SkOpAngle * spanToAngle(SkOpSpanBase *start, SkOpSpanBase *end)
Definition: SkOpSegment.h:391
SkDPoint dPtAtT(double mid) const
Definition: SkOpSegment.h:209
bool oppXor() const
bool contains(double t) const
const SkPoint * pts() const
Definition: SkOpSegment.h:327
SkOpSegment * addQuad(SkPoint pts[3], SkOpContour *parent)
Definition: SkOpSegment.h:98
const SkOpSpanBase * debugSpan(int id) const
const SkOpAngle * debugAngle(int id) const
bool missingCoincidence()
bool isXor() const
void dumpPts(const char *prefix="seg") const
void clearOne(SkOpSpan *span)
int updateOppWindingReverse(const SkOpAngle *angle) const
bool isVertical() const
Definition: SkOpSegment.h:269
static bool ComputeOneSumReverse(SkOpAngle *baseAngle, SkOpAngle *nextAngle, SkOpAngle::IncludeType)
SkOpSpan * windingSpanAtT(double tHit)
SkOpSegment * findNextWinding(SkTDArray< SkOpSpanBase * > *chase, SkOpSpanBase **nextStart, SkOpSpanBase **nextEnd, bool *unsortable)
SkOpSegment * next() const
Definition: SkOpSegment.h:304
void dumpAll() const
const SkOpSegment * debugSegment(int id) const
SkOpAngle * addStartSpan()
Definition: SkOpSegment.h:91
bool isHorizontal() const
Definition: SkOpSegment.h:261
SkOpContour * contour() const
Definition: SkOpSegment.h:130
bool spansNearby(const SkOpSpanBase *ref, const SkOpSpanBase *check, bool *found) const
SkOpAngle * addEndSpan()
Definition: SkOpSegment.h:73
bool markAngle(int maxWinding, int sumWinding, const SkOpAngle *angle, SkOpSpanBase **result)
void markDone(SkOpSpan *)
SkOpSegment * findNextXor(SkOpSpanBase **nextStart, SkOpSpanBase **nextEnd, bool *unsortable)
bool addExpanded(double newT, const SkOpSpanBase *test, bool *startOver)
void bumpCount()
Definition: SkOpSegment.h:113
int updateOppWinding(const SkOpSpanBase *start, const SkOpSpanBase *end) const
const SkOpSpan * prev() const
Definition: SkOpSpan.h:298
void setFromAngle(SkOpAngle *angle)
Definition: SkOpSpan.h:330
const SkOpSpan * starter(const SkOpSpanBase *end) const
Definition: SkOpSpan.h:347
const SkOpPtT * ptT() const
Definition: SkOpSpan.h:310
void setToAngle(SkOpAngle *angle)
Definition: SkOpSpan.h:533
SkOpSpanBase * next() const
Definition: SkOpSpan.h:495
bool done() const
Definition: SkOpSpan.h:459
@ kConic_Verb
Definition: SkPath.h:1469
@ kCubic_Verb
Definition: SkPath.h:1470
@ kQuad_Verb
Definition: SkPath.h:1468
@ kLine_Verb
Definition: SkPath.h:1467
float SkScalar
Definition: extension.cpp:12
glong glong end
GAsyncResult * result
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
Definition: switches.h:57
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir Path to the cache directory This is different from the persistent_cache_path in embedder which is used for Skia shader cache icu native lib Path to the library file that exports the ICU data vm service The hostname IP address on which the Dart VM Service should be served If not defaults to or::depending on whether ipv6 is specified vm service A custom Dart VM Service port The default is to pick a randomly available open port disable vm Disable the Dart VM Service The Dart VM Service is never available in release mode disable vm service Disable mDNS Dart VM Service publication Bind to the IPv6 localhost address for the Dart VM Service Ignored if vm service host is set endless trace Enable an endless trace buffer The default is a ring buffer This is useful when very old events need to viewed For during application launch Memory usage will continue to grow indefinitely however Start app with an specific route defined on the framework flutter assets dir
Definition: switches.h:145
const SkDConic & set(const SkPoint pts[kPointCount], SkScalar weight SkDEBUGPARAMS(SkOpGlobalState *state=nullptr))
const SkDCubic & set(const SkPoint pts[kPointCount] SkDEBUGPARAMS(SkOpGlobalState *state=nullptr))
SkDQuad fQuad
void setCubicBounds(const SkPoint curve[4], SkScalar, double s, double e, SkPathOpsBounds *)
SkDConic fConic
void setConicBounds(const SkPoint curve[3], SkScalar curveWeight, double s, double e, SkPathOpsBounds *)
SkDCubic fCubic
void setQuadBounds(const SkPoint curve[3], SkScalar, double s, double e, SkPathOpsBounds *)
const SkDQuad & set(const SkPoint pts[kPointCount] SkDEBUGPARAMS(SkOpGlobalState *state=nullptr))
Definition: SkPathOpsQuad.h:65
SkScalar fBottom
larger y-axis bounds
Definition: extension.cpp:17
SkScalar fLeft
smaller x-axis bounds
Definition: extension.cpp:14
SkScalar fRight
larger x-axis bounds
Definition: extension.cpp:16
void setBounds(const SkPoint pts[], int count)
Definition: SkRect.h:881
SkScalar fTop
smaller y-axis bounds
Definition: extension.cpp:15