Index: third_party/freetype/src/cff/cf2intrp.c |
diff --git a/third_party/freetype/src/cff/cf2intrp.c b/third_party/freetype/src/cff/cf2intrp.c |
index a26960669f171114357d8694f664568b8d4fcea2..ff3fa9aaaabe33c32bb05428d049359651a0ee77 100644 |
--- a/third_party/freetype/src/cff/cf2intrp.c |
+++ b/third_party/freetype/src/cff/cf2intrp.c |
@@ -43,6 +43,7 @@ |
#include "cf2font.h" |
#include "cf2stack.h" |
#include "cf2hints.h" |
+#include "cf2intrp.h" |
#include "cf2error.h" |
@@ -760,16 +761,19 @@ |
/* push our current CFF charstring region on subrStack */ |
charstring = (CF2_Buffer) |
- cf2_arrstack_getPointer( &subrStack, |
- charstringIndex + 1 ); |
+ cf2_arrstack_getPointer( |
+ &subrStack, |
+ (size_t)charstringIndex + 1 ); |
/* set up the new CFF region and pointer */ |
- subrIndex = cf2_stack_popInt( opStack ); |
+ subrIndex = (CF2_UInt)cf2_stack_popInt( opStack ); |
switch ( op1 ) |
{ |
case cf2_cmdCALLGSUBR: |
- FT_TRACE4(( "(%d)\n", subrIndex + decoder->globals_bias )); |
+ FT_TRACE4(( " (idx %d, entering level %d)\n", |
+ subrIndex + (CF2_UInt)decoder->globals_bias, |
+ charstringIndex + 1 )); |
if ( cf2_initGlobalRegionBuffer( decoder, |
subrIndex, |
@@ -782,7 +786,9 @@ |
default: |
/* cf2_cmdCALLSUBR */ |
- FT_TRACE4(( "(%d)\n", subrIndex + decoder->locals_bias )); |
+ FT_TRACE4(( " (idx %d, entering level %d)\n", |
+ subrIndex + (CF2_UInt)decoder->locals_bias, |
+ charstringIndex + 1 )); |
if ( cf2_initLocalRegionBuffer( decoder, |
subrIndex, |
@@ -798,7 +804,7 @@ |
continue; /* do not clear the stack */ |
case cf2_cmdRETURN: |
- FT_TRACE4(( " return\n" )); |
+ FT_TRACE4(( " return (leaving level %d)\n", charstringIndex )); |
if ( charstringIndex < 1 ) |
{ |
@@ -809,8 +815,9 @@ |
/* restore position in previous charstring */ |
charstring = (CF2_Buffer) |
- cf2_arrstack_getPointer( &subrStack, |
- --charstringIndex ); |
+ cf2_arrstack_getPointer( |
+ &subrStack, |
+ (CF2_UInt)--charstringIndex ); |
continue; /* do not clear the stack */ |
case cf2_cmdESC: |
@@ -1088,8 +1095,8 @@ |
/* must be either 4 or 5 -- */ |
/* this is a (deprecated) implied `seac' operator */ |
- CF2_UInt achar; |
- CF2_UInt bchar; |
+ CF2_Int achar; |
+ CF2_Int bchar; |
CF2_BufferRec component; |
CF2_Fixed dummyWidth; /* ignore component width */ |
FT_Error error2; |
@@ -1291,10 +1298,16 @@ |
case cf2_cmdVVCURVETO: |
{ |
- CF2_UInt count = cf2_stack_count( opStack ); |
+ CF2_UInt count, count1 = cf2_stack_count( opStack ); |
CF2_UInt index = 0; |
+ /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */ |
+ /* we enforce it by clearing the second bit */ |
+ /* (and sorting the stack indexing to suit) */ |
+ count = count1 & ~2U; |
+ index += count1 - count; |
+ |
FT_TRACE4(( " vvcurveto\n" )); |
while ( index < count ) |
@@ -1330,10 +1343,16 @@ |
case cf2_cmdHHCURVETO: |
{ |
- CF2_UInt count = cf2_stack_count( opStack ); |
+ CF2_UInt count, count1 = cf2_stack_count( opStack ); |
CF2_UInt index = 0; |
+ /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */ |
+ /* we enforce it by clearing the second bit */ |
+ /* (and sorting the stack indexing to suit) */ |
+ count = count1 & ~2U; |
+ index += count1 - count; |
+ |
FT_TRACE4(( " hhcurveto\n" )); |
while ( index < count ) |
@@ -1370,12 +1389,19 @@ |
case cf2_cmdVHCURVETO: |
case cf2_cmdHVCURVETO: |
{ |
- CF2_UInt count = cf2_stack_count( opStack ); |
+ CF2_UInt count, count1 = cf2_stack_count( opStack ); |
CF2_UInt index = 0; |
FT_Bool alternate = op1 == cf2_cmdHVCURVETO; |
+ /* if `cf2_stack_count' isn't of the form 8n, 8n+1, */ |
+ /* 8n+4, or 8n+5, we enforce it by clearing the */ |
+ /* second bit */ |
+ /* (and sorting the stack indexing to suit) */ |
+ count = count1 & ~2U; |
+ index += count1 - count; |
+ |
FT_TRACE4(( alternate ? " hvcurveto\n" : " vhcurveto\n" )); |
while ( index < count ) |