63#define FT_FACE_FIND_SERVICE( face, ptr, id ) \
65 FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
66 FT_Pointer _tmp_ = NULL; \
67 FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \
70 if ( module->clazz->get_interface ) \
71 _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
77#define FT_FACE_FIND_SERVICE( face, ptr, id ) \
79 FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
80 FT_Pointer _tmp_ = NULL; \
82 if ( module->clazz->get_interface ) \
83 _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
115#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \
117 FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
119 FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \
122 _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id, 1 ); \
128#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \
130 FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
134 _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id, 1 ); \
183#define FT_DEFINE_SERVICEDESCREC1( class_, \
184 serv_id_1, serv_data_1 ) \
185 static const FT_ServiceDescRec class_[] = \
187 { serv_id_1, serv_data_1 }, \
191#define FT_DEFINE_SERVICEDESCREC2( class_, \
192 serv_id_1, serv_data_1, \
193 serv_id_2, serv_data_2 ) \
194 static const FT_ServiceDescRec class_[] = \
196 { serv_id_1, serv_data_1 }, \
197 { serv_id_2, serv_data_2 }, \
201#define FT_DEFINE_SERVICEDESCREC3( class_, \
202 serv_id_1, serv_data_1, \
203 serv_id_2, serv_data_2, \
204 serv_id_3, serv_data_3 ) \
205 static const FT_ServiceDescRec class_[] = \
207 { serv_id_1, serv_data_1 }, \
208 { serv_id_2, serv_data_2 }, \
209 { serv_id_3, serv_data_3 }, \
213#define FT_DEFINE_SERVICEDESCREC4( class_, \
214 serv_id_1, serv_data_1, \
215 serv_id_2, serv_data_2, \
216 serv_id_3, serv_data_3, \
217 serv_id_4, serv_data_4 ) \
218 static const FT_ServiceDescRec class_[] = \
220 { serv_id_1, serv_data_1 }, \
221 { serv_id_2, serv_data_2 }, \
222 { serv_id_3, serv_data_3 }, \
223 { serv_id_4, serv_data_4 }, \
227#define FT_DEFINE_SERVICEDESCREC5( class_, \
228 serv_id_1, serv_data_1, \
229 serv_id_2, serv_data_2, \
230 serv_id_3, serv_data_3, \
231 serv_id_4, serv_data_4, \
232 serv_id_5, serv_data_5 ) \
233 static const FT_ServiceDescRec class_[] = \
235 { serv_id_1, serv_data_1 }, \
236 { serv_id_2, serv_data_2 }, \
237 { serv_id_3, serv_data_3 }, \
238 { serv_id_4, serv_data_4 }, \
239 { serv_id_5, serv_data_5 }, \
243#define FT_DEFINE_SERVICEDESCREC6( class_, \
244 serv_id_1, serv_data_1, \
245 serv_id_2, serv_data_2, \
246 serv_id_3, serv_data_3, \
247 serv_id_4, serv_data_4, \
248 serv_id_5, serv_data_5, \
249 serv_id_6, serv_data_6 ) \
250 static const FT_ServiceDescRec class_[] = \
252 { serv_id_1, serv_data_1 }, \
253 { serv_id_2, serv_data_2 }, \
254 { serv_id_3, serv_data_3 }, \
255 { serv_id_4, serv_data_4 }, \
256 { serv_id_5, serv_data_5 }, \
257 { serv_id_6, serv_data_6 }, \
261#define FT_DEFINE_SERVICEDESCREC7( class_, \
262 serv_id_1, serv_data_1, \
263 serv_id_2, serv_data_2, \
264 serv_id_3, serv_data_3, \
265 serv_id_4, serv_data_4, \
266 serv_id_5, serv_data_5, \
267 serv_id_6, serv_data_6, \
268 serv_id_7, serv_data_7 ) \
269 static const FT_ServiceDescRec class_[] = \
271 { serv_id_1, serv_data_1 }, \
272 { serv_id_2, serv_data_2 }, \
273 { serv_id_3, serv_data_3 }, \
274 { serv_id_4, serv_data_4 }, \
275 { serv_id_5, serv_data_5 }, \
276 { serv_id_6, serv_data_6 }, \
277 { serv_id_7, serv_data_7 }, \
281#define FT_DEFINE_SERVICEDESCREC8( class_, \
282 serv_id_1, serv_data_1, \
283 serv_id_2, serv_data_2, \
284 serv_id_3, serv_data_3, \
285 serv_id_4, serv_data_4, \
286 serv_id_5, serv_data_5, \
287 serv_id_6, serv_data_6, \
288 serv_id_7, serv_data_7, \
289 serv_id_8, serv_data_8 ) \
290 static const FT_ServiceDescRec class_[] = \
292 { serv_id_1, serv_data_1 }, \
293 { serv_id_2, serv_data_2 }, \
294 { serv_id_3, serv_data_3 }, \
295 { serv_id_4, serv_data_4 }, \
296 { serv_id_5, serv_data_5 }, \
297 { serv_id_6, serv_data_6 }, \
298 { serv_id_7, serv_data_7 }, \
299 { serv_id_8, serv_data_8 }, \
303#define FT_DEFINE_SERVICEDESCREC9( class_, \
304 serv_id_1, serv_data_1, \
305 serv_id_2, serv_data_2, \
306 serv_id_3, serv_data_3, \
307 serv_id_4, serv_data_4, \
308 serv_id_5, serv_data_5, \
309 serv_id_6, serv_data_6, \
310 serv_id_7, serv_data_7, \
311 serv_id_8, serv_data_8, \
312 serv_id_9, serv_data_9 ) \
313 static const FT_ServiceDescRec class_[] = \
315 { serv_id_1, serv_data_1 }, \
316 { serv_id_2, serv_data_2 }, \
317 { serv_id_3, serv_data_3 }, \
318 { serv_id_4, serv_data_4 }, \
319 { serv_id_5, serv_data_5 }, \
320 { serv_id_6, serv_data_6 }, \
321 { serv_id_7, serv_data_7 }, \
322 { serv_id_8, serv_data_8 }, \
323 { serv_id_9, serv_data_9 }, \
327#define FT_DEFINE_SERVICEDESCREC10( class_, \
328 serv_id_1, serv_data_1, \
329 serv_id_2, serv_data_2, \
330 serv_id_3, serv_data_3, \
331 serv_id_4, serv_data_4, \
332 serv_id_5, serv_data_5, \
333 serv_id_6, serv_data_6, \
334 serv_id_7, serv_data_7, \
335 serv_id_8, serv_data_8, \
336 serv_id_9, serv_data_9, \
337 serv_id_10, serv_data_10 ) \
338 static const FT_ServiceDescRec class_[] = \
340 { serv_id_1, serv_data_1 }, \
341 { serv_id_2, serv_data_2 }, \
342 { serv_id_3, serv_data_3 }, \
343 { serv_id_4, serv_data_4 }, \
344 { serv_id_5, serv_data_5 }, \
345 { serv_id_6, serv_data_6 }, \
346 { serv_id_7, serv_data_7 }, \
347 { serv_id_8, serv_data_8 }, \
348 { serv_id_9, serv_data_9 }, \
349 { serv_id_10, serv_data_10 }, \
365 const char* service_id );
406#define FT_SERVICE_UNAVAILABLE ((FT_Pointer)~(FT_PtrDist)1)
434#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \
437 FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \
440 svc = FT_FACE( face )->internal->services. service_ ## id; \
441 if ( svc == FT_SERVICE_UNAVAILABLE ) \
443 else if ( svc == NULL ) \
445 FT_FACE_FIND_SERVICE( face, svc, id ); \
447 FT_FACE( face )->internal->services. service_ ## id = \
448 (FT_Pointer)( svc != NULL ? svc \
449 : FT_SERVICE_UNAVAILABLE ); \
456#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \
461 svc = FT_FACE( face )->internal->services. service_ ## id; \
462 if ( svc == FT_SERVICE_UNAVAILABLE ) \
464 else if ( svc == NULL ) \
466 FT_FACE_FIND_SERVICE( face, svc, id ); \
468 FT_FACE( face )->internal->services. service_ ## id = \
469 (FT_Pointer)( svc != NULL ? svc \
470 : FT_SERVICE_UNAVAILABLE ); \
481#define FT_DEFINE_SERVICE( name ) \
482 typedef struct FT_Service_ ## name ## Rec_ \
483 FT_Service_ ## name ## Rec ; \
484 typedef struct FT_Service_ ## name ## Rec_ \
485 const * FT_Service_ ## name ; \
486 struct FT_Service_ ## name ## Rec_
struct FT_ServiceCacheRec_ FT_ServiceCacheRec
struct FT_ServiceDescRec_ FT_ServiceDescRec
struct FT_ServiceCacheRec_ * FT_ServiceCache
const FT_ServiceDescRec * FT_ServiceDesc
ft_service_list_lookup(FT_ServiceDesc service_descriptors, const char *service_id)
FT_Pointer service_POSTSCRIPT_FONT_NAME
FT_Pointer service_METRICS_VARIATIONS
FT_Pointer service_WINFNT
FT_Pointer service_MULTI_MASTERS
FT_Pointer service_PFR_METRICS
FT_Pointer service_GLYPH_DICT