[base] Fortify emboldening code against egregious distortions.
* src/base/ftoutln.c (FT_Outline_EmboldenXY): Threshold emboldening strength when it leads to segment collapse.
This commit is contained in:
parent
48ce226ae3
commit
dd5718c7d6
|
@ -1,3 +1,10 @@
|
||||||
|
2012-11-04 Alexei Podtelezhnikov <apodtele@gmail.com>
|
||||||
|
|
||||||
|
[base] Fortify emboldening code against egregious distortions.
|
||||||
|
|
||||||
|
* src/base/ftoutln.c (FT_Outline_EmboldenXY): Threshold emboldening
|
||||||
|
strength when it leads to segment collapse.
|
||||||
|
|
||||||
2012-11-03 Alexei Podtelezhnikov <apodtele@gmail.com>
|
2012-11-03 Alexei Podtelezhnikov <apodtele@gmail.com>
|
||||||
|
|
||||||
[base] Clean up emboldening code and improve comments there.
|
[base] Clean up emboldening code and improve comments there.
|
||||||
|
|
|
@ -922,7 +922,7 @@
|
||||||
for ( c = 0; c < outline->n_contours; c++ )
|
for ( c = 0; c < outline->n_contours; c++ )
|
||||||
{
|
{
|
||||||
FT_Vector in, out, shift;
|
FT_Vector in, out, shift;
|
||||||
FT_Fixed l_in, l_out, d;
|
FT_Fixed l_in, l_out, l, q, d;
|
||||||
int last = outline->contours[c];
|
int last = outline->contours[c];
|
||||||
|
|
||||||
|
|
||||||
|
@ -962,8 +962,22 @@
|
||||||
else
|
else
|
||||||
shift.y = -shift.y;
|
shift.y = -shift.y;
|
||||||
|
|
||||||
|
/* threshold strength to better handle collapsing segments */
|
||||||
|
l = FT_MIN( l_in, l_out );
|
||||||
|
q = out.x * in.y - out.y * in.x;
|
||||||
|
if ( orientation == FT_ORIENTATION_TRUETYPE )
|
||||||
|
q = -q;
|
||||||
|
|
||||||
|
if ( xstrength * q < d * l )
|
||||||
shift.x = FT_MulDiv( shift.x, xstrength, d );
|
shift.x = FT_MulDiv( shift.x, xstrength, d );
|
||||||
|
else
|
||||||
|
shift.x = FT_MulDiv( shift.x, l, q );
|
||||||
|
|
||||||
|
|
||||||
|
if ( ystrength * q < d * l )
|
||||||
shift.y = FT_MulDiv( shift.y, ystrength, d );
|
shift.y = FT_MulDiv( shift.y, ystrength, d );
|
||||||
|
else
|
||||||
|
shift.y = FT_MulDiv( shift.y, l, q );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
shift.x = shift.y = 0;
|
shift.x = shift.y = 0;
|
||||||
|
|
Loading…
Reference in New Issue