25 bool unsortable =
false;
38 if (!unsortable && current->
done()) {
50 SkDebugf(
"%s current id=%d from=(%1.9g,%1.9g) to=(%1.9g,%1.9g)\n", __FUNCTION__,
52 end->pt().fX,
end->pt().fY);
60 }
while (!writer->
isClosed() && (!unsortable || !
start->starter(
end)->done()));
63 if (!spanStart->
done()) {
76 if (last && !last->
chased()) {
101 bool unsortable =
false;
102 int safetyNet = 1000000;
112 if (--safetyNet < 0) {
115 if (!unsortable && current->
done()) {
127 SkDebugf(
"%s current id=%d from=(%1.9g,%1.9g) to=(%1.9g,%1.9g)\n", __FUNCTION__,
129 end->pt().fX,
end->pt().fY);
137 }
while (!writer->
isClosed() && (!unsortable || !
start->starter(
end)->done()));
140 if (!spanStart->
done()) {
160 void moveTo(
const SkPoint& currPt) {
164 bool addTrivialContourPoint(
const SkPoint& currPt) {
165 if (currPt == prevPt) {
186 if (!triv.addTrivialContourPoint(
points[3])) {
return false; }
190 if (!triv.addTrivialContourPoint(
points[2])) {
return false; }
193 if (!triv.addTrivialContourPoint(
points[1])) {
return false; }
194 if (!triv.addTrivialContourPoint(
points[0])) {
return false; }
211 if (path.isConvex()) {
215 }
else if (
result != &path) {
218 result->setFillType(fillType);
230 const char* testName =
"release";
232 if (SkPathOpsDebug::gDumpOp) {
233 DumpSimplify(path, testName);
237 SkPathOpsDebug::gSortCount = SkPathOpsDebug::gSortCountDefault;
240 if (!builder.finish()) {
243#if DEBUG_DUMP_SEGMENTS
248 result->setFillType(fillType);
257 }
while ((current = current->
next()));
263 globalState.debugAddToGlobalCoinDicts();
268#if DEBUG_DUMP_ALIGNMENT
269 contour.dumpSegments(
"aligned");
273 result->setFillType(fillType);
285 if (SkPathOpsDebug::gVerifyOp) {
287 ReportSimplifyFail(path);
290 VerifySimplify(path, *
result);
static const int points[]
static float next(float f)
bool AddIntersectTs(SkOpContour *test, SkOpContour *next, SkOpCoincidence *coincidence)
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1
bool SortContourList(SkOpContourHead **contourList, bool evenOdd, bool oppEvenOdd)
SkOpSegment * FindChase(SkTDArray< SkOpSpanBase * > *chase, SkOpSpanBase **startPtr, SkOpSpanBase **endPtr)
SkOpSpan * FindUndone(SkOpContourHead *contourHead)
bool HandleCoincidence(SkOpContourHead *contourList, SkOpCoincidence *coincidence)
SkOpSpan * FindSortableTop(SkOpContourHead *)
#define SkDEBUGPARAMS(...)
static bool bridgeWinding(SkOpContourHead *contourList, SkPathWriter *writer)
static bool bridgeXor(SkOpContourHead *contourList, SkPathWriter *writer)
static bool path_is_trivial(const SkPath &path)
bool Simplify(const SkPath &path, SkPath *result)
bool SimplifyDebug(const SkPath &path, SkPath *result SkDEBUGPARAMS(bool skipAssert) SkDEBUGPARAMS(const char *testName))
void setPhase(SkOpPhase phase)
bool activeWinding(SkOpSpanBase *start, SkOpSpanBase *end)
bool markAndChaseDone(SkOpSpanBase *start, SkOpSpanBase *end, SkOpSpanBase **found)
bool addCurveTo(const SkOpSpanBase *start, const SkOpSpanBase *end, SkPathWriter *path) const
SkOpSegment * findNextWinding(SkTDArray< SkOpSpanBase * > *chase, SkOpSpanBase **nextStart, SkOpSpanBase **nextEnd, bool *unsortable)
void markDone(SkOpSpan *)
SkOpSegment * findNextXor(SkOpSpanBase **nextStart, SkOpSpanBase **nextEnd, bool *unsortable)
void setChased(bool chased)
const SkOpSpan * starter(const SkOpSpanBase *end) const
SkOpSegment * segment() const
SkOpSpanBase * next() const
static void ShowActiveSpans(SkOpContourHead *contourList)
static bool ChaseContains(const SkTDArray< SkOpSpanBase * > &, const SkOpSpanBase *)
Verb next(SkPoint pts[4])
static float CrossProduct(const SkVector &a, const SkVector &b)