1 /**************************************************************************** 2 * 3 * ftconfig.h 4 * 5 * ANSI-specific configuration file (specification only). 6 * 7 * Copyright (C) 1996-2020 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 * 21 * This header file contains a number of macro definitions that are used by 22 * the rest of the engine. Most of the macros here are automatically 23 * determined at compile time, and you should not need to change it to port 24 * FreeType, except to compile the library with a non-ANSI compiler. 25 * 26 * Note however that if some specific modifications are needed, we advise 27 * you to place a modified copy in your build directory. 28 * 29 * The build directory is usually `builds/<system>`, and contains 30 * system-specific files that are always included first when building the 31 * library. 32 * 33 * This ANSI version should stay in `include/config/`. 34 * 35 */ 36 37 #ifndef FTCONFIG_H_ 38 #define FTCONFIG_H_ 39 40 #include <ft2build.h> 41 #include FT_CONFIG_OPTIONS_H 42 #include FT_CONFIG_STANDARD_LIBRARY_H 43 44 45 FT_BEGIN_HEADER 46 47 48 /************************************************************************** 49 * 50 * PLATFORM-SPECIFIC CONFIGURATION MACROS 51 * 52 * These macros can be toggled to suit a specific system. The current ones 53 * are defaults used to compile FreeType in an ANSI C environment (16bit 54 * compilers are also supported). Copy this file to your own 55 * `builds/<system>` directory, and edit it to port the engine. 56 * 57 */ 58 59 60 /* There are systems (like the Texas Instruments 'C54x) where a `char` */ 61 /* has 16~bits. ANSI~C says that `sizeof(char)` is always~1. Since an */ 62 /* `int` has 16~bits also for this system, `sizeof(int)` gives~1 which */ 63 /* is probably unexpected. */ 64 /* */ 65 /* `CHAR_BIT` (defined in `limits.h`) gives the number of bits in a */ 66 /* `char` type. */ 67 68 #ifndef FT_CHAR_BIT 69 #define FT_CHAR_BIT CHAR_BIT 70 #endif 71 72 73 /* The size of an `int` type. */ 74 #if FT_UINT_MAX == 0xFFFFUL 75 #define FT_SIZEOF_INT ( 16 / FT_CHAR_BIT ) 76 #elif FT_UINT_MAX == 0xFFFFFFFFUL 77 #define FT_SIZEOF_INT ( 32 / FT_CHAR_BIT ) 78 #elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL 79 #define FT_SIZEOF_INT ( 64 / FT_CHAR_BIT ) 80 #else 81 #error "Unsupported size of `int' type!" 82 #endif 83 84 /* The size of a `long` type. A five-byte `long` (as used e.g. on the */ 85 /* DM642) is recognized but avoided. */ 86 #if FT_ULONG_MAX == 0xFFFFFFFFUL 87 #define FT_SIZEOF_LONG ( 32 / FT_CHAR_BIT ) 88 #elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL 89 #define FT_SIZEOF_LONG ( 32 / FT_CHAR_BIT ) 90 #elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL 91 #define FT_SIZEOF_LONG ( 64 / FT_CHAR_BIT ) 92 #else 93 #error "Unsupported size of `long' type!" 94 #endif 95 96 97 /* `FT_UNUSED` indicates that a given parameter is not used -- */ 98 /* this is only used to get rid of unpleasant compiler warnings. */ 99 #ifndef FT_UNUSED 100 #define FT_UNUSED( arg ) ( (arg) = (arg) ) 101 #endif 102 103 104 /************************************************************************** 105 * 106 * AUTOMATIC CONFIGURATION MACROS 107 * 108 * These macros are computed from the ones defined above. Don't touch 109 * their definition, unless you know precisely what you are doing. No 110 * porter should need to mess with them. 111 * 112 */ 113 114 115 /************************************************************************** 116 * 117 * Mac support 118 * 119 * This is the only necessary change, so it is defined here instead 120 * providing a new configuration file. 121 */ 122 #if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) ) 123 /* No Carbon frameworks for 64bit 10.4.x. */ 124 /* `AvailabilityMacros.h` is available since Mac OS X 10.2, */ 125 /* so guess the system version by maximum errno before inclusion. */ 126 #include <errno.h> 127 #ifdef ECANCELED /* defined since 10.2 */ 128 #include "AvailabilityMacros.h" 129 #endif 130 #if defined( __LP64__ ) && \ 131 ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) 132 #undef FT_MACINTOSH 133 #endif 134 135 #elif defined( __SC__ ) || defined( __MRC__ ) 136 /* Classic MacOS compilers */ 137 #include "ConditionalMacros.h" 138 #if TARGET_OS_MAC 139 #define FT_MACINTOSH 1 140 #endif 141 142 #endif 143 144 145 /* Fix compiler warning with sgi compiler. */ 146 #if defined( __sgi ) && !defined( __GNUC__ ) 147 #if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 ) 148 #pragma set woff 3505 149 #endif 150 #endif 151 152 153 /************************************************************************** 154 * 155 * @section: 156 * basic_types 157 * 158 */ 159 160 161 /************************************************************************** 162 * 163 * @type: 164 * FT_Int16 165 * 166 * @description: 167 * A typedef for a 16bit signed integer type. 168 */ 169 typedef signed short FT_Int16; 170 171 172 /************************************************************************** 173 * 174 * @type: 175 * FT_UInt16 176 * 177 * @description: 178 * A typedef for a 16bit unsigned integer type. 179 */ 180 typedef unsigned short FT_UInt16; 181 182 /* */ 183 184 185 /* this #if 0 ... #endif clause is for documentation purposes */ 186 #if 0 187 188 /************************************************************************** 189 * 190 * @type: 191 * FT_Int32 192 * 193 * @description: 194 * A typedef for a 32bit signed integer type. The size depends on the 195 * configuration. 196 */ 197 typedef signed XXX FT_Int32; 198 199 200 /************************************************************************** 201 * 202 * @type: 203 * FT_UInt32 204 * 205 * A typedef for a 32bit unsigned integer type. The size depends on the 206 * configuration. 207 */ 208 typedef unsigned XXX FT_UInt32; 209 210 211 /************************************************************************** 212 * 213 * @type: 214 * FT_Int64 215 * 216 * A typedef for a 64bit signed integer type. The size depends on the 217 * configuration. Only defined if there is real 64bit support; 218 * otherwise, it gets emulated with a structure (if necessary). 219 */ 220 typedef signed XXX FT_Int64; 221 222 223 /************************************************************************** 224 * 225 * @type: 226 * FT_UInt64 227 * 228 * A typedef for a 64bit unsigned integer type. The size depends on the 229 * configuration. Only defined if there is real 64bit support; 230 * otherwise, it gets emulated with a structure (if necessary). 231 */ 232 typedef unsigned XXX FT_UInt64; 233 234 /* */ 235 236 #endif 237 238 #if FT_SIZEOF_INT == ( 32 / FT_CHAR_BIT ) 239 240 typedef signed int FT_Int32; 241 typedef unsigned int FT_UInt32; 242 243 #elif FT_SIZEOF_LONG == ( 32 / FT_CHAR_BIT ) 244 245 typedef signed long FT_Int32; 246 typedef unsigned long FT_UInt32; 247 248 #else 249 #error "no 32bit type found -- please check your configuration files" 250 #endif 251 252 253 /* look up an integer type that is at least 32~bits */ 254 #if FT_SIZEOF_INT >= ( 32 / FT_CHAR_BIT ) 255 256 typedef int FT_Fast; 257 typedef unsigned int FT_UFast; 258 259 #elif FT_SIZEOF_LONG >= ( 32 / FT_CHAR_BIT ) 260 261 typedef long FT_Fast; 262 typedef unsigned long FT_UFast; 263 264 #endif 265 266 267 /* determine whether we have a 64-bit `int` type for platforms without */ 268 /* Autoconf */ 269 #if FT_SIZEOF_LONG == ( 64 / FT_CHAR_BIT ) 270 271 /* `FT_LONG64` must be defined if a 64-bit type is available */ 272 #define FT_LONG64 273 #define FT_INT64 long 274 #define FT_UINT64 unsigned long 275 276 /************************************************************************** 277 * 278 * A 64-bit data type may create compilation problems if you compile in 279 * strict ANSI mode. To avoid them, we disable other 64-bit data types if 280 * `__STDC__` is defined. You can however ignore this rule by defining the 281 * `FT_CONFIG_OPTION_FORCE_INT64` configuration macro. 282 */ 283 #elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 ) 284 285 #if defined( __STDC_VERSION__ ) && __STDC_VERSION__ >= 199901L 286 287 #define FT_LONG64 288 #define FT_INT64 long long int 289 #define FT_UINT64 unsigned long long int 290 291 #elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ 292 293 /* this compiler provides the `__int64` type */ 294 #define FT_LONG64 295 #define FT_INT64 __int64 296 #define FT_UINT64 unsigned __int64 297 298 #elif defined( __BORLANDC__ ) /* Borland C++ */ 299 300 /* XXXX: We should probably check the value of `__BORLANDC__` in order */ 301 /* to test the compiler version. */ 302 303 /* this compiler provides the `__int64` type */ 304 #define FT_LONG64 305 #define FT_INT64 __int64 306 #define FT_UINT64 unsigned __int64 307 308 #elif defined( __WATCOMC__ ) /* Watcom C++ */ 309 310 /* Watcom doesn't provide 64-bit data types */ 311 312 #elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ 313 314 #define FT_LONG64 315 #define FT_INT64 long long int 316 #define FT_UINT64 unsigned long long int 317 318 #elif defined( __GNUC__ ) 319 320 /* GCC provides the `long long` type */ 321 #define FT_LONG64 322 #define FT_INT64 long long int 323 #define FT_UINT64 unsigned long long int 324 325 #endif /* __STDC_VERSION__ >= 199901L */ 326 327 #endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */ 328 329 #ifdef FT_LONG64 330 typedef FT_INT64 FT_Int64; 331 typedef FT_UINT64 FT_UInt64; 332 #endif 333 334 335 #ifdef _WIN64 336 /* only 64bit Windows uses the LLP64 data model, i.e., */ 337 /* 32bit integers, 64bit pointers */ 338 #define FT_UINT_TO_POINTER( x ) (void*)(unsigned __int64)(x) 339 #else 340 #define FT_UINT_TO_POINTER( x ) (void*)(unsigned long)(x) 341 #endif 342 343 344 /************************************************************************** 345 * 346 * miscellaneous 347 * 348 */ 349 350 351 #define FT_BEGIN_STMNT do { 352 #define FT_END_STMNT } while ( 0 ) 353 #define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT 354 355 356 /* `typeof` condition taken from gnulib's `intprops.h` header file */ 357 #if ( ( defined( __GNUC__ ) && __GNUC__ >= 2 ) || \ 358 ( defined( __IBMC__ ) && __IBMC__ >= 1210 && \ 359 defined( __IBM__TYPEOF__ ) ) || \ 360 ( defined( __SUNPRO_C ) && __SUNPRO_C >= 0x5110 && !__STDC__ ) ) 361 #define FT_TYPEOF( type ) ( __typeof__ ( type ) ) 362 #else 363 #define FT_TYPEOF( type ) /* empty */ 364 #endif 365 366 367 /* Use `FT_LOCAL` and `FT_LOCAL_DEF` to declare and define, */ 368 /* respectively, a function that gets used only within the scope of a */ 369 /* module. Normally, both the header and source code files for such a */ 370 /* function are within a single module directory. */ 371 /* */ 372 /* Intra-module arrays should be tagged with `FT_LOCAL_ARRAY` and */ 373 /* `FT_LOCAL_ARRAY_DEF`. */ 374 /* */ 375 #ifdef FT_MAKE_OPTION_SINGLE_OBJECT 376 377 #define FT_LOCAL( x ) static x 378 #define FT_LOCAL_DEF( x ) static x 379 380 #else 381 382 #ifdef __cplusplus 383 #define FT_LOCAL( x ) extern "C" x 384 #define FT_LOCAL_DEF( x ) extern "C" x 385 #else 386 #define FT_LOCAL( x ) extern x 387 #define FT_LOCAL_DEF( x ) x 388 #endif 389 390 #endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ 391 392 #define FT_LOCAL_ARRAY( x ) extern const x 393 #define FT_LOCAL_ARRAY_DEF( x ) const x 394 395 396 /* Use `FT_BASE` and `FT_BASE_DEF` to declare and define, respectively, */ 397 /* functions that are used in more than a single module. In the */ 398 /* current setup this implies that the declaration is in a header file */ 399 /* in the `include/freetype/internal` directory, and the function body */ 400 /* is in a file in `src/base`. */ 401 /* */ 402 #ifndef FT_BASE 403 404 #ifdef __cplusplus 405 #define FT_BASE( x ) extern "C" x 406 #else 407 #define FT_BASE( x ) extern x 408 #endif 409 410 #endif /* !FT_BASE */ 411 412 413 #ifndef FT_BASE_DEF 414 415 #ifdef __cplusplus 416 #define FT_BASE_DEF( x ) x 417 #else 418 #define FT_BASE_DEF( x ) x 419 #endif 420 421 #endif /* !FT_BASE_DEF */ 422 423 424 /* When compiling FreeType as a DLL or DSO with hidden visibility */ 425 /* some systems/compilers need a special attribute in front OR after */ 426 /* the return type of function declarations. */ 427 /* */ 428 /* Two macros are used within the FreeType source code to define */ 429 /* exported library functions: `FT_EXPORT` and `FT_EXPORT_DEF`. */ 430 /* */ 431 /* - `FT_EXPORT( return_type )` */ 432 /* */ 433 /* is used in a function declaration, as in */ 434 /* */ 435 /* ``` */ 436 /* FT_EXPORT( FT_Error ) */ 437 /* FT_Init_FreeType( FT_Library* alibrary ); */ 438 /* ``` */ 439 /* */ 440 /* - `FT_EXPORT_DEF( return_type )` */ 441 /* */ 442 /* is used in a function definition, as in */ 443 /* */ 444 /* ``` */ 445 /* FT_EXPORT_DEF( FT_Error ) */ 446 /* FT_Init_FreeType( FT_Library* alibrary ) */ 447 /* { */ 448 /* ... some code ... */ 449 /* return FT_Err_Ok; */ 450 /* } */ 451 /* ``` */ 452 /* */ 453 /* You can provide your own implementation of `FT_EXPORT` and */ 454 /* `FT_EXPORT_DEF` here if you want. */ 455 /* */ 456 /* To export a variable, use `FT_EXPORT_VAR`. */ 457 /* */ 458 #ifndef FT_EXPORT 459 460 #ifdef FT2_BUILD_LIBRARY 461 462 #if defined( _WIN32 ) && defined( DLL_EXPORT ) 463 #define FT_EXPORT( x ) __declspec( dllexport ) x 464 #elif defined( __GNUC__ ) && __GNUC__ >= 4 465 #define FT_EXPORT( x ) __attribute__(( visibility( "default" ) )) x 466 #elif defined( __SUNPRO_C ) && __SUNPRO_C >= 0x550 467 #define FT_EXPORT( x ) __global x 468 #elif defined( __cplusplus ) 469 #define FT_EXPORT( x ) extern "C" x 470 #else 471 #define FT_EXPORT( x ) extern x 472 #endif 473 474 #else 475 476 #if defined( _WIN32 ) && defined( DLL_IMPORT ) 477 #define FT_EXPORT( x ) __declspec( dllimport ) x 478 #elif defined( __cplusplus ) 479 #define FT_EXPORT( x ) extern "C" x 480 #else 481 #define FT_EXPORT( x ) extern x 482 #endif 483 484 #endif 485 486 #endif /* !FT_EXPORT */ 487 488 489 #ifndef FT_EXPORT_DEF 490 491 #ifdef __cplusplus 492 #define FT_EXPORT_DEF( x ) extern "C" x 493 #else 494 #define FT_EXPORT_DEF( x ) extern x 495 #endif 496 497 #endif /* !FT_EXPORT_DEF */ 498 499 500 #ifndef FT_EXPORT_VAR 501 502 #ifdef __cplusplus 503 #define FT_EXPORT_VAR( x ) extern "C" x 504 #else 505 #define FT_EXPORT_VAR( x ) extern x 506 #endif 507 508 #endif /* !FT_EXPORT_VAR */ 509 510 511 /* The following macros are needed to compile the library with a */ 512 /* C++ compiler and with 16bit compilers. */ 513 /* */ 514 515 /* This is special. Within C++, you must specify `extern "C"` for */ 516 /* functions which are used via function pointers, and you also */ 517 /* must do that for structures which contain function pointers to */ 518 /* assure C linkage -- it's not possible to have (local) anonymous */ 519 /* functions which are accessed by (global) function pointers. */ 520 /* */ 521 /* */ 522 /* FT_CALLBACK_DEF is used to _define_ a callback function, */ 523 /* located in the same source code file as the structure that uses */ 524 /* it. */ 525 /* */ 526 /* FT_BASE_CALLBACK and FT_BASE_CALLBACK_DEF are used to declare */ 527 /* and define a callback function, respectively, in a similar way */ 528 /* as FT_BASE and FT_BASE_DEF work. */ 529 /* */ 530 /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ 531 /* contains pointers to callback functions. */ 532 /* */ 533 /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ 534 /* that contains pointers to callback functions. */ 535 /* */ 536 /* */ 537 /* Some 16bit compilers have to redefine these macros to insert */ 538 /* the infamous `_cdecl` or `__fastcall` declarations. */ 539 /* */ 540 #ifndef FT_CALLBACK_DEF 541 #ifdef __cplusplus 542 #define FT_CALLBACK_DEF( x ) extern "C" x 543 #else 544 #define FT_CALLBACK_DEF( x ) static x 545 #endif 546 #endif /* FT_CALLBACK_DEF */ 547 548 #ifndef FT_BASE_CALLBACK 549 #ifdef __cplusplus 550 #define FT_BASE_CALLBACK( x ) extern "C" x 551 #define FT_BASE_CALLBACK_DEF( x ) extern "C" x 552 #else 553 #define FT_BASE_CALLBACK( x ) extern x 554 #define FT_BASE_CALLBACK_DEF( x ) x 555 #endif 556 #endif /* FT_BASE_CALLBACK */ 557 558 #ifndef FT_CALLBACK_TABLE 559 #ifdef __cplusplus 560 #define FT_CALLBACK_TABLE extern "C" 561 #define FT_CALLBACK_TABLE_DEF extern "C" 562 #else 563 #define FT_CALLBACK_TABLE extern 564 #define FT_CALLBACK_TABLE_DEF /* nothing */ 565 #endif 566 #endif /* FT_CALLBACK_TABLE */ 567 568 569 FT_END_HEADER 570 571 572 #endif /* FTCONFIG_H_ */ 573 574 575 /* END */