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