@ -4489,32 +4489,32 @@ static float stbtt__cuberoot( float x )
// x^3 + c*x^2 + b*x + a = 0
static int stbtt__solve_cubic ( float a , float b , float c , float * r )
{
float s = - a / 3 ;
float p = b - a * a / 3 ;
float q = a * ( 2 * a * a - 9 * b ) / 27 + c ;
float s = - a / 3 ;
float p = b - a * a / 3 ;
float q = a * ( 2 * a * a - 9 * b ) / 27 + c ;
float p3 = p * p * p ;
float d = q * q + 4 * p3 / 27 ;
if ( d > = 0 ) {
float z = ( float ) STBTT_sqrt ( d ) ;
float u = ( - q + z ) / 2 ;
float v = ( - q - z ) / 2 ;
u = stbtt__cuberoot ( u ) ;
v = stbtt__cuberoot ( v ) ;
r [ 0 ] = s + u + v ;
return 1 ;
} else {
float u = ( float ) STBTT_sqrt ( - p / 3 ) ;
float v = ( float ) STBTT_acos ( - STBTT_sqrt ( - 27 / p3 ) * q / 2 ) / 3 ; // p3 must be negative, since d is negative
float m = ( float ) STBTT_cos ( v ) ;
float d = q * q + 4 * p3 / 27 ;
if ( d > = 0 ) {
float z = ( float ) STBTT_sqrt ( d ) ;
float u = ( - q + z ) / 2 ;
float v = ( - q - z ) / 2 ;
u = stbtt__cuberoot ( u ) ;
v = stbtt__cuberoot ( v ) ;
r [ 0 ] = s + u + v ;
return 1 ;
} else {
float u = ( float ) STBTT_sqrt ( - p / 3 ) ;
float v = ( float ) STBTT_acos ( - STBTT_sqrt ( - 27 / p3 ) * q / 2 ) / 3 ; // p3 must be negative, since d is negative
float m = ( float ) STBTT_cos ( v ) ;
float n = ( float ) STBTT_cos ( v - 3.141592 / 2 ) * 1.732050808f ;
r [ 0 ] = s + u * 2 * m ;
r [ 1 ] = s - u * ( m + n ) ;
r [ 2 ] = s - u * ( m - n ) ;
r [ 0 ] = s + u * 2 * m ;
r [ 1 ] = s - u * ( m + n ) ;
r [ 2 ] = s - u * ( m - n ) ;
//STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe?
//STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f);
//STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f);
return 3 ;
return 3 ;
}
}