Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3918 | Serge | 1 | /***************************************************************************/ |
2 | /* */ |
||
3 | /* cffcmap.c */ |
||
4 | /* */ |
||
5 | /* CFF character mapping table (cmap) support (body). */ |
||
6 | /* */ |
||
7 | /* Copyright 2002-2007, 2010, 2013 by */ |
||
8 | /* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
||
9 | /* */ |
||
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. */ |
||
15 | /* */ |
||
16 | /***************************************************************************/ |
||
17 | |||
18 | |||
19 | #include |
||
20 | #include FT_INTERNAL_DEBUG_H |
||
21 | #include "cffcmap.h" |
||
22 | #include "cffload.h" |
||
23 | |||
24 | #include "cfferrs.h" |
||
25 | |||
26 | |||
27 | /*************************************************************************/ |
||
28 | /*************************************************************************/ |
||
29 | /***** *****/ |
||
30 | /***** CFF STANDARD (AND EXPERT) ENCODING CMAPS *****/ |
||
31 | /***** *****/ |
||
32 | /*************************************************************************/ |
||
33 | /*************************************************************************/ |
||
34 | |||
35 | FT_CALLBACK_DEF( FT_Error ) |
||
36 | cff_cmap_encoding_init( CFF_CMapStd cmap ) |
||
37 | { |
||
38 | TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); |
||
39 | CFF_Font cff = (CFF_Font)face->extra.data; |
||
40 | CFF_Encoding encoding = &cff->encoding; |
||
41 | |||
42 | |||
43 | cmap->gids = encoding->codes; |
||
44 | |||
45 | return 0; |
||
46 | } |
||
47 | |||
48 | |||
49 | FT_CALLBACK_DEF( void ) |
||
50 | cff_cmap_encoding_done( CFF_CMapStd cmap ) |
||
51 | { |
||
52 | cmap->gids = NULL; |
||
53 | } |
||
54 | |||
55 | |||
56 | FT_CALLBACK_DEF( FT_UInt ) |
||
57 | cff_cmap_encoding_char_index( CFF_CMapStd cmap, |
||
58 | FT_UInt32 char_code ) |
||
59 | { |
||
60 | FT_UInt result = 0; |
||
61 | |||
62 | |||
63 | if ( char_code < 256 ) |
||
64 | result = cmap->gids[char_code]; |
||
65 | |||
66 | return result; |
||
67 | } |
||
68 | |||
69 | |||
70 | FT_CALLBACK_DEF( FT_UInt32 ) |
||
71 | cff_cmap_encoding_char_next( CFF_CMapStd cmap, |
||
72 | FT_UInt32 *pchar_code ) |
||
73 | { |
||
74 | FT_UInt result = 0; |
||
75 | FT_UInt32 char_code = *pchar_code; |
||
76 | |||
77 | |||
78 | *pchar_code = 0; |
||
79 | |||
80 | if ( char_code < 255 ) |
||
81 | { |
||
82 | FT_UInt code = (FT_UInt)(char_code + 1); |
||
83 | |||
84 | |||
85 | for (;;) |
||
86 | { |
||
87 | if ( code >= 256 ) |
||
88 | break; |
||
89 | |||
90 | result = cmap->gids[code]; |
||
91 | if ( result != 0 ) |
||
92 | { |
||
93 | *pchar_code = code; |
||
94 | break; |
||
95 | } |
||
96 | |||
97 | code++; |
||
98 | } |
||
99 | } |
||
100 | return result; |
||
101 | } |
||
102 | |||
103 | |||
104 | FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec, |
||
105 | sizeof ( CFF_CMapStdRec ), |
||
106 | |||
107 | (FT_CMap_InitFunc) cff_cmap_encoding_init, |
||
108 | (FT_CMap_DoneFunc) cff_cmap_encoding_done, |
||
109 | (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index, |
||
110 | (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next, |
||
111 | |||
112 | NULL, NULL, NULL, NULL, NULL |
||
113 | ) |
||
114 | |||
115 | |||
116 | /*************************************************************************/ |
||
117 | /*************************************************************************/ |
||
118 | /***** *****/ |
||
119 | /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ |
||
120 | /***** *****/ |
||
121 | /*************************************************************************/ |
||
122 | /*************************************************************************/ |
||
123 | |||
124 | FT_CALLBACK_DEF( const char* ) |
||
125 | cff_sid_to_glyph_name( TT_Face face, |
||
126 | FT_UInt idx ) |
||
127 | { |
||
128 | CFF_Font cff = (CFF_Font)face->extra.data; |
||
129 | CFF_Charset charset = &cff->charset; |
||
130 | FT_UInt sid = charset->sids[idx]; |
||
131 | |||
132 | |||
133 | return cff_index_get_sid_string( cff, sid ); |
||
134 | } |
||
135 | |||
136 | |||
137 | FT_CALLBACK_DEF( FT_Error ) |
||
138 | cff_cmap_unicode_init( PS_Unicodes unicodes ) |
||
139 | { |
||
140 | TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); |
||
141 | FT_Memory memory = FT_FACE_MEMORY( face ); |
||
142 | CFF_Font cff = (CFF_Font)face->extra.data; |
||
143 | CFF_Charset charset = &cff->charset; |
||
144 | FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; |
||
145 | |||
146 | |||
147 | /* can't build Unicode map for CID-keyed font */ |
||
148 | /* because we don't know glyph names. */ |
||
149 | if ( !charset->sids ) |
||
150 | return FT_THROW( No_Unicode_Glyph_Name ); |
||
151 | |||
152 | return psnames->unicodes_init( memory, |
||
153 | unicodes, |
||
154 | cff->num_glyphs, |
||
155 | (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name, |
||
156 | (PS_FreeGlyphNameFunc)NULL, |
||
157 | (FT_Pointer)face ); |
||
158 | } |
||
159 | |||
160 | |||
161 | FT_CALLBACK_DEF( void ) |
||
162 | cff_cmap_unicode_done( PS_Unicodes unicodes ) |
||
163 | { |
||
164 | FT_Face face = FT_CMAP_FACE( unicodes ); |
||
165 | FT_Memory memory = FT_FACE_MEMORY( face ); |
||
166 | |||
167 | |||
168 | FT_FREE( unicodes->maps ); |
||
169 | unicodes->num_maps = 0; |
||
170 | } |
||
171 | |||
172 | |||
173 | FT_CALLBACK_DEF( FT_UInt ) |
||
174 | cff_cmap_unicode_char_index( PS_Unicodes unicodes, |
||
175 | FT_UInt32 char_code ) |
||
176 | { |
||
177 | TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); |
||
178 | CFF_Font cff = (CFF_Font)face->extra.data; |
||
179 | FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; |
||
180 | |||
181 | |||
182 | return psnames->unicodes_char_index( unicodes, char_code ); |
||
183 | } |
||
184 | |||
185 | |||
186 | FT_CALLBACK_DEF( FT_UInt32 ) |
||
187 | cff_cmap_unicode_char_next( PS_Unicodes unicodes, |
||
188 | FT_UInt32 *pchar_code ) |
||
189 | { |
||
190 | TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); |
||
191 | CFF_Font cff = (CFF_Font)face->extra.data; |
||
192 | FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; |
||
193 | |||
194 | |||
195 | return psnames->unicodes_char_next( unicodes, pchar_code ); |
||
196 | } |
||
197 | |||
198 | |||
199 | FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec, |
||
200 | sizeof ( PS_UnicodesRec ), |
||
201 | |||
202 | (FT_CMap_InitFunc) cff_cmap_unicode_init, |
||
203 | (FT_CMap_DoneFunc) cff_cmap_unicode_done, |
||
204 | (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index, |
||
205 | (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next, |
||
206 | |||
207 | NULL, NULL, NULL, NULL, NULL |
||
208 | ) |
||
209 | |||
210 | /* END */>> |