1 /***************************************************************************/
5 /* OpenType and CFF data/program tables loader (body). */
7 /* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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 /***************************************************************************/
20 #include FT_INTERNAL_DEBUG_H
21 #include FT_INTERNAL_OBJECTS_H
22 #include FT_INTERNAL_STREAM_H
23 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
24 #include FT_TRUETYPE_TAGS_H
25 #include FT_TYPE1_TABLES_H
35 static const FT_UShort cff_isoadobe_charset
[229] =
37 0, 1, 2, 3, 4, 5, 6, 7,
38 8, 9, 10, 11, 12, 13, 14, 15,
39 16, 17, 18, 19, 20, 21, 22, 23,
40 24, 25, 26, 27, 28, 29, 30, 31,
41 32, 33, 34, 35, 36, 37, 38, 39,
42 40, 41, 42, 43, 44, 45, 46, 47,
43 48, 49, 50, 51, 52, 53, 54, 55,
44 56, 57, 58, 59, 60, 61, 62, 63,
45 64, 65, 66, 67, 68, 69, 70, 71,
46 72, 73, 74, 75, 76, 77, 78, 79,
47 80, 81, 82, 83, 84, 85, 86, 87,
48 88, 89, 90, 91, 92, 93, 94, 95,
49 96, 97, 98, 99, 100, 101, 102, 103,
50 104, 105, 106, 107, 108, 109, 110, 111,
51 112, 113, 114, 115, 116, 117, 118, 119,
52 120, 121, 122, 123, 124, 125, 126, 127,
53 128, 129, 130, 131, 132, 133, 134, 135,
54 136, 137, 138, 139, 140, 141, 142, 143,
55 144, 145, 146, 147, 148, 149, 150, 151,
56 152, 153, 154, 155, 156, 157, 158, 159,
57 160, 161, 162, 163, 164, 165, 166, 167,
58 168, 169, 170, 171, 172, 173, 174, 175,
59 176, 177, 178, 179, 180, 181, 182, 183,
60 184, 185, 186, 187, 188, 189, 190, 191,
61 192, 193, 194, 195, 196, 197, 198, 199,
62 200, 201, 202, 203, 204, 205, 206, 207,
63 208, 209, 210, 211, 212, 213, 214, 215,
64 216, 217, 218, 219, 220, 221, 222, 223,
65 224, 225, 226, 227, 228
68 static const FT_UShort cff_expert_charset
[166] =
70 0, 1, 229, 230, 231, 232, 233, 234,
71 235, 236, 237, 238, 13, 14, 15, 99,
72 239, 240, 241, 242, 243, 244, 245, 246,
73 247, 248, 27, 28, 249, 250, 251, 252,
74 253, 254, 255, 256, 257, 258, 259, 260,
75 261, 262, 263, 264, 265, 266, 109, 110,
76 267, 268, 269, 270, 271, 272, 273, 274,
77 275, 276, 277, 278, 279, 280, 281, 282,
78 283, 284, 285, 286, 287, 288, 289, 290,
79 291, 292, 293, 294, 295, 296, 297, 298,
80 299, 300, 301, 302, 303, 304, 305, 306,
81 307, 308, 309, 310, 311, 312, 313, 314,
82 315, 316, 317, 318, 158, 155, 163, 319,
83 320, 321, 322, 323, 324, 325, 326, 150,
84 164, 169, 327, 328, 329, 330, 331, 332,
85 333, 334, 335, 336, 337, 338, 339, 340,
86 341, 342, 343, 344, 345, 346, 347, 348,
87 349, 350, 351, 352, 353, 354, 355, 356,
88 357, 358, 359, 360, 361, 362, 363, 364,
89 365, 366, 367, 368, 369, 370, 371, 372,
90 373, 374, 375, 376, 377, 378
93 static const FT_UShort cff_expertsubset_charset
[87] =
95 0, 1, 231, 232, 235, 236, 237, 238,
96 13, 14, 15, 99, 239, 240, 241, 242,
97 243, 244, 245, 246, 247, 248, 27, 28,
98 249, 250, 251, 253, 254, 255, 256, 257,
99 258, 259, 260, 261, 262, 263, 264, 265,
100 266, 109, 110, 267, 268, 269, 270, 272,
101 300, 301, 302, 305, 314, 315, 158, 155,
102 163, 320, 321, 322, 323, 324, 325, 326,
103 150, 164, 169, 327, 328, 329, 330, 331,
104 332, 333, 334, 335, 336, 337, 338, 339,
105 340, 341, 342, 343, 344, 345, 346
108 static const FT_UShort cff_standard_encoding
[256] =
110 0, 0, 0, 0, 0, 0, 0, 0,
111 0, 0, 0, 0, 0, 0, 0, 0,
112 0, 0, 0, 0, 0, 0, 0, 0,
113 0, 0, 0, 0, 0, 0, 0, 0,
114 1, 2, 3, 4, 5, 6, 7, 8,
115 9, 10, 11, 12, 13, 14, 15, 16,
116 17, 18, 19, 20, 21, 22, 23, 24,
117 25, 26, 27, 28, 29, 30, 31, 32,
118 33, 34, 35, 36, 37, 38, 39, 40,
119 41, 42, 43, 44, 45, 46, 47, 48,
120 49, 50, 51, 52, 53, 54, 55, 56,
121 57, 58, 59, 60, 61, 62, 63, 64,
122 65, 66, 67, 68, 69, 70, 71, 72,
123 73, 74, 75, 76, 77, 78, 79, 80,
124 81, 82, 83, 84, 85, 86, 87, 88,
125 89, 90, 91, 92, 93, 94, 95, 0,
126 0, 0, 0, 0, 0, 0, 0, 0,
127 0, 0, 0, 0, 0, 0, 0, 0,
128 0, 0, 0, 0, 0, 0, 0, 0,
129 0, 0, 0, 0, 0, 0, 0, 0,
130 0, 96, 97, 98, 99, 100, 101, 102,
131 103, 104, 105, 106, 107, 108, 109, 110,
132 0, 111, 112, 113, 114, 0, 115, 116,
133 117, 118, 119, 120, 121, 122, 0, 123,
134 0, 124, 125, 126, 127, 128, 129, 130,
135 131, 0, 132, 133, 0, 134, 135, 136,
136 137, 0, 0, 0, 0, 0, 0, 0,
137 0, 0, 0, 0, 0, 0, 0, 0,
138 0, 138, 0, 139, 0, 0, 0, 0,
139 140, 141, 142, 143, 0, 0, 0, 0,
140 0, 144, 0, 0, 0, 145, 0, 0,
141 146, 147, 148, 149, 0, 0, 0, 0
144 static const FT_UShort cff_expert_encoding
[256] =
146 0, 0, 0, 0, 0, 0, 0, 0,
147 0, 0, 0, 0, 0, 0, 0, 0,
148 0, 0, 0, 0, 0, 0, 0, 0,
149 0, 0, 0, 0, 0, 0, 0, 0,
150 1, 229, 230, 0, 231, 232, 233, 234,
151 235, 236, 237, 238, 13, 14, 15, 99,
152 239, 240, 241, 242, 243, 244, 245, 246,
153 247, 248, 27, 28, 249, 250, 251, 252,
154 0, 253, 254, 255, 256, 257, 0, 0,
155 0, 258, 0, 0, 259, 260, 261, 262,
156 0, 0, 263, 264, 265, 0, 266, 109,
157 110, 267, 268, 269, 0, 270, 271, 272,
158 273, 274, 275, 276, 277, 278, 279, 280,
159 281, 282, 283, 284, 285, 286, 287, 288,
160 289, 290, 291, 292, 293, 294, 295, 296,
161 297, 298, 299, 300, 301, 302, 303, 0,
162 0, 0, 0, 0, 0, 0, 0, 0,
163 0, 0, 0, 0, 0, 0, 0, 0,
164 0, 0, 0, 0, 0, 0, 0, 0,
165 0, 0, 0, 0, 0, 0, 0, 0,
166 0, 304, 305, 306, 0, 0, 307, 308,
167 309, 310, 311, 0, 312, 0, 0, 312,
168 0, 0, 314, 315, 0, 0, 316, 317,
169 318, 0, 0, 0, 158, 155, 163, 319,
170 320, 321, 322, 323, 324, 325, 0, 0,
171 326, 150, 164, 169, 327, 328, 329, 330,
172 331, 332, 333, 334, 335, 336, 337, 338,
173 339, 340, 341, 342, 343, 344, 345, 346,
174 347, 348, 349, 350, 351, 352, 353, 354,
175 355, 356, 357, 358, 359, 360, 361, 362,
176 363, 364, 365, 366, 367, 368, 369, 370,
177 371, 372, 373, 374, 375, 376, 377, 378
183 FT_LOCAL_DEF( FT_UShort
)
184 cff_get_standard_encoding( FT_UInt charcode
)
186 return (FT_UShort
)( charcode
< 256 ? cff_standard_encoding
[charcode
]
191 /*************************************************************************/
193 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
194 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
195 /* messages during execution. */
198 #define FT_COMPONENT trace_cffload
201 /* read an offset from the index's stream current position */
203 cff_index_read_offset( CFF_Index idx
,
207 FT_Stream stream
= idx
->stream
;
212 if ( !FT_STREAM_READ( tmp
, idx
->off_size
) )
217 for ( nn
= 0; nn
< idx
->off_size
; nn
++ )
218 result
= ( result
<< 8 ) | tmp
[nn
];
227 cff_index_init( CFF_Index idx
,
232 FT_Memory memory
= stream
->memory
;
236 FT_MEM_ZERO( idx
, sizeof ( *idx
) );
238 idx
->stream
= stream
;
239 idx
->start
= FT_STREAM_POS();
240 if ( !FT_READ_USHORT( count
) &&
247 /* there is at least one element; read the offset size, */
248 /* then access the offset table to compute the index's total size */
249 if ( FT_READ_BYTE( offsize
) )
252 if ( offsize
< 1 || offsize
> 4 )
254 error
= FT_Err_Invalid_Table
;
259 idx
->off_size
= offsize
;
260 size
= (FT_ULong
)( count
+ 1 ) * offsize
;
262 idx
->data_offset
= idx
->start
+ 3 + size
;
264 if ( FT_STREAM_SKIP( size
- offsize
) )
267 size
= cff_index_read_offset( idx
, &error
);
273 error
= CFF_Err_Invalid_Table
;
277 idx
->data_size
= --size
;
282 if ( FT_FRAME_EXTRACT( size
, idx
->bytes
) )
288 if ( FT_STREAM_SKIP( size
) )
295 FT_FREE( idx
->offsets
);
302 cff_index_done( CFF_Index idx
)
306 FT_Stream stream
= idx
->stream
;
307 FT_Memory memory
= stream
->memory
;
311 FT_FRAME_RELEASE( idx
->bytes
);
313 FT_FREE( idx
->offsets
);
314 FT_MEM_ZERO( idx
, sizeof ( *idx
) );
320 cff_index_load_offsets( CFF_Index idx
)
322 FT_Error error
= CFF_Err_Ok
;
323 FT_Stream stream
= idx
->stream
;
324 FT_Memory memory
= stream
->memory
;
327 if ( idx
->count
> 0 && idx
->offsets
== NULL
)
329 FT_Byte offsize
= idx
->off_size
;
336 data_size
= (FT_ULong
)( idx
->count
+ 1 ) * offsize
;
338 if ( FT_NEW_ARRAY( idx
->offsets
, idx
->count
+ 1 ) ||
339 FT_STREAM_SEEK( idx
->start
+ 3 ) ||
340 FT_FRAME_ENTER( data_size
) )
344 p
= (FT_Byte
*)stream
->cursor
;
345 p_end
= p
+ data_size
;
350 for ( ; p
< p_end
; p
++, poff
++ )
355 for ( ; p
< p_end
; p
+= 2, poff
++ )
356 poff
[0] = FT_PEEK_USHORT( p
);
360 for ( ; p
< p_end
; p
+= 3, poff
++ )
361 poff
[0] = FT_PEEK_OFF3( p
);
365 for ( ; p
< p_end
; p
+= 4, poff
++ )
366 poff
[0] = FT_PEEK_ULONG( p
);
374 FT_FREE( idx
->offsets
);
380 /* allocate a table containing pointers to an index's elements */
382 cff_index_get_pointers( CFF_Index idx
,
385 FT_Error error
= CFF_Err_Ok
;
386 FT_Memory memory
= idx
->stream
->memory
;
387 FT_ULong n
, offset
, old_offset
;
393 if ( idx
->offsets
== NULL
)
395 error
= cff_index_load_offsets( idx
);
400 if ( idx
->count
> 0 && !FT_NEW_ARRAY( t
, idx
->count
+ 1 ) )
403 for ( n
= 0; n
<= idx
->count
; n
++ )
405 /* at this point, `idx->offsets' can't be NULL */
406 offset
= idx
->offsets
[n
];
410 /* two sanity checks for invalid offset tables */
411 else if ( offset
< old_offset
)
414 else if ( offset
- 1 >= idx
->data_size
&& n
< idx
->count
)
417 t
[n
] = idx
->bytes
+ offset
- 1;
429 FT_LOCAL_DEF( FT_Error
)
430 cff_index_access_element( CFF_Index idx
,
433 FT_ULong
* pbyte_len
)
435 FT_Error error
= CFF_Err_Ok
;
438 if ( idx
&& idx
->count
> element
)
440 /* compute start and end offsets */
441 FT_Stream stream
= idx
->stream
;
442 FT_ULong off1
, off2
= 0;
445 /* load offsets from file or the offset table */
448 FT_ULong pos
= element
* idx
->off_size
;
451 if ( FT_STREAM_SEEK( idx
->start
+ 3 + pos
) )
454 off1
= cff_index_read_offset( idx
, &error
);
463 off2
= cff_index_read_offset( idx
, &error
);
465 while ( off2
== 0 && element
< idx
->count
);
468 else /* use offsets table */
470 off1
= idx
->offsets
[element
];
476 off2
= idx
->offsets
[element
];
478 } while ( off2
== 0 && element
< idx
->count
);
483 if ( off1
&& off2
> off1
)
485 *pbyte_len
= off2
- off1
;
489 /* this index was completely loaded in memory, that's easy */
490 *pbytes
= idx
->bytes
+ off1
- 1;
494 /* this index is still on disk/file, access it through a frame */
495 if ( FT_STREAM_SEEK( idx
->data_offset
+ off1
- 1 ) ||
496 FT_FRAME_EXTRACT( off2
- off1
, *pbytes
) )
502 /* empty index element */
508 error
= CFF_Err_Invalid_Argument
;
516 cff_index_forget_element( CFF_Index idx
,
519 if ( idx
->bytes
== 0 )
521 FT_Stream stream
= idx
->stream
;
524 FT_FRAME_RELEASE( *pbytes
);
529 FT_LOCAL_DEF( FT_String
* )
530 cff_index_get_name( CFF_Index idx
,
533 FT_Memory memory
= idx
->stream
->memory
;
540 error
= cff_index_access_element( idx
, element
, &bytes
, &byte_len
);
544 if ( !FT_ALLOC( name
, byte_len
+ 1 ) )
546 FT_MEM_COPY( name
, bytes
, byte_len
);
549 cff_index_forget_element( idx
, &bytes
);
556 FT_LOCAL_DEF( FT_String
* )
557 cff_index_get_sid_string( CFF_Index idx
,
559 FT_Service_PsCMaps psnames
)
561 /* value 0xFFFFU indicates a missing dictionary entry */
562 if ( sid
== 0xFFFFU
)
565 /* if it is not a standard string, return it */
567 return cff_index_get_name( idx
, sid
- 391 );
569 /* CID-keyed CFF fonts don't have glyph names */
573 /* that's a standard string, fetch a copy from the PSName module */
576 const char* adobe_name
= psnames
->adobe_std_strings( sid
);
581 FT_Memory memory
= idx
->stream
->memory
;
585 (void)FT_STRDUP( name
, adobe_name
);
595 /*************************************************************************/
596 /*************************************************************************/
598 /*** FD Select table support ***/
600 /*************************************************************************/
601 /*************************************************************************/
605 CFF_Done_FD_Select( CFF_FDSelect fdselect
,
608 if ( fdselect
->data
)
609 FT_FRAME_RELEASE( fdselect
->data
);
611 fdselect
->data_size
= 0;
612 fdselect
->format
= 0;
613 fdselect
->range_count
= 0;
618 CFF_Load_FD_Select( CFF_FDSelect fdselect
,
629 if ( FT_STREAM_SEEK( offset
) || FT_READ_BYTE( format
) )
632 fdselect
->format
= format
;
633 fdselect
->cache_count
= 0; /* clear cache */
637 case 0: /* format 0, that's simple */
638 fdselect
->data_size
= num_glyphs
;
641 case 3: /* format 3, a tad more complex */
642 if ( FT_READ_USHORT( num_ranges
) )
645 fdselect
->data_size
= num_ranges
* 3 + 2;
648 if ( FT_FRAME_EXTRACT( fdselect
->data_size
, fdselect
->data
) )
652 default: /* hmm... that's wrong */
653 error
= CFF_Err_Invalid_File_Format
;
661 FT_LOCAL_DEF( FT_Byte
)
662 cff_fd_select_get( CFF_FDSelect fdselect
,
663 FT_UInt glyph_index
)
668 switch ( fdselect
->format
)
671 fd
= fdselect
->data
[glyph_index
];
675 /* first, compare to cache */
676 if ( (FT_UInt
)( glyph_index
- fdselect
->cache_first
) <
677 fdselect
->cache_count
)
679 fd
= fdselect
->cache_fd
;
683 /* then, lookup the ranges array */
685 FT_Byte
* p
= fdselect
->data
;
686 FT_Byte
* p_limit
= p
+ fdselect
->data_size
;
688 FT_UInt first
, limit
;
691 first
= FT_NEXT_USHORT( p
);
694 if ( glyph_index
< first
)
698 limit
= FT_NEXT_USHORT( p
);
700 if ( glyph_index
< limit
)
705 fdselect
->cache_first
= first
;
706 fdselect
->cache_count
= limit
-first
;
707 fdselect
->cache_fd
= fd2
;
712 } while ( p
< p_limit
);
724 /*************************************************************************/
725 /*************************************************************************/
727 /*** CFF font support ***/
729 /*************************************************************************/
730 /*************************************************************************/
733 cff_charset_compute_cids( CFF_Charset charset
,
737 FT_Error error
= FT_Err_Ok
;
740 FT_UShort max_cid
= 0;
743 if ( charset
->max_cid
> 0 )
746 for ( i
= 0; i
< num_glyphs
; i
++ )
747 if ( charset
->sids
[i
] > max_cid
)
748 max_cid
= charset
->sids
[i
];
751 if ( FT_NEW_ARRAY( charset
->cids
, max_cid
) )
754 /* When multiple GIDs map to the same CID, we choose the lowest */
755 /* GID. This is not described in any spec, but it matches the */
756 /* behaviour of recent Acroread versions. */
757 for ( j
= num_glyphs
- 1; j
>= 0 ; j
-- )
758 charset
->cids
[charset
->sids
[j
]] = (FT_UShort
)j
;
760 charset
->max_cid
= max_cid
;
761 charset
->num_glyphs
= num_glyphs
;
768 FT_LOCAL_DEF( FT_UInt
)
769 cff_charset_cid_to_gindex( CFF_Charset charset
,
775 if ( cid
< charset
->max_cid
)
776 result
= charset
->cids
[cid
];
783 cff_charset_free_cids( CFF_Charset charset
,
786 FT_FREE( charset
->cids
);
787 charset
->max_cid
= 0;
792 cff_charset_done( CFF_Charset charset
,
795 FT_Memory memory
= stream
->memory
;
798 cff_charset_free_cids( charset
, memory
);
800 FT_FREE( charset
->sids
);
807 cff_charset_load( CFF_Charset charset
,
810 FT_ULong base_offset
,
814 FT_Memory memory
= stream
->memory
;
815 FT_Error error
= CFF_Err_Ok
;
819 /* If the the offset is greater than 2, we have to parse the */
826 charset
->offset
= base_offset
+ offset
;
828 /* Get the format of the table. */
829 if ( FT_STREAM_SEEK( charset
->offset
) ||
830 FT_READ_BYTE( charset
->format
) )
833 /* Allocate memory for sids. */
834 if ( FT_NEW_ARRAY( charset
->sids
, num_glyphs
) )
837 /* assign the .notdef glyph */
838 charset
->sids
[0] = 0;
840 switch ( charset
->format
)
843 if ( num_glyphs
> 0 )
845 if ( FT_FRAME_ENTER( ( num_glyphs
- 1 ) * 2 ) )
848 for ( j
= 1; j
< num_glyphs
; j
++ )
850 FT_UShort sid
= FT_GET_USHORT();
853 /* this constant is given in the CFF specification */
855 charset
->sids
[j
] = sid
;
858 FT_TRACE0(( "cff_charset_load:"
859 " invalid SID value %d set to zero\n", sid
));
860 charset
->sids
[j
] = 0;
877 while ( j
< num_glyphs
)
879 /* Read the first glyph sid of the range. */
880 if ( FT_READ_USHORT( glyph_sid
) )
883 /* Read the number of glyphs in the range. */
884 if ( charset
->format
== 2 )
886 if ( FT_READ_USHORT( nleft
) )
891 if ( FT_READ_BYTE( nleft
) )
895 /* check whether the range contains at least one valid glyph; */
896 /* the constant is given in the CFF specification */
897 if ( glyph_sid
>= 65000L ) {
898 FT_ERROR(( "cff_charset_load: invalid SID range\n" ));
899 error
= CFF_Err_Invalid_File_Format
;
903 /* try to rescue some of the SIDs if `nleft' is too large */
904 if ( nleft
> 65000L - 1L || glyph_sid
>= 65000L - nleft
) {
905 FT_ERROR(( "cff_charset_load: invalid SID range trimmed\n" ));
906 nleft
= ( FT_UInt
)( 65000L - 1L - glyph_sid
);
909 /* Fill in the range of sids -- `nleft + 1' glyphs. */
910 for ( i
= 0; j
< num_glyphs
&& i
<= nleft
; i
++, j
++, glyph_sid
++ )
911 charset
->sids
[j
] = glyph_sid
;
917 FT_ERROR(( "cff_charset_load: invalid table format\n" ));
918 error
= CFF_Err_Invalid_File_Format
;
924 /* Parse default tables corresponding to offset == 0, 1, or 2. */
925 /* CFF specification intimates the following: */
927 /* In order to use a predefined charset, the following must be */
928 /* true: The charset constructed for the glyphs in the font's */
929 /* charstrings dictionary must match the predefined charset in */
930 /* the first num_glyphs. */
932 charset
->offset
= offset
; /* record charset type */
934 switch ( (FT_UInt
)offset
)
937 if ( num_glyphs
> 229 )
939 FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
940 "predefined charset (Adobe ISO-Latin)\n" ));
941 error
= CFF_Err_Invalid_File_Format
;
945 /* Allocate memory for sids. */
946 if ( FT_NEW_ARRAY( charset
->sids
, num_glyphs
) )
949 /* Copy the predefined charset into the allocated memory. */
950 FT_ARRAY_COPY( charset
->sids
, cff_isoadobe_charset
, num_glyphs
);
955 if ( num_glyphs
> 166 )
957 FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
958 "predefined charset (Adobe Expert)\n" ));
959 error
= CFF_Err_Invalid_File_Format
;
963 /* Allocate memory for sids. */
964 if ( FT_NEW_ARRAY( charset
->sids
, num_glyphs
) )
967 /* Copy the predefined charset into the allocated memory. */
968 FT_ARRAY_COPY( charset
->sids
, cff_expert_charset
, num_glyphs
);
973 if ( num_glyphs
> 87 )
975 FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
976 "predefined charset (Adobe Expert Subset)\n" ));
977 error
= CFF_Err_Invalid_File_Format
;
981 /* Allocate memory for sids. */
982 if ( FT_NEW_ARRAY( charset
->sids
, num_glyphs
) )
985 /* Copy the predefined charset into the allocated memory. */
986 FT_ARRAY_COPY( charset
->sids
, cff_expertsubset_charset
, num_glyphs
);
991 error
= CFF_Err_Invalid_File_Format
;
996 /* we have to invert the `sids' array for subsetted CID-keyed fonts */
998 error
= cff_charset_compute_cids( charset
, num_glyphs
, memory
);
1001 /* Clean up if there was an error. */
1004 FT_FREE( charset
->sids
);
1005 FT_FREE( charset
->cids
);
1006 charset
->format
= 0;
1007 charset
->offset
= 0;
1016 cff_encoding_done( CFF_Encoding encoding
)
1018 encoding
->format
= 0;
1019 encoding
->offset
= 0;
1020 encoding
->count
= 0;
1025 cff_encoding_load( CFF_Encoding encoding
,
1026 CFF_Charset charset
,
1029 FT_ULong base_offset
,
1032 FT_Error error
= CFF_Err_Ok
;
1035 FT_UShort glyph_sid
;
1039 /* Check for charset->sids. If we do not have this, we fail. */
1040 if ( !charset
->sids
)
1042 error
= CFF_Err_Invalid_File_Format
;
1046 /* Zero out the code to gid/sid mappings. */
1047 for ( j
= 0; j
< 256; j
++ )
1049 encoding
->sids
[j
] = 0;
1050 encoding
->codes
[j
] = 0;
1053 /* Note: The encoding table in a CFF font is indexed by glyph index; */
1054 /* the first encoded glyph index is 1. Hence, we read the character */
1055 /* code (`glyph_code') at index j and make the assignment: */
1057 /* encoding->codes[glyph_code] = j + 1 */
1059 /* We also make the assignment: */
1061 /* encoding->sids[glyph_code] = charset->sids[j + 1] */
1063 /* This gives us both a code to GID and a code to SID mapping. */
1067 encoding
->offset
= base_offset
+ offset
;
1069 /* we need to parse the table to determine its size */
1070 if ( FT_STREAM_SEEK( encoding
->offset
) ||
1071 FT_READ_BYTE( encoding
->format
) ||
1072 FT_READ_BYTE( count
) )
1075 switch ( encoding
->format
& 0x7F )
1082 /* By convention, GID 0 is always ".notdef" and is never */
1083 /* coded in the font. Hence, the number of codes found */
1084 /* in the table is `count+1'. */
1086 encoding
->count
= count
+ 1;
1088 if ( FT_FRAME_ENTER( count
) )
1091 p
= (FT_Byte
*)stream
->cursor
;
1093 for ( j
= 1; j
<= count
; j
++ )
1097 /* Make sure j is not too big. */
1098 if ( j
< num_glyphs
)
1100 /* Assign code to GID mapping. */
1101 encoding
->codes
[glyph_code
] = (FT_UShort
)j
;
1103 /* Assign code to SID mapping. */
1104 encoding
->sids
[glyph_code
] = charset
->sids
[j
];
1119 encoding
->count
= 0;
1121 /* Parse the Format1 ranges. */
1122 for ( j
= 0; j
< count
; j
++, i
+= nleft
)
1124 /* Read the first glyph code of the range. */
1125 if ( FT_READ_BYTE( glyph_code
) )
1128 /* Read the number of codes in the range. */
1129 if ( FT_READ_BYTE( nleft
) )
1132 /* Increment nleft, so we read `nleft + 1' codes/sids. */
1135 /* compute max number of character codes */
1136 if ( (FT_UInt
)nleft
> encoding
->count
)
1137 encoding
->count
= nleft
;
1139 /* Fill in the range of codes/sids. */
1140 for ( k
= i
; k
< nleft
+ i
; k
++, glyph_code
++ )
1142 /* Make sure k is not too big. */
1143 if ( k
< num_glyphs
&& glyph_code
< 256 )
1145 /* Assign code to GID mapping. */
1146 encoding
->codes
[glyph_code
] = (FT_UShort
)k
;
1148 /* Assign code to SID mapping. */
1149 encoding
->sids
[glyph_code
] = charset
->sids
[k
];
1154 /* simple check; one never knows what can be found in a font */
1155 if ( encoding
->count
> 256 )
1156 encoding
->count
= 256;
1161 FT_ERROR(( "cff_encoding_load: invalid table format\n" ));
1162 error
= CFF_Err_Invalid_File_Format
;
1166 /* Parse supplemental encodings, if any. */
1167 if ( encoding
->format
& 0x80 )
1172 /* count supplements */
1173 if ( FT_READ_BYTE( count
) )
1176 for ( j
= 0; j
< count
; j
++ )
1178 /* Read supplemental glyph code. */
1179 if ( FT_READ_BYTE( glyph_code
) )
1182 /* Read the SID associated with this glyph code. */
1183 if ( FT_READ_USHORT( glyph_sid
) )
1186 /* Assign code to SID mapping. */
1187 encoding
->sids
[glyph_code
] = glyph_sid
;
1189 /* First, look up GID which has been assigned to */
1190 /* SID glyph_sid. */
1191 for ( gindex
= 0; gindex
< num_glyphs
; gindex
++ )
1193 if ( charset
->sids
[gindex
] == glyph_sid
)
1195 encoding
->codes
[glyph_code
] = (FT_UShort
)gindex
;
1204 /* We take into account the fact a CFF font can use a predefined */
1205 /* encoding without containing all of the glyphs encoded by this */
1206 /* encoding (see the note at the end of section 12 in the CFF */
1207 /* specification). */
1209 switch ( (FT_UInt
)offset
)
1212 /* First, copy the code to SID mapping. */
1213 FT_ARRAY_COPY( encoding
->sids
, cff_standard_encoding
, 256 );
1217 /* First, copy the code to SID mapping. */
1218 FT_ARRAY_COPY( encoding
->sids
, cff_expert_encoding
, 256 );
1221 /* Construct code to GID mapping from code to SID mapping */
1224 encoding
->count
= 0;
1226 error
= cff_charset_compute_cids( charset
, num_glyphs
,
1231 for ( j
= 0; j
< 256; j
++ )
1233 FT_UInt sid
= encoding
->sids
[j
];
1238 gid
= cff_charset_cid_to_gindex( charset
, sid
);
1242 encoding
->codes
[j
] = (FT_UShort
)gid
;
1244 if ( encoding
->count
< j
+ 1 )
1245 encoding
->count
= j
+ 1;
1249 encoding
->codes
[j
] = 0;
1250 encoding
->sids
[j
] = 0;
1256 FT_ERROR(( "cff_encoding_load: invalid table format\n" ));
1257 error
= CFF_Err_Invalid_File_Format
;
1264 /* Clean up if there was an error. */
1270 cff_subfont_load( CFF_SubFont font
,
1274 FT_ULong base_offset
,
1275 FT_Library library
)
1278 CFF_ParserRec parser
;
1279 FT_Byte
* dict
= NULL
;
1281 CFF_FontRecDict top
= &font
->font_dict
;
1282 CFF_Private priv
= &font
->private_dict
;
1285 cff_parser_init( &parser
, CFF_CODE_TOPDICT
, &font
->font_dict
, library
);
1288 FT_MEM_ZERO( top
, sizeof ( *top
) );
1290 top
->underline_position
= -100L << 16;
1291 top
->underline_thickness
= 50L << 16;
1292 top
->charstring_type
= 2;
1293 top
->font_matrix
.xx
= 0x10000L
;
1294 top
->font_matrix
.yy
= 0x10000L
;
1295 top
->cid_count
= 8720;
1297 /* we use the implementation specific SID value 0xFFFF to indicate */
1298 /* missing entries */
1299 top
->version
= 0xFFFFU
;
1300 top
->notice
= 0xFFFFU
;
1301 top
->copyright
= 0xFFFFU
;
1302 top
->full_name
= 0xFFFFU
;
1303 top
->family_name
= 0xFFFFU
;
1304 top
->weight
= 0xFFFFU
;
1305 top
->embedded_postscript
= 0xFFFFU
;
1307 top
->cid_registry
= 0xFFFFU
;
1308 top
->cid_ordering
= 0xFFFFU
;
1309 top
->cid_font_name
= 0xFFFFU
;
1311 error
= cff_index_access_element( idx
, font_index
, &dict
, &dict_len
);
1313 error
= cff_parser_run( &parser
, dict
, dict
+ dict_len
);
1315 cff_index_forget_element( idx
, &dict
);
1320 /* if it is a CID font, we stop there */
1321 if ( top
->cid_registry
!= 0xFFFFU
)
1324 /* parse the private dictionary, if any */
1325 if ( top
->private_offset
&& top
->private_size
)
1328 FT_MEM_ZERO( priv
, sizeof ( *priv
) );
1330 priv
->blue_shift
= 7;
1331 priv
->blue_fuzz
= 1;
1333 priv
->expansion_factor
= (FT_Fixed
)( 0.06 * 0x10000L
);
1334 priv
->blue_scale
= (FT_Fixed
)( 0.039625 * 0x10000L
* 1000 );
1336 cff_parser_init( &parser
, CFF_CODE_PRIVATE
, priv
, library
);
1338 if ( FT_STREAM_SEEK( base_offset
+ font
->font_dict
.private_offset
) ||
1339 FT_FRAME_ENTER( font
->font_dict
.private_size
) )
1342 error
= cff_parser_run( &parser
,
1343 (FT_Byte
*)stream
->cursor
,
1344 (FT_Byte
*)stream
->limit
);
1349 /* ensure that `num_blue_values' is even */
1350 priv
->num_blue_values
&= ~1;
1353 /* read the local subrs, if any */
1354 if ( priv
->local_subrs_offset
)
1356 if ( FT_STREAM_SEEK( base_offset
+ top
->private_offset
+
1357 priv
->local_subrs_offset
) )
1360 error
= cff_index_init( &font
->local_subrs_index
, stream
, 1 );
1364 font
->num_local_subrs
= font
->local_subrs_index
.count
;
1365 error
= cff_index_get_pointers( &font
->local_subrs_index
,
1366 &font
->local_subrs
);
1377 cff_subfont_done( FT_Memory memory
,
1378 CFF_SubFont subfont
)
1382 cff_index_done( &subfont
->local_subrs_index
);
1383 FT_FREE( subfont
->local_subrs
);
1388 FT_LOCAL_DEF( FT_Error
)
1389 cff_font_load( FT_Library library
,
1395 static const FT_Frame_Field cff_header_fields
[] =
1398 #define FT_STRUCTURE CFF_FontRec
1400 FT_FRAME_START( 4 ),
1401 FT_FRAME_BYTE( version_major
),
1402 FT_FRAME_BYTE( version_minor
),
1403 FT_FRAME_BYTE( header_size
),
1404 FT_FRAME_BYTE( absolute_offsize
),
1409 FT_Memory memory
= stream
->memory
;
1410 FT_ULong base_offset
;
1411 CFF_FontRecDict dict
;
1416 font
->stream
= stream
;
1417 font
->memory
= memory
;
1418 dict
= &font
->top_font
.font_dict
;
1419 base_offset
= FT_STREAM_POS();
1421 /* read CFF font header */
1422 if ( FT_STREAM_READ_FIELDS( cff_header_fields
, font
) )
1426 if ( font
->version_major
!= 1 ||
1427 font
->header_size
< 4 ||
1428 font
->absolute_offsize
> 4 )
1430 FT_TRACE2(( "[not a CFF font header]\n" ));
1431 error
= CFF_Err_Unknown_File_Format
;
1435 /* skip the rest of the header */
1436 if ( FT_STREAM_SKIP( font
->header_size
- 4 ) )
1439 /* read the name, top dict, string and global subrs index */
1440 if ( FT_SET_ERROR( cff_index_init( &font
->name_index
,
1442 FT_SET_ERROR( cff_index_init( &font
->font_dict_index
,
1444 FT_SET_ERROR( cff_index_init( &font
->string_index
,
1446 FT_SET_ERROR( cff_index_init( &font
->global_subrs_index
,
1450 /* well, we don't really forget the `disabled' fonts... */
1451 font
->num_faces
= font
->name_index
.count
;
1452 if ( face_index
>= (FT_Int
)font
->num_faces
)
1454 FT_ERROR(( "cff_font_load: incorrect face index = %d\n",
1456 error
= CFF_Err_Invalid_Argument
;
1459 /* in case of a font format check, simply exit now */
1460 if ( face_index
< 0 )
1463 /* now, parse the top-level font dictionary */
1464 error
= cff_subfont_load( &font
->top_font
,
1465 &font
->font_dict_index
,
1473 if ( FT_STREAM_SEEK( base_offset
+ dict
->charstrings_offset
) )
1476 error
= cff_index_init( &font
->charstrings_index
, stream
, 0 );
1480 /* now, check for a CID font */
1481 if ( dict
->cid_registry
!= 0xFFFFU
)
1483 CFF_IndexRec fd_index
;
1488 /* this is a CID-keyed font, we must now allocate a table of */
1489 /* sub-fonts, then load each of them separately */
1490 if ( FT_STREAM_SEEK( base_offset
+ dict
->cid_fd_array_offset
) )
1493 error
= cff_index_init( &fd_index
, stream
, 0 );
1497 if ( fd_index
.count
> CFF_MAX_CID_FONTS
)
1499 FT_TRACE0(( "cff_font_load: FD array too large in CID font\n" ));
1503 /* allocate & read each font dict independently */
1504 font
->num_subfonts
= fd_index
.count
;
1505 if ( FT_NEW_ARRAY( sub
, fd_index
.count
) )
1508 /* set up pointer table */
1509 for ( idx
= 0; idx
< fd_index
.count
; idx
++ )
1510 font
->subfonts
[idx
] = sub
+ idx
;
1512 /* now load each subfont independently */
1513 for ( idx
= 0; idx
< fd_index
.count
; idx
++ )
1515 sub
= font
->subfonts
[idx
];
1516 error
= cff_subfont_load( sub
, &fd_index
, idx
,
1517 stream
, base_offset
, library
);
1522 /* now load the FD Select array */
1523 error
= CFF_Load_FD_Select( &font
->fd_select
,
1524 font
->charstrings_index
.count
,
1526 base_offset
+ dict
->cid_fd_select_offset
);
1529 cff_index_done( &fd_index
);
1535 font
->num_subfonts
= 0;
1537 /* read the charstrings index now */
1538 if ( dict
->charstrings_offset
== 0 )
1540 FT_ERROR(( "cff_font_load: no charstrings offset\n" ));
1541 error
= CFF_Err_Unknown_File_Format
;
1545 /* explicit the global subrs */
1546 font
->num_global_subrs
= font
->global_subrs_index
.count
;
1547 font
->num_glyphs
= font
->charstrings_index
.count
;
1549 error
= cff_index_get_pointers( &font
->global_subrs_index
,
1550 &font
->global_subrs
) ;
1555 /* read the Charset and Encoding tables if available */
1556 if ( font
->num_glyphs
> 0 )
1558 FT_Bool invert
= FT_BOOL( dict
->cid_registry
!= 0xFFFFU
&& pure_cff
);
1561 error
= cff_charset_load( &font
->charset
, font
->num_glyphs
, stream
,
1562 base_offset
, dict
->charset_offset
, invert
);
1566 /* CID-keyed CFFs don't have an encoding */
1567 if ( dict
->cid_registry
== 0xFFFFU
)
1569 error
= cff_encoding_load( &font
->encoding
,
1574 dict
->encoding_offset
);
1580 /* get the font name (/CIDFontName for CID-keyed fonts, */
1581 /* /FontName otherwise) */
1582 font
->font_name
= cff_index_get_name( &font
->name_index
, face_index
);
1589 FT_LOCAL_DEF( void )
1590 cff_font_done( CFF_Font font
)
1592 FT_Memory memory
= font
->memory
;
1596 cff_index_done( &font
->global_subrs_index
);
1597 cff_index_done( &font
->string_index
);
1598 cff_index_done( &font
->font_dict_index
);
1599 cff_index_done( &font
->name_index
);
1600 cff_index_done( &font
->charstrings_index
);
1602 /* release font dictionaries, but only if working with */
1603 /* a CID keyed CFF font */
1604 if ( font
->num_subfonts
> 0 )
1606 for ( idx
= 0; idx
< font
->num_subfonts
; idx
++ )
1607 cff_subfont_done( memory
, font
->subfonts
[idx
] );
1609 /* the subfonts array has been allocated as a single block */
1610 FT_FREE( font
->subfonts
[0] );
1613 cff_encoding_done( &font
->encoding
);
1614 cff_charset_done( &font
->charset
, font
->stream
);
1616 cff_subfont_done( memory
, &font
->top_font
);
1618 CFF_Done_FD_Select( &font
->fd_select
, font
->stream
);
1620 if (font
->font_info
!= NULL
)
1622 FT_FREE( font
->font_info
->version
);
1623 FT_FREE( font
->font_info
->notice
);
1624 FT_FREE( font
->font_info
->full_name
);
1625 FT_FREE( font
->font_info
->family_name
);
1626 FT_FREE( font
->font_info
->weight
);
1627 FT_FREE( font
->font_info
);
1630 FT_FREE( font
->registry
);
1631 FT_FREE( font
->ordering
);
1633 FT_FREE( font
->global_subrs
);
1634 FT_FREE( font
->font_name
);