int intersect() {
     addExactEndPoints();
     if (fAllowNear) {
         addNearEndPoints();
     }
     double rootVals[3];
     int roots = intersectRay(rootVals);
     for (int index = 0; index < roots; ++index) {
         double cubicT = rootVals[index];
         double lineT = findLineT(cubicT);
         SkDPoint pt;
         if (pinTs(&cubicT, &lineT, &pt, kPointUninitialized) && uniqueAnswer(cubicT, pt)) {
             fIntersections->insert(cubicT, lineT, pt);
         }
     }
     checkCoincident();
     return fIntersections->used();
 }
 int verticalIntersect(double axisIntercept, double top, double bottom, bool flipped) {
     addExactVerticalEndPoints(top, bottom, axisIntercept);
     if (fAllowNear) {
         addNearVerticalEndPoints(top, bottom, axisIntercept);
     }
     double roots[3];
     int count = VerticalIntersect(fCubic, axisIntercept, roots);
     for (int index = 0; index < count; ++index) {
         double cubicT = roots[index];
         SkDPoint pt = { axisIntercept, fCubic.ptAtT(cubicT).fY };
         double lineT = (pt.fY - top) / (bottom - top);
         if (pinTs(&cubicT, &lineT, &pt, kPointInitialized) && uniqueAnswer(cubicT, pt)) {
             fIntersections->insert(cubicT, lineT, pt);
         }
     }
     if (flipped) {
         fIntersections->flip();
     }
     checkCoincident();
     return fIntersections->used();
 }
 int horizontalIntersect(double axisIntercept, double left, double right, bool flipped) {
     addExactHorizontalEndPoints(left, right, axisIntercept);
     if (fAllowNear) {
         addNearHorizontalEndPoints(left, right, axisIntercept);
     }
     double roots[3];
     int count = HorizontalIntersect(fCubic, axisIntercept, roots);
     for (int index = 0; index < count; ++index) {
         double cubicT = roots[index];
         SkDPoint pt = { fCubic.ptAtT(cubicT).fX,  axisIntercept };
         double lineT = (pt.fX - left) / (right - left);
         if (pinTs(&cubicT, &lineT, &pt, kPointInitialized) && uniqueAnswer(cubicT, pt)) {
             fIntersections->insert(cubicT, lineT, pt);
         }
     }
     if (flipped) {
         fIntersections->flip();
     }
     checkCoincident();
     return fIntersections->used();
 }
 int verticalIntersect(double axisIntercept, double top, double bottom, bool flipped) {
     addExactVerticalEndPoints(top, bottom, axisIntercept);
     if (fAllowNear) {
         addNearVerticalEndPoints(top, bottom, axisIntercept);
     }
     double rootVals[2];
     int roots = verticalIntersect(axisIntercept, rootVals);
     for (int index = 0; index < roots; ++index) {
         double quadT = rootVals[index];
         SkDPoint pt = fQuad.ptAtT(quadT);
         double lineT = (pt.fY - top) / (bottom - top);
         if (pinTs(&quadT, &lineT, &pt, kPointInitialized) && uniqueAnswer(quadT, pt)) {
             fIntersections->insert(quadT, lineT, pt);
         }
     }
     if (flipped) {
         fIntersections->flip();
     }
     checkCoincident();
     return fIntersections->used();
 }
 int horizontalIntersect(double axisIntercept, double left, double right, bool flipped) {
     addExactHorizontalEndPoints(left, right, axisIntercept);
     if (fAllowNear) {
         addNearHorizontalEndPoints(left, right, axisIntercept);
     }
     double rootVals[2];
     int roots = horizontalIntersect(axisIntercept, rootVals);
     for (int index = 0; index < roots; ++index) {
         double quadT = rootVals[index];
         SkDPoint pt = fQuad.ptAtT(quadT);
         double lineT = (pt.fX - left) / (right - left);
         if (pinTs(&quadT, &lineT, &pt, kPointInitialized) && uniqueAnswer(quadT, pt)) {
             fIntersections->insert(quadT, lineT, pt);
         }
     }
     if (flipped) {
         fIntersections->flip();
     }
     checkCoincident();
     return fIntersections->used();
 }