[psaux] Extend Adobe interpreter. (callothersubr)

* src/psaux/psintrp.c (cf2_interpT2CharString)
<callothersubr>: Fix Flex feature handling. (OtherSubrs 0~2)
<rmoveto>: 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-07-24 11:41:56 +08:00
parent 0ccdc5f3be
commit f5d196a29e
1 changed files with 20 additions and 7 deletions

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;