30 bool computeWinding =
false;
33 bool unorderable =
false;
36 angle = angle->
next();
41 if ((computeWinding = unorderable || (angle == firstAngle && loop))) {
44 loop |= angle == firstAngle;
46 winding = segment->
windSum(angle);
57 int testWinding = lesser->
windSum();
63 winding = testWinding;
65 angle = angle->
next();
66 }
while (angle != firstAngle);
68 *sortablePtr = !unorderable;
69 *windingPtr = winding;
89 while (!chase->
empty()) {
97 *startPtr = last->start();
98 *endPtr = last->end();
126 while ((angle = angle->
next()) != firstAngle) {
134 if (!segment->
done(angle)) {
173 SkTQSort<SkOpContour>(list.
begin(), list.
end());
177 contour->globalState()->setContourHead(contourHead);
178 *contourList = contourHead;
179 for (
int index = 1; index <
count; ++index) {
210 if (!
contour->moveMultiples()) {
257 const int SAFETY_COUNT = 3;
258 int safetyHatch = SAFETY_COUNT;
268 if (!--safetyHatch) {
269 SkASSERT(globalState->debugSkipAssert());
309 safetyHatch = SAFETY_COUNT;
321 if (!--safetyHatch) {
322 SkASSERT(globalState->debugSkipAssert());
330#if DEBUG_COINCIDENCE_VERBOSE
static void done(const char *config, const char *src, const char *srcOptions, const char *name)
SkAssertResult(font.textToGlyphs("Hello", 5, SkTextEncoding::kUTF8, glyphs, std::size(glyphs))==count)
static float next(float f)
#define SK_INIT_TO_AVOID_WARNING
static constexpr int32_t SK_MinS32
bool SortContourList(SkOpContourHead **contourList, bool evenOdd, bool oppEvenOdd)
static void calc_angles(SkOpContourHead *contourList DEBUG_COIN_DECLARE_PARAMS())
static bool move_nearby(SkOpContourHead *contourList DEBUG_COIN_DECLARE_PARAMS())
static bool sort_angles(SkOpContourHead *contourList)
static bool missing_coincidence(SkOpContourHead *contourList DEBUG_COIN_DECLARE_PARAMS())
SkOpSegment * FindChase(SkTDArray< SkOpSpanBase * > *chase, SkOpSpanBase **startPtr, SkOpSpanBase **endPtr)
const SkOpAngle * AngleWinding(SkOpSpanBase *start, SkOpSpanBase *end, int *windingPtr, bool *sortablePtr)
SkOpSpan * FindUndone(SkOpContourHead *contourHead)
static bool move_multiples(SkOpContourHead *contourList DEBUG_COIN_DECLARE_PARAMS())
bool HandleCoincidence(SkOpContourHead *contourList, SkOpCoincidence *coincidence)
#define DEBUG_PHASE_ONLY_PARAMS(phase)
#define DEBUG_COIN_DECLARE_PARAMS()
#define DEBUG_PHASE_PARAMS(phase)
#define DEBUG_ITER_PARAMS(iteration)
#define DEBUG_ITER_ONLY_PARAMS(iteration)
#define DEBUG_STATIC_SET_PHASE(obj)
#define DEBUG_COIN_ONLY_PARAMS()
#define DEBUG_COIN_PARAMS()
SkOpSegment * segment() const
SkOpSpanBase * end() const
SkOpSpanBase * start() const
bool addExpanded(DEBUG_COIN_DECLARE_ONLY_PARAMS())
bool addEndMovedSpans(DEBUG_COIN_DECLARE_ONLY_PARAMS())
bool apply(DEBUG_COIN_DECLARE_ONLY_PARAMS())
void debugShowCoincidence() const
bool addMissing(bool *added DEBUG_COIN_DECLARE_PARAMS())
void correctEnds(DEBUG_COIN_DECLARE_ONLY_PARAMS())
bool findOverlaps(SkOpCoincidence *DEBUG_COIN_DECLARE_PARAMS()) const
bool expand(DEBUG_COIN_DECLARE_ONLY_PARAMS())
bool mark(DEBUG_COIN_DECLARE_ONLY_PARAMS())
void debugValidate() const
SkOpGlobalState * globalState() const
const SkOpSpanBase * span() const
const SkOpPtT * next() const
int windSum(const SkOpAngle *angle) const
int updateWindingReverse(const SkOpAngle *angle)
void setUpWinding(SkOpSpanBase *start, SkOpSpanBase *end, int *maxWinding, int *sumWinding)
SkOpAngle * activeAngle(SkOpSpanBase *start, SkOpSpanBase **startPtr, SkOpSpanBase **endPtr, bool *done)
SkOpAngle * spanToAngle(SkOpSpanBase *start, SkOpSpanBase *end)
bool markAngle(int maxWinding, int sumWinding, const SkOpAngle *angle, SkOpSpanBase **result)
const SkOpSpan * starter(const SkOpSpanBase *end) const
SkOpSegment * segment() const
const SkOpPtT * ptT() const
static void ShowActiveSpans(SkOpContourHead *contourList)