[truetype] Clamp variation requests to valid range.

This is required by OpenType 1.8; it also avoids rounding surprises.

* src/truetype/ttgxvar.c (TT_Set_Var_Design): Clamp design coordinates
outside of the allowed range to always stay within the range instead
of producing an error.
This commit is contained in:
Behdad Esfahbod 2016-11-03 06:41:00 +01:00 committed by Werner Lemberg
parent 328d68449d
commit b72858c992
2 changed files with 30 additions and 13 deletions

View File

@ -1,3 +1,13 @@
2016-11-03 Behdad Esfahbod <behdad@behdad.org>
[truetype] Clamp variation requests to valid range.
This is required by OpenType 1.8; it also avoids rounding surprises.
* src/truetype/ttgxvar.c (TT_Set_Var_Design): Clamp design coordinates
outside of the allowed range to always stay within the range instead
of producing an error.
2016-10-29 Werner Lemberg <wl@gnu.org>
[truetype] Remove clang warnings.

View File

@ -1310,26 +1310,33 @@
a = mmvar->axis;
for ( i = 0; i < num_coords; i++, a++ )
{
FT_TRACE5(( " %.4f\n", coords[i] / 65536.0 ));
if ( coords[i] > a->maximum || coords[i] < a->minimum )
FT_Fixed coord = coords[i];
FT_TRACE5(( " %.4f\n", coord / 65536.0 ));
if ( coord > a->maximum || coord < a->minimum )
{
FT_TRACE1(( "TT_Set_Var_Design: normalized design coordinate %.4f\n"
" is out of range [%.4f;%.4f]\n",
coords[i] / 65536.0,
a->minimum / 65536.0,
a->maximum / 65536.0 ));
error = FT_THROW( Invalid_Argument );
goto Exit;
FT_TRACE1((
"TT_Set_Var_Design: normalized design coordinate %.4f\n"
" is out of range [%.4f;%.4f]; clamping\n",
coord / 65536.0,
a->minimum / 65536.0,
a->maximum / 65536.0 ));
if ( coord > a->maximum)
coord = a->maximum;
else
coord = a->minimum;
}
if ( coords[i] < a->def )
if ( coord < a->def )
normalized[i] = -FT_DivFix( coords[i] - a->def,
a->minimum - a->def );
else if ( a->maximum == a->def )
normalized[i] = 0;
else
else if ( coord > a->def )
normalized[i] = FT_DivFix( coords[i] - a->def,
a->maximum - a->def );
else
normalized[i] = 0;
}
FT_TRACE5(( "\n" ));