stb_truetype -- fix floating point comparison against zero by using a correct epsilon
This commit is contained in:
parent
b42009b3b9
commit
7e2ade58ea
@ -4547,6 +4547,9 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
|
|||||||
// invert for y-downwards bitmaps
|
// invert for y-downwards bitmaps
|
||||||
scale_y = -scale_y;
|
scale_y = -scale_y;
|
||||||
|
|
||||||
|
// distance from singular values (in the same units as the pixel grid)
|
||||||
|
const float eps = 1./128, eps2 = eps*eps;
|
||||||
|
|
||||||
{
|
{
|
||||||
int x,y,i,j;
|
int x,y,i,j;
|
||||||
float *precompute;
|
float *precompute;
|
||||||
@ -4560,15 +4563,15 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
|
|||||||
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;
|
||||||
float x1 = verts[j].x*scale_x, y1 = verts[j].y*scale_y;
|
float x1 = verts[j].x*scale_x, y1 = verts[j].y*scale_y;
|
||||||
float dist = (float) STBTT_sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0));
|
float dist = (float) STBTT_sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0));
|
||||||
precompute[i] = (dist == 0) ? 0.0f : 1.0f / dist;
|
precompute[i] = (dist < eps) ? 0.0f : 1.0f / dist;
|
||||||
} else if (verts[i].type == STBTT_vcurve) {
|
} else if (verts[i].type == STBTT_vcurve) {
|
||||||
float x2 = verts[j].x *scale_x, y2 = verts[j].y *scale_y;
|
float x2 = verts[j].x *scale_x, y2 = verts[j].y *scale_y;
|
||||||
float x1 = verts[i].cx*scale_x, y1 = verts[i].cy*scale_y;
|
float x1 = verts[i].cx*scale_x, y1 = verts[i].cy*scale_y;
|
||||||
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;
|
||||||
float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2;
|
float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2;
|
||||||
float len2 = bx*bx + by*by;
|
float len2 = bx*bx + by*by;
|
||||||
if (len2 != 0.0f)
|
if (len2 >= eps2)
|
||||||
precompute[i] = 1.0f / (bx*bx + by*by);
|
precompute[i] = 1.0f / len2;
|
||||||
else
|
else
|
||||||
precompute[i] = 0.0f;
|
precompute[i] = 0.0f;
|
||||||
} else
|
} else
|
||||||
@ -4633,8 +4636,8 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
|
|||||||
float a = 3*(ax*bx + ay*by);
|
float a = 3*(ax*bx + ay*by);
|
||||||
float b = 2*(ax*ax + ay*ay) + (mx*bx+my*by);
|
float b = 2*(ax*ax + ay*ay) + (mx*bx+my*by);
|
||||||
float c = mx*ax+my*ay;
|
float c = mx*ax+my*ay;
|
||||||
if (a == 0.0) { // if a is 0, it's linear
|
if (fabs(a) < eps2) { // if a is 0, it's linear
|
||||||
if (b != 0.0) {
|
if (fabs(b) >= eps2) {
|
||||||
res[num++] = -c/b;
|
res[num++] = -c/b;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user