1 
2 /*
3  * Copyright 2006 The Android Open Source Project
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 
9 
10 #ifndef SkPreConfig_DEFINED
11 #define SkPreConfig_DEFINED
12 
13 #ifdef WEBKIT_VERSION_MIN_REQUIRED
14     #include "config.h"
15 #endif
16 
17 // Allows embedders that want to disable macros that take arguments to just
18 // define that symbol to be one of these
19 //
20 #define SK_NOTHING_ARG1(arg1)
21 #define SK_NOTHING_ARG2(arg1, arg2)
22 #define SK_NOTHING_ARG3(arg1, arg2, arg3)
23 
24 //////////////////////////////////////////////////////////////////////
25 
26 #if !defined(SK_BUILD_FOR_ANDROID) && !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_PALM) && !defined(SK_BUILD_FOR_WINCE) && !defined(SK_BUILD_FOR_WIN32) && !defined(SK_BUILD_FOR_UNIX) && !defined(SK_BUILD_FOR_MAC) && !defined(SK_BUILD_FOR_SDL) && !defined(SK_BUILD_FOR_BREW)
27 
28     #ifdef __APPLE__
29         #include "TargetConditionals.h"
30     #endif
31 
32     #if defined(PALMOS_SDK_VERSION)
33         #define SK_BUILD_FOR_PALM
34     #elif defined(UNDER_CE)
35         #define SK_BUILD_FOR_WINCE
36     #elif defined(WIN32)
37         #define SK_BUILD_FOR_WIN32
38     #elif defined(__SYMBIAN32__)
39         #define SK_BUILD_FOR_WIN32
40     #elif defined(ANDROID)
41         #define SK_BUILD_FOR_ANDROID
42     #elif defined(linux) || defined(__FreeBSD__) || defined(__OpenBSD__) || \
43           defined(__sun) || defined(__NetBSD__) || defined(__DragonFly__) || \
44           defined(__GLIBC__) || defined(__GNU__)
45         #define SK_BUILD_FOR_UNIX
46     #elif TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
47         #define SK_BUILD_FOR_IOS
48     #else
49         #define SK_BUILD_FOR_MAC
50     #endif
51 
52 #endif
53 
54 /* Even if the user only defined the framework variant we still need to build
55  * the default (NDK-compliant) Android code. Therefore, when attempting to
56  * include/exclude something from the framework variant check first that we are
57  * building for Android then check the status of the framework define.
58  */
59 #if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) && !defined(SK_BUILD_FOR_ANDROID)
60     #define SK_BUILD_FOR_ANDROID
61 #endif
62 
63 //////////////////////////////////////////////////////////////////////
64 
65 #if !defined(SK_DEBUG) && !defined(SK_RELEASE)
66     #ifdef NDEBUG
67         #define SK_RELEASE
68     #else
69         #define SK_DEBUG
70     #endif
71 #endif
72 
73 #ifdef SK_BUILD_FOR_WIN32
74     #if !defined(SK_RESTRICT)
75         #define SK_RESTRICT __restrict
76     #endif
77     #if !defined(SK_WARN_UNUSED_RESULT)
78         #define SK_WARN_UNUSED_RESULT
79     #endif
80 #endif
81 
82 //////////////////////////////////////////////////////////////////////
83 
84 #if !defined(SK_RESTRICT)
85     #define SK_RESTRICT __restrict__
86 #endif
87 
88 #if !defined(SK_WARN_UNUSED_RESULT)
89     #define SK_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
90 #endif
91 
92 //////////////////////////////////////////////////////////////////////
93 
94 #if !defined(SK_CPU_BENDIAN) && !defined(SK_CPU_LENDIAN)
95     #if defined(__sparc) || defined(__sparc__) || \
96       defined(_POWER) || defined(__powerpc__) || \
97       defined(__ppc__) || defined(__hppa) || \
98       defined(__PPC__) || defined(__PPC64__) || \
99       defined(_MIPSEB) || defined(__ARMEB__) || \
100       defined(__s390__) || \
101       (defined(__sh__) && defined(__BIG_ENDIAN__)) || \
102       (defined(__ia64) && defined(__BIG_ENDIAN__))
103          #define SK_CPU_BENDIAN
104     #else
105         #define SK_CPU_LENDIAN
106     #endif
107 #endif
108 
109 //////////////////////////////////////////////////////////////////////
110 
111 #if defined(__i386) || defined(_M_IX86) ||  defined(__x86_64__) || defined(_M_X64)
112   #define SK_CPU_X86 1
113 #endif
114 
115 /**
116  *  SK_CPU_SSE_LEVEL
117  *
118  *  If defined, SK_CPU_SSE_LEVEL should be set to the highest supported level.
119  *  On non-intel CPU this should be undefined.
120  */
121 
122 #define SK_CPU_SSE_LEVEL_SSE1     10
123 #define SK_CPU_SSE_LEVEL_SSE2     20
124 #define SK_CPU_SSE_LEVEL_SSE3     30
125 #define SK_CPU_SSE_LEVEL_SSSE3    31
126 #define SK_CPU_SSE_LEVEL_SSE41    41
127 #define SK_CPU_SSE_LEVEL_SSE42    42
128 
129 // Are we in GCC?
130 #ifndef SK_CPU_SSE_LEVEL
131     // These checks must be done in descending order to ensure we set the highest
132     // available SSE level.
133     #if defined(__SSE4_2__)
134         #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE42
135     #elif defined(__SSE4_1__)
136         #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE41
137     #elif defined(__SSSE3__)
138         #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSSE3
139     #elif defined(__SSE3__)
140         #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE3
141     #elif defined(__SSE2__)
142         #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE2
143     #endif
144 #endif
145 
146 // Are we in VisualStudio?
147 #ifndef SK_CPU_SSE_LEVEL
148     // These checks must be done in descending order to ensure we set the highest
149     // available SSE level. 64-bit intel guarantees at least SSE2 support.
150     #if defined(_M_X64) || defined(_M_AMD64)
151         #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE2
152     #elif defined (_M_IX86_FP)
153         #if _M_IX86_FP >= 2
154             #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE2
155         #elif _M_IX86_FP == 1
156             #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE1
157         #endif
158     #endif
159 #endif
160 
161 //////////////////////////////////////////////////////////////////////
162 // ARM defines
163 
164 #if defined(__arm__) && (!defined(__APPLE__) || !TARGET_IPHONE_SIMULATOR)
165     #define SK_CPU_ARM32
166 
167     #if defined(__GNUC__)
168         #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
169                 || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
170                 || defined(__ARM_ARCH_7EM__) || defined(_ARM_ARCH_7)
171             #define SK_ARM_ARCH 7
172         #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
173                 || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \
174                 || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \
175                 || defined(__ARM_ARCH_6M__) || defined(_ARM_ARCH_6)
176             #define SK_ARM_ARCH 6
177         #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \
178                 || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \
179                 || defined(__ARM_ARCH_5TEJ__) || defined(_ARM_ARCH_5)
180             #define SK_ARM_ARCH 5
181         #elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) || defined(_ARM_ARCH_4)
182             #define SK_ARM_ARCH 4
183         #else
184             #define SK_ARM_ARCH 3
185         #endif
186 
187         #if defined(__thumb2__) && (SK_ARM_ARCH >= 6) \
188                 || !defined(__thumb__) && ((SK_ARM_ARCH > 5) || defined(__ARM_ARCH_5E__) \
189                 || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__))
190             #define SK_ARM_HAS_EDSP
191         #endif
192     #endif
193 #endif
194 
195 // Disable ARM64 optimizations for iOS due to complications regarding gyp and iOS.
196 #if defined(__aarch64__) && !defined(SK_BUILD_FOR_IOS)
197     #define SK_CPU_ARM64
198 #endif
199 
200 // All 64-bit ARM chips have NEON.  Many 32-bit ARM chips do too.
201 // TODO: Why don't we want NEON on iOS?
202 #if !defined(SK_ARM_HAS_NEON) && !defined(SK_BUILD_FOR_IOS) && \
203     (defined(SK_CPU_ARM64) || defined(__ARM_NEON__))
204     #define SK_ARM_HAS_NEON
205 #endif
206 
207 //////////////////////////////////////////////////////////////////////
208 
209 #if !defined(SKIA_IMPLEMENTATION)
210     #define SKIA_IMPLEMENTATION 0
211 #endif
212 
213 #if defined(SKIA_DLL)
214     #if defined(WIN32)
215         #if SKIA_IMPLEMENTATION
216             #define SK_API __declspec(dllexport)
217         #else
218             #define SK_API __declspec(dllimport)
219         #endif
220     #else
221         #define SK_API __attribute__((visibility("default")))
222     #endif
223 #else
224     #define SK_API
225 #endif
226 
227 //////////////////////////////////////////////////////////////////////
228 
229 /**
230  * Use SK_PURE_FUNC as an attribute to indicate that a function's
231  * return value only depends on the value of its parameters. This
232  * can help the compiler optimize out successive calls.
233  *
234  * Usage:
235  *      void  function(int params)  SK_PURE_FUNC;
236  */
237 #if defined(__GNUC__)
238 #  define  SK_PURE_FUNC  __attribute__((pure))
239 #else
240 #  define  SK_PURE_FUNC  /* nothing */
241 #endif
242 
243 //////////////////////////////////////////////////////////////////////
244 
245 /**
246  * SK_HAS_ATTRIBUTE(<name>) should return true iff the compiler
247  * supports __attribute__((<name>)). Mostly important because
248  * Clang doesn't support all of GCC attributes.
249  */
250 #if defined(__has_attribute)
251 #   define SK_HAS_ATTRIBUTE(x) __has_attribute(x)
252 #elif defined(__GNUC__)
253 #   define SK_HAS_ATTRIBUTE(x) 1
254 #else
255 #   define SK_HAS_ATTRIBUTE(x) 0
256 #endif
257 
258 /**
259  * SK_ATTRIBUTE_OPTIMIZE_O1 can be used as a function attribute
260  * to specify individual optimization level of -O1, if the compiler
261  * supports it.
262  *
263  * NOTE: Clang/ARM (r161757) does not support the 'optimize' attribute.
264  */
265 #if SK_HAS_ATTRIBUTE(optimize)
266 #   define SK_ATTRIBUTE_OPTIMIZE_O1 __attribute__((optimize("O1")))
267 #else
268 #   define SK_ATTRIBUTE_OPTIMIZE_O1 /* nothing */
269 #endif
270 
271 #endif
272