int SkIntersections::vertical(const SkDLine& line, double top, double bottom, double x, bool flipped) { fMax = 3; // cleanup parallel lines will bring this back line // see if end points intersect the opposite line double t; SkDPoint topPt = { x, top }; if ((t = line.exactPoint(topPt)) >= 0) { insert(t, (double) flipped, topPt); } if (top != bottom) { SkDPoint bottomPt = { x, bottom }; if ((t = line.exactPoint(bottomPt)) >= 0) { insert(t, (double) !flipped, bottomPt); } for (int index = 0; index < 2; ++index) { if ((t = SkDLine::ExactPointV(line[index], top, bottom, x)) >= 0) { insert((double) index, flipped ? 1 - t : t, line[index]); } } } int result = vertical_coincident(line, x); if (result == 1 && fUsed == 0) { fT[0][0] = VerticalIntercept(line, x); double yIntercept = line[0].fY + fT[0][0] * (line[1].fY - line[0].fY); if (between(top, yIntercept, bottom)) { fT[1][0] = (yIntercept - top) / (bottom - top); if (flipped) { // OPTIMIZATION: instead of swapping, pass original line, use [1].fY - [0].fY for (int index = 0; index < result; ++index) { fT[1][index] = 1 - fT[1][index]; } } fPt[0].fX = x; fPt[0].fY = yIntercept; fUsed = 1; } } if (fAllowNear || result == 2) { if ((t = line.nearPoint(topPt, nullptr)) >= 0) { insert(t, (double) flipped, topPt); } if (top != bottom) { SkDPoint bottomPt = { x, bottom }; if ((t = line.nearPoint(bottomPt, nullptr)) >= 0) { insert(t, (double) !flipped, bottomPt); } for (int index = 0; index < 2; ++index) { if ((t = SkDLine::NearPointV(line[index], top, bottom, x)) >= 0) { insert((double) index, flipped ? 1 - t : t, line[index]); } } } } cleanUpParallelLines(result == 2); SkASSERT(fUsed <= 2); return fUsed; }
int SkIntersections::vertical(const SkDLine& line, double x) { fMax = 2; int verticalType = vertical_coincident(line, x); if (verticalType == 1) { fT[0][0] = vertical_intercept(line, x); } else if (verticalType == 2) { fT[0][0] = 0; fT[0][1] = 1; } return fUsed = verticalType; }