37#define FT_COMPONENT cffparse
40 FT_LOCAL_DEF( FT_Error )
41 cff_parser_init( CFF_Parser parser,
46 FT_UShort num_designs,
49 FT_Memory memory = library->memory;
56 parser->top = parser->stack;
58 parser->object_code =
code;
59 parser->object = object;
60 parser->library = library;
61 parser->num_designs = num_designs;
62 parser->num_axes = num_axes;
65 if ( FT_QNEW_ARRAY( parser->stack, stackSize ) )
68 parser->stackSize = stackSize;
69 parser->top = parser->stack;
77 cff_parser_done( CFF_Parser parser )
79 FT_Memory memory = parser->library->memory;
82 FT_FREE( parser->stack );
84#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
85 FT_List_Finalize( &parser->t2_strings, NULL, memory, NULL );
96 cff_parse_integer( FT_Byte* start,
106 if ( p + 2 > limit && limit >= p )
109 val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] );
113 if ( p + 4 > limit && limit >= p )
116 val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) |
117 ( (FT_ULong)p[1] << 16 ) |
118 ( (FT_ULong)p[2] << 8 ) |
127 if ( p + 1 > limit && limit >= p )
130 val = ( v - 247 ) * 256 + p[0] + 108;
134 if ( p + 1 > limit && limit >= p )
137 val = -( v - 251 ) * 256 - p[0] - 108;
145 FT_TRACE4((
"!!!END OF DATA:!!!" ));
150 static const FT_Long power_tens[] =
166 static const FT_Long power_ten_limits[] =
172 FT_LONG_MAX / 10000L,
173 FT_LONG_MAX / 100000L,
174 FT_LONG_MAX / 1000000L,
175 FT_LONG_MAX / 10000000L,
176 FT_LONG_MAX / 100000000L,
177 FT_LONG_MAX / 1000000000L,
183 cff_parse_real( FT_Byte* start,
192 FT_Long result, number, exponent;
193 FT_Int sign = 0, exponent_sign = 0, have_overflow = 0;
194 FT_Long exponent_add, integer_length, fraction_length;
221 if ( p + 1 > limit && limit >= p )
226 nib = (FT_Int)( p[0] >> phase ) & 0xF;
236 if ( number >= 0xCCCCCCCL )
239 else if ( nib || number )
242 number = number * 10 + nib;
258 if ( p + 1 > limit && limit >= p )
263 nib = ( p[0] >> phase ) & 0xF;
269 if ( !nib && !number )
272 else if ( number < 0xCCCCCCCL && fraction_length < 9 )
275 number = number * 10 + nib;
297 if ( p + 1 > limit && limit >= p )
302 nib = ( p[0] >> phase ) & 0xF;
308 if ( exponent > 1000 )
311 exponent = exponent * 10 + nib;
315 exponent = -exponent;
330 exponent += power_ten + exponent_add;
335 fraction_length += integer_length;
336 exponent += integer_length;
338 if ( fraction_length <= 5 )
340 if ( number > 0x7FFFL )
342 result = FT_DivFix( number, 10 );
343 *scaling = exponent - fraction_length + 1;
349 FT_Long new_fraction_length, shift;
353 new_fraction_length = FT_MIN( exponent, 5 );
354 shift = new_fraction_length - fraction_length;
358 exponent -= new_fraction_length;
359 number *= power_tens[shift];
360 if ( number > 0x7FFFL )
367 exponent -= fraction_length;
370 exponent -= fraction_length;
372 result = (FT_Long)( (FT_ULong)number << 16 );
378 if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL )
380 result = FT_DivFix( number, power_tens[fraction_length - 4] );
381 *scaling = exponent - 4;
385 result = FT_DivFix( number, power_tens[fraction_length - 5] );
386 *scaling = exponent - 5;
392 integer_length += exponent;
393 fraction_length -= exponent;
395 if ( integer_length > 5 )
397 if ( integer_length < -5 )
401 if ( integer_length < 0 )
403 number /= power_tens[-integer_length];
404 fraction_length += integer_length;
408 if ( fraction_length == 10 )
411 fraction_length -= 1;
415 if ( fraction_length > 0 )
417 if ( ( number / power_tens[fraction_length] ) > 0x7FFFL )
420 result = FT_DivFix( number, power_tens[fraction_length] );
424 number *= power_tens[-fraction_length];
426 if ( number > 0x7FFFL )
429 result = (FT_Long)( (FT_ULong)number << 16 );
440 result = 0x7FFFFFFFL;
441 FT_TRACE4((
"!!!OVERFLOW:!!!" ));
446 FT_TRACE4((
"!!!UNDERFLOW:!!!" ));
451 FT_TRACE4((
"!!!END OF DATA:!!!" ));
457 FT_LOCAL_DEF( FT_Long )
458 cff_parse_num( CFF_Parser parser,
464 return cff_parse_real( *d, parser->limit, 0, NULL ) >> 16;
467 else if ( **d == 255 )
477 ( ( ( (FT_UInt32)*( d[0] + 1 ) << 24 ) |
478 ( (FT_UInt32)*( d[0] + 2 ) << 16 ) |
479 ( (FT_UInt32)*( d[0] + 3 ) << 8 ) |
480 (FT_UInt32)*( d[0] + 4 ) ) + 0x8000U ) >> 16 );
483 ( ( ( (FT_UInt32)*( d[0] + 1 ) << 16 ) |
484 ( (FT_UInt32)*( d[0] + 2 ) << 8 ) |
485 (FT_UInt32)*( d[0] + 3 ) ) + 0x80U ) >> 8 );
490 return cff_parse_integer( *d, parser->limit );
496 do_fixed( CFF_Parser parser,
501 return cff_parse_real( *d, parser->limit, scaling, NULL );
502 else if ( **d == 255 )
504 FT_Fixed val = (FT_Int32)( ( ( (FT_UInt32)*( d[0] + 1 ) << 24 ) |
505 ( (FT_UInt32)*( d[0] + 2 ) << 16 ) |
506 ( (FT_UInt32)*( d[0] + 3 ) << 8 ) |
507 (FT_UInt32)*( d[0] + 4 ) ) );
511 if ( FT_ABS( val ) > power_ten_limits[scaling] )
513 FT_TRACE4((
"!!!OVERFLOW:!!!" ));
514 return val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL;
516 val *= power_tens[scaling];
522 FT_Long val = cff_parse_integer( *d, parser->limit );
527 if ( ( FT_ABS( val ) << 16 ) > power_ten_limits[scaling] )
529 val = val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL;
533 val *= power_tens[scaling];
541 else if ( val < -0x7FFF )
547 return (FT_Long)( (FT_ULong)val << 16 );
550 FT_TRACE4((
"!!!OVERFLOW:!!!" ));
557 FT_LOCAL_DEF( FT_Fixed )
558 cff_parse_fixed( CFF_Parser parser,
561 return do_fixed( parser, d, 0 );
568 cff_parse_fixed_scaled( CFF_Parser parser,
572 return do_fixed( parser, d, scaling );
580 cff_parse_fixed_dynamic( CFF_Parser parser,
584 FT_ASSERT( scaling );
587 return cff_parse_real( *d, parser->limit, 0, scaling );
591 FT_Int integer_length;
594 number = cff_parse_integer( *d, parser->limit );
596 if ( number > 0x7FFFL )
598 for ( integer_length = 5; integer_length < 10; integer_length++ )
599 if ( number < power_tens[integer_length] )
602 if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL )
604 *scaling = integer_length - 4;
605 return FT_DivFix( number, power_tens[integer_length - 4] );
609 *scaling = integer_length - 5;
610 return FT_DivFix( number, power_tens[integer_length - 5] );
616 return (FT_Long)( (FT_ULong)number << 16 );
623 cff_parse_font_matrix( CFF_Parser parser )
625 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
626 FT_Matrix* matrix = &dict->font_matrix;
627 FT_Vector* offset = &dict->font_offset;
628 FT_ULong* upm = &dict->units_per_em;
629 FT_Byte** data = parser->stack;
632 if ( parser->top >= parser->stack + 6 )
637 FT_Long min_scaling, max_scaling;
641 dict->has_font_matrix = TRUE;
649 max_scaling = FT_LONG_MIN;
650 min_scaling = FT_LONG_MAX;
652 for ( i = 0; i < 6; i++ )
654 values[i] = cff_parse_fixed_dynamic( parser, data++, &scalings[i] );
657 if ( scalings[i] > max_scaling )
658 max_scaling = scalings[i];
659 if ( scalings[i] < min_scaling )
660 min_scaling = scalings[i];
664 if ( max_scaling < -9 ||
666 ( max_scaling - min_scaling ) < 0 ||
667 ( max_scaling - min_scaling ) > 9 )
669 FT_TRACE1((
"cff_parse_font_matrix:"
670 " strange scaling values (minimum %ld, maximum %ld),\n",
671 min_scaling, max_scaling ));
673 " using default matrix\n" ));
677 for ( i = 0; i < 6; i++ )
679 FT_Fixed value = values[i];
680 FT_Long divisor, half_divisor;
686 divisor = power_tens[max_scaling - scalings[i]];
687 half_divisor = divisor >> 1;
691 if ( FT_LONG_MIN + half_divisor < value )
692 values[i] = ( value - half_divisor ) / divisor;
694 values[i] = FT_LONG_MIN / divisor;
698 if ( FT_LONG_MAX - half_divisor > value )
699 values[i] = ( value + half_divisor ) / divisor;
701 values[i] = FT_LONG_MAX / divisor;
705 matrix->xx = values[0];
706 matrix->yx = values[1];
707 matrix->xy = values[2];
708 matrix->yy = values[3];
709 offset->x = values[4];
710 offset->y = values[5];
712 *upm = (FT_ULong)power_tens[-max_scaling];
714 FT_TRACE4((
" [%f %f %f %f %f %f]\n",
715 (
double)matrix->xx / (
double)*upm / 65536,
716 (
double)matrix->xy / (
double)*upm / 65536,
717 (
double)matrix->yx / (
double)*upm / 65536,
718 (
double)matrix->yy / (
double)*upm / 65536,
719 (
double)offset->x / (
double)*upm / 65536,
720 (
double)offset->y / (
double)*upm / 65536 ));
722 if ( !FT_Matrix_Check( matrix ) )
724 FT_TRACE1((
"cff_parse_font_matrix:"
725 " degenerate values, using default matrix\n" ));
732 return FT_THROW( Stack_Underflow );
737 matrix->xx = 0x10000L;
740 matrix->yy = 0x10000L;
750 cff_parse_font_bbox( CFF_Parser parser )
752 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
753 FT_BBox* bbox = &dict->font_bbox;
754 FT_Byte** data = parser->stack;
758 error = FT_ERR( Stack_Underflow );
760 if ( parser->top >= parser->stack + 4 )
762 bbox->xMin = FT_RoundFix( cff_parse_fixed( parser, data++ ) );
763 bbox->yMin = FT_RoundFix( cff_parse_fixed( parser, data++ ) );
764 bbox->xMax = FT_RoundFix( cff_parse_fixed( parser, data++ ) );
765 bbox->yMax = FT_RoundFix( cff_parse_fixed( parser, data ) );
768 FT_TRACE4((
" [%ld %ld %ld %ld]\n",
772 bbox->yMax / 65536 ));
780 cff_parse_private_dict( CFF_Parser parser )
782 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
783 FT_Byte** data = parser->stack;
787 error = FT_ERR( Stack_Underflow );
789 if ( parser->top >= parser->stack + 2 )
794 tmp = cff_parse_num( parser, data++ );
797 FT_ERROR((
"cff_parse_private_dict: Invalid dictionary size\n" ));
798 error = FT_THROW( Invalid_File_Format );
801 dict->private_size = (FT_ULong)tmp;
803 tmp = cff_parse_num( parser, data );
806 FT_ERROR((
"cff_parse_private_dict: Invalid dictionary offset\n" ));
807 error = FT_THROW( Invalid_File_Format );
810 dict->private_offset = (FT_ULong)tmp;
812 FT_TRACE4((
" %lu %lu\n",
813 dict->private_size, dict->private_offset ));
827 cff_parse_multiple_master( CFF_Parser parser )
829 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
833#ifdef FT_DEBUG_LEVEL_TRACE
835 if ( ft_trace_levels[FT_TRACE_COMP( FT_COMPONENT )] < 4 )
836 FT_TRACE1((
"Multiple Master CFFs not supported yet,"
837 " handling first master design only\n" ));
839 FT_TRACE1((
" (not supported yet,"
840 " handling first master design only)\n" ));
843 error = FT_ERR( Stack_Underflow );
846 if ( parser->top >= parser->stack + 5 )
848 FT_Long num_designs = cff_parse_num( parser, parser->stack );
851 if ( num_designs > 16 || num_designs < 2 )
853 FT_ERROR((
"cff_parse_multiple_master:"
854 " Invalid number of designs\n" ));
855 error = FT_THROW( Invalid_File_Format );
859 dict->num_designs = (FT_UShort)num_designs;
860 dict->num_axes = (FT_UShort)( parser->top - parser->stack - 4 );
862 parser->num_designs = dict->num_designs;
863 parser->num_axes = dict->num_axes;
874 cff_parse_cid_ros( CFF_Parser parser )
876 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
877 FT_Byte** data = parser->stack;
881 error = FT_ERR( Stack_Underflow );
883 if ( parser->top >= parser->stack + 3 )
885 dict->cid_registry = (FT_UInt)cff_parse_num( parser, data++ );
886 dict->cid_ordering = (FT_UInt)cff_parse_num( parser, data++ );
888 FT_TRACE1((
"cff_parse_cid_ros: real supplement is rounded\n" ));
889 dict->cid_supplement = cff_parse_num( parser, data );
890 if ( dict->cid_supplement < 0 )
891 FT_TRACE1((
"cff_parse_cid_ros: negative supplement %ld is found\n",
892 dict->cid_supplement ));
895 FT_TRACE4((
" %u %u %ld\n",
898 dict->cid_supplement ));
906 cff_parse_vsindex( CFF_Parser parser )
909 CFF_Private priv = (CFF_Private)parser->object;
910 FT_Byte** data = parser->stack;
915 if ( !priv || !priv->subfont )
917 error = FT_THROW( Invalid_File_Format );
921 blend = &priv->subfont->blend;
925 FT_ERROR((
" cff_parse_vsindex: vsindex not allowed after blend\n" ));
926 error = FT_THROW( Syntax_Error );
930 priv->vsindex = (FT_UInt)cff_parse_num( parser, data++ );
932 FT_TRACE4((
" %u\n", priv->vsindex ));
942 cff_parse_blend( CFF_Parser parser )
945 CFF_Private priv = (CFF_Private)parser->object;
952 if ( !priv || !priv->subfont )
954 error = FT_THROW( Invalid_File_Format );
958 subFont = priv->subfont;
959 blend = &subFont->blend;
961 if ( cff_blend_check_vector( blend,
966 error = cff_blend_build_vector( blend,
974 numBlends = (FT_UInt)cff_parse_num( parser, parser->top - 1 );
975 if ( numBlends > parser->stackSize )
977 FT_ERROR((
"cff_parse_blend: Invalid number of blends\n" ));
978 error = FT_THROW( Invalid_File_Format );
982 FT_TRACE4((
" %u value%s blended\n",
984 numBlends == 1 ?
"" :
"s" ));
986 error = cff_blend_doBlend( subFont, parser, numBlends );
988 blend->usedBV = TRUE;
997 cff_parse_maxstack( CFF_Parser parser )
1000 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
1001 FT_Byte** data = parser->stack;
1002 FT_Error error = FT_Err_Ok;
1007 error = FT_THROW( Invalid_File_Format );
1011 dict->maxstack = (FT_UInt)cff_parse_num( parser, data++ );
1012 if ( dict->maxstack > CFF2_MAX_STACK )
1013 dict->maxstack = CFF2_MAX_STACK;
1014 if ( dict->maxstack < CFF2_DEFAULT_STACK )
1015 dict->maxstack = CFF2_DEFAULT_STACK;
1017 FT_TRACE4((
" %u\n", dict->maxstack ));
1024#define CFF_FIELD_NUM( code, name, id ) \
1025 CFF_FIELD( code, name, id, cff_kind_num )
1026#define CFF_FIELD_FIXED( code, name, id ) \
1027 CFF_FIELD( code, name, id, cff_kind_fixed )
1028#define CFF_FIELD_FIXED_1000( code, name, id ) \
1029 CFF_FIELD( code, name, id, cff_kind_fixed_thousand )
1030#define CFF_FIELD_STRING( code, name, id ) \
1031 CFF_FIELD( code, name, id, cff_kind_string )
1032#define CFF_FIELD_BOOL( code, name, id ) \
1033 CFF_FIELD( code, name, id, cff_kind_bool )
1034#define CFF_FIELD_DELTA( code, name, max, id ) \
1035 CFF_FIELD_DELTA_KIND( code, name, max, id, cff_kind_delta )
1036#define CFF_FIELD_DELTA_FIXED( code, name, max, id ) \
1037 CFF_FIELD_DELTA_KIND( code, name, max, id, cff_kind_delta_fixed )
1041#undef CFF_FIELD_DELTA_KIND
1044#ifndef FT_DEBUG_LEVEL_TRACE
1047#define CFF_FIELD_CALLBACK( code, name, id ) \
1049 cff_kind_callback, \
1052 cff_parse_ ## name, \
1056#define CFF_FIELD_BLEND( code, id ) \
1065#define CFF_FIELD( code, name, id, kind ) \
1069 FT_FIELD_OFFSET( name ), \
1070 FT_FIELD_SIZE( name ), \
1074#define CFF_FIELD_DELTA_KIND( code, name, max, id, kind ) \
1078 FT_FIELD_OFFSET( name ), \
1079 FT_FIELD_SIZE_DELTA( name ), \
1082 FT_FIELD_OFFSET( num_ ## name ) \
1085 static const CFF_Field_Handler cff_field_handlers[] =
1090 { 0, 0, 0, 0, NULL, 0, 0 }
1098#define CFF_FIELD_CALLBACK( code, name, id ) \
1100 cff_kind_callback, \
1103 cff_parse_ ## name, \
1108#define CFF_FIELD_BLEND( code, id ) \
1118#define CFF_FIELD( code, name, id, kind ) \
1122 FT_FIELD_OFFSET( name ), \
1123 FT_FIELD_SIZE( name ), \
1128#define CFF_FIELD_DELTA_KIND( code, name, max, id, kind ) \
1132 FT_FIELD_OFFSET( name ), \
1133 FT_FIELD_SIZE_DELTA( name ), \
1136 FT_FIELD_OFFSET( num_ ## name ), \
1140 static const CFF_Field_Handler cff_field_handlers[] =
1145 { 0, 0, 0, 0, NULL, 0, 0, NULL }
1152 FT_LOCAL_DEF( FT_Error )
1153 cff_parser_run( CFF_Parser parser,
1158 FT_Error error = FT_Err_Ok;
1160#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
1161 PSAux_Service psaux;
1163 FT_Library library = parser->library;
1164 FT_Memory memory = library->memory;
1167 parser->top = parser->stack;
1168 parser->start = start;
1169 parser->limit = limit;
1170 parser->cursor = start;
1180 if ( v >= 27 && v != 31 && v != 255 )
1183 if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize )
1184 goto Stack_Overflow;
1215#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
1220 CFF_Decoder decoder;
1221 CFF_FontRec cff_rec;
1222 FT_Byte* charstring_base;
1223 FT_ULong charstring_len;
1229 charstring_base = ++p;
1241 charstring_len = (FT_ULong)( p - charstring_base ) + 1;
1244 FT_ZERO( &decoder );
1245 FT_ZERO( &cff_rec );
1247 cff_rec.top_font.font_dict.num_designs = parser->num_designs;
1248 cff_rec.top_font.font_dict.num_axes = parser->num_axes;
1249 decoder.cff = &cff_rec;
1251 psaux = (PSAux_Service)FT_Get_Module_Interface( library,
"psaux" );
1254 FT_ERROR((
"cff_parser_run: cannot access `psaux' module\n" ));
1255 error = FT_THROW( Missing_Module );
1259 error = psaux->cff_decoder_funcs->parse_charstrings_old(
1260 &decoder, charstring_base, charstring_len, 1 );
1268 if ( FT_QALLOC( q, (FT_Long)( 2 *
sizeof ( FT_ListNode ) ) +
1269 5 * ( decoder.top - decoder.stack ) ) )
1272 FT_List_Add( &parser->t2_strings, (FT_ListNode)q );
1274 q += 2 *
sizeof ( FT_ListNode );
1276 for ( stack = decoder.stack; stack < decoder.top; stack++ )
1278 FT_Long num = *stack;
1281 if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize )
1282 goto Stack_Overflow;
1286 if ( num & 0xFFFFU )
1289 *q++ = (FT_Byte)( ( num >> 24 ) & 0xFF );
1290 *q++ = (FT_Byte)( ( num >> 16 ) & 0xFF );
1291 *q++ = (FT_Byte)( ( num >> 8 ) & 0xFF );
1292 *q++ = (FT_Byte)( ( num ) & 0xFF );
1298 if ( -107 <= num && num <= 107 )
1299 *q++ = (FT_Byte)( num + 139 );
1300 else if ( 108 <= num && num <= 1131 )
1302 *q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 247 );
1303 *q++ = (FT_Byte)( ( num - 108 ) & 0xFF );
1305 else if ( -1131 <= num && num <= -108 )
1307 *q++ = (FT_Byte)( ( ( -num - 108 ) >> 8 ) + 251 );
1308 *q++ = (FT_Byte)( ( -num - 108) & 0xFF );
1313 *q++ = (FT_Byte)( num >> 8 );
1314 *q++ = (FT_Byte)( num & 0xFF );
1327 const CFF_Field_Handler* field;
1330 if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize )
1331 goto Stack_Overflow;
1333 num_args = (FT_UInt)( parser->top - parser->stack );
1344 code = 0x100 | p[0];
1348 for ( field = cff_field_handlers; field->kind; field++ )
1350 if ( field->code == (FT_Int)
code )
1354 FT_Byte* q = (FT_Byte*)parser->object + field->offset;
1357#ifdef FT_DEBUG_LEVEL_TRACE
1358 FT_TRACE4((
" %s", field->id ));
1363 if ( field->kind != cff_kind_delta &&
1364 field->kind != cff_kind_delta_fixed && num_args < 1 )
1365 goto Stack_Underflow;
1367 switch ( field->kind )
1370 case cff_kind_string:
1372 val = cff_parse_num( parser, parser->stack );
1375 case cff_kind_fixed:
1376 val = cff_parse_fixed( parser, parser->stack );
1379 case cff_kind_fixed_thousand:
1380 val = cff_parse_fixed_scaled( parser, parser->stack, 3 );
1383 switch ( field->size )
1385 case (8 / FT_CHAR_BIT):
1386 *(FT_Byte*)q = (FT_Byte)val;
1389 case (16 / FT_CHAR_BIT):
1390 *(FT_Short*)q = (FT_Short)val;
1393 case (32 / FT_CHAR_BIT):
1394 *(FT_Int32*)q = (FT_Int)val;
1401#ifdef FT_DEBUG_LEVEL_TRACE
1402 switch ( field->kind )
1405 FT_TRACE4((
" %s\n", val ?
"true" :
"false" ));
1408 case cff_kind_string:
1409 FT_TRACE4((
" %ld (SID)\n", val ));
1413 FT_TRACE4((
" %ld\n", val ));
1416 case cff_kind_fixed:
1417 FT_TRACE4((
" %f\n", (
double)val / 65536 ));
1420 case cff_kind_fixed_thousand:
1421 FT_TRACE4((
" %f\n", (
double)val / 65536 / 1000 ));
1431 case cff_kind_delta:
1433 FT_Byte* qcount = (FT_Byte*)parser->object +
1434 field->count_offset;
1436 FT_Byte** data = parser->stack;
1439 if ( num_args > field->array_max )
1440 num_args = field->array_max;
1442 FT_TRACE4((
" [" ));
1445 *qcount = (FT_Byte)num_args;
1448 while ( num_args > 0 )
1450 val = ADD_LONG( val, cff_parse_num( parser, data++ ) );
1451 switch ( field->size )
1453 case (8 / FT_CHAR_BIT):
1454 *(FT_Byte*)q = (FT_Byte)val;
1457 case (16 / FT_CHAR_BIT):
1458 *(FT_Short*)q = (FT_Short)val;
1461 case (32 / FT_CHAR_BIT):
1462 *(FT_Int32*)q = (FT_Int)val;
1469 FT_TRACE4((
" %ld", val ));
1475 FT_TRACE4((
"]\n" ));
1479 case cff_kind_delta_fixed:
1481 FT_Byte* qcount = (FT_Byte*)parser->object +
1482 field->count_offset;
1484 FT_Byte** data = parser->stack;
1487 if ( num_args > field->array_max )
1488 num_args = field->array_max;
1490 FT_TRACE4((
" [" ));
1493 *qcount = (FT_Byte)num_args;
1496 while ( num_args > 0 )
1498 val = ADD_LONG( val, cff_parse_fixed( parser, data++ ) );
1501 FT_TRACE4((
" %f\n", (
double)val / 65536 ));
1507 FT_TRACE4((
"]\n" ));
1512 error = field->reader( parser );
1527 if ( field->kind != cff_kind_blend )
1528 parser->top = parser->stack;
1537 error = FT_THROW( Invalid_Argument );
1541 error = FT_THROW( Invalid_Argument );
1545 error = FT_THROW( Invalid_Argument );