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