@ -4587,18 +4587,17 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
for ( i = 0 ; i < num_verts ; + + i ) {
for ( i = 0 ; i < num_verts ; + + i ) {
float x0 = verts [ i ] . x * scale_x , y0 = verts [ i ] . y * scale_y ;
float x0 = verts [ i ] . x * scale_x , y0 = verts [ i ] . y * scale_y ;
// check against every point here rather than inside line/curve primitives -- @TODO: wrong if multiple 'moves' in a row produce a garbage point, and given culling, probably more efficient to do within line/curve
if ( verts [ i ] . type = = STBTT_vline & & precompute [ i ] ! = 0.0f ) {
float dist2 = ( x0 - sx ) * ( x0 - sx ) + ( y0 - sy ) * ( y0 - sy ) ;
float x1 = verts [ i - 1 ] . x * scale_x , y1 = verts [ i - 1 ] . y * scale_y ;
float dist , dist2 = ( x0 - sx ) * ( x0 - sx ) + ( y0 - sy ) * ( y0 - sy ) ;
if ( dist2 < min_dist * min_dist )
if ( dist2 < min_dist * min_dist )
min_dist = ( float ) STBTT_sqrt ( dist2 ) ;
min_dist = ( float ) STBTT_sqrt ( dist2 ) ;
if ( verts [ i ] . type = = STBTT_vline ) {
float x1 = verts [ i - 1 ] . x * scale_x , y1 = verts [ i - 1 ] . y * scale_y ;
// coarse culling against bbox
// coarse culling against bbox
//if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist &&
//if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist &&
// sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist)
// sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist)
float dist = ( float ) STBTT_fabs ( ( x1 - x0 ) * ( y0 - sy ) - ( y1 - y0 ) * ( x0 - sx ) ) * precompute [ i ] ;
dist = ( float ) STBTT_fabs ( ( x1 - x0 ) * ( y0 - sy ) - ( y1 - y0 ) * ( x0 - sx ) ) * precompute [ i ] ;
STBTT_assert ( i ! = 0 ) ;
STBTT_assert ( i ! = 0 ) ;
if ( dist < min_dist ) {
if ( dist < min_dist ) {
// check position along line
// check position along line
@ -4625,7 +4624,7 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
float ax = x1 - x0 , ay = y1 - y0 ;
float ax = x1 - x0 , ay = y1 - y0 ;
float bx = x0 - 2 * x1 + x2 , by = y0 - 2 * y1 + y2 ;
float bx = x0 - 2 * x1 + x2 , by = y0 - 2 * y1 + y2 ;
float mx = x0 - sx , my = y0 - sy ;
float mx = x0 - sx , my = y0 - sy ;
float res [ 3 ] , px , py , t , it ;
float res [ 3 ] , px , py , t , it , dist2 ;
float a_inv = precompute [ i ] ;
float a_inv = precompute [ i ] ;
if ( a_inv = = 0.0 ) { // if a_inv is 0, it's 2nd degree so use quadratic formula
if ( a_inv = = 0.0 ) { // if a_inv is 0, it's 2nd degree so use quadratic formula
float a = 3 * ( ax * bx + ay * by ) ;
float a = 3 * ( ax * bx + ay * by ) ;
@ -4652,6 +4651,10 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
float d = ( mx * ax + my * ay ) * a_inv ;
float d = ( mx * ax + my * ay ) * a_inv ;
num = stbtt__solve_cubic ( b , c , d , res ) ;
num = stbtt__solve_cubic ( b , c , d , res ) ;
}
}
dist2 = ( x0 - sx ) * ( x0 - sx ) + ( y0 - sy ) * ( y0 - sy ) ;
if ( dist2 < min_dist * min_dist )
min_dist = ( float ) STBTT_sqrt ( dist2 ) ;
if ( num > = 1 & & res [ 0 ] > = 0.0f & & res [ 0 ] < = 1.0f ) {
if ( num > = 1 & & res [ 0 ] > = 0.0f & & res [ 0 ] < = 1.0f ) {
t = res [ 0 ] , it = 1.0f - t ;
t = res [ 0 ] , it = 1.0f - t ;
px = it * it * x0 + 2 * t * it * x1 + t * t * x2 ;
px = it * it * x0 + 2 * t * it * x1 + t * t * x2 ;