[truetype] Let SHPIX move points in the twilight zone in v40.

* src/truetype/ttinterp.c (Ins_SHPIX): Allow SHPIX to move points in
the twilight zone.  Otherwise, treat SHPIX the same as DELTAP.
Unbreaks various fonts such as older versions of Rokkitt and DTL
Argo T Light that would glitch severly after calling ALIGNRP after a
blocked SHPIX.
This commit is contained in:
Nikolaus Waxweiler 2016-05-31 08:39:52 +02:00 committed by Werner Lemberg
parent d28eac249a
commit b459882804
2 changed files with 25 additions and 5 deletions

View File

@ -1,3 +1,13 @@
2016-05-17 Nikolaus Waxweiler <madigens@gmail.com>
[truetype] Let SHPIX move points in the twilight zone in v40.
* src/truetype/ttinterp.c (Ins_SHPIX): Allow SHPIX to move points in
the twilight zone. Otherwise, treat SHPIX the same as DELTAP.
Unbreaks various fonts such as older versions of Rokkitt and DTL
Argo T Light that would glitch severly after calling ALIGNRP after a
blocked SHPIX.
2016-05-30 Werner Lemberg <wl@gnu.org>
[type42] Support `CharStrings' entry format as created by LilyPond.

View File

@ -5548,6 +5548,12 @@
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
FT_Int B1, B2;
#endif
#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
FT_Bool in_twilight = exc->GS.gep0 == 0 || \
exc->GS.gep1 == 0 || \
exc->GS.gep2 == 0;
#endif
if ( exc->top < exc->GS.loop + 1 )
@ -5656,11 +5662,15 @@
if ( SUBPIXEL_HINTING_MINIMAL &&
exc->backwards_compatibility )
{
/* XXX: breaks Rokkitt < v1.2 */
/* (glyphs explode vertically on ALIGNRP). */
if ( !( exc->iupx_called && exc->iupy_called ) &&
( ( exc->is_composite && exc->GS.freeVector.y != 0 ) ||
( exc->zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y ) ) )
/* Special case: allow SHPIX to move points in the twilight zone. */
/* Otherwise, treat SHPIX the same as DELTAP. Unbreaks various */
/* fonts such as older versions of Rokkitt and DTL Argo T Light */
/* that would glitch severly after calling ALIGNRP after a blocked */
/* SHPIX. */
if ( in_twilight ||
( !( exc->iupx_called && exc->iupy_called ) &&
( ( exc->is_composite && exc->GS.freeVector.y != 0 ) ||
( exc->zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y ) ) ) )
Move_Zp2_Point( exc, point, 0, dy, TRUE );
}
else