forked from minhngoc25a/freetype2
[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
18bf29d9b5
commit
5242f8cf4e
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue