bool SkOpContour::addCoincident(int index, SkOpContour* other, int otherIndex, const SkIntersections& ts, bool swap) { SkPoint pt0 = ts.pt(0).asSkPoint(); SkPoint pt1 = ts.pt(1).asSkPoint(); if (pt0 == pt1) { // FIXME: one could imagine a case where it would be incorrect to ignore this // suppose two self-intersecting cubics overlap to be coincident -- // this needs to check that by some measure the t values are far enough apart // or needs to check to see if the self-intersection bit was set on the cubic segment return false; } SkCoincidence& coincidence = fCoincidences.push_back(); coincidence.fOther = other; coincidence.fSegments[0] = index; coincidence.fSegments[1] = otherIndex; coincidence.fTs[swap][0] = ts[0][0]; coincidence.fTs[swap][1] = ts[0][1]; coincidence.fTs[!swap][0] = ts[1][0]; coincidence.fTs[!swap][1] = ts[1][1]; coincidence.fPts[swap][0] = pt0; coincidence.fPts[swap][1] = pt1; bool nearStart = ts.nearlySame(0); bool nearEnd = ts.nearlySame(1); coincidence.fPts[!swap][0] = nearStart ? ts.pt2(0).asSkPoint() : pt0; coincidence.fPts[!swap][1] = nearEnd ? ts.pt2(1).asSkPoint() : pt1; coincidence.fNearly[0] = nearStart; coincidence.fNearly[1] = nearEnd; return true; }