Extend Adobe interpreter (flex in callothersubr).

* src/psaux/psintrp.c (cf2_interpT2CharString)
<cf2_escCALLOTHERSUBR>: Fix Flex feature handling (OtherSubrs 0, 1,
2).
<cf2_cmdRMOVETO>: Do not actually move the `glyphPath' while doing
flex.  This is to avoid closing the current contour.
This commit is contained in:
Ewald Hew 2017-09-25 07:59:41 +02:00 committed by Werner Lemberg
parent 9668255965
commit d55a701de6
2 changed files with 30 additions and 7 deletions

View File

@ -1,3 +1,13 @@
2017-09-25 Ewald Hew <ewaldhew@gmail.com>
[psaux] Extend Adobe interpreter (flex in callothersubr).
* src/psaux/psintrp.c (cf2_interpT2CharString)
<cf2_escCALLOTHERSUBR>: Fix Flex feature handling (OtherSubrs 0, 1,
2).
<cf2_cmdRMOVETO>: Do not actually move the `glyphPath' while doing
flex. This is to avoid closing the current contour.
2017-09-25 Ewald Hew <ewaldhew@gmail.com>
[psaux] Extend Adobe interpreter (callothersubr).

View File

@ -503,6 +503,7 @@
FT_Byte op1; /* first opcode byte */
CF2_F16Dot16 storage[CF2_STORAGE_SIZE]; /* for `put' and `get' */
CF2_F16Dot16 flexStore[6]; /* for Type 1 flex */
/* instruction limit; 20,000,000 matches Avalon */
FT_UInt32 instructionLimit = 20000000UL;
@ -526,6 +527,7 @@
FT_ZERO( &storage );
FT_ZERO( &results );
FT_ZERO( &flexStore );
/* initialize the remaining objects */
cf2_arrstack_init( &subrStack,
@ -1518,8 +1520,7 @@
if ( arg_cnt != 0 )
goto Unexpected_OtherSubr;
if ( ps_builder_start_point( &decoder->builder, curX, curY ) ||
ps_builder_check_points( &decoder->builder, 6 ) )
if ( ps_builder_check_points( &decoder->builder, 6 ) )
goto exit;
decoder->flex_state = 1;
@ -1529,6 +1530,7 @@
case 2: /* add flex vectors */
{
FT_Int idx;
FT_Int idx2;
if ( arg_cnt != 0 )
@ -1558,10 +1560,20 @@
goto exit;
}
ps_builder_add_point( &decoder->builder,
curX,
curY,
(FT_Byte)( idx == 3 || idx == 6 ) );
/* map: 1->2 2->4 3->6 4->2 5->4 6->6 */
idx2 = ( idx > 3 ? idx - 3 : idx ) * 2;
flexStore[idx2 - 2] = curX;
flexStore[idx2 - 1] = curY;
if ( idx == 3 || idx == 6 )
cf2_glyphpath_curveTo( &glyphPath,
flexStore[0],
flexStore[1],
flexStore[2],
flexStore[3],
flexStore[4],
flexStore[5] );
}
}
break;
@ -2371,7 +2383,8 @@
curY = ADD_INT32( curY, cf2_stack_popFixed( opStack ) );
curX = ADD_INT32( curX, cf2_stack_popFixed( opStack ) );
cf2_glyphpath_moveTo( &glyphPath, curX, curY );
if ( !decoder->flex_state )
cf2_glyphpath_moveTo( &glyphPath, curX, curY );
break;