vrshoot

annotate libs/ft2static/freetype/internal/ftserv.h @ 0:b2f14e535253

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 01 Feb 2014 19:58:19 +0200
parents
children
rev   line source
nuclear@0 1 /***************************************************************************/
nuclear@0 2 /* */
nuclear@0 3 /* ftserv.h */
nuclear@0 4 /* */
nuclear@0 5 /* The FreeType services (specification only). */
nuclear@0 6 /* */
nuclear@0 7 /* Copyright 2003, 2004, 2005, 2006, 2007 by */
nuclear@0 8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
nuclear@0 9 /* */
nuclear@0 10 /* This file is part of the FreeType project, and may only be used, */
nuclear@0 11 /* modified, and distributed under the terms of the FreeType project */
nuclear@0 12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */
nuclear@0 13 /* this file you indicate that you have read the license and */
nuclear@0 14 /* understand and accept it fully. */
nuclear@0 15 /* */
nuclear@0 16 /***************************************************************************/
nuclear@0 17
nuclear@0 18 /*************************************************************************/
nuclear@0 19 /* */
nuclear@0 20 /* Each module can export one or more `services'. Each service is */
nuclear@0 21 /* identified by a constant string and modeled by a pointer; the latter */
nuclear@0 22 /* generally corresponds to a structure containing function pointers. */
nuclear@0 23 /* */
nuclear@0 24 /* Note that a service's data cannot be a mere function pointer because */
nuclear@0 25 /* in C it is possible that function pointers might be implemented */
nuclear@0 26 /* differently than data pointers (e.g. 48 bits instead of 32). */
nuclear@0 27 /* */
nuclear@0 28 /*************************************************************************/
nuclear@0 29
nuclear@0 30
nuclear@0 31 #ifndef __FTSERV_H__
nuclear@0 32 #define __FTSERV_H__
nuclear@0 33
nuclear@0 34
nuclear@0 35 FT_BEGIN_HEADER
nuclear@0 36
nuclear@0 37 #if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */
nuclear@0 38
nuclear@0 39 /* we disable the warning `conditional expression is constant' here */
nuclear@0 40 /* in order to compile cleanly with the maximum level of warnings */
nuclear@0 41 #pragma warning( disable : 4127 )
nuclear@0 42
nuclear@0 43 #endif /* _MSC_VER */
nuclear@0 44
nuclear@0 45 /*
nuclear@0 46 * @macro:
nuclear@0 47 * FT_FACE_FIND_SERVICE
nuclear@0 48 *
nuclear@0 49 * @description:
nuclear@0 50 * This macro is used to look up a service from a face's driver module.
nuclear@0 51 *
nuclear@0 52 * @input:
nuclear@0 53 * face ::
nuclear@0 54 * The source face handle.
nuclear@0 55 *
nuclear@0 56 * id ::
nuclear@0 57 * A string describing the service as defined in the service's
nuclear@0 58 * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
nuclear@0 59 * `multi-masters'). It is automatically prefixed with
nuclear@0 60 * `FT_SERVICE_ID_'.
nuclear@0 61 *
nuclear@0 62 * @output:
nuclear@0 63 * ptr ::
nuclear@0 64 * A variable that receives the service pointer. Will be NULL
nuclear@0 65 * if not found.
nuclear@0 66 */
nuclear@0 67 #ifdef __cplusplus
nuclear@0 68
nuclear@0 69 #define FT_FACE_FIND_SERVICE( face, ptr, id ) \
nuclear@0 70 FT_BEGIN_STMNT \
nuclear@0 71 FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
nuclear@0 72 FT_Pointer _tmp_ = NULL; \
nuclear@0 73 FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \
nuclear@0 74 \
nuclear@0 75 \
nuclear@0 76 if ( module->clazz->get_interface ) \
nuclear@0 77 _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
nuclear@0 78 *_pptr_ = _tmp_; \
nuclear@0 79 FT_END_STMNT
nuclear@0 80
nuclear@0 81 #else /* !C++ */
nuclear@0 82
nuclear@0 83 #define FT_FACE_FIND_SERVICE( face, ptr, id ) \
nuclear@0 84 FT_BEGIN_STMNT \
nuclear@0 85 FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
nuclear@0 86 FT_Pointer _tmp_ = NULL; \
nuclear@0 87 \
nuclear@0 88 if ( module->clazz->get_interface ) \
nuclear@0 89 _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
nuclear@0 90 ptr = _tmp_; \
nuclear@0 91 FT_END_STMNT
nuclear@0 92
nuclear@0 93 #endif /* !C++ */
nuclear@0 94
nuclear@0 95 /*
nuclear@0 96 * @macro:
nuclear@0 97 * FT_FACE_FIND_GLOBAL_SERVICE
nuclear@0 98 *
nuclear@0 99 * @description:
nuclear@0 100 * This macro is used to look up a service from all modules.
nuclear@0 101 *
nuclear@0 102 * @input:
nuclear@0 103 * face ::
nuclear@0 104 * The source face handle.
nuclear@0 105 *
nuclear@0 106 * id ::
nuclear@0 107 * A string describing the service as defined in the service's
nuclear@0 108 * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
nuclear@0 109 * `multi-masters'). It is automatically prefixed with
nuclear@0 110 * `FT_SERVICE_ID_'.
nuclear@0 111 *
nuclear@0 112 * @output:
nuclear@0 113 * ptr ::
nuclear@0 114 * A variable that receives the service pointer. Will be NULL
nuclear@0 115 * if not found.
nuclear@0 116 */
nuclear@0 117 #ifdef __cplusplus
nuclear@0 118
nuclear@0 119 #define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \
nuclear@0 120 FT_BEGIN_STMNT \
nuclear@0 121 FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
nuclear@0 122 FT_Pointer _tmp_; \
nuclear@0 123 FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \
nuclear@0 124 \
nuclear@0 125 \
nuclear@0 126 _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
nuclear@0 127 *_pptr_ = _tmp_; \
nuclear@0 128 FT_END_STMNT
nuclear@0 129
nuclear@0 130 #else /* !C++ */
nuclear@0 131
nuclear@0 132 #define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \
nuclear@0 133 FT_BEGIN_STMNT \
nuclear@0 134 FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
nuclear@0 135 FT_Pointer _tmp_; \
nuclear@0 136 \
nuclear@0 137 \
nuclear@0 138 _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
nuclear@0 139 ptr = _tmp_; \
nuclear@0 140 FT_END_STMNT
nuclear@0 141
nuclear@0 142 #endif /* !C++ */
nuclear@0 143
nuclear@0 144
nuclear@0 145 /*************************************************************************/
nuclear@0 146 /*************************************************************************/
nuclear@0 147 /***** *****/
nuclear@0 148 /***** S E R V I C E D E S C R I P T O R S *****/
nuclear@0 149 /***** *****/
nuclear@0 150 /*************************************************************************/
nuclear@0 151 /*************************************************************************/
nuclear@0 152
nuclear@0 153 /*
nuclear@0 154 * The following structure is used to _describe_ a given service
nuclear@0 155 * to the library. This is useful to build simple static service lists.
nuclear@0 156 */
nuclear@0 157 typedef struct FT_ServiceDescRec_
nuclear@0 158 {
nuclear@0 159 const char* serv_id; /* service name */
nuclear@0 160 const void* serv_data; /* service pointer/data */
nuclear@0 161
nuclear@0 162 } FT_ServiceDescRec;
nuclear@0 163
nuclear@0 164 typedef const FT_ServiceDescRec* FT_ServiceDesc;
nuclear@0 165
nuclear@0 166 /*************************************************************************/
nuclear@0 167 /* */
nuclear@0 168 /* <Macro> */
nuclear@0 169 /* FT_DEFINE_SERVICEDESCREC1 .. FT_DEFINE_SERVICEDESCREC6 */
nuclear@0 170 /* */
nuclear@0 171 /* <Description> */
nuclear@0 172 /* Used to initialize an array of FT_ServiceDescRec structs. */
nuclear@0 173 /* */
nuclear@0 174 /* When FT_CONFIG_OPTION_PIC is defined a Create funtion will need */
nuclear@0 175 /* to called with a pointer where the allocated array is returned. */
nuclear@0 176 /* And when it is no longer needed a Destroy function needs */
nuclear@0 177 /* to be called to release that allocation. */
nuclear@0 178 /* */
nuclear@0 179 /* These functions should be manyally called from the pic_init and */
nuclear@0 180 /* pic_free functions of your module (see FT_DEFINE_MODULE) */
nuclear@0 181 /* */
nuclear@0 182 /* When FT_CONFIG_OPTION_PIC is not defined the array will be */
nuclear@0 183 /* allocated in the global scope (or the scope where the macro */
nuclear@0 184 /* is used). */
nuclear@0 185 /* */
nuclear@0 186 #ifndef FT_CONFIG_OPTION_PIC
nuclear@0 187
nuclear@0 188 #define FT_DEFINE_SERVICEDESCREC1(class_, serv_id_1, serv_data_1) \
nuclear@0 189 static const FT_ServiceDescRec class_[] = \
nuclear@0 190 { \
nuclear@0 191 {serv_id_1, serv_data_1}, \
nuclear@0 192 {NULL, NULL} \
nuclear@0 193 };
nuclear@0 194 #define FT_DEFINE_SERVICEDESCREC2(class_, serv_id_1, serv_data_1, \
nuclear@0 195 serv_id_2, serv_data_2) \
nuclear@0 196 static const FT_ServiceDescRec class_[] = \
nuclear@0 197 { \
nuclear@0 198 {serv_id_1, serv_data_1}, \
nuclear@0 199 {serv_id_2, serv_data_2}, \
nuclear@0 200 {NULL, NULL} \
nuclear@0 201 };
nuclear@0 202 #define FT_DEFINE_SERVICEDESCREC3(class_, serv_id_1, serv_data_1, \
nuclear@0 203 serv_id_2, serv_data_2, serv_id_3, serv_data_3) \
nuclear@0 204 static const FT_ServiceDescRec class_[] = \
nuclear@0 205 { \
nuclear@0 206 {serv_id_1, serv_data_1}, \
nuclear@0 207 {serv_id_2, serv_data_2}, \
nuclear@0 208 {serv_id_3, serv_data_3}, \
nuclear@0 209 {NULL, NULL} \
nuclear@0 210 };
nuclear@0 211 #define FT_DEFINE_SERVICEDESCREC4(class_, serv_id_1, serv_data_1, \
nuclear@0 212 serv_id_2, serv_data_2, serv_id_3, serv_data_3, \
nuclear@0 213 serv_id_4, serv_data_4) \
nuclear@0 214 static const FT_ServiceDescRec class_[] = \
nuclear@0 215 { \
nuclear@0 216 {serv_id_1, serv_data_1}, \
nuclear@0 217 {serv_id_2, serv_data_2}, \
nuclear@0 218 {serv_id_3, serv_data_3}, \
nuclear@0 219 {serv_id_4, serv_data_4}, \
nuclear@0 220 {NULL, NULL} \
nuclear@0 221 };
nuclear@0 222 #define FT_DEFINE_SERVICEDESCREC5(class_, serv_id_1, serv_data_1, \
nuclear@0 223 serv_id_2, serv_data_2, serv_id_3, serv_data_3, \
nuclear@0 224 serv_id_4, serv_data_4, serv_id_5, serv_data_5) \
nuclear@0 225 static const FT_ServiceDescRec class_[] = \
nuclear@0 226 { \
nuclear@0 227 {serv_id_1, serv_data_1}, \
nuclear@0 228 {serv_id_2, serv_data_2}, \
nuclear@0 229 {serv_id_3, serv_data_3}, \
nuclear@0 230 {serv_id_4, serv_data_4}, \
nuclear@0 231 {serv_id_5, serv_data_5}, \
nuclear@0 232 {NULL, NULL} \
nuclear@0 233 };
nuclear@0 234 #define FT_DEFINE_SERVICEDESCREC6(class_, serv_id_1, serv_data_1, \
nuclear@0 235 serv_id_2, serv_data_2, serv_id_3, serv_data_3, \
nuclear@0 236 serv_id_4, serv_data_4, serv_id_5, serv_data_5, \
nuclear@0 237 serv_id_6, serv_data_6) \
nuclear@0 238 static const FT_ServiceDescRec class_[] = \
nuclear@0 239 { \
nuclear@0 240 {serv_id_1, serv_data_1}, \
nuclear@0 241 {serv_id_2, serv_data_2}, \
nuclear@0 242 {serv_id_3, serv_data_3}, \
nuclear@0 243 {serv_id_4, serv_data_4}, \
nuclear@0 244 {serv_id_5, serv_data_5}, \
nuclear@0 245 {serv_id_6, serv_data_6}, \
nuclear@0 246 {NULL, NULL} \
nuclear@0 247 };
nuclear@0 248
nuclear@0 249 #else /* FT_CONFIG_OPTION_PIC */
nuclear@0 250
nuclear@0 251 #define FT_DEFINE_SERVICEDESCREC1(class_, serv_id_1, serv_data_1) \
nuclear@0 252 void \
nuclear@0 253 FT_Destroy_Class_##class_( FT_Library library, \
nuclear@0 254 FT_ServiceDescRec* clazz ) \
nuclear@0 255 { \
nuclear@0 256 FT_Memory memory = library->memory; \
nuclear@0 257 if ( clazz ) \
nuclear@0 258 FT_FREE( clazz ); \
nuclear@0 259 } \
nuclear@0 260 \
nuclear@0 261 FT_Error \
nuclear@0 262 FT_Create_Class_##class_( FT_Library library, \
nuclear@0 263 FT_ServiceDescRec** output_class) \
nuclear@0 264 { \
nuclear@0 265 FT_ServiceDescRec* clazz; \
nuclear@0 266 FT_Error error; \
nuclear@0 267 FT_Memory memory = library->memory; \
nuclear@0 268 \
nuclear@0 269 if ( FT_ALLOC( clazz, sizeof(*clazz)*2 ) ) \
nuclear@0 270 return error; \
nuclear@0 271 clazz[0].serv_id = serv_id_1; \
nuclear@0 272 clazz[0].serv_data = serv_data_1; \
nuclear@0 273 clazz[1].serv_id = NULL; \
nuclear@0 274 clazz[1].serv_data = NULL; \
nuclear@0 275 *output_class = clazz; \
nuclear@0 276 return FT_Err_Ok; \
nuclear@0 277 }
nuclear@0 278
nuclear@0 279 #define FT_DEFINE_SERVICEDESCREC2(class_, serv_id_1, serv_data_1, \
nuclear@0 280 serv_id_2, serv_data_2) \
nuclear@0 281 void \
nuclear@0 282 FT_Destroy_Class_##class_( FT_Library library, \
nuclear@0 283 FT_ServiceDescRec* clazz ) \
nuclear@0 284 { \
nuclear@0 285 FT_Memory memory = library->memory; \
nuclear@0 286 if ( clazz ) \
nuclear@0 287 FT_FREE( clazz ); \
nuclear@0 288 } \
nuclear@0 289 \
nuclear@0 290 FT_Error \
nuclear@0 291 FT_Create_Class_##class_( FT_Library library, \
nuclear@0 292 FT_ServiceDescRec** output_class) \
nuclear@0 293 { \
nuclear@0 294 FT_ServiceDescRec* clazz; \
nuclear@0 295 FT_Error error; \
nuclear@0 296 FT_Memory memory = library->memory; \
nuclear@0 297 \
nuclear@0 298 if ( FT_ALLOC( clazz, sizeof(*clazz)*3 ) ) \
nuclear@0 299 return error; \
nuclear@0 300 clazz[0].serv_id = serv_id_1; \
nuclear@0 301 clazz[0].serv_data = serv_data_1; \
nuclear@0 302 clazz[1].serv_id = serv_id_2; \
nuclear@0 303 clazz[1].serv_data = serv_data_2; \
nuclear@0 304 clazz[2].serv_id = NULL; \
nuclear@0 305 clazz[2].serv_data = NULL; \
nuclear@0 306 *output_class = clazz; \
nuclear@0 307 return FT_Err_Ok; \
nuclear@0 308 }
nuclear@0 309
nuclear@0 310 #define FT_DEFINE_SERVICEDESCREC3(class_, serv_id_1, serv_data_1, \
nuclear@0 311 serv_id_2, serv_data_2, serv_id_3, serv_data_3) \
nuclear@0 312 void \
nuclear@0 313 FT_Destroy_Class_##class_( FT_Library library, \
nuclear@0 314 FT_ServiceDescRec* clazz ) \
nuclear@0 315 { \
nuclear@0 316 FT_Memory memory = library->memory; \
nuclear@0 317 if ( clazz ) \
nuclear@0 318 FT_FREE( clazz ); \
nuclear@0 319 } \
nuclear@0 320 \
nuclear@0 321 FT_Error \
nuclear@0 322 FT_Create_Class_##class_( FT_Library library, \
nuclear@0 323 FT_ServiceDescRec** output_class) \
nuclear@0 324 { \
nuclear@0 325 FT_ServiceDescRec* clazz; \
nuclear@0 326 FT_Error error; \
nuclear@0 327 FT_Memory memory = library->memory; \
nuclear@0 328 \
nuclear@0 329 if ( FT_ALLOC( clazz, sizeof(*clazz)*4 ) ) \
nuclear@0 330 return error; \
nuclear@0 331 clazz[0].serv_id = serv_id_1; \
nuclear@0 332 clazz[0].serv_data = serv_data_1; \
nuclear@0 333 clazz[1].serv_id = serv_id_2; \
nuclear@0 334 clazz[1].serv_data = serv_data_2; \
nuclear@0 335 clazz[2].serv_id = serv_id_3; \
nuclear@0 336 clazz[2].serv_data = serv_data_3; \
nuclear@0 337 clazz[3].serv_id = NULL; \
nuclear@0 338 clazz[3].serv_data = NULL; \
nuclear@0 339 *output_class = clazz; \
nuclear@0 340 return FT_Err_Ok; \
nuclear@0 341 }
nuclear@0 342
nuclear@0 343 #define FT_DEFINE_SERVICEDESCREC4(class_, serv_id_1, serv_data_1, \
nuclear@0 344 serv_id_2, serv_data_2, serv_id_3, serv_data_3, \
nuclear@0 345 serv_id_4, serv_data_4) \
nuclear@0 346 void \
nuclear@0 347 FT_Destroy_Class_##class_( FT_Library library, \
nuclear@0 348 FT_ServiceDescRec* clazz ) \
nuclear@0 349 { \
nuclear@0 350 FT_Memory memory = library->memory; \
nuclear@0 351 if ( clazz ) \
nuclear@0 352 FT_FREE( clazz ); \
nuclear@0 353 } \
nuclear@0 354 \
nuclear@0 355 FT_Error \
nuclear@0 356 FT_Create_Class_##class_( FT_Library library, \
nuclear@0 357 FT_ServiceDescRec** output_class) \
nuclear@0 358 { \
nuclear@0 359 FT_ServiceDescRec* clazz; \
nuclear@0 360 FT_Error error; \
nuclear@0 361 FT_Memory memory = library->memory; \
nuclear@0 362 \
nuclear@0 363 if ( FT_ALLOC( clazz, sizeof(*clazz)*5 ) ) \
nuclear@0 364 return error; \
nuclear@0 365 clazz[0].serv_id = serv_id_1; \
nuclear@0 366 clazz[0].serv_data = serv_data_1; \
nuclear@0 367 clazz[1].serv_id = serv_id_2; \
nuclear@0 368 clazz[1].serv_data = serv_data_2; \
nuclear@0 369 clazz[2].serv_id = serv_id_3; \
nuclear@0 370 clazz[2].serv_data = serv_data_3; \
nuclear@0 371 clazz[3].serv_id = serv_id_4; \
nuclear@0 372 clazz[3].serv_data = serv_data_4; \
nuclear@0 373 clazz[4].serv_id = NULL; \
nuclear@0 374 clazz[4].serv_data = NULL; \
nuclear@0 375 *output_class = clazz; \
nuclear@0 376 return FT_Err_Ok; \
nuclear@0 377 }
nuclear@0 378
nuclear@0 379 #define FT_DEFINE_SERVICEDESCREC5(class_, serv_id_1, serv_data_1, \
nuclear@0 380 serv_id_2, serv_data_2, serv_id_3, serv_data_3, serv_id_4, \
nuclear@0 381 serv_data_4, serv_id_5, serv_data_5) \
nuclear@0 382 void \
nuclear@0 383 FT_Destroy_Class_##class_( FT_Library library, \
nuclear@0 384 FT_ServiceDescRec* clazz ) \
nuclear@0 385 { \
nuclear@0 386 FT_Memory memory = library->memory; \
nuclear@0 387 if ( clazz ) \
nuclear@0 388 FT_FREE( clazz ); \
nuclear@0 389 } \
nuclear@0 390 \
nuclear@0 391 FT_Error \
nuclear@0 392 FT_Create_Class_##class_( FT_Library library, \
nuclear@0 393 FT_ServiceDescRec** output_class) \
nuclear@0 394 { \
nuclear@0 395 FT_ServiceDescRec* clazz; \
nuclear@0 396 FT_Error error; \
nuclear@0 397 FT_Memory memory = library->memory; \
nuclear@0 398 \
nuclear@0 399 if ( FT_ALLOC( clazz, sizeof(*clazz)*6 ) ) \
nuclear@0 400 return error; \
nuclear@0 401 clazz[0].serv_id = serv_id_1; \
nuclear@0 402 clazz[0].serv_data = serv_data_1; \
nuclear@0 403 clazz[1].serv_id = serv_id_2; \
nuclear@0 404 clazz[1].serv_data = serv_data_2; \
nuclear@0 405 clazz[2].serv_id = serv_id_3; \
nuclear@0 406 clazz[2].serv_data = serv_data_3; \
nuclear@0 407 clazz[3].serv_id = serv_id_4; \
nuclear@0 408 clazz[3].serv_data = serv_data_4; \
nuclear@0 409 clazz[4].serv_id = serv_id_5; \
nuclear@0 410 clazz[4].serv_data = serv_data_5; \
nuclear@0 411 clazz[5].serv_id = NULL; \
nuclear@0 412 clazz[5].serv_data = NULL; \
nuclear@0 413 *output_class = clazz; \
nuclear@0 414 return FT_Err_Ok; \
nuclear@0 415 }
nuclear@0 416
nuclear@0 417 #define FT_DEFINE_SERVICEDESCREC6(class_, serv_id_1, serv_data_1, \
nuclear@0 418 serv_id_2, serv_data_2, serv_id_3, serv_data_3, \
nuclear@0 419 serv_id_4, serv_data_4, serv_id_5, serv_data_5, \
nuclear@0 420 serv_id_6, serv_data_6) \
nuclear@0 421 void \
nuclear@0 422 FT_Destroy_Class_##class_( FT_Library library, \
nuclear@0 423 FT_ServiceDescRec* clazz ) \
nuclear@0 424 { \
nuclear@0 425 FT_Memory memory = library->memory; \
nuclear@0 426 if ( clazz ) \
nuclear@0 427 FT_FREE( clazz ); \
nuclear@0 428 } \
nuclear@0 429 \
nuclear@0 430 FT_Error \
nuclear@0 431 FT_Create_Class_##class_( FT_Library library, \
nuclear@0 432 FT_ServiceDescRec** output_class) \
nuclear@0 433 { \
nuclear@0 434 FT_ServiceDescRec* clazz; \
nuclear@0 435 FT_Error error; \
nuclear@0 436 FT_Memory memory = library->memory; \
nuclear@0 437 \
nuclear@0 438 if ( FT_ALLOC( clazz, sizeof(*clazz)*7 ) ) \
nuclear@0 439 return error; \
nuclear@0 440 clazz[0].serv_id = serv_id_1; \
nuclear@0 441 clazz[0].serv_data = serv_data_1; \
nuclear@0 442 clazz[1].serv_id = serv_id_2; \
nuclear@0 443 clazz[1].serv_data = serv_data_2; \
nuclear@0 444 clazz[2].serv_id = serv_id_3; \
nuclear@0 445 clazz[2].serv_data = serv_data_3; \
nuclear@0 446 clazz[3].serv_id = serv_id_4; \
nuclear@0 447 clazz[3].serv_data = serv_data_4; \
nuclear@0 448 clazz[4].serv_id = serv_id_5; \
nuclear@0 449 clazz[4].serv_data = serv_data_5; \
nuclear@0 450 clazz[5].serv_id = serv_id_6; \
nuclear@0 451 clazz[5].serv_data = serv_data_6; \
nuclear@0 452 clazz[6].serv_id = NULL; \
nuclear@0 453 clazz[6].serv_data = NULL; \
nuclear@0 454 *output_class = clazz; \
nuclear@0 455 return FT_Err_Ok; \
nuclear@0 456 }
nuclear@0 457 #endif /* FT_CONFIG_OPTION_PIC */
nuclear@0 458
nuclear@0 459 /*
nuclear@0 460 * Parse a list of FT_ServiceDescRec descriptors and look for
nuclear@0 461 * a specific service by ID. Note that the last element in the
nuclear@0 462 * array must be { NULL, NULL }, and that the function should
nuclear@0 463 * return NULL if the service isn't available.
nuclear@0 464 *
nuclear@0 465 * This function can be used by modules to implement their
nuclear@0 466 * `get_service' method.
nuclear@0 467 */
nuclear@0 468 FT_BASE( FT_Pointer )
nuclear@0 469 ft_service_list_lookup( FT_ServiceDesc service_descriptors,
nuclear@0 470 const char* service_id );
nuclear@0 471
nuclear@0 472
nuclear@0 473 /*************************************************************************/
nuclear@0 474 /*************************************************************************/
nuclear@0 475 /***** *****/
nuclear@0 476 /***** S E R V I C E S C A C H E *****/
nuclear@0 477 /***** *****/
nuclear@0 478 /*************************************************************************/
nuclear@0 479 /*************************************************************************/
nuclear@0 480
nuclear@0 481 /*
nuclear@0 482 * This structure is used to store a cache for several frequently used
nuclear@0 483 * services. It is the type of `face->internal->services'. You
nuclear@0 484 * should only use FT_FACE_LOOKUP_SERVICE to access it.
nuclear@0 485 *
nuclear@0 486 * All fields should have the type FT_Pointer to relax compilation
nuclear@0 487 * dependencies. We assume the developer isn't completely stupid.
nuclear@0 488 *
nuclear@0 489 * Each field must be named `service_XXXX' where `XXX' corresponds to
nuclear@0 490 * the correct FT_SERVICE_ID_XXXX macro. See the definition of
nuclear@0 491 * FT_FACE_LOOKUP_SERVICE below how this is implemented.
nuclear@0 492 *
nuclear@0 493 */
nuclear@0 494 typedef struct FT_ServiceCacheRec_
nuclear@0 495 {
nuclear@0 496 FT_Pointer service_POSTSCRIPT_FONT_NAME;
nuclear@0 497 FT_Pointer service_MULTI_MASTERS;
nuclear@0 498 FT_Pointer service_GLYPH_DICT;
nuclear@0 499 FT_Pointer service_PFR_METRICS;
nuclear@0 500 FT_Pointer service_WINFNT;
nuclear@0 501
nuclear@0 502 } FT_ServiceCacheRec, *FT_ServiceCache;
nuclear@0 503
nuclear@0 504
nuclear@0 505 /*
nuclear@0 506 * A magic number used within the services cache.
nuclear@0 507 */
nuclear@0 508 #define FT_SERVICE_UNAVAILABLE ((FT_Pointer)-2) /* magic number */
nuclear@0 509
nuclear@0 510
nuclear@0 511 /*
nuclear@0 512 * @macro:
nuclear@0 513 * FT_FACE_LOOKUP_SERVICE
nuclear@0 514 *
nuclear@0 515 * @description:
nuclear@0 516 * This macro is used to lookup a service from a face's driver module
nuclear@0 517 * using its cache.
nuclear@0 518 *
nuclear@0 519 * @input:
nuclear@0 520 * face::
nuclear@0 521 * The source face handle containing the cache.
nuclear@0 522 *
nuclear@0 523 * field ::
nuclear@0 524 * The field name in the cache.
nuclear@0 525 *
nuclear@0 526 * id ::
nuclear@0 527 * The service ID.
nuclear@0 528 *
nuclear@0 529 * @output:
nuclear@0 530 * ptr ::
nuclear@0 531 * A variable receiving the service data. NULL if not available.
nuclear@0 532 */
nuclear@0 533 #ifdef __cplusplus
nuclear@0 534
nuclear@0 535 #define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \
nuclear@0 536 FT_BEGIN_STMNT \
nuclear@0 537 FT_Pointer svc; \
nuclear@0 538 FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \
nuclear@0 539 \
nuclear@0 540 \
nuclear@0 541 svc = FT_FACE( face )->internal->services. service_ ## id; \
nuclear@0 542 if ( svc == FT_SERVICE_UNAVAILABLE ) \
nuclear@0 543 svc = NULL; \
nuclear@0 544 else if ( svc == NULL ) \
nuclear@0 545 { \
nuclear@0 546 FT_FACE_FIND_SERVICE( face, svc, id ); \
nuclear@0 547 \
nuclear@0 548 FT_FACE( face )->internal->services. service_ ## id = \
nuclear@0 549 (FT_Pointer)( svc != NULL ? svc \
nuclear@0 550 : FT_SERVICE_UNAVAILABLE ); \
nuclear@0 551 } \
nuclear@0 552 *Pptr = svc; \
nuclear@0 553 FT_END_STMNT
nuclear@0 554
nuclear@0 555 #else /* !C++ */
nuclear@0 556
nuclear@0 557 #define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \
nuclear@0 558 FT_BEGIN_STMNT \
nuclear@0 559 FT_Pointer svc; \
nuclear@0 560 \
nuclear@0 561 \
nuclear@0 562 svc = FT_FACE( face )->internal->services. service_ ## id; \
nuclear@0 563 if ( svc == FT_SERVICE_UNAVAILABLE ) \
nuclear@0 564 svc = NULL; \
nuclear@0 565 else if ( svc == NULL ) \
nuclear@0 566 { \
nuclear@0 567 FT_FACE_FIND_SERVICE( face, svc, id ); \
nuclear@0 568 \
nuclear@0 569 FT_FACE( face )->internal->services. service_ ## id = \
nuclear@0 570 (FT_Pointer)( svc != NULL ? svc \
nuclear@0 571 : FT_SERVICE_UNAVAILABLE ); \
nuclear@0 572 } \
nuclear@0 573 ptr = svc; \
nuclear@0 574 FT_END_STMNT
nuclear@0 575
nuclear@0 576 #endif /* !C++ */
nuclear@0 577
nuclear@0 578 /*
nuclear@0 579 * A macro used to define new service structure types.
nuclear@0 580 */
nuclear@0 581
nuclear@0 582 #define FT_DEFINE_SERVICE( name ) \
nuclear@0 583 typedef struct FT_Service_ ## name ## Rec_ \
nuclear@0 584 FT_Service_ ## name ## Rec ; \
nuclear@0 585 typedef struct FT_Service_ ## name ## Rec_ \
nuclear@0 586 const * FT_Service_ ## name ; \
nuclear@0 587 struct FT_Service_ ## name ## Rec_
nuclear@0 588
nuclear@0 589 /* */
nuclear@0 590
nuclear@0 591 /*
nuclear@0 592 * The header files containing the services.
nuclear@0 593 */
nuclear@0 594
nuclear@0 595 #define FT_SERVICE_BDF_H <freetype/internal/services/svbdf.h>
nuclear@0 596 #define FT_SERVICE_CID_H <freetype/internal/services/svcid.h>
nuclear@0 597 #define FT_SERVICE_GLYPH_DICT_H <freetype/internal/services/svgldict.h>
nuclear@0 598 #define FT_SERVICE_GX_VALIDATE_H <freetype/internal/services/svgxval.h>
nuclear@0 599 #define FT_SERVICE_KERNING_H <freetype/internal/services/svkern.h>
nuclear@0 600 #define FT_SERVICE_MULTIPLE_MASTERS_H <freetype/internal/services/svmm.h>
nuclear@0 601 #define FT_SERVICE_OPENTYPE_VALIDATE_H <freetype/internal/services/svotval.h>
nuclear@0 602 #define FT_SERVICE_PFR_H <freetype/internal/services/svpfr.h>
nuclear@0 603 #define FT_SERVICE_POSTSCRIPT_CMAPS_H <freetype/internal/services/svpscmap.h>
nuclear@0 604 #define FT_SERVICE_POSTSCRIPT_INFO_H <freetype/internal/services/svpsinfo.h>
nuclear@0 605 #define FT_SERVICE_POSTSCRIPT_NAME_H <freetype/internal/services/svpostnm.h>
nuclear@0 606 #define FT_SERVICE_SFNT_H <freetype/internal/services/svsfnt.h>
nuclear@0 607 #define FT_SERVICE_TRUETYPE_ENGINE_H <freetype/internal/services/svtteng.h>
nuclear@0 608 #define FT_SERVICE_TT_CMAP_H <freetype/internal/services/svttcmap.h>
nuclear@0 609 #define FT_SERVICE_WINFNT_H <freetype/internal/services/svwinfnt.h>
nuclear@0 610 #define FT_SERVICE_XFREE86_NAME_H <freetype/internal/services/svxf86nm.h>
nuclear@0 611 #define FT_SERVICE_TRUETYPE_GLYF_H <freetype/internal/services/svttglyf.h>
nuclear@0 612
nuclear@0 613 /* */
nuclear@0 614
nuclear@0 615 FT_END_HEADER
nuclear@0 616
nuclear@0 617 #endif /* __FTSERV_H__ */
nuclear@0 618
nuclear@0 619
nuclear@0 620 /* END */