[psaux] Extend Adobe interpreter. (pop)

* src/psaux/psintrp.c (cf2_interpT2CharString): Change how unhandled OtherSubr
results are stored. Implement the PostScript stack using an array.
<pop>: Ensure that the stack is not cleared after getting OtherSubr results.
Fix stack access.
This commit is contained in:
Ewald Hew 2017-07-24 11:41:40 +08:00
parent f69fcb0ede
commit 1105d24166
1 changed files with 14 additions and 10 deletions

View File

@ -490,8 +490,10 @@
/* Stuff for Type 1 */
FT_Int known_othersubr_result_cnt = 0;
FT_Int unknown_othersubr_result_cnt = 0;
FT_Bool large_int = FALSE;
#define PS_STORAGE_SIZE 3
CF2_F16Dot16 results[PS_STORAGE_SIZE]; /* for othersubr results */
FT_Int result_cnt = 0;
/* save this for hinting seac accents */
CF2_Fixed hintOriginY = curY;
@ -523,6 +525,7 @@
FT_ZERO( &storage );
FT_ZERO( &results );
/* initialize the remaining objects */
cf2_arrstack_init( &subrStack,
@ -618,7 +621,7 @@
if ( font->isT1 )
{
FT_ASSERT( known_othersubr_result_cnt == 0 ||
unknown_othersubr_result_cnt == 0 );
result_cnt == 0 );
}
if ( cf2_buf_isEnd( charstring ) )
@ -644,14 +647,14 @@
if ( font->isT1 )
{
if ( unknown_othersubr_result_cnt > 0 &&
if ( result_cnt > 0 &&
!( op1 == cf2_cmdCALLSUBR ||
op1 == cf2_cmdRETURN ||
op1 == cf2_escPOP ||
op1 >= 32 /* Numbers */ ) )
{
/* all operands have been transferred by previous pops */
unknown_othersubr_result_cnt = 0;
result_cnt = 0;
}
if ( large_int && !( op1 >= 32 || op1 == cf2_escDIV ) )
@ -1459,20 +1462,21 @@
{
known_othersubr_result_cnt--;
/* ignore, we pushed the operands ourselves */
break;
continue;
}
if ( unknown_othersubr_result_cnt == 0 )
if ( result_cnt == 0 )
{
FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
" no more operands for othersubr\n" ));
goto Syntax_Error;
lastError = FT_THROW( Invalid_Glyph_Format );
goto exit;
}
unknown_othersubr_result_cnt--;
top++; /* `push' the operand to callothersubr onto the stack */
result_cnt--;
cf2_stack_pushFixed( opStack, results[result_cnt] );
}
break;
continue; /* do not clear the stack */
case cf2_escDROP:
FT_TRACE4(( " drop\n" ));