7#ifndef SkOpSegment_DEFINE
8#define SkOpSegment_DEFINE
38 return fBounds.
fTop < rh.fBounds.
fTop;
50 int* sumMiWinding,
int* sumSuWinding);
75 angle->
set(&fTail, fTail.
prev());
93 angle->
set(&fHead, fHead.
next());
140 const SkOpPtT* debugAddT(
double t, SkPathOpsDebug::GlitchLog* )
const;
144 void debugCheckAngleCoin()
const;
147 void debugCheckHealth(SkPathOpsDebug::GlitchLog* )
const;
148 void debugClearAll(SkPathOpsDebug::GlitchLog* glitches)
const;
149 void debugClearOne(
const SkOpSpan* span, SkPathOpsDebug::GlitchLog* glitches)
const;
160 void debugMissingCoincidence(SkPathOpsDebug::GlitchLog* glitches)
const;
161 void debugMoveMultiples(SkPathOpsDebug::GlitchLog* glitches)
const;
162 void debugMoveNearby(SkPathOpsDebug::GlitchLog* glitches)
const;
168#if DEBUG_ACTIVE_SPANS
169 void debugShowActiveSpans(
SkString* str)
const;
172 void debugShowNewWinding(
const char* fun,
const SkOpSpan* span,
int winding);
173 void debugShowNewWinding(
const char* fun,
const SkOpSpan* span,
int winding,
int oppWinding);
179#if DEBUG_COINCIDENCE_ORDER
180 void debugResetCoinT()
const;
181 void debugSetCoinT(
int,
SkScalar )
const;
185 static void DebugClearVisited(
const SkOpSpanBase* span);
187 bool debugVisited()
const {
188 if (!fDebugVisited) {
189 fDebugVisited =
true;
197 double distSq(
double t,
const SkOpAngle* opp)
const;
202 return fDoneCount == fCount;
221 void dumpPts(
const char* prefix =
"seg")
const;
227 SkPathOp op,
int xorMiMask,
int xorSuMask);
294 bool markAngle(
int maxWinding,
int sumWinding,
int oppMaxWinding,
int oppSumWinding,
313 :
end->upCast()->oppValue();
348 void resetDebugVisited()
const {
349 fDebugVisited =
false;
371 *maxWinding = *sumWinding;
375 *sumWinding -= deltaSum;
379 int* maxWinding,
int* sumWinding);
381 int* maxWinding,
int* sumWinding,
int* oppMaxWinding,
int* oppSumWinding);
387 :
end->upCast()->windValue();
453 mutable bool fDebugVisited;
455#if DEBUG_COINCIDENCE_ORDER
456 mutable int fDebugBaseIndex;
459 mutable int fDebugLastIndex;
static int step(int x, SkScalar min, SkScalar max)
#define check(reporter, ref, unref, make, kill)
static constexpr int32_t SK_MinS32
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)
int SkPathOpsVerbToPoints(SkPath::Verb verb)
auto make(Ctor &&ctor) -> decltype(ctor(nullptr))
SkOpSpanBase * end() const
void set(SkOpSpanBase *start, SkOpSpanBase *end)
SkOpSpanBase * start() const
SkArenaAlloc * allocator()
void setAllocatedOpSpan()
void addOpp(SkOpPtT *opp, SkOpPtT *oppPrev)
const SkOpSegment * segment() const
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)
void debugValidate() const
const SkOpPtT * debugPtT(int id) const
void joinEnds(SkOpSegment *start)
bool done(const SkOpAngle *angle) 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)
const SkPoint & lastPt() 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 *)
int windSum(const SkOpAngle *angle) const
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
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
const SkOpSegment * prev() const
SkOpAngle * activeAngleOther(SkOpSpanBase *start, SkOpSpanBase **startPtr, SkOpSpanBase **endPtr, bool *done)
const SkOpSpanBase * tail() const
bool activeWinding(SkOpSpanBase *start, SkOpSpanBase *end)
int updateWindingReverse(const SkOpAngle *angle)
static int SpanSign(const SkOpSpanBase *start, const SkOpSpanBase *end)
void init(SkPoint pts[], SkScalar weight, SkOpContour *parent, SkPath::Verb verb)
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)
SkOpAngle * debugLastAngle()
SkOpGlobalState * globalState() const
SkOpAngle * activeAngleInner(SkOpSpanBase *start, SkOpSpanBase **startPtr, SkOpSpanBase **endPtr, bool *done)
SkOpSpan * insert(SkOpSpan *prev)
void setUpWinding(SkOpSpanBase *start, SkOpSpanBase *end, int *maxWinding, int *sumWinding)
void release(const SkOpSpan *)
static void ClearVisited(SkOpSpanBase *span)
static int OppSign(const SkOpSpanBase *start, const SkOpSpanBase *end)
int updateWinding(SkOpSpanBase *start, SkOpSpanBase *end)
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)
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 contains(double t) const
const SkPoint * pts() const
SkOpSegment * addQuad(SkPoint pts[3], SkOpContour *parent)
const SkOpSpanBase * debugSpan(int id) const
const SkOpAngle * debugAngle(int id) const
bool missingCoincidence()
void dumpPts(const char *prefix="seg") const
void clearOne(SkOpSpan *span)
int updateOppWindingReverse(const SkOpAngle *angle) 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
const SkOpSegment * debugSegment(int id) const
SkOpAngle * addStartSpan()
bool isHorizontal() const
SkOpContour * contour() const
bool spansNearby(const SkOpSpanBase *ref, const SkOpSpanBase *check, bool *found) const
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)
int updateOppWinding(const SkOpSpanBase *start, const SkOpSpanBase *end) const
const SkOpSpan * prev() const
void setFromAngle(SkOpAngle *angle)
const SkOpSpan * starter(const SkOpSpanBase *end) const
const SkOpPtT * ptT() const
void setToAngle(SkOpAngle *angle)
SkOpSpanBase * next() const
const SkDConic & set(const SkPoint pts[kPointCount], SkScalar weight SkDEBUGPARAMS(SkOpGlobalState *state=nullptr))
const SkDCubic & set(const SkPoint pts[kPointCount] SkDEBUGPARAMS(SkOpGlobalState *state=nullptr))
void setCubicBounds(const SkPoint curve[4], SkScalar, double s, double e, SkPathOpsBounds *)
void setConicBounds(const SkPoint curve[3], SkScalar curveWeight, double s, double e, SkPathOpsBounds *)
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
SkScalar fLeft
smaller x-axis bounds
SkScalar fRight
larger x-axis bounds
void setBounds(const SkPoint pts[], int count)
SkScalar fTop
smaller y-axis bounds