ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

ftserv.h
Go to the documentation of this file.
00001 /***************************************************************************/
00002 /*                                                                         */
00003 /*  ftserv.h                                                               */
00004 /*                                                                         */
00005 /*    The FreeType services (specification only).                          */
00006 /*                                                                         */
00007 /*  Copyright 2003, 2004, 2005, 2006, 2007 by                              */
00008 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
00009 /*                                                                         */
00010 /*  This file is part of the FreeType project, and may only be used,       */
00011 /*  modified, and distributed under the terms of the FreeType project      */
00012 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
00013 /*  this file you indicate that you have read the license and              */
00014 /*  understand and accept it fully.                                        */
00015 /*                                                                         */
00016 /***************************************************************************/
00017 
00018   /*************************************************************************/
00019   /*                                                                       */
00020   /*  Each module can export one or more `services'.  Each service is      */
00021   /*  identified by a constant string and modeled by a pointer; the latter */
00022   /*  generally corresponds to a structure containing function pointers.   */
00023   /*                                                                       */
00024   /*  Note that a service's data cannot be a mere function pointer because */
00025   /*  in C it is possible that function pointers might be implemented      */
00026   /*  differently than data pointers (e.g. 48 bits instead of 32).         */
00027   /*                                                                       */
00028   /*************************************************************************/
00029 
00030 
00031 #ifndef __FTSERV_H__
00032 #define __FTSERV_H__
00033 
00034 
00035 FT_BEGIN_HEADER
00036 
00037 #if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */
00038 
00039   /* we disable the warning `conditional expression is constant' here */
00040   /* in order to compile cleanly with the maximum level of warnings   */
00041 #pragma warning( disable : 4127 )
00042 
00043 #endif /* _MSC_VER */
00044 
00045   /*
00046    * @macro:
00047    *   FT_FACE_FIND_SERVICE
00048    *
00049    * @description:
00050    *   This macro is used to look up a service from a face's driver module.
00051    *
00052    * @input:
00053    *   face ::
00054    *     The source face handle.
00055    *
00056    *   id ::
00057    *     A string describing the service as defined in the service's
00058    *     header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
00059    *     `multi-masters').  It is automatically prefixed with
00060    *     `FT_SERVICE_ID_'.
00061    *
00062    * @output:
00063    *   ptr ::
00064    *     A variable that receives the service pointer.  Will be NULL
00065    *     if not found.
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 /* !C++ */
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 /* !C++ */
00094 
00095   /*
00096    * @macro:
00097    *   FT_FACE_FIND_GLOBAL_SERVICE
00098    *
00099    * @description:
00100    *   This macro is used to look up a service from all modules.
00101    *
00102    * @input:
00103    *   face ::
00104    *     The source face handle.
00105    *
00106    *   id ::
00107    *     A string describing the service as defined in the service's
00108    *     header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
00109    *     `multi-masters').  It is automatically prefixed with
00110    *     `FT_SERVICE_ID_'.
00111    *
00112    * @output:
00113    *   ptr ::
00114    *     A variable that receives the service pointer.  Will be NULL
00115    *     if not found.
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 /* !C++ */
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 /* !C++ */
00143 
00144 
00145   /*************************************************************************/
00146   /*************************************************************************/
00147   /*****                                                               *****/
00148   /*****         S E R V I C E   D E S C R I P T O R S                 *****/
00149   /*****                                                               *****/
00150   /*************************************************************************/
00151   /*************************************************************************/
00152 
00153   /*
00154    *  The following structure is used to _describe_ a given service
00155    *  to the library.  This is useful to build simple static service lists.
00156    */
00157   typedef struct  FT_ServiceDescRec_
00158   {
00159     const char*  serv_id;     /* service name         */
00160     const void*  serv_data;   /* service pointer/data */
00161 
00162   } FT_ServiceDescRec;
00163 
00164   typedef const FT_ServiceDescRec*  FT_ServiceDesc;
00165 
00166   /*************************************************************************/
00167   /*                                                                       */
00168   /* <Macro>                                                               */
00169   /*    FT_DEFINE_SERVICEDESCREC1 .. FT_DEFINE_SERVICEDESCREC6             */
00170   /*                                                                       */
00171   /* <Description>                                                         */
00172   /*    Used to initialize an array of FT_ServiceDescRec structs.          */
00173   /*                                                                       */
00174   /*    When FT_CONFIG_OPTION_PIC is defined a Create funtion will need    */
00175   /*    to called with a pointer where the allocated array is returned.    */
00176   /*    And when it is no longer needed a Destroy function needs           */
00177   /*    to be called to release that allocation.                           */
00178   /*                                                                       */
00179   /*    These functions should be manyally called from the pic_init and    */
00180   /*    pic_free functions of your module (see FT_DEFINE_MODULE)           */
00181   /*                                                                       */
00182   /*    When FT_CONFIG_OPTION_PIC is not defined the array will be         */
00183   /*    allocated in the global scope (or the scope where the macro        */
00184   /*    is used).                                                          */
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 /* FT_CONFIG_OPTION_PIC */ 
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 /* FT_CONFIG_OPTION_PIC */ 
00458 
00459   /*
00460    *  Parse a list of FT_ServiceDescRec descriptors and look for
00461    *  a specific service by ID.  Note that the last element in the
00462    *  array must be { NULL, NULL }, and that the function should
00463    *  return NULL if the service isn't available.
00464    *
00465    *  This function can be used by modules to implement their
00466    *  `get_service' method.
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   /*****             S E R V I C E S   C A C H E                       *****/
00477   /*****                                                               *****/
00478   /*************************************************************************/
00479   /*************************************************************************/
00480 
00481   /*
00482    *  This structure is used to store a cache for several frequently used
00483    *  services.  It is the type of `face->internal->services'.  You
00484    *  should only use FT_FACE_LOOKUP_SERVICE to access it.
00485    *
00486    *  All fields should have the type FT_Pointer to relax compilation
00487    *  dependencies.  We assume the developer isn't completely stupid.
00488    *
00489    *  Each field must be named `service_XXXX' where `XXX' corresponds to
00490    *  the correct FT_SERVICE_ID_XXXX macro.  See the definition of
00491    *  FT_FACE_LOOKUP_SERVICE below how this is implemented.
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    *  A magic number used within the services cache.
00507    */
00508 #define FT_SERVICE_UNAVAILABLE  ((FT_Pointer)-2)  /* magic number */
00509 
00510 
00511   /*
00512    * @macro:
00513    *   FT_FACE_LOOKUP_SERVICE
00514    *
00515    * @description:
00516    *   This macro is used to lookup a service from a face's driver module
00517    *   using its cache.
00518    *
00519    * @input:
00520    *   face::
00521    *     The source face handle containing the cache.
00522    *
00523    *   field ::
00524    *     The field name in the cache.
00525    *
00526    *   id ::
00527    *     The service ID.
00528    *
00529    * @output:
00530    *   ptr ::
00531    *     A variable receiving the service data.  NULL if not available.
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 /* !C++ */
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 /* !C++ */
00577 
00578   /*
00579    *  A macro used to define new service structure types.
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    *  The header files containing the services.
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 /* __FTSERV_H__ */
00618 
00619 
00620 /* END */

Generated on Sat May 26 2012 04:32:27 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.