| 1 | /**************************************************************************** | 
| 2 |  * | 
| 3 |  * config/public-macros.h | 
| 4 |  * | 
| 5 |  *   Define a set of compiler macros used in public FreeType headers. | 
| 6 |  * | 
| 7 |  * Copyright (C) 2020-2021 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 |    * The definitions in this file are used by the public FreeType headers | 
| 20 |    * and thus should be considered part of the public API. | 
| 21 |    * | 
| 22 |    * Other compiler-specific macro definitions that are not exposed by the | 
| 23 |    * FreeType API should go into | 
| 24 |    * `include/freetype/internal/compiler-macros.h` instead. | 
| 25 |    */ | 
| 26 | #ifndef FREETYPE_CONFIG_PUBLIC_MACROS_H_ | 
| 27 | #define FREETYPE_CONFIG_PUBLIC_MACROS_H_ | 
| 28 |  | 
| 29 |   /* | 
| 30 |    * `FT_BEGIN_HEADER` and `FT_END_HEADER` might have already been defined | 
| 31 |    * by `freetype/config/ftheader.h`, but we don't want to include this | 
| 32 |    * header here, so redefine the macros here only when needed.  Their | 
| 33 |    * definition is very stable, so keeping them in sync with the ones in the | 
| 34 |    * header should not be a maintenance issue. | 
| 35 |    */ | 
| 36 | #ifndef FT_BEGIN_HEADER | 
| 37 | #ifdef __cplusplus | 
| 38 | #define FT_BEGIN_HEADER  extern "C" { | 
| 39 | #else | 
| 40 | #define FT_BEGIN_HEADER  /* empty */ | 
| 41 | #endif | 
| 42 | #endif  /* FT_BEGIN_HEADER */ | 
| 43 |  | 
| 44 | #ifndef FT_END_HEADER | 
| 45 | #ifdef __cplusplus | 
| 46 | #define FT_END_HEADER  } | 
| 47 | #else | 
| 48 | #define FT_END_HEADER  /* empty */ | 
| 49 | #endif | 
| 50 | #endif  /* FT_END_HEADER */ | 
| 51 |  | 
| 52 |  | 
| 53 | FT_BEGIN_HEADER | 
| 54 |  | 
| 55 |   /* | 
| 56 |    * Mark a function declaration as public.  This ensures it will be | 
| 57 |    * properly exported to client code.  Place this before a function | 
| 58 |    * declaration. | 
| 59 |    * | 
| 60 |    * NOTE: This macro should be considered an internal implementation | 
| 61 |    * detail, and not part of the FreeType API.  It is only defined here | 
| 62 |    * because it is needed by `FT_EXPORT`. | 
| 63 |    */ | 
| 64 |  | 
| 65 |   /* Visual C, mingw */ | 
| 66 | #if defined( _WIN32 ) | 
| 67 |  | 
| 68 | #if defined( FT2_BUILD_LIBRARY ) && defined( DLL_EXPORT ) | 
| 69 | #define FT_PUBLIC_FUNCTION_ATTRIBUTE  __declspec( dllexport ) | 
| 70 | #elif defined( DLL_IMPORT ) | 
| 71 | #define FT_PUBLIC_FUNCTION_ATTRIBUTE  __declspec( dllimport ) | 
| 72 | #endif | 
| 73 |  | 
| 74 |   /* gcc, clang */ | 
| 75 | #elif ( defined( __GNUC__ ) && __GNUC__ >= 4 ) || defined( __clang__ ) | 
| 76 | #define FT_PUBLIC_FUNCTION_ATTRIBUTE \ | 
| 77 |           __attribute__(( visibility( "default" ) )) | 
| 78 |  | 
| 79 |   /* Sun */ | 
| 80 | #elif defined( __SUNPRO_C ) && __SUNPRO_C >= 0x550 | 
| 81 | #define FT_PUBLIC_FUNCTION_ATTRIBUTE  __global | 
| 82 | #endif | 
| 83 |  | 
| 84 |  | 
| 85 | #ifndef FT_PUBLIC_FUNCTION_ATTRIBUTE | 
| 86 | #define FT_PUBLIC_FUNCTION_ATTRIBUTE  /* empty */ | 
| 87 | #endif | 
| 88 |  | 
| 89 |  | 
| 90 |   /* | 
| 91 |    * Define a public FreeType API function.  This ensures it is properly | 
| 92 |    * exported or imported at build time.  The macro parameter is the | 
| 93 |    * function's return type as in: | 
| 94 |    * | 
| 95 |    *   FT_EXPORT( FT_Bool ) | 
| 96 |    *   FT_Object_Method( FT_Object  obj, | 
| 97 |    *                     ... ); | 
| 98 |    * | 
| 99 |    * NOTE: This requires that all `FT_EXPORT` uses are inside | 
| 100 |    * `FT_BEGIN_HEADER ... FT_END_HEADER` blocks.  This guarantees that the | 
| 101 |    * functions are exported with C linkage, even when the header is included | 
| 102 |    * by a C++ source file. | 
| 103 |    */ | 
| 104 | #define FT_EXPORT( x )  FT_PUBLIC_FUNCTION_ATTRIBUTE extern x | 
| 105 |  | 
| 106 |  | 
| 107 |   /* | 
| 108 |    * `FT_UNUSED` indicates that a given parameter is not used -- this is | 
| 109 |    * only used to get rid of unpleasant compiler warnings. | 
| 110 |    * | 
| 111 |    * Technically, this was not meant to be part of the public API, but some | 
| 112 |    * third-party code depends on it. | 
| 113 |    */ | 
| 114 | #ifndef FT_UNUSED | 
| 115 | #define FT_UNUSED( arg )  ( (arg) = (arg) ) | 
| 116 | #endif | 
| 117 |  | 
| 118 |  | 
| 119 |   /* | 
| 120 |    * Support for casts in both C and C++. | 
| 121 |    */ | 
| 122 | #ifdef __cplusplus | 
| 123 | #define FT_STATIC_CAST( type, var )       static_cast<type>(var) | 
| 124 | #define FT_REINTERPRET_CAST( type, var )  reinterpret_cast<type>(var) | 
| 125 |  | 
| 126 | #define FT_STATIC_BYTE_CAST( type, var )                         \ | 
| 127 |           static_cast<type>( static_cast<unsigned char>( var ) ) | 
| 128 | #else | 
| 129 | #define FT_STATIC_CAST( type, var )       (type)(var) | 
| 130 | #define FT_REINTERPRET_CAST( type, var )  (type)(var) | 
| 131 |  | 
| 132 | #define FT_STATIC_BYTE_CAST( type, var )  (type)(unsigned char)(var) | 
| 133 | #endif | 
| 134 |  | 
| 135 |  | 
| 136 | FT_END_HEADER | 
| 137 |  | 
| 138 | #endif  /* FREETYPE_CONFIG_PUBLIC_MACROS_H_ */ | 
| 139 |  |