1 /***************************************************************************/
5 /* OpenType and CFF data/program tables loader (body). */
7 /* Copyright 1996-2016 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_TRUETYPE_TAGS_H
24 #include FT_TYPE1_TABLES_H
34 static const FT_UShort cff_isoadobe_charset[229] =
36 0, 1, 2, 3, 4, 5, 6, 7,
37 8, 9, 10, 11, 12, 13, 14, 15,
38 16, 17, 18, 19, 20, 21, 22, 23,
39 24, 25, 26, 27, 28, 29, 30, 31,
40 32, 33, 34, 35, 36, 37, 38, 39,
41 40, 41, 42, 43, 44, 45, 46, 47,
42 48, 49, 50, 51, 52, 53, 54, 55,
43 56, 57, 58, 59, 60, 61, 62, 63,
44 64, 65, 66, 67, 68, 69, 70, 71,
45 72, 73, 74, 75, 76, 77, 78, 79,
46 80, 81, 82, 83, 84, 85, 86, 87,
47 88, 89, 90, 91, 92, 93, 94, 95,
48 96, 97, 98, 99, 100, 101, 102, 103,
49 104, 105, 106, 107, 108, 109, 110, 111,
50 112, 113, 114, 115, 116, 117, 118, 119,
51 120, 121, 122, 123, 124, 125, 126, 127,
52 128, 129, 130, 131, 132, 133, 134, 135,
53 136, 137, 138, 139, 140, 141, 142, 143,
54 144, 145, 146, 147, 148, 149, 150, 151,
55 152, 153, 154, 155, 156, 157, 158, 159,
56 160, 161, 162, 163, 164, 165, 166, 167,
57 168, 169, 170, 171, 172, 173, 174, 175,
58 176, 177, 178, 179, 180, 181, 182, 183,
59 184, 185, 186, 187, 188, 189, 190, 191,
60 192, 193, 194, 195, 196, 197, 198, 199,
61 200, 201, 202, 203, 204, 205, 206, 207,
62 208, 209, 210, 211, 212, 213, 214, 215,
63 216, 217, 218, 219, 220, 221, 222, 223,
64 224, 225, 226, 227, 228
67 static const FT_UShort cff_expert_charset[166] =
69 0, 1, 229, 230, 231, 232, 233, 234,
70 235, 236, 237, 238, 13, 14, 15, 99,
71 239, 240, 241, 242, 243, 244, 245, 246,
72 247, 248, 27, 28, 249, 250, 251, 252,
73 253, 254, 255, 256, 257, 258, 259, 260,
74 261, 262, 263, 264, 265, 266, 109, 110,
75 267, 268, 269, 270, 271, 272, 273, 274,
76 275, 276, 277, 278, 279, 280, 281, 282,
77 283, 284, 285, 286, 287, 288, 289, 290,
78 291, 292, 293, 294, 295, 296, 297, 298,
79 299, 300, 301, 302, 303, 304, 305, 306,
80 307, 308, 309, 310, 311, 312, 313, 314,
81 315, 316, 317, 318, 158, 155, 163, 319,
82 320, 321, 322, 323, 324, 325, 326, 150,
83 164, 169, 327, 328, 329, 330, 331, 332,
84 333, 334, 335, 336, 337, 338, 339, 340,
85 341, 342, 343, 344, 345, 346, 347, 348,
86 349, 350, 351, 352, 353, 354, 355, 356,
87 357, 358, 359, 360, 361, 362, 363, 364,
88 365, 366, 367, 368, 369, 370, 371, 372,
89 373, 374, 375, 376, 377, 378
92 static const FT_UShort cff_expertsubset_charset[87] =
94 0, 1, 231, 232, 235, 236, 237, 238,
95 13, 14, 15, 99, 239, 240, 241, 242,
96 243, 244, 245, 246, 247, 248, 27, 28,
97 249, 250, 251, 253, 254, 255, 256, 257,
98 258, 259, 260, 261, 262, 263, 264, 265,
99 266, 109, 110, 267, 268, 269, 270, 272,
100 300, 301, 302, 305, 314, 315, 158, 155,
101 163, 320, 321, 322, 323, 324, 325, 326,
102 150, 164, 169, 327, 328, 329, 330, 331,
103 332, 333, 334, 335, 336, 337, 338, 339,
104 340, 341, 342, 343, 344, 345, 346
107 static const FT_UShort cff_standard_encoding[256] =
109 0, 0, 0, 0, 0, 0, 0, 0,
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 1, 2, 3, 4, 5, 6, 7, 8,
114 9, 10, 11, 12, 13, 14, 15, 16,
115 17, 18, 19, 20, 21, 22, 23, 24,
116 25, 26, 27, 28, 29, 30, 31, 32,
117 33, 34, 35, 36, 37, 38, 39, 40,
118 41, 42, 43, 44, 45, 46, 47, 48,
119 49, 50, 51, 52, 53, 54, 55, 56,
120 57, 58, 59, 60, 61, 62, 63, 64,
121 65, 66, 67, 68, 69, 70, 71, 72,
122 73, 74, 75, 76, 77, 78, 79, 80,
123 81, 82, 83, 84, 85, 86, 87, 88,
124 89, 90, 91, 92, 93, 94, 95, 0,
125 0, 0, 0, 0, 0, 0, 0, 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, 96, 97, 98, 99, 100, 101, 102,
130 103, 104, 105, 106, 107, 108, 109, 110,
131 0, 111, 112, 113, 114, 0, 115, 116,
132 117, 118, 119, 120, 121, 122, 0, 123,
133 0, 124, 125, 126, 127, 128, 129, 130,
134 131, 0, 132, 133, 0, 134, 135, 136,
135 137, 0, 0, 0, 0, 0, 0, 0,
136 0, 0, 0, 0, 0, 0, 0, 0,
137 0, 138, 0, 139, 0, 0, 0, 0,
138 140, 141, 142, 143, 0, 0, 0, 0,
139 0, 144, 0, 0, 0, 145, 0, 0,
140 146, 147, 148, 149, 0, 0, 0, 0
143 static const FT_UShort cff_expert_encoding[256] =
145 0, 0, 0, 0, 0, 0, 0, 0,
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 1, 229, 230, 0, 231, 232, 233, 234,
150 235, 236, 237, 238, 13, 14, 15, 99,
151 239, 240, 241, 242, 243, 244, 245, 246,
152 247, 248, 27, 28, 249, 250, 251, 252,
153 0, 253, 254, 255, 256, 257, 0, 0,
154 0, 258, 0, 0, 259, 260, 261, 262,
155 0, 0, 263, 264, 265, 0, 266, 109,
156 110, 267, 268, 269, 0, 270, 271, 272,
157 273, 274, 275, 276, 277, 278, 279, 280,
158 281, 282, 283, 284, 285, 286, 287, 288,
159 289, 290, 291, 292, 293, 294, 295, 296,
160 297, 298, 299, 300, 301, 302, 303, 0,
161 0, 0, 0, 0, 0, 0, 0, 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, 304, 305, 306, 0, 0, 307, 308,
166 309, 310, 311, 0, 312, 0, 0, 312,
167 0, 0, 314, 315, 0, 0, 316, 317,
168 318, 0, 0, 0, 158, 155, 163, 319,
169 320, 321, 322, 323, 324, 325, 0, 0,
170 326, 150, 164, 169, 327, 328, 329, 330,
171 331, 332, 333, 334, 335, 336, 337, 338,
172 339, 340, 341, 342, 343, 344, 345, 346,
173 347, 348, 349, 350, 351, 352, 353, 354,
174 355, 356, 357, 358, 359, 360, 361, 362,
175 363, 364, 365, 366, 367, 368, 369, 370,
176 371, 372, 373, 374, 375, 376, 377, 378
182 FT_LOCAL_DEF( FT_UShort )
183 cff_get_standard_encoding( FT_UInt charcode )
185 return (FT_UShort)( charcode < 256 ? cff_standard_encoding[charcode]
190 /*************************************************************************/
192 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
193 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
194 /* messages during execution. */
197 #define FT_COMPONENT trace_cffload
200 /* read an offset from the index's stream current position */
202 cff_index_read_offset( CFF_Index idx,
206 FT_Stream stream = idx->stream;
211 if ( !FT_STREAM_READ( tmp, idx->off_size ) )
216 for ( nn = 0; nn < idx->off_size; nn++ )
217 result = ( result << 8 ) | tmp[nn];
226 cff_index_init( CFF_Index idx,
231 FT_Memory memory = stream->memory;
235 FT_MEM_ZERO( idx, sizeof ( *idx ) );
237 idx->stream = stream;
238 idx->start = FT_STREAM_POS();
239 if ( !FT_READ_USHORT( count ) &&
246 /* there is at least one element; read the offset size, */
247 /* then access the offset table to compute the index's total size */
248 if ( FT_READ_BYTE( offsize ) )
251 if ( offsize < 1 || offsize > 4 )
253 error = FT_THROW( Invalid_Table );
258 idx->off_size = offsize;
259 size = (FT_ULong)( count + 1 ) * offsize;
261 idx->data_offset = idx->start + 3 + size;
263 if ( FT_STREAM_SKIP( size - offsize ) )
266 size = cff_index_read_offset( idx, &error );
272 error = FT_THROW( Invalid_Table );
276 idx->data_size = --size;
281 if ( FT_FRAME_EXTRACT( size, idx->bytes ) )
287 if ( FT_STREAM_SKIP( size ) )
294 FT_FREE( idx->offsets );
301 cff_index_done( CFF_Index idx )
305 FT_Stream stream = idx->stream;
306 FT_Memory memory = stream->memory;
310 FT_FRAME_RELEASE( idx->bytes );
312 FT_FREE( idx->offsets );
313 FT_MEM_ZERO( idx, sizeof ( *idx ) );
319 cff_index_load_offsets( CFF_Index idx )
321 FT_Error error = FT_Err_Ok;
322 FT_Stream stream = idx->stream;
323 FT_Memory memory = stream->memory;
326 if ( idx->count > 0 && idx->offsets == NULL )
328 FT_Byte offsize = idx->off_size;
335 data_size = (FT_ULong)( idx->count + 1 ) * offsize;
337 if ( FT_NEW_ARRAY( idx->offsets, idx->count + 1 ) ||
338 FT_STREAM_SEEK( idx->start + 3 ) ||
339 FT_FRAME_ENTER( data_size ) )
343 p = (FT_Byte*)stream->cursor;
344 p_end = p + data_size;
349 for ( ; p < p_end; p++, poff++ )
354 for ( ; p < p_end; p += 2, poff++ )
355 poff[0] = FT_PEEK_USHORT( p );
359 for ( ; p < p_end; p += 3, poff++ )
360 poff[0] = FT_PEEK_UOFF3( p );
364 for ( ; p < p_end; p += 4, poff++ )
365 poff[0] = FT_PEEK_ULONG( p );
373 FT_FREE( idx->offsets );
379 /* Allocate a table containing pointers to an index's elements. */
380 /* The `pool' argument makes this function convert the index */
381 /* entries to C-style strings (this is, NULL-terminated). */
383 cff_index_get_pointers( CFF_Index idx,
386 FT_ULong* pool_size )
388 FT_Error error = FT_Err_Ok;
389 FT_Memory memory = idx->stream->memory;
392 FT_Byte* new_bytes = NULL;
398 if ( idx->offsets == NULL )
400 error = cff_index_load_offsets( idx );
405 new_size = idx->data_size + idx->count;
407 if ( idx->count > 0 &&
408 !FT_NEW_ARRAY( t, idx->count + 1 ) &&
409 ( !pool || !FT_ALLOC( new_bytes, new_size ) ) )
411 FT_ULong n, cur_offset;
413 FT_Byte* org_bytes = idx->bytes;
416 /* at this point, `idx->offsets' can't be NULL */
417 cur_offset = idx->offsets[0] - 1;
420 if ( cur_offset != 0 )
422 FT_TRACE0(( "cff_index_get_pointers:"
423 " invalid first offset value %d set to zero\n",
429 t[0] = org_bytes + cur_offset;
431 t[0] = new_bytes + cur_offset;
433 for ( n = 1; n <= idx->count; n++ )
435 FT_ULong next_offset = idx->offsets[n] - 1;
438 /* two sanity checks for invalid offset tables */
439 if ( next_offset < cur_offset )
440 next_offset = cur_offset;
441 else if ( next_offset > idx->data_size )
442 next_offset = idx->data_size;
445 t[n] = org_bytes + next_offset;
448 t[n] = new_bytes + next_offset + extra;
450 if ( next_offset != cur_offset )
452 FT_MEM_COPY( t[n - 1], org_bytes + cur_offset, t[n] - t[n - 1] );
459 cur_offset = next_offset;
466 *pool_size = new_size;
474 FT_LOCAL_DEF( FT_Error )
475 cff_index_access_element( CFF_Index idx,
478 FT_ULong* pbyte_len )
480 FT_Error error = FT_Err_Ok;
483 if ( idx && idx->count > element )
485 /* compute start and end offsets */
486 FT_Stream stream = idx->stream;
487 FT_ULong off1, off2 = 0;
490 /* load offsets from file or the offset table */
493 FT_ULong pos = element * idx->off_size;
496 if ( FT_STREAM_SEEK( idx->start + 3 + pos ) )
499 off1 = cff_index_read_offset( idx, &error );
508 off2 = cff_index_read_offset( idx, &error );
510 } while ( off2 == 0 && element < idx->count );
513 else /* use offsets table */
515 off1 = idx->offsets[element];
521 off2 = idx->offsets[element];
523 } while ( off2 == 0 && element < idx->count );
527 /* XXX: should check off2 does not exceed the end of this entry; */
528 /* at present, only truncate off2 at the end of this stream */
529 if ( off2 > stream->size + 1 ||
530 idx->data_offset > stream->size - off2 + 1 )
532 FT_ERROR(( "cff_index_access_element:"
533 " offset to next entry (%d)"
534 " exceeds the end of stream (%d)\n",
535 off2, stream->size - idx->data_offset + 1 ));
536 off2 = stream->size - idx->data_offset + 1;
540 if ( off1 && off2 > off1 )
542 *pbyte_len = off2 - off1;
546 /* this index was completely loaded in memory, that's easy */
547 *pbytes = idx->bytes + off1 - 1;
551 /* this index is still on disk/file, access it through a frame */
552 if ( FT_STREAM_SEEK( idx->data_offset + off1 - 1 ) ||
553 FT_FRAME_EXTRACT( off2 - off1, *pbytes ) )
559 /* empty index element */
565 error = FT_THROW( Invalid_Argument );
573 cff_index_forget_element( CFF_Index idx,
576 if ( idx->bytes == 0 )
578 FT_Stream stream = idx->stream;
581 FT_FRAME_RELEASE( *pbytes );
586 /* get an entry from Name INDEX */
587 FT_LOCAL_DEF( FT_String* )
588 cff_index_get_name( CFF_Font font,
591 CFF_Index idx = &font->name_index;
592 FT_Memory memory = idx->stream->memory;
599 error = cff_index_access_element( idx, element, &bytes, &byte_len );
603 if ( !FT_ALLOC( name, byte_len + 1 ) )
605 FT_MEM_COPY( name, bytes, byte_len );
608 cff_index_forget_element( idx, &bytes );
615 /* get an entry from String INDEX */
616 FT_LOCAL_DEF( FT_String* )
617 cff_index_get_string( CFF_Font font,
620 return ( element < font->num_strings )
621 ? (FT_String*)font->strings[element]
626 FT_LOCAL_DEF( FT_String* )
627 cff_index_get_sid_string( CFF_Font font,
630 /* value 0xFFFFU indicates a missing dictionary entry */
631 if ( sid == 0xFFFFU )
634 /* if it is not a standard string, return it */
636 return cff_index_get_string( font, sid - 391 );
638 /* CID-keyed CFF fonts don't have glyph names */
639 if ( !font->psnames )
642 /* this is a standard string */
643 return (FT_String *)font->psnames->adobe_std_strings( sid );
647 /*************************************************************************/
648 /*************************************************************************/
650 /*** FD Select table support ***/
652 /*************************************************************************/
653 /*************************************************************************/
657 CFF_Done_FD_Select( CFF_FDSelect fdselect,
660 if ( fdselect->data )
661 FT_FRAME_RELEASE( fdselect->data );
663 fdselect->data_size = 0;
664 fdselect->format = 0;
665 fdselect->range_count = 0;
670 CFF_Load_FD_Select( CFF_FDSelect fdselect,
681 if ( FT_STREAM_SEEK( offset ) || FT_READ_BYTE( format ) )
684 fdselect->format = format;
685 fdselect->cache_count = 0; /* clear cache */
689 case 0: /* format 0, that's simple */
690 fdselect->data_size = num_glyphs;
693 case 3: /* format 3, a tad more complex */
694 if ( FT_READ_USHORT( num_ranges ) )
699 FT_TRACE0(( "CFF_Load_FD_Select: empty FDSelect array\n" ));
700 error = FT_THROW( Invalid_File_Format );
704 fdselect->data_size = num_ranges * 3 + 2;
707 if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) )
711 default: /* hmm... that's wrong */
712 error = FT_THROW( Invalid_File_Format );
720 FT_LOCAL_DEF( FT_Byte )
721 cff_fd_select_get( CFF_FDSelect fdselect,
722 FT_UInt glyph_index )
727 switch ( fdselect->format )
730 fd = fdselect->data[glyph_index];
734 /* first, compare to the cache */
735 if ( (FT_UInt)( glyph_index - fdselect->cache_first ) <
736 fdselect->cache_count )
738 fd = fdselect->cache_fd;
742 /* then, look up the ranges array */
744 FT_Byte* p = fdselect->data;
745 FT_Byte* p_limit = p + fdselect->data_size;
747 FT_UInt first, limit;
750 first = FT_NEXT_USHORT( p );
753 if ( glyph_index < first )
757 limit = FT_NEXT_USHORT( p );
759 if ( glyph_index < limit )
764 fdselect->cache_first = first;
765 fdselect->cache_count = limit - first;
766 fdselect->cache_fd = fd2;
771 } while ( p < p_limit );
783 /*************************************************************************/
784 /*************************************************************************/
786 /*** CFF font support ***/
788 /*************************************************************************/
789 /*************************************************************************/
792 cff_charset_compute_cids( CFF_Charset charset,
796 FT_Error error = FT_Err_Ok;
799 FT_UShort max_cid = 0;
802 if ( charset->max_cid > 0 )
805 for ( i = 0; i < num_glyphs; i++ )
807 if ( charset->sids[i] > max_cid )
808 max_cid = charset->sids[i];
811 if ( FT_NEW_ARRAY( charset->cids, (FT_ULong)max_cid + 1 ) )
814 /* When multiple GIDs map to the same CID, we choose the lowest */
815 /* GID. This is not described in any spec, but it matches the */
816 /* behaviour of recent Acroread versions. */
817 for ( j = (FT_Long)num_glyphs - 1; j >= 0; j-- )
818 charset->cids[charset->sids[j]] = (FT_UShort)j;
820 charset->max_cid = max_cid;
821 charset->num_glyphs = num_glyphs;
828 FT_LOCAL_DEF( FT_UInt )
829 cff_charset_cid_to_gindex( CFF_Charset charset,
835 if ( cid <= charset->max_cid )
836 result = charset->cids[cid];
843 cff_charset_free_cids( CFF_Charset charset,
846 FT_FREE( charset->cids );
847 charset->max_cid = 0;
852 cff_charset_done( CFF_Charset charset,
855 FT_Memory memory = stream->memory;
858 cff_charset_free_cids( charset, memory );
860 FT_FREE( charset->sids );
867 cff_charset_load( CFF_Charset charset,
870 FT_ULong base_offset,
874 FT_Memory memory = stream->memory;
875 FT_Error error = FT_Err_Ok;
879 /* If the offset is greater than 2, we have to parse the charset */
886 charset->offset = base_offset + offset;
888 /* Get the format of the table. */
889 if ( FT_STREAM_SEEK( charset->offset ) ||
890 FT_READ_BYTE( charset->format ) )
893 /* Allocate memory for sids. */
894 if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
897 /* assign the .notdef glyph */
898 charset->sids[0] = 0;
900 switch ( charset->format )
903 if ( num_glyphs > 0 )
905 if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) )
908 for ( j = 1; j < num_glyphs; j++ )
909 charset->sids[j] = FT_GET_USHORT();
924 while ( j < num_glyphs )
926 /* Read the first glyph sid of the range. */
927 if ( FT_READ_USHORT( glyph_sid ) )
930 /* Read the number of glyphs in the range. */
931 if ( charset->format == 2 )
933 if ( FT_READ_USHORT( nleft ) )
938 if ( FT_READ_BYTE( nleft ) )
942 /* try to rescue some of the SIDs if `nleft' is too large */
943 if ( glyph_sid > 0xFFFFL - nleft )
945 FT_ERROR(( "cff_charset_load: invalid SID range trimmed"
946 " nleft=%d -> %d\n", nleft, 0xFFFFL - glyph_sid ));
947 nleft = ( FT_UInt )( 0xFFFFL - glyph_sid );
950 /* Fill in the range of sids -- `nleft + 1' glyphs. */
951 for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ )
952 charset->sids[j] = glyph_sid;
958 FT_ERROR(( "cff_charset_load: invalid table format\n" ));
959 error = FT_THROW( Invalid_File_Format );
965 /* Parse default tables corresponding to offset == 0, 1, or 2. */
966 /* CFF specification intimates the following: */
968 /* In order to use a predefined charset, the following must be */
969 /* true: The charset constructed for the glyphs in the font's */
970 /* charstrings dictionary must match the predefined charset in */
971 /* the first num_glyphs. */
973 charset->offset = offset; /* record charset type */
975 switch ( (FT_UInt)offset )
978 if ( num_glyphs > 229 )
980 FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
981 "predefined charset (Adobe ISO-Latin)\n" ));
982 error = FT_THROW( Invalid_File_Format );
986 /* Allocate memory for sids. */
987 if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
990 /* Copy the predefined charset into the allocated memory. */
991 FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs );
996 if ( num_glyphs > 166 )
998 FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
999 "predefined charset (Adobe Expert)\n" ));
1000 error = FT_THROW( Invalid_File_Format );
1004 /* Allocate memory for sids. */
1005 if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
1008 /* Copy the predefined charset into the allocated memory. */
1009 FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs );
1014 if ( num_glyphs > 87 )
1016 FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
1017 "predefined charset (Adobe Expert Subset)\n" ));
1018 error = FT_THROW( Invalid_File_Format );
1022 /* Allocate memory for sids. */
1023 if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
1026 /* Copy the predefined charset into the allocated memory. */
1027 FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs );
1032 error = FT_THROW( Invalid_File_Format );
1037 /* we have to invert the `sids' array for subsetted CID-keyed fonts */
1039 error = cff_charset_compute_cids( charset, num_glyphs, memory );
1042 /* Clean up if there was an error. */
1045 FT_FREE( charset->sids );
1046 FT_FREE( charset->cids );
1047 charset->format = 0;
1048 charset->offset = 0;
1057 cff_encoding_done( CFF_Encoding encoding )
1059 encoding->format = 0;
1060 encoding->offset = 0;
1061 encoding->count = 0;
1066 cff_encoding_load( CFF_Encoding encoding,
1067 CFF_Charset charset,
1070 FT_ULong base_offset,
1073 FT_Error error = FT_Err_Ok;
1076 FT_UShort glyph_sid;
1080 /* Check for charset->sids. If we do not have this, we fail. */
1081 if ( !charset->sids )
1083 error = FT_THROW( Invalid_File_Format );
1087 /* Zero out the code to gid/sid mappings. */
1088 for ( j = 0; j < 256; j++ )
1090 encoding->sids [j] = 0;
1091 encoding->codes[j] = 0;
1094 /* Note: The encoding table in a CFF font is indexed by glyph index; */
1095 /* the first encoded glyph index is 1. Hence, we read the character */
1096 /* code (`glyph_code') at index j and make the assignment: */
1098 /* encoding->codes[glyph_code] = j + 1 */
1100 /* We also make the assignment: */
1102 /* encoding->sids[glyph_code] = charset->sids[j + 1] */
1104 /* This gives us both a code to GID and a code to SID mapping. */
1108 encoding->offset = base_offset + offset;
1110 /* we need to parse the table to determine its size */
1111 if ( FT_STREAM_SEEK( encoding->offset ) ||
1112 FT_READ_BYTE( encoding->format ) ||
1113 FT_READ_BYTE( count ) )
1116 switch ( encoding->format & 0x7F )
1123 /* By convention, GID 0 is always ".notdef" and is never */
1124 /* coded in the font. Hence, the number of codes found */
1125 /* in the table is `count+1'. */
1127 encoding->count = count + 1;
1129 if ( FT_FRAME_ENTER( count ) )
1132 p = (FT_Byte*)stream->cursor;
1134 for ( j = 1; j <= count; j++ )
1138 /* Make sure j is not too big. */
1139 if ( j < num_glyphs )
1141 /* Assign code to GID mapping. */
1142 encoding->codes[glyph_code] = (FT_UShort)j;
1144 /* Assign code to SID mapping. */
1145 encoding->sids[glyph_code] = charset->sids[j];
1160 encoding->count = 0;
1162 /* Parse the Format1 ranges. */
1163 for ( j = 0; j < count; j++, i += nleft )
1165 /* Read the first glyph code of the range. */
1166 if ( FT_READ_BYTE( glyph_code ) )
1169 /* Read the number of codes in the range. */
1170 if ( FT_READ_BYTE( nleft ) )
1173 /* Increment nleft, so we read `nleft + 1' codes/sids. */
1176 /* compute max number of character codes */
1177 if ( (FT_UInt)nleft > encoding->count )
1178 encoding->count = nleft;
1180 /* Fill in the range of codes/sids. */
1181 for ( k = i; k < nleft + i; k++, glyph_code++ )
1183 /* Make sure k is not too big. */
1184 if ( k < num_glyphs && glyph_code < 256 )
1186 /* Assign code to GID mapping. */
1187 encoding->codes[glyph_code] = (FT_UShort)k;
1189 /* Assign code to SID mapping. */
1190 encoding->sids[glyph_code] = charset->sids[k];
1195 /* simple check; one never knows what can be found in a font */
1196 if ( encoding->count > 256 )
1197 encoding->count = 256;
1202 FT_ERROR(( "cff_encoding_load: invalid table format\n" ));
1203 error = FT_THROW( Invalid_File_Format );
1207 /* Parse supplemental encodings, if any. */
1208 if ( encoding->format & 0x80 )
1213 /* count supplements */
1214 if ( FT_READ_BYTE( count ) )
1217 for ( j = 0; j < count; j++ )
1219 /* Read supplemental glyph code. */
1220 if ( FT_READ_BYTE( glyph_code ) )
1223 /* Read the SID associated with this glyph code. */
1224 if ( FT_READ_USHORT( glyph_sid ) )
1227 /* Assign code to SID mapping. */
1228 encoding->sids[glyph_code] = glyph_sid;
1230 /* First, look up GID which has been assigned to */
1231 /* SID glyph_sid. */
1232 for ( gindex = 0; gindex < num_glyphs; gindex++ )
1234 if ( charset->sids[gindex] == glyph_sid )
1236 encoding->codes[glyph_code] = (FT_UShort)gindex;
1245 /* We take into account the fact a CFF font can use a predefined */
1246 /* encoding without containing all of the glyphs encoded by this */
1247 /* encoding (see the note at the end of section 12 in the CFF */
1248 /* specification). */
1250 switch ( (FT_UInt)offset )
1253 /* First, copy the code to SID mapping. */
1254 FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 );
1258 /* First, copy the code to SID mapping. */
1259 FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 );
1262 /* Construct code to GID mapping from code to SID mapping */
1265 encoding->count = 0;
1267 error = cff_charset_compute_cids( charset, num_glyphs,
1272 for ( j = 0; j < 256; j++ )
1274 FT_UInt sid = encoding->sids[j];
1279 gid = cff_charset_cid_to_gindex( charset, sid );
1283 encoding->codes[j] = (FT_UShort)gid;
1284 encoding->count = j + 1;
1288 encoding->codes[j] = 0;
1289 encoding->sids [j] = 0;
1295 FT_ERROR(( "cff_encoding_load: invalid table format\n" ));
1296 error = FT_THROW( Invalid_File_Format );
1303 /* Clean up if there was an error. */
1309 cff_subfont_load( CFF_SubFont font,
1313 FT_ULong base_offset,
1314 FT_Library library )
1317 CFF_ParserRec parser;
1318 FT_Byte* dict = NULL;
1320 CFF_FontRecDict top = &font->font_dict;
1321 CFF_Private priv = &font->private_dict;
1324 cff_parser_init( &parser,
1332 FT_MEM_ZERO( top, sizeof ( *top ) );
1334 top->underline_position = -( 100L << 16 );
1335 top->underline_thickness = 50L << 16;
1336 top->charstring_type = 2;
1337 top->font_matrix.xx = 0x10000L;
1338 top->font_matrix.yy = 0x10000L;
1339 top->cid_count = 8720;
1341 /* we use the implementation specific SID value 0xFFFF to indicate */
1342 /* missing entries */
1343 top->version = 0xFFFFU;
1344 top->notice = 0xFFFFU;
1345 top->copyright = 0xFFFFU;
1346 top->full_name = 0xFFFFU;
1347 top->family_name = 0xFFFFU;
1348 top->weight = 0xFFFFU;
1349 top->embedded_postscript = 0xFFFFU;
1351 top->cid_registry = 0xFFFFU;
1352 top->cid_ordering = 0xFFFFU;
1353 top->cid_font_name = 0xFFFFU;
1355 error = cff_index_access_element( idx, font_index, &dict, &dict_len );
1358 FT_TRACE4(( " top dictionary:\n" ));
1359 error = cff_parser_run( &parser, dict, dict + dict_len );
1362 cff_index_forget_element( idx, &dict );
1367 /* if it is a CID font, we stop there */
1368 if ( top->cid_registry != 0xFFFFU )
1371 /* parse the private dictionary, if any */
1372 if ( top->private_offset && top->private_size )
1375 FT_MEM_ZERO( priv, sizeof ( *priv ) );
1377 priv->blue_shift = 7;
1378 priv->blue_fuzz = 1;
1380 priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L );
1381 priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 );
1383 cff_parser_init( &parser,
1390 if ( FT_STREAM_SEEK( base_offset + font->font_dict.private_offset ) ||
1391 FT_FRAME_ENTER( font->font_dict.private_size ) )
1394 FT_TRACE4(( " private dictionary:\n" ));
1395 error = cff_parser_run( &parser,
1396 (FT_Byte*)stream->cursor,
1397 (FT_Byte*)stream->limit );
1402 /* ensure that `num_blue_values' is even */
1403 priv->num_blue_values &= ~1;
1406 /* read the local subrs, if any */
1407 if ( priv->local_subrs_offset )
1409 if ( FT_STREAM_SEEK( base_offset + top->private_offset +
1410 priv->local_subrs_offset ) )
1413 error = cff_index_init( &font->local_subrs_index, stream, 1 );
1417 error = cff_index_get_pointers( &font->local_subrs_index,
1418 &font->local_subrs, NULL, NULL );
1429 cff_subfont_done( FT_Memory memory,
1430 CFF_SubFont subfont )
1434 cff_index_done( &subfont->local_subrs_index );
1435 FT_FREE( subfont->local_subrs );
1440 FT_LOCAL_DEF( FT_Error )
1441 cff_font_load( FT_Library library,
1447 static const FT_Frame_Field cff_header_fields[] =
1450 #define FT_STRUCTURE CFF_FontRec
1452 FT_FRAME_START( 4 ),
1453 FT_FRAME_BYTE( version_major ),
1454 FT_FRAME_BYTE( version_minor ),
1455 FT_FRAME_BYTE( header_size ),
1456 FT_FRAME_BYTE( absolute_offsize ),
1461 FT_Memory memory = stream->memory;
1462 FT_ULong base_offset;
1463 CFF_FontRecDict dict;
1464 CFF_IndexRec string_index;
1465 FT_UInt subfont_index;
1469 FT_ZERO( &string_index );
1471 font->stream = stream;
1472 font->memory = memory;
1473 dict = &font->top_font.font_dict;
1474 base_offset = FT_STREAM_POS();
1476 /* read CFF font header */
1477 if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) )
1481 if ( font->version_major != 1 ||
1482 font->header_size < 4 ||
1483 font->absolute_offsize > 4 )
1485 FT_TRACE2(( " not a CFF font header\n" ));
1486 error = FT_THROW( Unknown_File_Format );
1490 /* skip the rest of the header */
1491 if ( FT_STREAM_SKIP( font->header_size - 4 ) )
1494 /* read the name, top dict, string and global subrs index */
1495 if ( FT_SET_ERROR( cff_index_init( &font->name_index,
1497 FT_SET_ERROR( cff_index_init( &font->font_dict_index,
1499 FT_SET_ERROR( cff_index_init( &string_index,
1501 FT_SET_ERROR( cff_index_init( &font->global_subrs_index,
1503 FT_SET_ERROR( cff_index_get_pointers( &string_index,
1506 &font->string_pool_size ) ) )
1509 font->num_strings = string_index.count;
1513 /* well, we don't really forget the `disabled' fonts... */
1514 subfont_index = (FT_UInt)( face_index & 0xFFFF );
1516 if ( face_index > 0 && subfont_index >= font->name_index.count )
1518 FT_ERROR(( "cff_font_load:"
1519 " invalid subfont index for pure CFF font (%d)\n",
1521 error = FT_THROW( Invalid_Argument );
1525 font->num_faces = font->name_index.count;
1531 if ( font->name_index.count > 1 )
1533 FT_ERROR(( "cff_font_load:"
1534 " invalid CFF font with multiple subfonts\n"
1536 " in SFNT wrapper\n" ));
1537 error = FT_THROW( Invalid_File_Format );
1542 /* in case of a font format check, simply exit now */
1543 if ( face_index < 0 )
1546 /* now, parse the top-level font dictionary */
1547 FT_TRACE4(( "parsing top-level\n" ));
1548 error = cff_subfont_load( &font->top_font,
1549 &font->font_dict_index,
1557 if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) )
1560 error = cff_index_init( &font->charstrings_index, stream, 0 );
1564 /* now, check for a CID font */
1565 if ( dict->cid_registry != 0xFFFFU )
1567 CFF_IndexRec fd_index;
1568 CFF_SubFont sub = NULL;
1572 /* this is a CID-keyed font, we must now allocate a table of */
1573 /* sub-fonts, then load each of them separately */
1574 if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) )
1577 error = cff_index_init( &fd_index, stream, 0 );
1581 if ( fd_index.count > CFF_MAX_CID_FONTS )
1583 FT_TRACE0(( "cff_font_load: FD array too large in CID font\n" ));
1587 /* allocate & read each font dict independently */
1588 font->num_subfonts = fd_index.count;
1589 if ( FT_NEW_ARRAY( sub, fd_index.count ) )
1592 /* set up pointer table */
1593 for ( idx = 0; idx < fd_index.count; idx++ )
1594 font->subfonts[idx] = sub + idx;
1596 /* now load each subfont independently */
1597 for ( idx = 0; idx < fd_index.count; idx++ )
1599 sub = font->subfonts[idx];
1600 FT_TRACE4(( "parsing subfont %u\n", idx ));
1601 error = cff_subfont_load( sub, &fd_index, idx,
1602 stream, base_offset, library );
1607 /* now load the FD Select array */
1608 error = CFF_Load_FD_Select( &font->fd_select,
1609 font->charstrings_index.count,
1611 base_offset + dict->cid_fd_select_offset );
1614 cff_index_done( &fd_index );
1620 font->num_subfonts = 0;
1622 /* read the charstrings index now */
1623 if ( dict->charstrings_offset == 0 )
1625 FT_ERROR(( "cff_font_load: no charstrings offset\n" ));
1626 error = FT_THROW( Invalid_File_Format );
1630 font->num_glyphs = font->charstrings_index.count;
1632 error = cff_index_get_pointers( &font->global_subrs_index,
1633 &font->global_subrs, NULL, NULL );
1638 /* read the Charset and Encoding tables if available */
1639 if ( font->num_glyphs > 0 )
1641 FT_Bool invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff );
1644 error = cff_charset_load( &font->charset, font->num_glyphs, stream,
1645 base_offset, dict->charset_offset, invert );
1649 /* CID-keyed CFFs don't have an encoding */
1650 if ( dict->cid_registry == 0xFFFFU )
1652 error = cff_encoding_load( &font->encoding,
1657 dict->encoding_offset );
1663 /* get the font name (/CIDFontName for CID-keyed fonts, */
1664 /* /FontName otherwise) */
1665 font->font_name = cff_index_get_name( font, subfont_index );
1668 cff_index_done( &string_index );
1674 FT_LOCAL_DEF( void )
1675 cff_font_done( CFF_Font font )
1677 FT_Memory memory = font->memory;
1681 cff_index_done( &font->global_subrs_index );
1682 cff_index_done( &font->font_dict_index );
1683 cff_index_done( &font->name_index );
1684 cff_index_done( &font->charstrings_index );
1686 /* release font dictionaries, but only if working with */
1687 /* a CID keyed CFF font */
1688 if ( font->num_subfonts > 0 )
1690 for ( idx = 0; idx < font->num_subfonts; idx++ )
1691 cff_subfont_done( memory, font->subfonts[idx] );
1693 /* the subfonts array has been allocated as a single block */
1694 FT_FREE( font->subfonts[0] );
1697 cff_encoding_done( &font->encoding );
1698 cff_charset_done( &font->charset, font->stream );
1700 cff_subfont_done( memory, &font->top_font );
1702 CFF_Done_FD_Select( &font->fd_select, font->stream );
1704 FT_FREE( font->font_info );
1706 FT_FREE( font->font_name );
1707 FT_FREE( font->global_subrs );
1708 FT_FREE( font->strings );
1709 FT_FREE( font->string_pool );
1711 if ( font->cf2_instance.finalizer )
1713 font->cf2_instance.finalizer( font->cf2_instance.data );
1714 FT_FREE( font->cf2_instance.data );