double TOfNextMajor(Edge *e, EdgeList *es, double sought_m ) { /* We want to find t so that Mspline(t) = sought_m */ /* the curve is monotonic */ Spline1D *msp = &e->spline->splines[es->major]; double new_t; if ( es->is_overlap ) { /* if we've adjusted the height then we won't be able to find it restricting */ /* t between [0,1] as we do. So it's a special case. (this is to handle */ /* hstem hints) */ if ( e->max_adjusted && sought_m==e->mmax ) { e->m_cur = sought_m; return( e->up?1.0:0.0 ); } new_t = IterateSplineSolve(msp,e->t_mmin,e->t_mmax,(sought_m+es->mmin)/es->scale,.001); if ( new_t==-1 ) IError( "No Solution"); e->m_cur = (((msp->a*new_t + msp->b)*new_t+msp->c)*new_t + msp->d)*es->scale - es->mmin; return( new_t ); } else { Spline *sp = e->spline; if ( sp->islinear ) { new_t = e->t_cur + (sought_m-e->m_cur)/(es->scale * msp->c); e->m_cur = (msp->c*new_t + msp->d)*es->scale - es->mmin; return( new_t ); } /* if we have a spline that is nearly horizontal at its max. endpoint */ /* then finding A value of t for which y has the right value isn't good */ /* enough (at least not when finding intersections) */ if ( sought_m+1>e->mmax ) { e->m_cur = e->mmax; return( e->t_mmax ); } /* if we've adjusted the height then we won't be able to find it restricting */ /* t between [0,1] as we do. So it's a special case. (this is to handle */ /* hstem hints) */ if ( e->max_adjusted && sought_m==e->mmax ) { e->m_cur = sought_m; return( e->up?1.0:0.0 ); } new_t = IterateSplineSolve(msp,e->t_mmin,e->t_mmax,(sought_m+es->mmin)/es->scale,.001); if ( new_t==-1 ) IError( "No Solution"); e->m_cur = (((msp->a*new_t + msp->b)*new_t+msp->c)*new_t + msp->d)*es->scale - es->mmin; return( new_t ); } }
static double MonotonicFindY(Monotonic *m,double test,double old_t) { double tstart, tend, t; tstart = m->tstart; tend = m->tend; if ( old_t!=-1 ) { if ( m->yup ) tstart = old_t; else tend = old_t; } t = IterateSplineSolve(&m->s->splines[1],tstart,tend,test); return( t ); }