1 /***************************************************************************/
5 /* CFF token stream parser (body) */
7 /* Copyright 1996-2001, 2002, 2003, 2004, 2007, 2008 by */
8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
10 /* This file is part of the FreeType project, and may only be used, */
11 /* modified, and distributed under the terms of the FreeType project */
12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */
13 /* this file you indicate that you have read the license and */
14 /* understand and accept it fully. */
16 /***************************************************************************/
21 #include FT_INTERNAL_STREAM_H
22 #include FT_INTERNAL_DEBUG_H
27 /*************************************************************************/
29 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
30 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
31 /* messages during execution. */
34 #define FT_COMPONENT trace_cffparse
42 cff_kind_fixed_thousand
,
48 cff_kind_max
/* do not remove */
52 /* now generate handlers for the most simple fields */
53 typedef FT_Error (*CFF_Field_Reader
)( CFF_Parser parser
);
55 typedef struct CFF_Field_Handler_
61 CFF_Field_Reader reader
;
69 cff_parser_init( CFF_Parser parser
,
73 FT_MEM_ZERO( parser
, sizeof ( *parser
) );
75 parser
->top
= parser
->stack
;
76 parser
->object_code
= code
;
77 parser
->object
= object
;
83 cff_parse_integer( FT_Byte
* start
,
96 val
= (FT_Short
)( ( (FT_Int
)p
[0] << 8 ) | p
[1] );
104 val
= ( (FT_Long
)p
[0] << 24 ) |
105 ( (FT_Long
)p
[1] << 16 ) |
106 ( (FT_Long
)p
[2] << 8 ) |
119 val
= ( v
- 247 ) * 256 + p
[0] + 108;
127 val
= -( v
- 251 ) * 256 - p
[0] - 108;
140 static const FT_Long power_tens
[] =
157 cff_parse_real( FT_Byte
* start
,
166 FT_Long result
, number
, rest
, exponent
;
167 FT_Int sign
= 0, exponent_sign
= 0;
168 FT_Int exponent_add
, integer_length
, fraction_length
;
184 /* First of all, read the integer part. */
189 /* If we entered this iteration with phase == 4, we need to */
190 /* read a new byte. This also skips past the initial 0x1E. */
195 /* Make sure we don't read past the end. */
200 /* Get the nibble. */
201 nib
= ( p
[0] >> phase
) & 0xF;
210 /* Increase exponent if we can't add the digit. */
211 if ( number
>= 0xCCCCCCCL
)
213 /* Skip leading zeros. */
214 else if ( nib
|| number
)
217 number
= number
* 10 + nib
;
222 /* Read fraction part, if any. */
226 /* If we entered this iteration with phase == 4, we need */
227 /* to read a new byte. */
232 /* Make sure we don't read past the end. */
237 /* Get the nibble. */
238 nib
= ( p
[0] >> phase
) & 0xF;
243 /* Skip leading zeros if possible. */
244 if ( !nib
&& !number
)
246 /* Only add digit if we don't overflow. */
247 else if ( number
< 0xCCCCCCCL
)
250 number
= number
* 10 + nib
;
254 /* Read exponent, if any. */
265 /* If we entered this iteration with phase == 4, */
266 /* we need to read a new byte. */
271 /* Make sure we don't read past the end. */
276 /* Get the nibble. */
277 nib
= ( p
[0] >> phase
) & 0xF;
282 exponent
= exponent
* 10 + nib
;
284 /* Arbitrarily limit exponent. */
285 if ( exponent
> 1000 )
290 exponent
= -exponent
;
293 /* We don't check `power_ten' and `exponent_add'. */
294 exponent
+= power_ten
+ exponent_add
;
298 /* Only use `fraction_length'. */
299 fraction_length
+= integer_length
;
300 exponent
+= integer_length
;
302 if ( fraction_length
<= 5 )
304 if ( number
> 0x7FFFL
)
306 result
= FT_DivFix( number
, 10 );
307 *scaling
= exponent
- fraction_length
+ 1;
313 FT_Int new_fraction_length
, shift
;
316 /* Make `scaling' as small as possible. */
317 new_fraction_length
= FT_MIN( exponent
, 5 );
318 exponent
-= new_fraction_length
;
319 shift
= new_fraction_length
- fraction_length
;
321 number
*= power_tens
[shift
];
322 if ( number
> 0x7FFFL
)
329 exponent
-= fraction_length
;
331 result
= number
<< 16;
337 if ( ( number
/ power_tens
[fraction_length
- 5] ) > 0x7FFFL
)
339 result
= FT_DivFix( number
, power_tens
[fraction_length
- 4] );
340 *scaling
= exponent
- 4;
344 result
= FT_DivFix( number
, power_tens
[fraction_length
- 5] );
345 *scaling
= exponent
- 5;
351 integer_length
+= exponent
;
352 fraction_length
-= exponent
;
354 /* Check for overflow and underflow. */
355 if ( FT_ABS( integer_length
) > 5 )
358 /* Convert into 16.16 format. */
359 if ( fraction_length
> 0 )
361 if ( ( number
/ power_tens
[fraction_length
] ) > 0x7FFFL
)
364 result
= FT_DivFix( number
, power_tens
[fraction_length
] );
368 number
*= power_tens
[-fraction_length
];
370 if ( number
> 0x7FFFL
)
373 result
= number
<< 16;
385 /* read a number, either integer or real */
387 cff_parse_num( FT_Byte
** d
)
389 return **d
== 30 ? ( cff_parse_real( d
[0], d
[1], 0, NULL
) >> 16 )
390 : cff_parse_integer( d
[0], d
[1] );
394 /* read a floating point number, either integer or real */
396 cff_parse_fixed( FT_Byte
** d
)
398 return **d
== 30 ? cff_parse_real( d
[0], d
[1], 0, NULL
)
399 : cff_parse_integer( d
[0], d
[1] ) << 16;
403 /* read a floating point number, either integer or real, */
404 /* but return `10^scaling' times the number read in */
406 cff_parse_fixed_scaled( FT_Byte
** d
,
410 30 ? cff_parse_real( d
[0], d
[1], scaling
, NULL
)
411 : (FT_Fixed
)FT_MulFix( cff_parse_integer( d
[0], d
[1] ) << 16,
412 power_tens
[scaling
] );
416 /* read a floating point number, either integer or real, */
417 /* and return it as precise as possible -- `scaling' returns */
418 /* the scaling factor (as a power of 10) */
420 cff_parse_fixed_dynamic( FT_Byte
** d
,
423 FT_ASSERT( scaling
);
426 return cff_parse_real( d
[0], d
[1], 0, scaling
);
430 FT_Int integer_length
;
433 number
= cff_parse_integer( d
[0], d
[1] );
435 if ( number
> 0x7FFFL
)
437 for ( integer_length
= 5; integer_length
< 10; integer_length
++ )
438 if ( number
< power_tens
[integer_length
] )
441 if ( ( number
/ power_tens
[integer_length
- 5] ) > 0x7FFFL
)
443 *scaling
= integer_length
- 4;
444 return FT_DivFix( number
, power_tens
[integer_length
- 4] );
448 *scaling
= integer_length
- 5;
449 return FT_DivFix( number
, power_tens
[integer_length
- 5] );
462 cff_parse_font_matrix( CFF_Parser parser
)
464 CFF_FontRecDict dict
= (CFF_FontRecDict
)parser
->object
;
465 FT_Matrix
* matrix
= &dict
->font_matrix
;
466 FT_Vector
* offset
= &dict
->font_offset
;
467 FT_ULong
* upm
= &dict
->units_per_em
;
468 FT_Byte
** data
= parser
->stack
;
469 FT_Error error
= CFF_Err_Stack_Underflow
;
472 if ( parser
->top
>= parser
->stack
+ 6 )
479 /* We expect a well-formed font matrix, this is, the matrix elements */
480 /* `xx' and `yy' are of approximately the same magnitude. To avoid */
481 /* loss of precision, we use the magnitude of element `xx' to scale */
482 /* all other elements. The scaling factor is then contained in the */
483 /* `units_per_em' value. */
485 matrix
->xx
= cff_parse_fixed_dynamic( data
++, &scaling
);
489 if ( scaling
< 0 || scaling
> 9 )
491 /* Return default matrix in case of unlikely values. */
492 matrix
->xx
= 0x10000L
;
495 matrix
->yy
= 0x10000L
;
503 matrix
->yx
= cff_parse_fixed_scaled( data
++, scaling
);
504 matrix
->xy
= cff_parse_fixed_scaled( data
++, scaling
);
505 matrix
->yy
= cff_parse_fixed_scaled( data
++, scaling
);
506 offset
->x
= cff_parse_fixed_scaled( data
++, scaling
);
507 offset
->y
= cff_parse_fixed_scaled( data
, scaling
);
509 *upm
= power_tens
[scaling
];
518 cff_parse_font_bbox( CFF_Parser parser
)
520 CFF_FontRecDict dict
= (CFF_FontRecDict
)parser
->object
;
521 FT_BBox
* bbox
= &dict
->font_bbox
;
522 FT_Byte
** data
= parser
->stack
;
526 error
= CFF_Err_Stack_Underflow
;
528 if ( parser
->top
>= parser
->stack
+ 4 )
530 bbox
->xMin
= FT_RoundFix( cff_parse_fixed( data
++ ) );
531 bbox
->yMin
= FT_RoundFix( cff_parse_fixed( data
++ ) );
532 bbox
->xMax
= FT_RoundFix( cff_parse_fixed( data
++ ) );
533 bbox
->yMax
= FT_RoundFix( cff_parse_fixed( data
) );
542 cff_parse_private_dict( CFF_Parser parser
)
544 CFF_FontRecDict dict
= (CFF_FontRecDict
)parser
->object
;
545 FT_Byte
** data
= parser
->stack
;
549 error
= CFF_Err_Stack_Underflow
;
551 if ( parser
->top
>= parser
->stack
+ 2 )
553 dict
->private_size
= cff_parse_num( data
++ );
554 dict
->private_offset
= cff_parse_num( data
);
563 cff_parse_cid_ros( CFF_Parser parser
)
565 CFF_FontRecDict dict
= (CFF_FontRecDict
)parser
->object
;
566 FT_Byte
** data
= parser
->stack
;
570 error
= CFF_Err_Stack_Underflow
;
572 if ( parser
->top
>= parser
->stack
+ 3 )
574 dict
->cid_registry
= (FT_UInt
)cff_parse_num ( data
++ );
575 dict
->cid_ordering
= (FT_UInt
)cff_parse_num ( data
++ );
576 dict
->cid_supplement
= (FT_ULong
)cff_parse_num( data
);
584 #define CFF_FIELD_NUM( code, name ) \
585 CFF_FIELD( code, name, cff_kind_num )
586 #define CFF_FIELD_FIXED( code, name ) \
587 CFF_FIELD( code, name, cff_kind_fixed )
588 #define CFF_FIELD_FIXED_1000( code, name ) \
589 CFF_FIELD( code, name, cff_kind_fixed_thousand )
590 #define CFF_FIELD_STRING( code, name ) \
591 CFF_FIELD( code, name, cff_kind_string )
592 #define CFF_FIELD_BOOL( code, name ) \
593 CFF_FIELD( code, name, cff_kind_bool )
594 #define CFF_FIELD_DELTA( code, name, max ) \
595 CFF_FIELD( code, name, cff_kind_delta )
597 #define CFF_FIELD_CALLBACK( code, name ) \
602 cff_parse_ ## name, \
607 #define CFF_FIELD( code, name, kind ) \
611 FT_FIELD_OFFSET( name ), \
612 FT_FIELD_SIZE( name ), \
616 #undef CFF_FIELD_DELTA
617 #define CFF_FIELD_DELTA( code, name, max ) \
621 FT_FIELD_OFFSET( name ), \
622 FT_FIELD_SIZE_DELTA( name ), \
625 FT_FIELD_OFFSET( num_ ## name ) \
628 #define CFFCODE_TOPDICT 0x1000
629 #define CFFCODE_PRIVATE 0x2000
631 static const CFF_Field_Handler cff_field_handlers
[] =
634 #include "cfftoken.h"
636 { 0, 0, 0, 0, 0, 0, 0 }
640 FT_LOCAL_DEF( FT_Error
)
641 cff_parser_run( CFF_Parser parser
,
646 FT_Error error
= CFF_Err_Ok
;
649 parser
->top
= parser
->stack
;
650 parser
->start
= start
;
651 parser
->limit
= limit
;
652 parser
->cursor
= start
;
659 if ( v
>= 27 && v
!= 31 )
661 /* it's a number; we will push its position on the stack */
662 if ( parser
->top
- parser
->stack
>= CFF_MAX_STACK_DEPTH
)
670 /* skip real number */
694 /* This is not a number, hence it's an operator. Compute its code */
695 /* and look for it in our current list. */
698 FT_UInt num_args
= (FT_UInt
)
699 ( parser
->top
- parser
->stack
);
700 const CFF_Field_Handler
* field
;
707 /* two byte operator */
714 code
= code
| parser
->object_code
;
716 for ( field
= cff_field_handlers
; field
->kind
; field
++ )
718 if ( field
->code
== (FT_Int
)code
)
720 /* we found our field's handler; read it */
722 FT_Byte
* q
= (FT_Byte
*)parser
->object
+ field
->offset
;
725 /* check that we have enough arguments -- except for */
726 /* delta encoded arrays, which can be empty */
727 if ( field
->kind
!= cff_kind_delta
&& num_args
< 1 )
728 goto Stack_Underflow
;
730 switch ( field
->kind
)
733 case cff_kind_string
:
735 val
= cff_parse_num( parser
->stack
);
739 val
= cff_parse_fixed( parser
->stack
);
742 case cff_kind_fixed_thousand
:
743 val
= cff_parse_fixed_scaled( parser
->stack
, 3 );
746 switch ( field
->size
)
748 case (8 / FT_CHAR_BIT
):
749 *(FT_Byte
*)q
= (FT_Byte
)val
;
752 case (16 / FT_CHAR_BIT
):
753 *(FT_Short
*)q
= (FT_Short
)val
;
756 case (32 / FT_CHAR_BIT
):
757 *(FT_Int32
*)q
= (FT_Int
)val
;
760 default: /* for 64-bit systems */
767 FT_Byte
* qcount
= (FT_Byte
*)parser
->object
+
770 FT_Byte
** data
= parser
->stack
;
773 if ( num_args
> field
->array_max
)
774 num_args
= field
->array_max
;
777 *qcount
= (FT_Byte
)num_args
;
780 while ( num_args
> 0 )
782 val
+= cff_parse_num( data
++ );
783 switch ( field
->size
)
785 case (8 / FT_CHAR_BIT
):
786 *(FT_Byte
*)q
= (FT_Byte
)val
;
789 case (16 / FT_CHAR_BIT
):
790 *(FT_Short
*)q
= (FT_Short
)val
;
793 case (32 / FT_CHAR_BIT
):
794 *(FT_Int32
*)q
= (FT_Int
)val
;
797 default: /* for 64-bit systems */
807 default: /* callback */
808 error
= field
->reader( parser
);
816 /* this is an unknown operator, or it is unsupported; */
817 /* we will ignore it for now. */
821 parser
->top
= parser
->stack
;
830 error
= CFF_Err_Invalid_Argument
;
834 error
= CFF_Err_Invalid_Argument
;
838 error
= CFF_Err_Invalid_Argument
;