Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
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();
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
344 void rayCheck(const SkOpRayHit& base, SkOpRayDir dir, SkOpRayHit** hits, SkArenaAlloc*);
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)
#define SkASSERT(cond)
Definition SkAssert.h:116
#define SkDEBUGCODE(...)
Definition SkDebug.h:23
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)
SkPathOp
Definition SkPathOps.h:22
auto make(Ctor &&ctor) -> decltype(ctor(nullptr))
SkOpSpanBase * end() const
Definition SkOpAngle.h:73
void set(SkOpSpanBase *start, SkOpSpanBase *end)
SkOpSpanBase * start() const
Definition SkOpAngle.h:94
SkArenaAlloc * allocator()
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
bool markWinding(SkOpSpan *, int winding)
bool isVertical(SkOpSpanBase *start, SkOpSpanBase *end) const
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()
void joinEnds(SkOpSegment *start)
int count() const
bool done(const SkOpAngle *angle) const
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
SkOpSegment * addLine(SkPoint pts[2], SkOpContour *parent)
Definition SkOpSegment.h:82
bool operand() const
const SkPoint & lastPt() const
void dumpCoin() const
void setContour(SkOpContour *contour)
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
int windSum(const SkOpAngle *angle) const
SkOpSpan * head()
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
bool isClose(double t, const SkOpSegment *opp) const
SkPoint ptAtT(double mid) const
void setPrev(SkOpSegment *prev)
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
const SkPathOpsBounds & bounds() const
bool moveMultiples()
const SkOpSegment * prev() const
SkOpAngle * activeAngleOther(SkOpSpanBase *start, SkOpSpanBase **startPtr, SkOpSpanBase **endPtr, bool *done)
const SkOpSpanBase * tail() const
bool activeWinding(SkOpSpanBase *start, SkOpSpanBase *end)
void dump() const
int updateWindingReverse(const SkOpAngle *angle)
static int SpanSign(const SkOpSpanBase *start, const SkOpSpanBase *end)
SkOpSpanBase * tail()
SkOpSpan * undoneSpan()
void init(SkPoint pts[], SkScalar weight, SkOpContour *parent, SkPath::Verb verb)
void resetVisited()
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
SkOpAngle * debugLastAngle()
SkScalar weight() const
SkOpGlobalState * globalState() const
SkOpAngle * activeAngleInner(SkOpSpanBase *start, SkOpSpanBase **startPtr, SkOpSpanBase **endPtr, bool *done)
SkOpSpan * insert(SkOpSpan *prev)
void markAllDone()
void setUpWinding(SkOpSpanBase *start, SkOpSpanBase *end, int *maxWinding, int *sumWinding)
SkOpPtT * addT(double t)
void release(const SkOpSpan *)
static void ClearVisited(SkOpSpanBase *span)
static int OppSign(const SkOpSpanBase *start, const SkOpSpanBase *end)
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
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
SkOpAngle * activeAngle(SkOpSpanBase *start, SkOpSpanBase **startPtr, SkOpSpanBase **endPtr, bool *done)
static bool UseInnerWinding(int outerWinding, int innerWinding)
void setNext(SkOpSegment *next)
bool activeOp(SkOpSpanBase *start, SkOpSpanBase *end, int xorMiMask, int xorSuMask, SkPathOp op)
SkOpAngle * spanToAngle(SkOpSpanBase *start, SkOpSpanBase *end)
SkDPoint dPtAtT(double mid) const
bool oppXor() const
bool contains(double t) const
const SkPoint * pts() const
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
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
void dumpAll() const
const SkOpSegment * debugSegment(int id) const
SkOpAngle * addStartSpan()
Definition SkOpSegment.h:91
bool isHorizontal() const
SkOpContour * contour() const
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()
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:1461
@ kCubic_Verb
Definition SkPath.h:1462
@ kQuad_Verb
Definition SkPath.h:1460
@ kLine_Verb
Definition SkPath.h:1459
float SkScalar
Definition extension.cpp:12
glong glong end
GAsyncResult * result
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))
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