00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef __FTSERV_H__
00032 #define __FTSERV_H__
00033
00034
00035 FT_BEGIN_HEADER
00036
00037 #if defined( _MSC_VER )
00038
00039
00040
00041 #pragma warning( disable : 4127 )
00042
00043 #endif
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 #ifdef __cplusplus
00068
00069 #define FT_FACE_FIND_SERVICE( face, ptr, id ) \
00070 FT_BEGIN_STMNT \
00071 FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
00072 FT_Pointer _tmp_ = NULL; \
00073 FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \
00074 \
00075 \
00076 if ( module->clazz->get_interface ) \
00077 _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
00078 *_pptr_ = _tmp_; \
00079 FT_END_STMNT
00080
00081 #else
00082
00083 #define FT_FACE_FIND_SERVICE( face, ptr, id ) \
00084 FT_BEGIN_STMNT \
00085 FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
00086 FT_Pointer _tmp_ = NULL; \
00087 \
00088 if ( module->clazz->get_interface ) \
00089 _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
00090 ptr = _tmp_; \
00091 FT_END_STMNT
00092
00093 #endif
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 #ifdef __cplusplus
00118
00119 #define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \
00120 FT_BEGIN_STMNT \
00121 FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
00122 FT_Pointer _tmp_; \
00123 FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \
00124 \
00125 \
00126 _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
00127 *_pptr_ = _tmp_; \
00128 FT_END_STMNT
00129
00130 #else
00131
00132 #define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \
00133 FT_BEGIN_STMNT \
00134 FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
00135 FT_Pointer _tmp_; \
00136 \
00137 \
00138 _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
00139 ptr = _tmp_; \
00140 FT_END_STMNT
00141
00142 #endif
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 typedef struct FT_ServiceDescRec_
00158 {
00159 const char* serv_id;
00160 const void* serv_data;
00161
00162 } FT_ServiceDescRec;
00163
00164 typedef const FT_ServiceDescRec* FT_ServiceDesc;
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186 #ifndef FT_CONFIG_OPTION_PIC
00187
00188 #define FT_DEFINE_SERVICEDESCREC1(class_, serv_id_1, serv_data_1) \
00189 static const FT_ServiceDescRec class_[] = \
00190 { \
00191 {serv_id_1, serv_data_1}, \
00192 {NULL, NULL} \
00193 };
00194 #define FT_DEFINE_SERVICEDESCREC2(class_, serv_id_1, serv_data_1, \
00195 serv_id_2, serv_data_2) \
00196 static const FT_ServiceDescRec class_[] = \
00197 { \
00198 {serv_id_1, serv_data_1}, \
00199 {serv_id_2, serv_data_2}, \
00200 {NULL, NULL} \
00201 };
00202 #define FT_DEFINE_SERVICEDESCREC3(class_, serv_id_1, serv_data_1, \
00203 serv_id_2, serv_data_2, serv_id_3, serv_data_3) \
00204 static const FT_ServiceDescRec class_[] = \
00205 { \
00206 {serv_id_1, serv_data_1}, \
00207 {serv_id_2, serv_data_2}, \
00208 {serv_id_3, serv_data_3}, \
00209 {NULL, NULL} \
00210 };
00211 #define FT_DEFINE_SERVICEDESCREC4(class_, serv_id_1, serv_data_1, \
00212 serv_id_2, serv_data_2, serv_id_3, serv_data_3, \
00213 serv_id_4, serv_data_4) \
00214 static const FT_ServiceDescRec class_[] = \
00215 { \
00216 {serv_id_1, serv_data_1}, \
00217 {serv_id_2, serv_data_2}, \
00218 {serv_id_3, serv_data_3}, \
00219 {serv_id_4, serv_data_4}, \
00220 {NULL, NULL} \
00221 };
00222 #define FT_DEFINE_SERVICEDESCREC5(class_, serv_id_1, serv_data_1, \
00223 serv_id_2, serv_data_2, serv_id_3, serv_data_3, \
00224 serv_id_4, serv_data_4, serv_id_5, serv_data_5) \
00225 static const FT_ServiceDescRec class_[] = \
00226 { \
00227 {serv_id_1, serv_data_1}, \
00228 {serv_id_2, serv_data_2}, \
00229 {serv_id_3, serv_data_3}, \
00230 {serv_id_4, serv_data_4}, \
00231 {serv_id_5, serv_data_5}, \
00232 {NULL, NULL} \
00233 };
00234 #define FT_DEFINE_SERVICEDESCREC6(class_, serv_id_1, serv_data_1, \
00235 serv_id_2, serv_data_2, serv_id_3, serv_data_3, \
00236 serv_id_4, serv_data_4, serv_id_5, serv_data_5, \
00237 serv_id_6, serv_data_6) \
00238 static const FT_ServiceDescRec class_[] = \
00239 { \
00240 {serv_id_1, serv_data_1}, \
00241 {serv_id_2, serv_data_2}, \
00242 {serv_id_3, serv_data_3}, \
00243 {serv_id_4, serv_data_4}, \
00244 {serv_id_5, serv_data_5}, \
00245 {serv_id_6, serv_data_6}, \
00246 {NULL, NULL} \
00247 };
00248
00249 #else
00250
00251 #define FT_DEFINE_SERVICEDESCREC1(class_, serv_id_1, serv_data_1) \
00252 void \
00253 FT_Destroy_Class_##class_( FT_Library library, \
00254 FT_ServiceDescRec* clazz ) \
00255 { \
00256 FT_Memory memory = library->memory; \
00257 if ( clazz ) \
00258 FT_FREE( clazz ); \
00259 } \
00260 \
00261 FT_Error \
00262 FT_Create_Class_##class_( FT_Library library, \
00263 FT_ServiceDescRec** output_class) \
00264 { \
00265 FT_ServiceDescRec* clazz; \
00266 FT_Error error; \
00267 FT_Memory memory = library->memory; \
00268 \
00269 if ( FT_ALLOC( clazz, sizeof(*clazz)*2 ) ) \
00270 return error; \
00271 clazz[0].serv_id = serv_id_1; \
00272 clazz[0].serv_data = serv_data_1; \
00273 clazz[1].serv_id = NULL; \
00274 clazz[1].serv_data = NULL; \
00275 *output_class = clazz; \
00276 return FT_Err_Ok; \
00277 }
00278
00279 #define FT_DEFINE_SERVICEDESCREC2(class_, serv_id_1, serv_data_1, \
00280 serv_id_2, serv_data_2) \
00281 void \
00282 FT_Destroy_Class_##class_( FT_Library library, \
00283 FT_ServiceDescRec* clazz ) \
00284 { \
00285 FT_Memory memory = library->memory; \
00286 if ( clazz ) \
00287 FT_FREE( clazz ); \
00288 } \
00289 \
00290 FT_Error \
00291 FT_Create_Class_##class_( FT_Library library, \
00292 FT_ServiceDescRec** output_class) \
00293 { \
00294 FT_ServiceDescRec* clazz; \
00295 FT_Error error; \
00296 FT_Memory memory = library->memory; \
00297 \
00298 if ( FT_ALLOC( clazz, sizeof(*clazz)*3 ) ) \
00299 return error; \
00300 clazz[0].serv_id = serv_id_1; \
00301 clazz[0].serv_data = serv_data_1; \
00302 clazz[1].serv_id = serv_id_2; \
00303 clazz[1].serv_data = serv_data_2; \
00304 clazz[2].serv_id = NULL; \
00305 clazz[2].serv_data = NULL; \
00306 *output_class = clazz; \
00307 return FT_Err_Ok; \
00308 }
00309
00310 #define FT_DEFINE_SERVICEDESCREC3(class_, serv_id_1, serv_data_1, \
00311 serv_id_2, serv_data_2, serv_id_3, serv_data_3) \
00312 void \
00313 FT_Destroy_Class_##class_( FT_Library library, \
00314 FT_ServiceDescRec* clazz ) \
00315 { \
00316 FT_Memory memory = library->memory; \
00317 if ( clazz ) \
00318 FT_FREE( clazz ); \
00319 } \
00320 \
00321 FT_Error \
00322 FT_Create_Class_##class_( FT_Library library, \
00323 FT_ServiceDescRec** output_class) \
00324 { \
00325 FT_ServiceDescRec* clazz; \
00326 FT_Error error; \
00327 FT_Memory memory = library->memory; \
00328 \
00329 if ( FT_ALLOC( clazz, sizeof(*clazz)*4 ) ) \
00330 return error; \
00331 clazz[0].serv_id = serv_id_1; \
00332 clazz[0].serv_data = serv_data_1; \
00333 clazz[1].serv_id = serv_id_2; \
00334 clazz[1].serv_data = serv_data_2; \
00335 clazz[2].serv_id = serv_id_3; \
00336 clazz[2].serv_data = serv_data_3; \
00337 clazz[3].serv_id = NULL; \
00338 clazz[3].serv_data = NULL; \
00339 *output_class = clazz; \
00340 return FT_Err_Ok; \
00341 }
00342
00343 #define FT_DEFINE_SERVICEDESCREC4(class_, serv_id_1, serv_data_1, \
00344 serv_id_2, serv_data_2, serv_id_3, serv_data_3, \
00345 serv_id_4, serv_data_4) \
00346 void \
00347 FT_Destroy_Class_##class_( FT_Library library, \
00348 FT_ServiceDescRec* clazz ) \
00349 { \
00350 FT_Memory memory = library->memory; \
00351 if ( clazz ) \
00352 FT_FREE( clazz ); \
00353 } \
00354 \
00355 FT_Error \
00356 FT_Create_Class_##class_( FT_Library library, \
00357 FT_ServiceDescRec** output_class) \
00358 { \
00359 FT_ServiceDescRec* clazz; \
00360 FT_Error error; \
00361 FT_Memory memory = library->memory; \
00362 \
00363 if ( FT_ALLOC( clazz, sizeof(*clazz)*5 ) ) \
00364 return error; \
00365 clazz[0].serv_id = serv_id_1; \
00366 clazz[0].serv_data = serv_data_1; \
00367 clazz[1].serv_id = serv_id_2; \
00368 clazz[1].serv_data = serv_data_2; \
00369 clazz[2].serv_id = serv_id_3; \
00370 clazz[2].serv_data = serv_data_3; \
00371 clazz[3].serv_id = serv_id_4; \
00372 clazz[3].serv_data = serv_data_4; \
00373 clazz[4].serv_id = NULL; \
00374 clazz[4].serv_data = NULL; \
00375 *output_class = clazz; \
00376 return FT_Err_Ok; \
00377 }
00378
00379 #define FT_DEFINE_SERVICEDESCREC5(class_, serv_id_1, serv_data_1, \
00380 serv_id_2, serv_data_2, serv_id_3, serv_data_3, serv_id_4, \
00381 serv_data_4, serv_id_5, serv_data_5) \
00382 void \
00383 FT_Destroy_Class_##class_( FT_Library library, \
00384 FT_ServiceDescRec* clazz ) \
00385 { \
00386 FT_Memory memory = library->memory; \
00387 if ( clazz ) \
00388 FT_FREE( clazz ); \
00389 } \
00390 \
00391 FT_Error \
00392 FT_Create_Class_##class_( FT_Library library, \
00393 FT_ServiceDescRec** output_class) \
00394 { \
00395 FT_ServiceDescRec* clazz; \
00396 FT_Error error; \
00397 FT_Memory memory = library->memory; \
00398 \
00399 if ( FT_ALLOC( clazz, sizeof(*clazz)*6 ) ) \
00400 return error; \
00401 clazz[0].serv_id = serv_id_1; \
00402 clazz[0].serv_data = serv_data_1; \
00403 clazz[1].serv_id = serv_id_2; \
00404 clazz[1].serv_data = serv_data_2; \
00405 clazz[2].serv_id = serv_id_3; \
00406 clazz[2].serv_data = serv_data_3; \
00407 clazz[3].serv_id = serv_id_4; \
00408 clazz[3].serv_data = serv_data_4; \
00409 clazz[4].serv_id = serv_id_5; \
00410 clazz[4].serv_data = serv_data_5; \
00411 clazz[5].serv_id = NULL; \
00412 clazz[5].serv_data = NULL; \
00413 *output_class = clazz; \
00414 return FT_Err_Ok; \
00415 }
00416
00417 #define FT_DEFINE_SERVICEDESCREC6(class_, serv_id_1, serv_data_1, \
00418 serv_id_2, serv_data_2, serv_id_3, serv_data_3, \
00419 serv_id_4, serv_data_4, serv_id_5, serv_data_5, \
00420 serv_id_6, serv_data_6) \
00421 void \
00422 FT_Destroy_Class_##class_( FT_Library library, \
00423 FT_ServiceDescRec* clazz ) \
00424 { \
00425 FT_Memory memory = library->memory; \
00426 if ( clazz ) \
00427 FT_FREE( clazz ); \
00428 } \
00429 \
00430 FT_Error \
00431 FT_Create_Class_##class_( FT_Library library, \
00432 FT_ServiceDescRec** output_class) \
00433 { \
00434 FT_ServiceDescRec* clazz; \
00435 FT_Error error; \
00436 FT_Memory memory = library->memory; \
00437 \
00438 if ( FT_ALLOC( clazz, sizeof(*clazz)*7 ) ) \
00439 return error; \
00440 clazz[0].serv_id = serv_id_1; \
00441 clazz[0].serv_data = serv_data_1; \
00442 clazz[1].serv_id = serv_id_2; \
00443 clazz[1].serv_data = serv_data_2; \
00444 clazz[2].serv_id = serv_id_3; \
00445 clazz[2].serv_data = serv_data_3; \
00446 clazz[3].serv_id = serv_id_4; \
00447 clazz[3].serv_data = serv_data_4; \
00448 clazz[4].serv_id = serv_id_5; \
00449 clazz[4].serv_data = serv_data_5; \
00450 clazz[5].serv_id = serv_id_6; \
00451 clazz[5].serv_data = serv_data_6; \
00452 clazz[6].serv_id = NULL; \
00453 clazz[6].serv_data = NULL; \
00454 *output_class = clazz; \
00455 return FT_Err_Ok; \
00456 }
00457 #endif
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468 FT_BASE( FT_Pointer )
00469 ft_service_list_lookup( FT_ServiceDesc service_descriptors,
00470 const char* service_id );
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494 typedef struct FT_ServiceCacheRec_
00495 {
00496 FT_Pointer service_POSTSCRIPT_FONT_NAME;
00497 FT_Pointer service_MULTI_MASTERS;
00498 FT_Pointer service_GLYPH_DICT;
00499 FT_Pointer service_PFR_METRICS;
00500 FT_Pointer service_WINFNT;
00501
00502 } FT_ServiceCacheRec, *FT_ServiceCache;
00503
00504
00505
00506
00507
00508 #define FT_SERVICE_UNAVAILABLE ((FT_Pointer)-2)
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533 #ifdef __cplusplus
00534
00535 #define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \
00536 FT_BEGIN_STMNT \
00537 FT_Pointer svc; \
00538 FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \
00539 \
00540 \
00541 svc = FT_FACE( face )->internal->services. service_ ## id; \
00542 if ( svc == FT_SERVICE_UNAVAILABLE ) \
00543 svc = NULL; \
00544 else if ( svc == NULL ) \
00545 { \
00546 FT_FACE_FIND_SERVICE( face, svc, id ); \
00547 \
00548 FT_FACE( face )->internal->services. service_ ## id = \
00549 (FT_Pointer)( svc != NULL ? svc \
00550 : FT_SERVICE_UNAVAILABLE ); \
00551 } \
00552 *Pptr = svc; \
00553 FT_END_STMNT
00554
00555 #else
00556
00557 #define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \
00558 FT_BEGIN_STMNT \
00559 FT_Pointer svc; \
00560 \
00561 \
00562 svc = FT_FACE( face )->internal->services. service_ ## id; \
00563 if ( svc == FT_SERVICE_UNAVAILABLE ) \
00564 svc = NULL; \
00565 else if ( svc == NULL ) \
00566 { \
00567 FT_FACE_FIND_SERVICE( face, svc, id ); \
00568 \
00569 FT_FACE( face )->internal->services. service_ ## id = \
00570 (FT_Pointer)( svc != NULL ? svc \
00571 : FT_SERVICE_UNAVAILABLE ); \
00572 } \
00573 ptr = svc; \
00574 FT_END_STMNT
00575
00576 #endif
00577
00578
00579
00580
00581
00582 #define FT_DEFINE_SERVICE( name ) \
00583 typedef struct FT_Service_ ## name ## Rec_ \
00584 FT_Service_ ## name ## Rec ; \
00585 typedef struct FT_Service_ ## name ## Rec_ \
00586 const * FT_Service_ ## name ; \
00587 struct FT_Service_ ## name ## Rec_
00588
00589
00590
00591
00592
00593
00594
00595 #define FT_SERVICE_BDF_H <freetype/internal/services/svbdf.h>
00596 #define FT_SERVICE_CID_H <freetype/internal/services/svcid.h>
00597 #define FT_SERVICE_GLYPH_DICT_H <freetype/internal/services/svgldict.h>
00598 #define FT_SERVICE_GX_VALIDATE_H <freetype/internal/services/svgxval.h>
00599 #define FT_SERVICE_KERNING_H <freetype/internal/services/svkern.h>
00600 #define FT_SERVICE_MULTIPLE_MASTERS_H <freetype/internal/services/svmm.h>
00601 #define FT_SERVICE_OPENTYPE_VALIDATE_H <freetype/internal/services/svotval.h>
00602 #define FT_SERVICE_PFR_H <freetype/internal/services/svpfr.h>
00603 #define FT_SERVICE_POSTSCRIPT_CMAPS_H <freetype/internal/services/svpscmap.h>
00604 #define FT_SERVICE_POSTSCRIPT_INFO_H <freetype/internal/services/svpsinfo.h>
00605 #define FT_SERVICE_POSTSCRIPT_NAME_H <freetype/internal/services/svpostnm.h>
00606 #define FT_SERVICE_SFNT_H <freetype/internal/services/svsfnt.h>
00607 #define FT_SERVICE_TRUETYPE_ENGINE_H <freetype/internal/services/svtteng.h>
00608 #define FT_SERVICE_TT_CMAP_H <freetype/internal/services/svttcmap.h>
00609 #define FT_SERVICE_WINFNT_H <freetype/internal/services/svwinfnt.h>
00610 #define FT_SERVICE_XFREE86_NAME_H <freetype/internal/services/svxf86nm.h>
00611 #define FT_SERVICE_TRUETYPE_GLYF_H <freetype/internal/services/svttglyf.h>
00612
00613
00614
00615 FT_END_HEADER
00616
00617 #endif
00618
00619
00620