[cff] Clean up CharString number encoding.

* src/cff/cffparser.c (cff_parser_run): Work with signed numbers.
truetype-mm
Alexei Podtelezhnikov 2 years ago
parent 51c1705477
commit de6002203b
  1. 67
      src/cff/cffparse.c

@ -1334,8 +1334,7 @@
while ( stack < decoder.top )
{
FT_ULong num;
FT_Bool neg;
FT_Long num = *stack;
if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize )
@ -1343,65 +1342,35 @@
*parser->top++ = q;
if ( *stack < 0 )
{
num = (FT_ULong)NEG_LONG( *stack );
neg = 1;
}
else
{
num = (FT_ULong)*stack;
neg = 0;
}
if ( num & 0xFFFFU )
{
if ( neg )
num = (FT_ULong)-num;
*q++ = 255;
*q++ = ( num & 0xFF000000U ) >> 24;
*q++ = ( num & 0x00FF0000U ) >> 16;
*q++ = ( num & 0x0000FF00U ) >> 8;
*q++ = num & 0x000000FFU;
*q++ = (FT_Byte)( ( num >> 24 ) & 0xFF );
*q++ = (FT_Byte)( ( num >> 16 ) & 0xFF );
*q++ = (FT_Byte)( ( num >> 8 ) & 0xFF );
*q++ = (FT_Byte)( ( num ) & 0xFF );
}
else
{
num >>= 16;
if ( neg )
if ( -107 <= num && num <= 107 )
*q++ = (FT_Byte)( num + 139 );
else if ( 108 <= num && num <= 1131 )
{
if ( num <= 107 )
*q++ = (FT_Byte)( 139 - num );
else if ( num <= 1131 )
{
*q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 251 );
*q++ = (FT_Byte)( ( num - 108 ) & 0xFF );
}
else
{
num = (FT_ULong)-num;
*q++ = 28;
*q++ = (FT_Byte)( num >> 8 );
*q++ = (FT_Byte)( num & 0xFF );
}
*q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 247 );
*q++ = (FT_Byte)( ( num - 108 ) & 0xFF );
}
else if ( -1131 <= num && num <= -108 )
{
*q++ = (FT_Byte)( ( ( 108 - num ) >> 8 ) + 251 );
*q++ = (FT_Byte)( ( 108 - num ) & 0xFF );
}
else
{
if ( num <= 107 )
*q++ = (FT_Byte)( num + 139 );
else if ( num <= 1131 )
{
*q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 247 );
*q++ = (FT_Byte)( ( num - 108 ) & 0xFF );
}
else
{
*q++ = 28;
*q++ = (FT_Byte)( num >> 8 );
*q++ = (FT_Byte)( num & 0xFF );
}
*q++ = 28;
*q++ = (FT_Byte)( num >> 8 );
*q++ = (FT_Byte)( num & 0xFF );
}
}

Loading…
Cancel
Save