summaryrefslogtreecommitdiff
path: root/include/freetype/config/public-macros.h
blob: 5cc3236ed409e2dacb1915d789b0fd6ba4ec9670 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/****************************************************************************
 *
 * config/public-macros.h
 *
 *   Define a set of compiler macros used in public FreeType headers.
 *
 * Copyright (C) 2020 by
 * David Turner, Robert Wilhelm, and Werner Lemberg.
 *
 * This file is part of the FreeType project, and may only be used,
 * modified, and distributed under the terms of the FreeType project
 * license, LICENSE.TXT.  By continuing to use, modify, or distribute
 * this file you indicate that you have read the license and
 * understand and accept it fully.
 *
 */

/* The definitions in this file are used by the public FreeType headers,
 * and thus should be considered part of the public API.
 *
 * Other compiler-specific macro definitions that are not exposed by the
 * FreeType API should go into include/freetype/internal/compiler-macros.h
 * instead.
 */
#ifndef FREETYPE_CONFIG_PUBLIC_MACROS_H_
#define FREETYPE_CONFIG_PUBLIC_MACROS_H_

/* FT_BEGIN_HEADER and FT_END_HEADER might have already been defined by
 * <freetype/config/ftheader.h>, but we don't want to include this header
 * here, so redefine the macros here only when needed. Their definition is
 * very stable, so keeping them in sync with the ones in the header should
 * not be a maintenance issue.
 */
#ifndef FT_BEGIN_HEADER
#  ifdef __cplusplus
#    define FT_BEGIN_HEADER extern "C" {
#  else
#    define FT_BEGIN_HEADER  /* nothing */
#  endif
#endif  /* FT_END_HEADER */

#ifndef FT_END_HEADER
#  ifdef __cplusplus
#    define FT_END_HEADER  }
#  else
#    define FT_END_HEADER  /* nothing */
#  endif
#endif  /* FT_END_HEADER */

FT_BEGIN_HEADER

/* Mark a function declaration as public. This ensures it will be properly
 * exported to client code. Place this before a function declaration.
 *
 * NOTE: This macro should be considered an internal implementation detail, and
 * not part of the FreeType API. It is only defined here because it is needed
 * by FT_EXPORT()
 */
#if defined(_WIN32)
#  if defined(FT2_BUILD_LIBRARY) && defined( DLL_EXPORT )
#    define FT_PUBLIC_FUNCTION_ATTRIBUTE  __declspec( dllexport )
#  elif defined( DLL_IMPORT )
#    define FT_PUBLIC_FUNCTION_ATTRIBUTE  __declspec( dllimport )
#  endif
#elif (defined(__GNUC__) && __GNUC__ >= 4) || defined(__clang__)
#  define FT_PUBLIC_FUNCTION_ATTRIBUTE  __attribute__((visibility("default")))
#elif defined(__SUNPRO_C) && __SUNPRO_C >= 0x550
#  define FT_PUBLIC_FUNCTION_ATTRIBUTE __global
#endif

#ifndef FT_PUBLIC_FUNCTION_ATTRIBUTE
#  define FT_PUBLIC_FUNCTION_ATTRIBUTE  /* nothing */
#endif

/* Define a public FreeType API function. This ensures it is properly exported
 * or imported at build time. The macro parameter is the function's return type
 * as in:
 *
 *     FT_EXPORT( FT_Bool )  FT_Object_Method( FT_Object obj, ... );
 *
 * NOTE: This requires that all FT_EXPORT() uses are inside FT_BEGIN_HEADER ..
 * FT_END_HEADER blocks. This guarantees that the functions are exported with
 * C linkage, even when the header is included by a C++ source file.
 */
#define FT_EXPORT( x )  FT_PUBLIC_FUNCTION_ATTRIBUTE extern x

  /* `FT_UNUSED` indicates that a given parameter is not used --   */
  /* this is only used to get rid of unpleasant compiler warnings. */
  /*                                                               */
  /* Technically, this was not meant to be part of the public API, */
  /* but some third-party code depends on it.                      */
  /*                                                               */
#ifndef FT_UNUSED
#define FT_UNUSED( arg )  ( (arg) = (arg) )
#endif


FT_END_HEADER

#endif  /* FREETYPE_CONFIG_PUBLIC_MACROS_H_ */