20 #include FT_INTERNAL_DEBUG_H
24 #include FT_INTERNAL_VALIDATE_H
25 #include FT_INTERNAL_STREAM_H
38 #define FT_COMPONENT trace_ttcmap
41 #define TT_PEEK_SHORT FT_PEEK_SHORT
42 #define TT_PEEK_USHORT FT_PEEK_USHORT
43 #define TT_PEEK_UINT24 FT_PEEK_UOFF3
44 #define TT_PEEK_LONG FT_PEEK_LONG
45 #define TT_PEEK_ULONG FT_PEEK_ULONG
47 #define TT_NEXT_SHORT FT_NEXT_SHORT
48 #define TT_NEXT_USHORT FT_NEXT_USHORT
49 #define TT_NEXT_UINT24 FT_NEXT_UOFF3
50 #define TT_NEXT_LONG FT_NEXT_LONG
51 #define TT_NEXT_ULONG FT_NEXT_ULONG
85 #ifdef TT_CONFIG_CMAP_FORMAT_0
95 if ( table + length > valid->limit || length < 262 )
105 for ( n = 0; n < 256; n++ )
119 FT_UInt32 char_code )
124 return char_code < 256 ? table[6 + char_code] : 0;
130 FT_UInt32 *pchar_code )
133 FT_UInt32 charcode = *pchar_code;
139 while ( ++charcode < 256 )
141 gindex = table[charcode];
155 tt_cmap0_get_info(
TT_CMap cmap,
161 cmap_info->format = 0;
176 NULL, NULL, NULL, NULL, NULL
272 #ifdef TT_CONFIG_CMAP_FORMAT_2
275 tt_cmap2_validate(
FT_Byte* table,
286 if ( table + length > valid->limit || length < 6 + 512 )
294 for ( n = 0; n < 256; n++ )
305 if ( idx > max_subs )
312 glyph_ids = subs + (max_subs + 1) * 8;
313 if ( glyph_ids > valid->limit )
317 for ( n = 0; n <= max_subs; n++ )
330 if ( code_count == 0 )
336 if ( first_code >= 256 || first_code + code_count > 256 )
359 idx = ( idx + delta ) & 0xFFFFU;
375 tt_cmap2_get_subheader(
FT_Byte* table,
376 FT_UInt32 char_code )
381 if ( char_code < 0x10000UL )
426 tt_cmap2_char_index(
TT_CMap cmap,
427 FT_UInt32 char_code )
434 subheader = tt_cmap2_get_subheader( table, char_code );
450 if ( idx < count && offset != 0 )
452 p += offset + 2 *
idx;
456 result = (
FT_UInt)( idx + delta ) & 0xFFFFU;
464 tt_cmap2_char_next(
TT_CMap cmap,
465 FT_UInt32 *pcharcode )
469 FT_UInt32 result = 0;
470 FT_UInt32 charcode = *pcharcode + 1;
474 while ( charcode < 0x10000UL )
476 subheader = tt_cmap2_get_subheader( table, charcode );
491 if ( char_lo < start )
497 pos = (
FT_UInt)( char_lo - start );
499 p += offset + pos * 2;
502 for ( ; pos <
count; pos++, charcode++ )
508 gindex = ( idx + delta ) & 0xFFFFU;
531 tt_cmap2_get_info(
TT_CMap cmap,
537 cmap_info->format = 2;
552 NULL, NULL, NULL, NULL, NULL
633 #ifdef TT_CONFIG_CMAP_FORMAT_4
635 typedef struct TT_CMap4Rec_
638 FT_UInt32 cur_charcode;
648 } TT_CMap4Rec, *TT_CMap4;
652 tt_cmap4_init( TT_CMap4 cmap,
658 cmap->cmap.data =
table;
662 cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;
663 cmap->cur_gindex = 0;
670 tt_cmap4_set_range( TT_CMap4 cmap,
673 FT_Byte* table = cmap->cmap.data;
675 FT_UInt num_ranges = cmap->num_ranges;
678 while ( range_index < num_ranges )
683 p = table + 14 + range_index * 2;
686 p += 2 + num_ranges * 2;
697 if ( range_index >= num_ranges - 1 &&
698 cmap->cur_start == 0xFFFFU &&
699 cmap->cur_end == 0xFFFFU )
705 if ( offset && p + offset + 2 > limit )
712 if ( offset != 0xFFFFU )
714 cmap->cur_values = offset ? p + offset :
NULL;
715 cmap->cur_range = range_index;
732 tt_cmap4_next( TT_CMap4 cmap )
737 if ( cmap->cur_charcode >= 0xFFFFUL )
740 charcode = (
FT_UInt)cmap->cur_charcode + 1;
742 if ( charcode < cmap->cur_start )
743 charcode = cmap->cur_start;
749 FT_Int delta = cmap->cur_delta;
752 if ( charcode <= end )
756 FT_Byte* p = values + 2 * ( charcode - cmap->cur_start );
766 gindex = (
FT_UInt)( ( gindex + delta ) & 0xFFFFU );
769 cmap->cur_charcode = charcode;
770 cmap->cur_gindex = gindex;
774 }
while ( ++charcode <= end );
785 cmap->cur_charcode = charcode;
786 cmap->cur_gindex = gindex;
789 }
while ( ++charcode <= end );
794 if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 )
797 if ( charcode < cmap->cur_start )
798 charcode = cmap->cur_start;
802 cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;
803 cmap->cur_gindex = 0;
808 tt_cmap4_validate(
FT_Byte* table,
823 if ( table + length > valid->limit )
828 length = (
FT_UInt)( valid->limit - table );
843 if ( length < 16 + num_segs * 2 * 4 )
856 if ( ( search_range | range_shift ) & 1 )
864 if ( search_range > num_segs ||
865 search_range * 2 < num_segs ||
866 search_range + range_shift != num_segs ||
867 search_range != ( 1U << entry_selector ) )
872 starts = table + 16 + num_segs * 2;
873 deltas = starts + num_segs * 2;
874 offsets = deltas + num_segs * 2;
875 glyph_ids = offsets + num_segs * 2;
880 p = ends + ( num_segs - 1 ) * 2;
887 FT_UInt last_start = 0, last_end = 0;
895 for ( n = 0; n < num_segs; n++ )
919 if ( last_start > start || last_end > end )
926 if ( offset && offset != 0xFFFFU )
933 if ( p < glyph_ids ||
934 p + ( end - start + 1 ) * 2 > table + length )
947 else if ( n != num_segs - 1 ||
948 !( start == 0xFFFFU && end == 0xFFFFU ) )
950 if ( p < glyph_ids ||
951 p + ( end - start + 1 ) * 2 > valid->limit )
961 for ( i = start; i <
end; i++ )
966 idx = (
FT_UInt)( idx + delta ) & 0xFFFFU;
974 else if ( offset == 0xFFFFU )
981 !( start == 0xFFFFU && end == 0xFFFFU ) )
995 tt_cmap4_char_map_linear(
TT_CMap cmap,
996 FT_UInt32* pcharcode,
1002 FT_UInt32 charcode = *pcharcode;
1010 num_segs = num_segs2 >> 1;
1019 for ( ; charcode <= 0xFFFFU; charcode++ )
1024 p = cmap->
data + 14;
1025 q = cmap->
data + 16 + num_segs2;
1027 for ( i = 0; i < num_segs; i++ )
1032 if ( charcode >= start && charcode <= end )
1034 p = q - 2 + num_segs2;
1041 if ( i >= num_segs - 1 &&
1042 start == 0xFFFFU && end == 0xFFFFU )
1048 if ( offset && p + offset + 2 > limit )
1055 if ( offset == 0xFFFFU )
1060 p += offset + ( charcode -
start ) * 2;
1063 gindex = (
FT_UInt)( gindex + delta ) & 0xFFFFU;
1066 gindex = (
FT_UInt)( charcode + delta ) & 0xFFFFU;
1072 if ( !next || gindex )
1076 if ( next && gindex )
1077 *pcharcode = charcode;
1084 tt_cmap4_char_map_binary(
TT_CMap cmap,
1085 FT_UInt32* pcharcode,
1102 num_segs = num_segs2 >> 1;
1117 mid = ( min +
max ) >> 1;
1118 p = cmap->
data + 14 + mid * 2;
1123 if ( charcode < start )
1125 else if ( charcode > end )
1136 if ( mid >= num_segs - 1 &&
1137 start == 0xFFFFU && end == 0xFFFFU )
1143 if ( offset && p + offset + 2 > limit )
1159 if ( offset == 0xFFFFU )
1163 for ( i = max ; i > 0; i-- )
1170 p = cmap->
data + 14 + ( i - 1 ) * 2;
1173 if ( charcode > prev_end )
1187 if ( offset != 0xFFFFU )
1192 if ( mid == max + 1 )
1196 p = cmap->
data + 14 + max * 2;
1209 for ( i = max + 1; i < num_segs; i++ )
1214 p = cmap->
data + 14 + i * 2;
1219 if ( charcode < next_start )
1229 if ( offset != 0xFFFFU )
1246 p = cmap->
data + 14 + mid * 2;
1258 if ( offset == 0xFFFFU )
1264 p += offset + ( charcode -
start ) * 2;
1267 gindex = (
FT_UInt)( gindex + delta ) & 0xFFFFU;
1270 gindex = (
FT_UInt)( charcode + delta ) & 0xFFFFU;
1278 TT_CMap4 cmap4 = (TT_CMap4)cmap;
1285 if ( charcode > end )
1288 if ( mid == num_segs )
1292 if ( tt_cmap4_set_range( cmap4, mid ) )
1295 *pcharcode = charcode;
1299 cmap4->cur_charcode = charcode;
1302 cmap4->cur_gindex = gindex;
1305 cmap4->cur_charcode = charcode;
1306 tt_cmap4_next( cmap4 );
1307 gindex = cmap4->cur_gindex;
1311 *pcharcode = cmap4->cur_charcode;
1320 tt_cmap4_char_index(
TT_CMap cmap,
1321 FT_UInt32 char_code )
1323 if ( char_code >= 0x10000UL )
1327 return tt_cmap4_char_map_linear( cmap, &char_code, 0 );
1329 return tt_cmap4_char_map_binary( cmap, &char_code, 0 );
1334 tt_cmap4_char_next(
TT_CMap cmap,
1335 FT_UInt32 *pchar_code )
1340 if ( *pchar_code >= 0xFFFFU )
1344 gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 );
1347 TT_CMap4 cmap4 = (TT_CMap4)cmap;
1351 if ( *pchar_code == cmap4->cur_charcode )
1353 tt_cmap4_next( cmap4 );
1354 gindex = cmap4->cur_gindex;
1356 *pchar_code = cmap4->cur_charcode;
1359 gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 );
1367 tt_cmap4_get_info(
TT_CMap cmap,
1373 cmap_info->format = 4;
1381 sizeof ( TT_CMap4Rec ),
1387 NULL, NULL, NULL, NULL, NULL
1423 #ifdef TT_CONFIG_CMAP_FORMAT_6
1426 tt_cmap6_validate(
FT_Byte* table,
1433 if ( table + 10 > valid->limit )
1442 if ( table + length > valid->limit || length < 10 + count * 2 )
1451 for ( ; count > 0; count-- )
1464 tt_cmap6_char_index(
TT_CMap cmap,
1465 FT_UInt32 char_code )
1485 tt_cmap6_char_next(
TT_CMap cmap,
1486 FT_UInt32 *pchar_code )
1489 FT_UInt32 result = 0;
1490 FT_UInt32 char_code = *pchar_code + 1;
1499 if ( char_code >= 0x10000UL )
1502 if ( char_code < start )
1505 idx = (
FT_UInt)( char_code - start );
1508 for ( ; idx <
count; idx++ )
1526 tt_cmap6_get_info(
TT_CMap cmap,
1532 cmap_info->format = 6;
1547 NULL, NULL, NULL, NULL, NULL
1611 #ifdef TT_CONFIG_CMAP_FORMAT_8
1614 tt_cmap8_validate(
FT_Byte* table,
1620 FT_UInt32 num_groups;
1623 if ( table + 16 + 8192 > valid->limit )
1627 if ( length > (FT_UInt32)( valid->limit - table ) || length < 8192 + 16 )
1634 if ( p + num_groups * 12 > valid->limit )
1642 for ( n = 0; n < num_groups; n++ )
1654 if ( n > 0 && start <= last )
1662 count = (FT_UInt32)( end - start + 1 );
1664 if ( start & ~0xFFFFU )
1668 for ( ; count > 0; count--, start++ )
1670 hi = (
FT_UInt)( start >> 16 );
1671 lo = (
FT_UInt)( start & 0xFFFFU );
1673 if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 )
1676 if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 )
1686 if ( end & ~0xFFFFU )
1689 for ( ; count > 0; count--, start++ )
1691 lo = (
FT_UInt)( start & 0xFFFFU );
1693 if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 )
1708 tt_cmap8_char_index(
TT_CMap cmap,
1709 FT_UInt32 char_code )
1718 for ( ; num_groups > 0; num_groups-- )
1724 if ( char_code < start )
1727 if ( char_code <= end )
1729 result = (
FT_UInt)( start_id + char_code - start );
1738 tt_cmap8_char_next(
TT_CMap cmap,
1739 FT_UInt32 *pchar_code )
1741 FT_UInt32 result = 0;
1742 FT_UInt32 char_code = *pchar_code + 1;
1752 for ( ; num_groups > 0; num_groups-- )
1758 if ( char_code < start )
1761 if ( char_code <= end )
1763 gindex = (
FT_UInt)( char_code - start + start_id );
1779 tt_cmap8_get_info(
TT_CMap cmap,
1785 cmap_info->format = 8;
1800 NULL, NULL, NULL, NULL, NULL
1835 #ifdef TT_CONFIG_CMAP_FORMAT_10
1838 tt_cmap10_validate(
FT_Byte* table,
1845 if ( table + 20 > valid->limit )
1852 if ( length > (
FT_ULong)( valid->limit - table ) ||
1853 length < 20 + count * 2 )
1862 for ( ; count > 0; count-- )
1875 tt_cmap10_char_index(
TT_CMap cmap,
1876 FT_UInt32 char_code )
1883 FT_UInt32 idx = (
FT_ULong)( char_code - start );
1896 tt_cmap10_char_next(
TT_CMap cmap,
1897 FT_UInt32 *pchar_code )
1900 FT_UInt32 char_code = *pchar_code + 1;
1908 if ( char_code < start )
1911 idx = (FT_UInt32)( char_code - start );
1914 for ( ; idx <
count; idx++ )
1922 *pchar_code = char_code;
1928 tt_cmap10_get_info(
TT_CMap cmap,
1934 cmap_info->format = 10;
1949 NULL, NULL, NULL, NULL, NULL
1988 #ifdef TT_CONFIG_CMAP_FORMAT_12
1990 typedef struct TT_CMap12Rec_
1999 } TT_CMap12Rec, *TT_CMap12;
2003 tt_cmap12_init( TT_CMap12 cmap,
2006 cmap->cmap.data =
table;
2018 tt_cmap12_validate(
FT_Byte* table,
2026 if ( table + 16 > valid->limit )
2035 if ( length > (
FT_ULong)( valid->limit - table ) ||
2036 length < 16 + 12 * num_groups )
2044 for ( n = 0; n < num_groups; n++ )
2053 if ( n > 0 && start <= last )
2074 tt_cmap12_next( TT_CMap12 cmap )
2082 if ( cmap->cur_charcode >= 0xFFFFFFFFUL )
2085 char_code = cmap->cur_charcode + 1;
2087 n = cmap->cur_group;
2089 for ( n = cmap->cur_group;
n < cmap->num_groups; n++ )
2091 p = cmap->cmap.data + 16 + 12 *
n;
2096 if ( char_code < start )
2099 for ( ; char_code <=
end; char_code++ )
2101 gindex = (
FT_UInt)( start_id + char_code - start );
2105 cmap->cur_charcode = char_code;;
2106 cmap->cur_gindex = gindex;
2107 cmap->cur_group =
n;
2120 tt_cmap12_char_map_binary(
TT_CMap cmap,
2121 FT_UInt32* pchar_code,
2127 FT_UInt32 char_code = *pchar_code;
2148 mid = ( min +
max ) >> 1;
2149 p = cmap->
data + 16 + 12 * mid;
2154 if ( char_code < start )
2156 else if ( char_code > end )
2161 gindex = (
FT_UInt)( start_id + char_code - start );
2169 TT_CMap12 cmap12 = (TT_CMap12)cmap;
2176 if ( char_code > end )
2179 if ( mid == num_groups )
2184 cmap12->cur_charcode = char_code;
2185 cmap12->cur_group = mid;
2189 tt_cmap12_next( cmap12 );
2191 if ( cmap12->valid )
2192 gindex = cmap12->cur_gindex;
2195 cmap12->cur_gindex = gindex;
2198 *pchar_code = cmap12->cur_charcode;
2206 tt_cmap12_char_index(
TT_CMap cmap,
2207 FT_UInt32 char_code )
2209 return tt_cmap12_char_map_binary( cmap, &char_code, 0 );
2214 tt_cmap12_char_next(
TT_CMap cmap,
2215 FT_UInt32 *pchar_code )
2217 TT_CMap12 cmap12 = (TT_CMap12)cmap;
2221 if ( cmap12->cur_charcode >= 0xFFFFFFFFUL )
2225 if ( cmap12->valid && cmap12->cur_charcode == *pchar_code )
2227 tt_cmap12_next( cmap12 );
2228 if ( cmap12->valid )
2230 gindex = cmap12->cur_gindex;
2234 *pchar_code = (FT_UInt32)cmap12->cur_charcode;
2240 gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 );
2243 return (FT_UInt32)gindex;
2248 tt_cmap12_get_info(
TT_CMap cmap,
2254 cmap_info->format = 12;
2262 sizeof ( TT_CMap12Rec ),
2269 NULL, NULL, NULL, NULL, NULL
2308 #ifdef TT_CONFIG_CMAP_FORMAT_13
2310 typedef struct TT_CMap13Rec_
2319 } TT_CMap13Rec, *TT_CMap13;
2323 tt_cmap13_init( TT_CMap13 cmap,
2326 cmap->cmap.data =
table;
2338 tt_cmap13_validate(
FT_Byte* table,
2346 if ( table + 16 > valid->limit )
2355 if ( length > (
FT_ULong)( valid->limit - table ) ||
2356 length < 16 + 12 * num_groups )
2364 for ( n = 0; n < num_groups; n++ )
2373 if ( n > 0 && start <= last )
2394 tt_cmap13_next( TT_CMap13 cmap )
2402 if ( cmap->cur_charcode >= 0xFFFFFFFFUL )
2405 char_code = cmap->cur_charcode + 1;
2407 n = cmap->cur_group;
2409 for ( n = cmap->cur_group;
n < cmap->num_groups; n++ )
2411 p = cmap->cmap.data + 16 + 12 *
n;
2416 if ( char_code < start )
2419 if ( char_code <= end )
2425 cmap->cur_charcode = char_code;;
2426 cmap->cur_gindex = gindex;
2427 cmap->cur_group =
n;
2440 tt_cmap13_char_map_binary(
TT_CMap cmap,
2441 FT_UInt32* pchar_code,
2447 FT_UInt32 char_code = *pchar_code;
2468 mid = ( min +
max ) >> 1;
2469 p = cmap->
data + 16 + 12 * mid;
2474 if ( char_code < start )
2476 else if ( char_code > end )
2488 TT_CMap13 cmap13 = (TT_CMap13)cmap;
2495 if ( char_code > end )
2498 if ( mid == num_groups )
2503 cmap13->cur_charcode = char_code;
2504 cmap13->cur_group = mid;
2508 tt_cmap13_next( cmap13 );
2510 if ( cmap13->valid )
2511 gindex = cmap13->cur_gindex;
2514 cmap13->cur_gindex = gindex;
2517 *pchar_code = cmap13->cur_charcode;
2525 tt_cmap13_char_index(
TT_CMap cmap,
2526 FT_UInt32 char_code )
2528 return tt_cmap13_char_map_binary( cmap, &char_code, 0 );
2533 tt_cmap13_char_next(
TT_CMap cmap,
2534 FT_UInt32 *pchar_code )
2536 TT_CMap13 cmap13 = (TT_CMap13)cmap;
2540 if ( cmap13->cur_charcode >= 0xFFFFFFFFUL )
2544 if ( cmap13->valid && cmap13->cur_charcode == *pchar_code )
2546 tt_cmap13_next( cmap13 );
2547 if ( cmap13->valid )
2549 gindex = cmap13->cur_gindex;
2551 *pchar_code = cmap13->cur_charcode;
2557 gindex = tt_cmap13_char_map_binary( cmap, pchar_code, 1 );
2564 tt_cmap13_get_info(
TT_CMap cmap,
2570 cmap_info->format = 13;
2578 sizeof ( TT_CMap13Rec ),
2585 NULL, NULL, NULL, NULL, NULL
2656 #ifdef TT_CONFIG_CMAP_FORMAT_14
2658 typedef struct TT_CMap14Rec_
2667 FT_UInt32 max_results;
2671 } TT_CMap14Rec, *TT_CMap14;
2675 tt_cmap14_done( TT_CMap14 cmap )
2680 cmap->max_results = 0;
2681 if ( memory != NULL && cmap->results != NULL )
2687 tt_cmap14_ensure( TT_CMap14 cmap,
2688 FT_UInt32 num_results,
2691 FT_UInt32 old_max = cmap->max_results;
2695 if ( num_results > cmap->max_results )
2697 cmap->memory = memory;
2702 cmap->max_results = num_results;
2710 tt_cmap14_init( TT_CMap14 cmap,
2713 cmap->cmap.data =
table;
2717 cmap->max_results = 0;
2718 cmap->results =
NULL;
2725 tt_cmap14_validate(
FT_Byte* table,
2733 if ( length > (
FT_ULong)( valid->limit - table ) ||
2734 length < 10 + 11 * num_selectors )
2745 for ( n = 0; n < num_selectors; n++ )
2752 if ( defOff >= length || nondefOff >= length )
2755 if ( varSel < lastVarSel )
2758 lastVarSel = varSel + 1;
2764 FT_Byte* defp = table + defOff;
2770 if ( defp + numRanges * 4 > valid->limit )
2773 for ( i = 0; i < numRanges; ++
i )
2779 if ( base + cnt >= 0x110000UL )
2782 if ( base < lastBase )
2785 lastBase = base + cnt + 1U;
2790 if ( nondefOff != 0 )
2792 FT_Byte* ndp = table + nondefOff;
2797 if ( numMappings * 4 > (
FT_ULong)( valid->limit - ndp ) )
2800 for ( i = 0; i < numMappings; ++
i )
2806 if ( uni >= 0x110000UL )
2809 if ( uni < lastUni )
2827 tt_cmap14_char_index(
TT_CMap cmap,
2828 FT_UInt32 char_code )
2839 tt_cmap14_char_next(
TT_CMap cmap,
2840 FT_UInt32 *pchar_code )
2851 tt_cmap14_get_info(
TT_CMap cmap,
2856 cmap_info->format = 14;
2858 cmap_info->language = 0xFFFFFFFFUL;
2865 tt_cmap14_char_map_def_binary(
FT_Byte *base,
2866 FT_UInt32 char_code )
2880 FT_UInt32 mid = ( min +
max ) >> 1;
2886 if ( char_code < start )
2888 else if ( char_code > start+cnt )
2899 tt_cmap14_char_map_nondef_binary(
FT_Byte *base,
2900 FT_UInt32 char_code )
2914 FT_UInt32 mid = ( min +
max ) >> 1;
2919 if ( char_code < uni )
2921 else if ( char_code > uni )
2932 tt_cmap14_find_variant(
FT_Byte *base,
2933 FT_UInt32 variantCode )
2947 FT_UInt32 mid = ( min +
max ) >> 1;
2952 if ( variantCode < varSel )
2954 else if ( variantCode > varSel )
2965 tt_cmap14_char_var_index(
TT_CMap cmap,
2968 FT_UInt32 variantSelector)
2970 FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );
2982 tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )
2986 return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode );
2989 if ( nondefOff != 0 )
2990 return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
2998 tt_cmap14_char_var_isdefault(
TT_CMap cmap,
3000 FT_UInt32 variantSelector )
3002 FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );
3014 tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )
3017 if ( nondefOff != 0 &&
3018 tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
3027 tt_cmap14_variants(
TT_CMap cmap,
3030 TT_CMap14 cmap14 = (TT_CMap14)cmap;
3031 FT_UInt32 count = cmap14->num_selectors;
3037 if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )
3040 result = cmap14->results;
3041 for ( i = 0; i <
count; ++
i )
3053 tt_cmap14_char_variants(
TT_CMap cmap,
3055 FT_UInt32 charCode )
3057 TT_CMap14 cmap14 = (TT_CMap14) cmap;
3058 FT_UInt32 count = cmap14->num_selectors;
3063 if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )
3066 for ( q = cmap14->results; count > 0; --count )
3073 if ( ( defOff != 0 &&
3074 tt_cmap14_char_map_def_binary( cmap->data + defOff,
3077 tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
3086 return cmap14->results;
3091 tt_cmap14_def_char_count(
FT_Byte *p )
3098 for ( ; numRanges > 0; numRanges-- )
3109 tt_cmap14_get_def_chars(
TT_CMap cmap,
3113 TT_CMap14 cmap14 = (TT_CMap14) cmap;
3114 FT_UInt32 numRanges;
3119 cnt = tt_cmap14_def_char_count( p );
3122 if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) )
3125 for ( q = cmap14->results; numRanges > 0; --numRanges )
3136 }
while ( --cnt != 0 );
3140 return cmap14->results;
3145 tt_cmap14_get_nondef_chars(
TT_CMap cmap,
3149 TT_CMap14 cmap14 = (TT_CMap14) cmap;
3150 FT_UInt32 numMappings;
3157 if ( tt_cmap14_ensure( cmap14, ( numMappings + 1 ), memory ) )
3160 ret = cmap14->results;
3161 for ( i = 0; i < numMappings; ++
i )
3173 tt_cmap14_variant_chars(
TT_CMap cmap,
3175 FT_UInt32 variantSelector )
3177 FT_Byte *p = tt_cmap14_find_variant( cmap->data + 6,
3191 if ( defOff == 0 && nondefOff == 0 )
3195 return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,
3197 else if ( nondefOff == 0 )
3198 return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,
3204 TT_CMap14 cmap14 = (TT_CMap14) cmap;
3205 FT_UInt32 numRanges;
3206 FT_UInt32 numMappings;
3214 p = cmap->data + nondefOff;
3215 dp = cmap->data + defOff;
3218 dcnt = tt_cmap14_def_char_count( dp );
3221 if ( numMappings == 0 )
3222 return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,
3225 return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,
3228 if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) )
3231 ret = cmap14->results;
3242 if ( nuni > duni + dcnt )
3244 for ( k = 0; k <= dcnt; ++
k )
3245 ret[i++] = duni + k;
3249 if ( di > numRanges )
3262 if ( ni > numMappings )
3270 if ( ni <= numMappings )
3276 while ( ni < numMappings )
3283 else if ( di <= numRanges )
3288 for ( k = 0; k <= dcnt; ++
k )
3289 ret[i++] = duni + k;
3291 while ( di < numRanges )
3296 for ( k = 0; k <= dcnt; ++
k )
3297 ret[i++] = duni + k;
3310 sizeof ( TT_CMap14Rec ),
3332 #ifndef FT_CONFIG_OPTION_PIC
3336 #define TTCMAPCITEM(a) &a,
3358 #define TTCMAPCITEM(a) i++;
3370 #define TTCMAPCITEM(a) \
3371 FT_Init_Class_##a(&recs[i]); \
3372 clazz[i] = &recs[i]; \
3378 *output_class = clazz;
3391 FT_Byte* table = face->cmap_table;
3392 FT_Byte* limit = table + face->cmap_size;
3400 if ( !p || p + 4 > limit )
3401 return SFNT_Err_Invalid_Table;
3408 " unsupported `cmap' table format = %d\n",
3410 return SFNT_Err_Invalid_Table;
3414 #ifdef FT_MAX_CHARMAP_CACHEABLE
3416 FT_ERROR((
"tt_face_build_cmaps: too many cmap subtables(%d) "
3417 "subtable#%d and later are loaded but cannot be searched\n",
3421 for ( ; num_cmaps > 0 && p + 8 <=
limit; num_cmaps-- )
3430 charmap.
encoding = FT_ENCODING_NONE;
3441 for ( ; *pclazz; pclazz++ )
3444 if ( clazz->
format == format )
3447 volatile FT_Error error = SFNT_Err_Ok;
3472 cmap, &charmap, &ttcmap ) )
3482 " broken cmap sub-table ignored\n" ));
3488 if ( *pclazz == NULL )
3491 " unsupported cmap sub-table ignored\n" ));
#define FT_ALLOC(ptr, size)
GLenum GLsizei GLenum GLenum const GLvoid * table
#define FT_QRENEW_ARRAY(ptr, curcnt, newcnt)
FT_UInt(* FT_CMap_CharVarIndexFunc)(FT_CMap cmap, FT_CMap unicode_cmap, FT_UInt32 char_code, FT_UInt32 variant_selector)
FT_UInt(* FT_CMap_CharIndexFunc)(FT_CMap cmap, FT_UInt32 char_code)
tt_face_build_cmaps(TT_Face face)
static const TT_CMap_Class tt_cmap_classes[]
tt_cmap_init(TT_CMap cmap, FT_Byte *table)
#define FT_NEXT_BYTE(buffer)
GLuint GLsizei const GLuint const GLintptr * offsets
#define FT_INVALID_TOO_SHORT
#define FT_PAD_FLOOR(x, n)
FT_UInt(* FT_CMap_CharNextFunc)(FT_CMap cmap, FT_UInt32 *achar_code)
TT_CMap_ValidateFunc validate
tt_get_cmap_info(FT_CharMap charmap, TT_CMapInfo *cmap_info)
#define FT_MAX_CHARMAP_CACHEABLE
FT_BEGIN_HEADER typedef unsigned char FT_Bool
TT_CMap_Info_GetFunc get_cmap_info
#define FT_ERROR(varformat)
#define FT_ASSERT(condition)
void(* FT_CMap_DoneFunc)(FT_CMap cmap)
FT_UInt32 *(* FT_CMap_VariantListFunc)(FT_CMap cmap, FT_Memory mem)
struct FT_CMapRec_ * FT_CMap
FT_Error(* TT_CMap_ValidateFunc)(FT_Byte *data, FT_Validator valid)
struct TT_FaceRec_ * TT_Face
#define FT_DEFINE_TT_CMAP(class_, size_, init_, done_, char_index_,char_next_, char_var_index_, char_var_default_, variant_list_,charvariant_list_, variantchar_list_,format_, validate_, get_cmap_info_)
#define FT_TRACE0(varformat)
FT_UInt32 *(* FT_CMap_VariantCharListFunc)(FT_CMap cmap, FT_Memory mem, FT_UInt32 variant_selector)
typedefFT_BEGIN_HEADER struct FT_ValidatorRec_ volatile * FT_Validator
GLint GLenum GLsizei GLsizei GLsizei GLint GLenum format
#define FT_TT_CMAP_CLASSES_GET
FT_ValidatorRec validator
#define FT_CALLBACK_DEF(x)
#define FT_PEEK_USHORT(p)
typedefFT_BEGIN_HEADER struct FT_MemoryRec_ * FT_Memory
FT_Bool(* FT_CMap_CharVarIsDefaultFunc)(FT_CMap cmap, FT_UInt32 char_code, FT_UInt32 variant_selector)
#define FT_NEXT_USHORT(buffer)
struct TT_CMapRec_ * TT_CMap
#define FT_INVALID_OFFSET
FT_CMap_New(FT_CMap_Class clazz, FT_Pointer init_data, FT_CharMap charmap, FT_CMap *acmap)
GLdouble GLdouble GLdouble GLdouble q
#define TT_VALID_GLYPH_COUNT(x)
#define TT_CMAP_FLAG_UNSORTED
FT_Error(* FT_CMap_InitFunc)(FT_CMap cmap, FT_Pointer init_data)
ft_validator_init(FT_Validator valid, const FT_Byte *base, const FT_Byte *limit, FT_ValidationLevel level)
#define TT_CMAP_FLAG_OVERLAPPING
#define FT_INVALID_GLYPH_ID
#define FT_FACE_LIBRARY(x)
FT_UInt32 *(* FT_CMap_CharVariantListFunc)(FT_CMap cmap, FT_Memory mem, FT_UInt32 char_code)
FT_Error(* TT_CMap_Info_GetFunc)(FT_CharMap charmap, TT_CMapInfo *cmap_info)
GLint GLsizei const GLuint64 * values
struct TT_CMap_ClassRec_ * TT_CMap_Class