ref: cdab9cfae9f336bddf709bad6f4f1de66f67524e
parent: 77b34e01ed459cd7bc3b46241a109cc4c2981a83
author: Ewald Hew <[email protected]>
date: Sat Oct 21 12:36:49 EDT 2017
[psaux] Fix PostScript interpreter rewinding in Type 1 mode. (#52251) The interpreter in Type 1 mode rewinds the charstring after collecting all hints for building the initial hintmap (commit d52dd7f). However, some charstrings use `endchar' in a final subroutine call, rewinding to the start of that subroutine, and only a small section of the actual glyph is drawn. * src/psaux/psintrp.c (cf2_interpT2CharString) <cf2_cmdENDCHAR>: Ensure we are on the top level charstring before rewinding.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2017-11-03 Ewald Hew <[email protected]>
+
+ [psaux] Fix PostScript interpreter rewinding in Type 1 mode. (#52251)
+
+ The interpreter in Type 1 mode rewinds the charstring after collecting
+ all hints for building the initial hintmap (commit d52dd7f). However,
+ some charstrings use `endchar' in a final subroutine call, rewinding to
+ the start of that subroutine, and only a small section of the actual
+ glyph is drawn.
+
+ * src/psaux/psintrp.c (cf2_interpT2CharString) <cf2_cmdENDCHAR>:
+ Ensure we are on the top level charstring before rewinding.
+
2017-11-03 suzuki toshiya <[email protected]>
[truetype] Add more tricky fonts.
--- a/src/psaux/psintrp.c
+++ b/src/psaux/psintrp.c
@@ -2462,6 +2462,19 @@
hintMask.isNew = TRUE;
/* rewind charstring */
+ /* some charstrings use endchar from a final subroutine call */
+ /* without returning, detect these and exit to the top level */
+ /* charstring */
+ while ( charstringIndex > 0 )
+ {
+ FT_TRACE4(( " return (leaving level %d)\n", charstringIndex ));
+
+ /* restore position in previous charstring */
+ charstring = (CF2_Buffer)
+ cf2_arrstack_getPointer(
+ &subrStack,
+ (CF2_UInt)--charstringIndex );
+ }
charstring->ptr = charstring->start;
break;