diff options
author | Ewald Hew <ewaldhew@gmail.com> | 2017-09-25 07:59:41 +0200 |
---|---|---|
committer | Werner Lemberg <wl@gnu.org> | 2017-09-25 09:26:59 +0200 |
commit | d55a701de60f559d27f5106cddb50884fed00bf7 (patch) | |
tree | 89bc923ec87c259b58d6529e08b505d6e02ffb46 /src/psaux/psintrp.c | |
parent | 9668255965bb61df1f217b353ff1e5ed609d15f7 (diff) | |
download | freetype2-d55a701de60f559d27f5106cddb50884fed00bf7.tar.gz |
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.
Diffstat (limited to 'src/psaux/psintrp.c')
-rw-r--r-- | src/psaux/psintrp.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/src/psaux/psintrp.c b/src/psaux/psintrp.c index b95646e52..5705af063 100644 --- a/src/psaux/psintrp.c +++ b/src/psaux/psintrp.c @@ -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; |