Imported Upstream version 2.10.4
[platform/upstream/freetype2.git] / include / freetype / config / integer-types.h
1 /****************************************************************************
2  *
3  * config/integer-types.h
4  *
5  *   FreeType integer types definitions.
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 #ifndef FREETYPE_CONFIG_INTEGER_TYPES_H_
18 #define FREETYPE_CONFIG_INTEGER_TYPES_H_
19
20   /* There are systems (like the Texas Instruments 'C54x) where a `char`  */
21   /* has 16~bits.  ANSI~C says that `sizeof(char)` is always~1.  Since an */
22   /* `int` has 16~bits also for this system, `sizeof(int)` gives~1 which  */
23   /* is probably unexpected.                                              */
24   /*                                                                      */
25   /* `CHAR_BIT` (defined in `limits.h`) gives the number of bits in a     */
26   /* `char` type.                                                         */
27
28 #ifndef FT_CHAR_BIT
29 #define FT_CHAR_BIT  CHAR_BIT
30 #endif
31
32 #ifndef FT_SIZEOF_INT
33
34   /* The size of an `int` type. */
35 #if                                 FT_UINT_MAX == 0xFFFFUL
36 #define FT_SIZEOF_INT  ( 16 / FT_CHAR_BIT )
37 #elif                               FT_UINT_MAX == 0xFFFFFFFFUL
38 #define FT_SIZEOF_INT  ( 32 / FT_CHAR_BIT )
39 #elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL
40 #define FT_SIZEOF_INT  ( 64 / FT_CHAR_BIT )
41 #else
42 #error "Unsupported size of `int' type!"
43 #endif
44
45 #endif  /* !defined(FT_SIZEOF_INT) */
46
47 #ifndef FT_SIZEOF_LONG
48
49   /* The size of a `long` type.  A five-byte `long` (as used e.g. on the */
50   /* DM642) is recognized but avoided.                                   */
51 #if                                  FT_ULONG_MAX == 0xFFFFFFFFUL
52 #define FT_SIZEOF_LONG  ( 32 / FT_CHAR_BIT )
53 #elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL
54 #define FT_SIZEOF_LONG  ( 32 / FT_CHAR_BIT )
55 #elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL
56 #define FT_SIZEOF_LONG  ( 64 / FT_CHAR_BIT )
57 #else
58 #error "Unsupported size of `long' type!"
59 #endif
60
61 #endif /* !defined(FT_SIZEOF_LONG) */
62
63   /**************************************************************************
64    *
65    * @section:
66    *   basic_types
67    *
68    */
69
70
71   /**************************************************************************
72    *
73    * @type:
74    *   FT_Int16
75    *
76    * @description:
77    *   A typedef for a 16bit signed integer type.
78    */
79   typedef signed short  FT_Int16;
80
81
82   /**************************************************************************
83    *
84    * @type:
85    *   FT_UInt16
86    *
87    * @description:
88    *   A typedef for a 16bit unsigned integer type.
89    */
90   typedef unsigned short  FT_UInt16;
91
92   /* */
93
94
95   /* this #if 0 ... #endif clause is for documentation purposes */
96 #if 0
97
98   /**************************************************************************
99    *
100    * @type:
101    *   FT_Int32
102    *
103    * @description:
104    *   A typedef for a 32bit signed integer type.  The size depends on the
105    *   configuration.
106    */
107   typedef signed XXX  FT_Int32;
108
109
110   /**************************************************************************
111    *
112    * @type:
113    *   FT_UInt32
114    *
115    *   A typedef for a 32bit unsigned integer type.  The size depends on the
116    *   configuration.
117    */
118   typedef unsigned XXX  FT_UInt32;
119
120
121   /**************************************************************************
122    *
123    * @type:
124    *   FT_Int64
125    *
126    *   A typedef for a 64bit signed integer type.  The size depends on the
127    *   configuration.  Only defined if there is real 64bit support;
128    *   otherwise, it gets emulated with a structure (if necessary).
129    */
130   typedef signed XXX  FT_Int64;
131
132
133   /**************************************************************************
134    *
135    * @type:
136    *   FT_UInt64
137    *
138    *   A typedef for a 64bit unsigned integer type.  The size depends on the
139    *   configuration.  Only defined if there is real 64bit support;
140    *   otherwise, it gets emulated with a structure (if necessary).
141    */
142   typedef unsigned XXX  FT_UInt64;
143
144   /* */
145
146 #endif
147
148 #if FT_SIZEOF_INT == ( 32 / FT_CHAR_BIT )
149
150   typedef signed int      FT_Int32;
151   typedef unsigned int    FT_UInt32;
152
153 #elif FT_SIZEOF_LONG == ( 32 / FT_CHAR_BIT )
154
155   typedef signed long     FT_Int32;
156   typedef unsigned long   FT_UInt32;
157
158 #else
159 #error "no 32bit type found -- please check your configuration files"
160 #endif
161
162
163   /* look up an integer type that is at least 32~bits */
164 #if FT_SIZEOF_INT >= ( 32 / FT_CHAR_BIT )
165
166   typedef int            FT_Fast;
167   typedef unsigned int   FT_UFast;
168
169 #elif FT_SIZEOF_LONG >= ( 32 / FT_CHAR_BIT )
170
171   typedef long           FT_Fast;
172   typedef unsigned long  FT_UFast;
173
174 #endif
175
176
177   /* determine whether we have a 64-bit `int` type for platforms without */
178   /* Autoconf                                                            */
179 #if FT_SIZEOF_LONG == ( 64 / FT_CHAR_BIT )
180
181   /* `FT_LONG64` must be defined if a 64-bit type is available */
182 #define FT_LONG64
183 #define FT_INT64   long
184 #define FT_UINT64  unsigned long
185
186   /**************************************************************************
187    *
188    * A 64-bit data type may create compilation problems if you compile in
189    * strict ANSI mode.  To avoid them, we disable other 64-bit data types if
190    * `__STDC__` is defined.  You can however ignore this rule by defining the
191    * `FT_CONFIG_OPTION_FORCE_INT64` configuration macro.
192    */
193 #elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 )
194
195 #if defined( __STDC_VERSION__ ) && __STDC_VERSION__ >= 199901L
196
197 #define FT_LONG64
198 #define FT_INT64   long long int
199 #define FT_UINT64  unsigned long long int
200
201 #elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */
202
203   /* this compiler provides the `__int64` type */
204 #define FT_LONG64
205 #define FT_INT64   __int64
206 #define FT_UINT64  unsigned __int64
207
208 #elif defined( __BORLANDC__ )  /* Borland C++ */
209
210   /* XXXX: We should probably check the value of `__BORLANDC__` in order */
211   /*       to test the compiler version.                                 */
212
213   /* this compiler provides the `__int64` type */
214 #define FT_LONG64
215 #define FT_INT64   __int64
216 #define FT_UINT64  unsigned __int64
217
218 #elif defined( __WATCOMC__ )   /* Watcom C++ */
219
220   /* Watcom doesn't provide 64-bit data types */
221
222 #elif defined( __MWERKS__ )    /* Metrowerks CodeWarrior */
223
224 #define FT_LONG64
225 #define FT_INT64   long long int
226 #define FT_UINT64  unsigned long long int
227
228 #elif defined( __GNUC__ )
229
230   /* GCC provides the `long long` type */
231 #define FT_LONG64
232 #define FT_INT64   long long int
233 #define FT_UINT64  unsigned long long int
234
235 #endif /* __STDC_VERSION__ >= 199901L */
236
237 #endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */
238
239 #ifdef FT_LONG64
240   typedef FT_INT64   FT_Int64;
241   typedef FT_UINT64  FT_UInt64;
242 #endif
243
244
245 #endif  /* FREETYPE_CONFIG_INTEGER_TYPES_H_ */