Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4349 | Serge | 1 | /***************************************************************************/ |
2 | /* */ |
||
3 | /* ftdriver.h */ |
||
4 | /* */ |
||
5 | /* FreeType font driver interface (specification). */ |
||
6 | /* */ |
||
7 | /* Copyright 1996-2003, 2006, 2008, 2011-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 | #ifndef __FTDRIVER_H__ |
||
20 | #define __FTDRIVER_H__ |
||
21 | |||
22 | |||
23 | #include |
||
24 | #include FT_MODULE_H |
||
25 | |||
26 | |||
27 | FT_BEGIN_HEADER |
||
28 | |||
29 | |||
30 | typedef FT_Error |
||
31 | (*FT_Face_InitFunc)( FT_Stream stream, |
||
32 | FT_Face face, |
||
33 | FT_Int typeface_index, |
||
34 | FT_Int num_params, |
||
35 | FT_Parameter* parameters ); |
||
36 | |||
37 | typedef void |
||
38 | (*FT_Face_DoneFunc)( FT_Face face ); |
||
39 | |||
40 | |||
41 | typedef FT_Error |
||
42 | (*FT_Size_InitFunc)( FT_Size size ); |
||
43 | |||
44 | typedef void |
||
45 | (*FT_Size_DoneFunc)( FT_Size size ); |
||
46 | |||
47 | |||
48 | typedef FT_Error |
||
49 | (*FT_Slot_InitFunc)( FT_GlyphSlot slot ); |
||
50 | |||
51 | typedef void |
||
52 | (*FT_Slot_DoneFunc)( FT_GlyphSlot slot ); |
||
53 | |||
54 | |||
55 | typedef FT_Error |
||
56 | (*FT_Size_RequestFunc)( FT_Size size, |
||
57 | FT_Size_Request req ); |
||
58 | |||
59 | typedef FT_Error |
||
60 | (*FT_Size_SelectFunc)( FT_Size size, |
||
61 | FT_ULong size_index ); |
||
62 | |||
63 | typedef FT_Error |
||
64 | (*FT_Slot_LoadFunc)( FT_GlyphSlot slot, |
||
65 | FT_Size size, |
||
66 | FT_UInt glyph_index, |
||
67 | FT_Int32 load_flags ); |
||
68 | |||
69 | |||
70 | typedef FT_UInt |
||
71 | (*FT_CharMap_CharIndexFunc)( FT_CharMap charmap, |
||
72 | FT_Long charcode ); |
||
73 | |||
74 | typedef FT_Long |
||
75 | (*FT_CharMap_CharNextFunc)( FT_CharMap charmap, |
||
76 | FT_Long charcode ); |
||
77 | |||
78 | |||
79 | typedef FT_Error |
||
80 | (*FT_Face_GetKerningFunc)( FT_Face face, |
||
81 | FT_UInt left_glyph, |
||
82 | FT_UInt right_glyph, |
||
83 | FT_Vector* kerning ); |
||
84 | |||
85 | |||
86 | typedef FT_Error |
||
87 | (*FT_Face_AttachFunc)( FT_Face face, |
||
88 | FT_Stream stream ); |
||
89 | |||
90 | |||
91 | typedef FT_Error |
||
92 | (*FT_Face_GetAdvancesFunc)( FT_Face face, |
||
93 | FT_UInt first, |
||
94 | FT_UInt count, |
||
95 | FT_Int32 flags, |
||
96 | FT_Fixed* advances ); |
||
97 | |||
98 | |||
99 | /*************************************************************************/ |
||
100 | /* */ |
||
101 | /* |
||
102 | /* FT_Driver_ClassRec */ |
||
103 | /* */ |
||
104 | /* |
||
105 | /* The font driver class. This structure mostly contains pointers to */ |
||
106 | /* driver methods. */ |
||
107 | /* */ |
||
108 | /* |
||
109 | /* root :: The parent module. */ |
||
110 | /* */ |
||
111 | /* face_object_size :: The size of a face object in bytes. */ |
||
112 | /* */ |
||
113 | /* size_object_size :: The size of a size object in bytes. */ |
||
114 | /* */ |
||
115 | /* slot_object_size :: The size of a glyph object in bytes. */ |
||
116 | /* */ |
||
117 | /* init_face :: The format-specific face constructor. */ |
||
118 | /* */ |
||
119 | /* done_face :: The format-specific face destructor. */ |
||
120 | /* */ |
||
121 | /* init_size :: The format-specific size constructor. */ |
||
122 | /* */ |
||
123 | /* done_size :: The format-specific size destructor. */ |
||
124 | /* */ |
||
125 | /* init_slot :: The format-specific slot constructor. */ |
||
126 | /* */ |
||
127 | /* done_slot :: The format-specific slot destructor. */ |
||
128 | /* */ |
||
129 | /* */ |
||
130 | /* load_glyph :: A function handle to load a glyph to a slot. */ |
||
131 | /* This field is mandatory! */ |
||
132 | /* */ |
||
133 | /* get_kerning :: A function handle to return the unscaled */ |
||
134 | /* kerning for a given pair of glyphs. Can be */ |
||
135 | /* set to 0 if the format doesn't support */ |
||
136 | /* kerning. */ |
||
137 | /* */ |
||
138 | /* attach_file :: This function handle is used to read */ |
||
139 | /* additional data for a face from another */ |
||
140 | /* file/stream. For example, this can be used to */ |
||
141 | /* add data from AFM or PFM files on a Type 1 */ |
||
142 | /* face, or a CIDMap on a CID-keyed face. */ |
||
143 | /* */ |
||
144 | /* get_advances :: A function handle used to return advance */ |
||
145 | /* widths of `count' glyphs (in font units), */ |
||
146 | /* starting at `first'. The `vertical' flag must */ |
||
147 | /* be set to get vertical advance heights. The */ |
||
148 | /* `advances' buffer is caller-allocated. */ |
||
149 | /* The idea of this function is to be able to */ |
||
150 | /* perform device-independent text layout without */ |
||
151 | /* loading a single glyph image. */ |
||
152 | /* */ |
||
153 | /* request_size :: A handle to a function used to request the new */ |
||
154 | /* character size. Can be set to 0 if the */ |
||
155 | /* scaling done in the base layer suffices. */ |
||
156 | /* */ |
||
157 | /* select_size :: A handle to a function used to select a new */ |
||
158 | /* fixed size. It is used only if */ |
||
159 | /* @FT_FACE_FLAG_FIXED_SIZES is set. Can be set */ |
||
160 | /* to 0 if the scaling done in the base layer */ |
||
161 | /* suffices. */ |
||
162 | /* |
||
163 | /* Most function pointers, with the exception of `load_glyph', can be */ |
||
164 | /* set to 0 to indicate a default behaviour. */ |
||
165 | /* */ |
||
166 | typedef struct FT_Driver_ClassRec_ |
||
167 | { |
||
168 | FT_Module_Class root; |
||
169 | |||
170 | FT_Long face_object_size; |
||
171 | FT_Long size_object_size; |
||
172 | FT_Long slot_object_size; |
||
173 | |||
174 | FT_Face_InitFunc init_face; |
||
175 | FT_Face_DoneFunc done_face; |
||
176 | |||
177 | FT_Size_InitFunc init_size; |
||
178 | FT_Size_DoneFunc done_size; |
||
179 | |||
180 | FT_Slot_InitFunc init_slot; |
||
181 | FT_Slot_DoneFunc done_slot; |
||
182 | |||
183 | FT_Slot_LoadFunc load_glyph; |
||
184 | |||
185 | FT_Face_GetKerningFunc get_kerning; |
||
186 | FT_Face_AttachFunc attach_file; |
||
187 | FT_Face_GetAdvancesFunc get_advances; |
||
188 | |||
189 | /* since version 2.2 */ |
||
190 | FT_Size_RequestFunc request_size; |
||
191 | FT_Size_SelectFunc select_size; |
||
192 | |||
193 | } FT_Driver_ClassRec, *FT_Driver_Class; |
||
194 | |||
195 | |||
196 | /*************************************************************************/ |
||
197 | /* */ |
||
198 | /* |
||
199 | /* FT_DECLARE_DRIVER */ |
||
200 | /* */ |
||
201 | /* |
||
202 | /* Used to create a forward declaration of an FT_Driver_ClassRec */ |
||
203 | /* struct instance. */ |
||
204 | /* */ |
||
205 | /* |
||
206 | /* FT_DEFINE_DRIVER */ |
||
207 | /* */ |
||
208 | /* |
||
209 | /* Used to initialize an instance of FT_Driver_ClassRec struct. */ |
||
210 | /* */ |
||
211 | /* When FT_CONFIG_OPTION_PIC is defined a `create' function has to be */ |
||
212 | /* called with a pointer where the allocated structure is returned. */ |
||
213 | /* And when it is no longer needed a `destroy' function needs to be */ |
||
214 | /* called to release that allocation. */ |
||
215 | /* */ |
||
216 | /* `fcinit.c' (ft_create_default_module_classes) already contains a */ |
||
217 | /* mechanism to call these functions for the default modules */ |
||
218 | /* described in `ftmodule.h'. */ |
||
219 | /* */ |
||
220 | /* Notice that the created `create' and `destroy' functions call */ |
||
221 | /* `pic_init' and `pic_free' to allow you to manually allocate and */ |
||
222 | /* initialize any additional global data, like a module specific */ |
||
223 | /* interface, and put them in the global pic container defined in */ |
||
224 | /* `ftpic.h'. If you don't need them just implement the functions as */ |
||
225 | /* empty to resolve the link error. Also the `pic_init' and */ |
||
226 | /* `pic_free' functions should be declared in `pic.h', to be referred */ |
||
227 | /* by driver definition calling `FT_DEFINE_DRIVER' in following. */ |
||
228 | /* */ |
||
229 | /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ |
||
230 | /* allocated in the global scope (or the scope where the macro is */ |
||
231 | /* used). */ |
||
232 | /* */ |
||
233 | #ifndef FT_CONFIG_OPTION_PIC |
||
234 | |||
235 | #define FT_DECLARE_DRIVER( class_ ) \ |
||
236 | FT_CALLBACK_TABLE \ |
||
237 | const FT_Driver_ClassRec class_; |
||
238 | |||
239 | #define FT_DEFINE_DRIVER( \ |
||
240 | class_, \ |
||
241 | flags_, \ |
||
242 | size_, \ |
||
243 | name_, \ |
||
244 | version_, \ |
||
245 | requires_, \ |
||
246 | interface_, \ |
||
247 | init_, \ |
||
248 | done_, \ |
||
249 | get_interface_, \ |
||
250 | face_object_size_, \ |
||
251 | size_object_size_, \ |
||
252 | slot_object_size_, \ |
||
253 | init_face_, \ |
||
254 | done_face_, \ |
||
255 | init_size_, \ |
||
256 | done_size_, \ |
||
257 | init_slot_, \ |
||
258 | done_slot_, \ |
||
259 | load_glyph_, \ |
||
260 | get_kerning_, \ |
||
261 | attach_file_, \ |
||
262 | get_advances_, \ |
||
263 | request_size_, \ |
||
264 | select_size_ ) \ |
||
265 | FT_CALLBACK_TABLE_DEF \ |
||
266 | const FT_Driver_ClassRec class_ = \ |
||
267 | { \ |
||
268 | FT_DEFINE_ROOT_MODULE( flags_, \ |
||
269 | size_, \ |
||
270 | name_, \ |
||
271 | version_, \ |
||
272 | requires_, \ |
||
273 | interface_, \ |
||
274 | init_, \ |
||
275 | done_, \ |
||
276 | get_interface_ ) \ |
||
277 | \ |
||
278 | face_object_size_, \ |
||
279 | size_object_size_, \ |
||
280 | slot_object_size_, \ |
||
281 | \ |
||
282 | init_face_, \ |
||
283 | done_face_, \ |
||
284 | \ |
||
285 | init_size_, \ |
||
286 | done_size_, \ |
||
287 | \ |
||
288 | init_slot_, \ |
||
289 | done_slot_, \ |
||
290 | \ |
||
291 | load_glyph_, \ |
||
292 | \ |
||
293 | get_kerning_, \ |
||
294 | attach_file_, \ |
||
295 | get_advances_, \ |
||
296 | \ |
||
297 | request_size_, \ |
||
298 | select_size_ \ |
||
299 | }; |
||
300 | |||
301 | #else /* FT_CONFIG_OPTION_PIC */ |
||
302 | |||
303 | #define FT_DECLARE_DRIVER( class_ ) FT_DECLARE_MODULE( class_ ) |
||
304 | |||
305 | #define FT_DEFINE_DRIVER( \ |
||
306 | class_, \ |
||
307 | flags_, \ |
||
308 | size_, \ |
||
309 | name_, \ |
||
310 | version_, \ |
||
311 | requires_, \ |
||
312 | interface_, \ |
||
313 | init_, \ |
||
314 | done_, \ |
||
315 | get_interface_, \ |
||
316 | face_object_size_, \ |
||
317 | size_object_size_, \ |
||
318 | slot_object_size_, \ |
||
319 | init_face_, \ |
||
320 | done_face_, \ |
||
321 | init_size_, \ |
||
322 | done_size_, \ |
||
323 | init_slot_, \ |
||
324 | done_slot_, \ |
||
325 | load_glyph_, \ |
||
326 | get_kerning_, \ |
||
327 | attach_file_, \ |
||
328 | get_advances_, \ |
||
329 | request_size_, \ |
||
330 | select_size_ ) \ |
||
331 | void \ |
||
332 | FT_Destroy_Class_ ## class_( FT_Library library, \ |
||
333 | FT_Module_Class* clazz ) \ |
||
334 | { \ |
||
335 | FT_Memory memory = library->memory; \ |
||
336 | FT_Driver_Class dclazz = (FT_Driver_Class)clazz; \ |
||
337 | \ |
||
338 | \ |
||
339 | class_ ## _pic_free( library ); \ |
||
340 | if ( dclazz ) \ |
||
341 | FT_FREE( dclazz ); \ |
||
342 | } \ |
||
343 | \ |
||
344 | \ |
||
345 | FT_Error \ |
||
346 | FT_Create_Class_ ## class_( FT_Library library, \ |
||
347 | FT_Module_Class** output_class ) \ |
||
348 | { \ |
||
349 | FT_Driver_Class clazz = NULL; \ |
||
350 | FT_Error error; \ |
||
351 | FT_Memory memory = library->memory; \ |
||
352 | \ |
||
353 | \ |
||
354 | if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \ |
||
355 | return error; \ |
||
356 | \ |
||
357 | error = class_ ## _pic_init( library ); \ |
||
358 | if ( error ) \ |
||
359 | { \ |
||
360 | FT_FREE( clazz ); \ |
||
361 | return error; \ |
||
362 | } \ |
||
363 | \ |
||
364 | FT_DEFINE_ROOT_MODULE( flags_, \ |
||
365 | size_, \ |
||
366 | name_, \ |
||
367 | version_, \ |
||
368 | requires_, \ |
||
369 | interface_, \ |
||
370 | init_, \ |
||
371 | done_, \ |
||
372 | get_interface_ ) \ |
||
373 | \ |
||
374 | clazz->face_object_size = face_object_size_; \ |
||
375 | clazz->size_object_size = size_object_size_; \ |
||
376 | clazz->slot_object_size = slot_object_size_; \ |
||
377 | \ |
||
378 | clazz->init_face = init_face_; \ |
||
379 | clazz->done_face = done_face_; \ |
||
380 | \ |
||
381 | clazz->init_size = init_size_; \ |
||
382 | clazz->done_size = done_size_; \ |
||
383 | \ |
||
384 | clazz->init_slot = init_slot_; \ |
||
385 | clazz->done_slot = done_slot_; \ |
||
386 | \ |
||
387 | clazz->load_glyph = load_glyph_; \ |
||
388 | \ |
||
389 | clazz->get_kerning = get_kerning_; \ |
||
390 | clazz->attach_file = attach_file_; \ |
||
391 | clazz->get_advances = get_advances_; \ |
||
392 | \ |
||
393 | clazz->request_size = request_size_; \ |
||
394 | clazz->select_size = select_size_; \ |
||
395 | \ |
||
396 | *output_class = (FT_Module_Class*)clazz; \ |
||
397 | \ |
||
398 | return FT_Err_Ok; \ |
||
399 | } |
||
400 | |||
401 | |||
402 | #endif /* FT_CONFIG_OPTION_PIC */ |
||
403 | |||
404 | FT_END_HEADER |
||
405 | |||
406 | #endif /* __FTDRIVER_H__ */ |
||
407 | |||
408 | |||
409 | /* END */ |