diff options
author | Ewald Hew <ewaldhew@gmail.com> | 2017-07-24 11:41:56 +0800 |
---|---|---|
committer | Ewald Hew <ewaldhew@gmail.com> | 2017-08-21 14:17:43 +0800 |
commit | 5242f8cf4e8f445a6e44c669fd61ce53b367161e (patch) | |
tree | a2cc01b22ce132731d72e02e495479797eb1319f | |
parent | 18bf29d9b5584f89ebc96641d64a7816c96adc42 (diff) | |
download | freetype2-5242f8cf4e8f445a6e44c669fd61ce53b367161e.tar.gz |
[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.
-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; |