OLD | NEW |
| (Empty) |
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 "../../include/ft2build.h" | |
20 #include "../../include/freetype/internal/ftdebug.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 */ | |
OLD | NEW |