diff options
author | Behdad Esfahbod <behdad@behdad.org> | 2016-11-03 06:41:00 +0100 |
---|---|---|
committer | Werner Lemberg <wl@gnu.org> | 2016-11-03 06:41:00 +0100 |
commit | b72858c992d4c9b06899f35f8e11c71801229c53 (patch) | |
tree | 244c460e9598cc423559dc546fe79828353e4e5f /src | |
parent | 328d68449da9fd6bf28a92c06a65cb0070a7915a (diff) | |
download | freetype2-b72858c992d4c9b06899f35f8e11c71801229c53.tar.gz |
[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.
Diffstat (limited to 'src')
-rw-r--r-- | src/truetype/ttgxvar.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/src/truetype/ttgxvar.c b/src/truetype/ttgxvar.c index fd00ca45a..0b48c2c91 100644 --- a/src/truetype/ttgxvar.c +++ b/src/truetype/ttgxvar.c @@ -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" )); |