int SkIntersections::horizontal(const SkDLine& line, double left, double right, double y, bool flipped) { fMax = 3; // clean up parallel at the end will limit the result to 2 at the most // see if end points intersect the opposite line double t; const SkDPoint leftPt = { left, y }; if ((t = line.exactPoint(leftPt)) >= 0) { insert(t, (double) flipped, leftPt); } if (left != right) { const SkDPoint rightPt = { right, y }; if ((t = line.exactPoint(rightPt)) >= 0) { insert(t, (double) !flipped, rightPt); } for (int index = 0; index < 2; ++index) { if ((t = SkDLine::ExactPointH(line[index], left, right, y)) >= 0) { insert((double) index, flipped ? 1 - t : t, line[index]); } } } int result = horizontal_coincident(line, y); if (result == 1 && fUsed == 0) { fT[0][0] = HorizontalIntercept(line, y); double xIntercept = line[0].fX + fT[0][0] * (line[1].fX - line[0].fX); if (between(left, xIntercept, right)) { fT[1][0] = (xIntercept - left) / (right - left); if (flipped) { // OPTIMIZATION: ? instead of swapping, pass original line, use [1].fX - [0].fX for (int index = 0; index < result; ++index) { fT[1][index] = 1 - fT[1][index]; } } fPt[0].fX = xIntercept; fPt[0].fY = y; fUsed = 1; } } if (fAllowNear || result == 2) { if ((t = line.nearPoint(leftPt, nullptr)) >= 0) { insert(t, (double) flipped, leftPt); } if (left != right) { const SkDPoint rightPt = { right, y }; if ((t = line.nearPoint(rightPt, nullptr)) >= 0) { insert(t, (double) !flipped, rightPt); } for (int index = 0; index < 2; ++index) { if ((t = SkDLine::NearPointH(line[index], left, right, y)) >= 0) { insert((double) index, flipped ? 1 - t : t, line[index]); } } } } cleanUpParallelLines(result == 2); return fUsed; }
int SkIntersections::horizontal(const SkDLine& line, double y) { fMax = 2; int horizontalType = horizontal_coincident(line, y); if (horizontalType == 1) { fT[0][0] = horizontal_intercept(line, y); } else if (horizontalType == 2) { fT[0][0] = 0; fT[0][1] = 1; } return fUsed = horizontalType; }