1 /***************************************************************************/ 2 /* */ 3 /* ftserv.h */ 4 /* */ 5 /* The FreeType services (specification only). */ 6 /* */ 7 /* Copyright 2003, 2004, 2005, 2006, 2007 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 /* */ 20 /* Each module can export one or more `services'. Each service is */ 21 /* identified by a constant string and modeled by a pointer; the latter */ 22 /* generally corresponds to a structure containing function pointers. */ 23 /* */ 24 /* Note that a service's data cannot be a mere function pointer because */ 25 /* in C it is possible that function pointers might be implemented */ 26 /* differently than data pointers (e.g. 48 bits instead of 32). */ 27 /* */ 28 /*************************************************************************/ 29 30 31 #ifndef __FTSERV_H__ 32 #define __FTSERV_H__ 33 34 35 FT_BEGIN_HEADER 36 37 #if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ 38 39 /* we disable the warning `conditional expression is constant' here */ 40 /* in order to compile cleanly with the maximum level of warnings */ 41 #pragma warning( disable : 4127 ) 42 43 #endif /* _MSC_VER */ 44 45 /* 46 * @macro: 47 * FT_FACE_FIND_SERVICE 48 * 49 * @description: 50 * This macro is used to look up a service from a face's driver module. 51 * 52 * @input: 53 * face :: 54 * The source face handle. 55 * 56 * id :: 57 * A string describing the service as defined in the service's 58 * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to 59 * `multi-masters'). It is automatically prefixed with 60 * `FT_SERVICE_ID_'. 61 * 62 * @output: 63 * ptr :: 64 * A variable that receives the service pointer. Will be NULL 65 * if not found. 66 */ 67 #ifdef __cplusplus 68 69 #define FT_FACE_FIND_SERVICE( face, ptr, id ) \ 70 FT_BEGIN_STMNT \ 71 FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ 72 FT_Pointer _tmp_ = NULL; \ 73 FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ 74 \ 75 \ 76 if ( module->clazz->get_interface ) \ 77 _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ 78 *_pptr_ = _tmp_; \ 79 FT_END_STMNT 80 81 #else /* !C++ */ 82 83 #define FT_FACE_FIND_SERVICE( face, ptr, id ) \ 84 FT_BEGIN_STMNT \ 85 FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ 86 FT_Pointer _tmp_ = NULL; \ 87 \ 88 if ( module->clazz->get_interface ) \ 89 _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ 90 ptr = _tmp_; \ 91 FT_END_STMNT 92 93 #endif /* !C++ */ 94 95 /* 96 * @macro: 97 * FT_FACE_FIND_GLOBAL_SERVICE 98 * 99 * @description: 100 * This macro is used to look up a service from all modules. 101 * 102 * @input: 103 * face :: 104 * The source face handle. 105 * 106 * id :: 107 * A string describing the service as defined in the service's 108 * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to 109 * `multi-masters'). It is automatically prefixed with 110 * `FT_SERVICE_ID_'. 111 * 112 * @output: 113 * ptr :: 114 * A variable that receives the service pointer. Will be NULL 115 * if not found. 116 */ 117 #ifdef __cplusplus 118 119 #define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ 120 FT_BEGIN_STMNT \ 121 FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ 122 FT_Pointer _tmp_; \ 123 FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ 124 \ 125 \ 126 _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ 127 *_pptr_ = _tmp_; \ 128 FT_END_STMNT 129 130 #else /* !C++ */ 131 132 #define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ 133 FT_BEGIN_STMNT \ 134 FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ 135 FT_Pointer _tmp_; \ 136 \ 137 \ 138 _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ 139 ptr = _tmp_; \ 140 FT_END_STMNT 141 142 #endif /* !C++ */ 143 144 145 /*************************************************************************/ 146 /*************************************************************************/ 147 /***** *****/ 148 /***** S E R V I C E D E S C R I P T O R S *****/ 149 /***** *****/ 150 /*************************************************************************/ 151 /*************************************************************************/ 152 153 /* 154 * The following structure is used to _describe_ a given service 155 * to the library. This is useful to build simple static service lists. 156 */ 157 typedef struct FT_ServiceDescRec_ 158 { 159 const char* serv_id; /* service name */ 160 const void* serv_data; /* service pointer/data */ 161 162 } FT_ServiceDescRec; 163 164 typedef const FT_ServiceDescRec* FT_ServiceDesc; 165 166 167 /* 168 * Parse a list of FT_ServiceDescRec descriptors and look for 169 * a specific service by ID. Note that the last element in the 170 * array must be { NULL, NULL }, and that the function should 171 * return NULL if the service isn't available. 172 * 173 * This function can be used by modules to implement their 174 * `get_service' method. 175 */ 176 FT_BASE( FT_Pointer ) 177 ft_service_list_lookup( FT_ServiceDesc service_descriptors, 178 const char* service_id ); 179 180 181 /*************************************************************************/ 182 /*************************************************************************/ 183 /***** *****/ 184 /***** S E R V I C E S C A C H E *****/ 185 /***** *****/ 186 /*************************************************************************/ 187 /*************************************************************************/ 188 189 /* 190 * This structure is used to store a cache for several frequently used 191 * services. It is the type of `face->internal->services'. You 192 * should only use FT_FACE_LOOKUP_SERVICE to access it. 193 * 194 * All fields should have the type FT_Pointer to relax compilation 195 * dependencies. We assume the developer isn't completely stupid. 196 * 197 * Each field must be named `service_XXXX' where `XXX' corresponds to 198 * the correct FT_SERVICE_ID_XXXX macro. See the definition of 199 * FT_FACE_LOOKUP_SERVICE below how this is implemented. 200 * 201 */ 202 typedef struct FT_ServiceCacheRec_ 203 { 204 FT_Pointer service_POSTSCRIPT_FONT_NAME; 205 FT_Pointer service_MULTI_MASTERS; 206 FT_Pointer service_GLYPH_DICT; 207 FT_Pointer service_PFR_METRICS; 208 FT_Pointer service_WINFNT; 209 210 } FT_ServiceCacheRec, *FT_ServiceCache; 211 212 213 /* 214 * A magic number used within the services cache. 215 */ 216 #define FT_SERVICE_UNAVAILABLE ((FT_Pointer)-2) /* magic number */ 217 218 219 /* 220 * @macro: 221 * FT_FACE_LOOKUP_SERVICE 222 * 223 * @description: 224 * This macro is used to lookup a service from a face's driver module 225 * using its cache. 226 * 227 * @input: 228 * face:: 229 * The source face handle containing the cache. 230 * 231 * field :: 232 * The field name in the cache. 233 * 234 * id :: 235 * The service ID. 236 * 237 * @output: 238 * ptr :: 239 * A variable receiving the service data. NULL if not available. 240 */ 241 #ifdef __cplusplus 242 243 #define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ 244 FT_BEGIN_STMNT \ 245 FT_Pointer svc; \ 246 FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \ 247 \ 248 \ 249 svc = FT_FACE( face )->internal->services. service_ ## id; \ 250 if ( svc == FT_SERVICE_UNAVAILABLE ) \ 251 svc = NULL; \ 252 else if ( svc == NULL ) \ 253 { \ 254 FT_FACE_FIND_SERVICE( face, svc, id ); \ 255 \ 256 FT_FACE( face )->internal->services. service_ ## id = \ 257 (FT_Pointer)( svc != NULL ? svc \ 258 : FT_SERVICE_UNAVAILABLE ); \ 259 } \ 260 *Pptr = svc; \ 261 FT_END_STMNT 262 263 #else /* !C++ */ 264 265 #define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ 266 FT_BEGIN_STMNT \ 267 FT_Pointer svc; \ 268 \ 269 \ 270 svc = FT_FACE( face )->internal->services. service_ ## id; \ 271 if ( svc == FT_SERVICE_UNAVAILABLE ) \ 272 svc = NULL; \ 273 else if ( svc == NULL ) \ 274 { \ 275 FT_FACE_FIND_SERVICE( face, svc, id ); \ 276 \ 277 FT_FACE( face )->internal->services. service_ ## id = \ 278 (FT_Pointer)( svc != NULL ? svc \ 279 : FT_SERVICE_UNAVAILABLE ); \ 280 } \ 281 ptr = svc; \ 282 FT_END_STMNT 283 284 #endif /* !C++ */ 285 286 /* 287 * A macro used to define new service structure types. 288 */ 289 290 #define FT_DEFINE_SERVICE( name ) \ 291 typedef struct FT_Service_ ## name ## Rec_ \ 292 FT_Service_ ## name ## Rec ; \ 293 typedef struct FT_Service_ ## name ## Rec_ \ 294 const * FT_Service_ ## name ; \ 295 struct FT_Service_ ## name ## Rec_ 296 297 /* */ 298 299 /* 300 * The header files containing the services. 301 */ 302 303 #define FT_SERVICE_BDF_H <freetype/internal/services/svbdf.h> 304 #define FT_SERVICE_CID_H <freetype/internal/services/svcid.h> 305 #define FT_SERVICE_GLYPH_DICT_H <freetype/internal/services/svgldict.h> 306 #define FT_SERVICE_GX_VALIDATE_H <freetype/internal/services/svgxval.h> 307 #define FT_SERVICE_KERNING_H <freetype/internal/services/svkern.h> 308 #define FT_SERVICE_MULTIPLE_MASTERS_H <freetype/internal/services/svmm.h> 309 #define FT_SERVICE_OPENTYPE_VALIDATE_H <freetype/internal/services/svotval.h> 310 #define FT_SERVICE_PFR_H <freetype/internal/services/svpfr.h> 311 #define FT_SERVICE_POSTSCRIPT_CMAPS_H <freetype/internal/services/svpscmap.h> 312 #define FT_SERVICE_POSTSCRIPT_INFO_H <freetype/internal/services/svpsinfo.h> 313 #define FT_SERVICE_POSTSCRIPT_NAME_H <freetype/internal/services/svpostnm.h> 314 #define FT_SERVICE_SFNT_H <freetype/internal/services/svsfnt.h> 315 #define FT_SERVICE_TRUETYPE_ENGINE_H <freetype/internal/services/svtteng.h> 316 #define FT_SERVICE_TT_CMAP_H <freetype/internal/services/svttcmap.h> 317 #define FT_SERVICE_WINFNT_H <freetype/internal/services/svwinfnt.h> 318 #define FT_SERVICE_XFREE86_NAME_H <freetype/internal/services/svxf86nm.h> 319 #define FT_SERVICE_TRUETYPE_GLYF_H <freetype/internal/services/svttglyf.h> 320 321 /* */ 322 323 FT_END_HEADER 324 325 #endif /* __FTSERV_H__ */ 326 327 328 /* END */ 329