• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 SkPostConfig_DEFINED
11 #define SkPostConfig_DEFINED
12 
13 #if defined(SK_BUILD_FOR_WIN32) || defined(SK_BUILD_FOR_WINCE)
14     #define SK_BUILD_FOR_WIN
15 #endif
16 
17 #if defined(SK_DEBUG) && defined(SK_RELEASE)
18     #error "cannot define both SK_DEBUG and SK_RELEASE"
19 #elif !defined(SK_DEBUG) && !defined(SK_RELEASE)
20     #error "must define either SK_DEBUG or SK_RELEASE"
21 #endif
22 
23 #if defined SK_SUPPORT_UNITTEST && !defined(SK_DEBUG)
24     #error "can't have unittests without debug"
25 #endif
26 
27 #if defined(SK_SCALAR_IS_FIXED) && defined(SK_SCALAR_IS_FLOAT)
28     #error "cannot define both SK_SCALAR_IS_FIXED and SK_SCALAR_IS_FLOAT"
29 #elif !defined(SK_SCALAR_IS_FIXED) && !defined(SK_SCALAR_IS_FLOAT)
30     #define SK_SCALAR_IS_FLOAT
31 #endif
32 
33 #if defined(SK_MSCALAR_IS_DOUBLE) && defined(SK_MSCALAR_IS_FLOAT)
34     #error "cannot define both SK_MSCALAR_IS_DOUBLE and SK_MSCALAR_IS_FLOAT"
35 #elif !defined(SK_MSCALAR_IS_DOUBLE) && !defined(SK_MSCALAR_IS_FLOAT)
36     // default is double, as that is faster given our impl uses doubles
37     // for intermediate calculations.
38     #define SK_MSCALAR_IS_DOUBLE
39 #endif
40 
41 #if defined(SK_CPU_LENDIAN) && defined(SK_CPU_BENDIAN)
42     #error "cannot define both SK_CPU_LENDIAN and SK_CPU_BENDIAN"
43 #elif !defined(SK_CPU_LENDIAN) && !defined(SK_CPU_BENDIAN)
44     #error "must define either SK_CPU_LENDIAN or SK_CPU_BENDIAN"
45 #endif
46 
47 // ensure the port has defined all of these, or none of them
48 #ifdef SK_A32_SHIFT
49     #if !defined(SK_R32_SHIFT) || !defined(SK_G32_SHIFT) || !defined(SK_B32_SHIFT)
50         #error "all or none of the 32bit SHIFT amounts must be defined"
51     #endif
52 #else
53     #if defined(SK_R32_SHIFT) || defined(SK_G32_SHIFT) || defined(SK_B32_SHIFT)
54         #error "all or none of the 32bit SHIFT amounts must be defined"
55     #endif
56 #endif
57 
58 #if !defined(SK_HAS_COMPILER_FEATURE)
59     #if defined(__has_feature)
60         #define SK_HAS_COMPILER_FEATURE(x) __has_feature(x)
61     #else
62         #define SK_HAS_COMPILER_FEATURE(x) 0
63     #endif
64 #endif
65 
66 #if !defined(SK_SUPPORT_GPU)
67     #define SK_SUPPORT_GPU 1
68 #endif
69 
70 /**
71  * The clang static analyzer likes to know that when the program is not
72  * expected to continue (crash, assertion failure, etc). It will notice that
73  * some combination of parameters lead to a function call that does not return.
74  * It can then make appropriate assumptions about the parameters in code
75  * executed only if the non-returning function was *not* called.
76  */
77 #if !defined(SkNO_RETURN_HINT)
78     #if SK_HAS_COMPILER_FEATURE(attribute_analyzer_noreturn)
79         static inline void SkNO_RETURN_HINT() __attribute__((analyzer_noreturn));
SkNO_RETURN_HINT()80         static inline void SkNO_RETURN_HINT() {}
81     #else
82         #define SkNO_RETURN_HINT() do {} while (false)
83     #endif
84 #endif
85 
86 #if defined(SK_ZLIB_INCLUDE) && defined(SK_SYSTEM_ZLIB)
87     #error "cannot define both SK_ZLIB_INCLUDE and SK_SYSTEM_ZLIB"
88 #elif defined(SK_ZLIB_INCLUDE) || defined(SK_SYSTEM_ZLIB)
89     #define SK_HAS_ZLIB
90 #endif
91 
92 ///////////////////////////////////////////////////////////////////////////////
93 
94 #ifndef SkNEW
95     #define SkNEW(type_name)                (new type_name)
96     #define SkNEW_ARGS(type_name, args)     (new type_name args)
97     #define SkNEW_ARRAY(type_name, count)   (new type_name[(count)])
98     #define SkNEW_PLACEMENT(buf, type_name) (new (buf) type_name)
99     #define SkNEW_PLACEMENT_ARGS(buf, type_name, args) \
100                                             (new (buf) type_name args)
101     #define SkDELETE(obj)                   (delete (obj))
102     #define SkDELETE_ARRAY(array)           (delete[] (array))
103 #endif
104 
105 #ifndef SK_CRASH
106 #if 1   // set to 0 for infinite loop, which can help connecting gdb
107     #define SK_CRASH() do { SkNO_RETURN_HINT(); *(int *)(uintptr_t)0xbbadbeef = 0; } while (false)
108 #else
109     #define SK_CRASH() do { SkNO_RETURN_HINT(); } while (true)
110 #endif
111 #endif
112 
113 ///////////////////////////////////////////////////////////////////////////////
114 
115 // SK_ENABLE_INST_COUNT defaults to 1 in DEBUG and 0 in RELEASE
116 #ifndef SK_ENABLE_INST_COUNT
117     #ifdef SK_DEBUG
118         #define SK_ENABLE_INST_COUNT 1
119     #else
120         #define SK_ENABLE_INST_COUNT 0
121     #endif
122 #endif
123 
124 ///////////////////////////////////////////////////////////////////////////////
125 
126 #if defined(SK_SOFTWARE_FLOAT) && defined(SK_SCALAR_IS_FLOAT)
127     // if this is defined, we convert floats to 2scompliment ints for compares
128     #ifndef SK_SCALAR_SLOW_COMPARES
129         #define SK_SCALAR_SLOW_COMPARES
130     #endif
131     #ifndef SK_USE_FLOATBITS
132         #define SK_USE_FLOATBITS
133     #endif
134 #endif
135 
136 #ifdef SK_BUILD_FOR_WIN
137     // we want lean_and_mean when we include windows.h
138     #ifndef WIN32_LEAN_AND_MEAN
139         #define WIN32_LEAN_AND_MEAN
140         #define WIN32_IS_MEAN_WAS_LOCALLY_DEFINED
141     #endif
142 
143     #include <windows.h>
144 
145     #ifdef WIN32_IS_MEAN_WAS_LOCALLY_DEFINED
146         #undef WIN32_LEAN_AND_MEAN
147     #endif
148 
149     #ifndef SK_DEBUGBREAK
150         #define SK_DEBUGBREAK(cond)     do { if (!(cond)) { SkNO_RETURN_HINT(); __debugbreak(); }} while (false)
151     #endif
152 
153     #ifndef SK_A32_SHIFT
154         #define SK_A32_SHIFT 24
155         #define SK_R32_SHIFT 16
156         #define SK_G32_SHIFT 8
157         #define SK_B32_SHIFT 0
158     #endif
159 
160 #elif defined(SK_BUILD_FOR_MAC)
161     #ifndef SK_DEBUGBREAK
162         #define SK_DEBUGBREAK(cond)     do { if (!(cond)) SK_CRASH(); } while (false)
163     #endif
164 #else
165     #ifdef SK_DEBUG
166         #include <stdio.h>
167         #ifndef SK_DEBUGBREAK
168             #define SK_DEBUGBREAK(cond) do { if (cond) break; \
169                 SkDebugf("%s:%d: failed assertion \"%s\"\n", \
170                 __FILE__, __LINE__, #cond); SK_CRASH(); } while (false)
171         #endif
172     #endif
173 #endif
174 
175 /*
176  *  We check to see if the SHIFT value has already been defined.
177  *  if not, we define it ourself to some default values. We default to OpenGL
178  *  order (in memory: r,g,b,a)
179  */
180 #ifndef SK_A32_SHIFT
181     #ifdef SK_CPU_BENDIAN
182         #define SK_R32_SHIFT    24
183         #define SK_G32_SHIFT    16
184         #define SK_B32_SHIFT    8
185         #define SK_A32_SHIFT    0
186     #else
187         #define SK_R32_SHIFT    0
188         #define SK_G32_SHIFT    8
189         #define SK_B32_SHIFT    16
190         #define SK_A32_SHIFT    24
191     #endif
192 #endif
193 
194 //  stdlib macros
195 
196 #if 0
197 #if !defined(strlen) && defined(SK_DEBUG)
198     extern size_t sk_strlen(const char*);
199     #define strlen(s)   sk_strlen(s)
200 #endif
201 #ifndef sk_strcpy
202     #define sk_strcpy(dst, src)     strcpy(dst, src)
203 #endif
204 #ifndef sk_strchr
205     #define sk_strchr(s, c)         strchr(s, c)
206 #endif
207 #ifndef sk_strrchr
208     #define sk_strrchr(s, c)        strrchr(s, c)
209 #endif
210 #ifndef sk_strcmp
211     #define sk_strcmp(s, t)         strcmp(s, t)
212 #endif
213 #ifndef sk_strncmp
214     #define sk_strncmp(s, t, n)     strncmp(s, t, n)
215 #endif
216 #ifndef sk_memcpy
217     #define sk_memcpy(dst, src, n)  memcpy(dst, src, n)
218 #endif
219 #ifndef memmove
220     #define memmove(dst, src, n)    memmove(dst, src, n)
221 #endif
222 #ifndef sk_memset
223     #define sk_memset(dst, val, n)  memset(dst, val, n)
224 #endif
225 #ifndef sk_memcmp
226     #define sk_memcmp(s, t, n)      memcmp(s, t, n)
227 #endif
228 
229 #define sk_strequal(s, t)           (!sk_strcmp(s, t))
230 #define sk_strnequal(s, t, n)       (!sk_strncmp(s, t, n))
231 #endif
232 
233 //////////////////////////////////////////////////////////////////////
234 
235 #if defined(SK_BUILD_FOR_WIN32) || defined(SK_BUILD_FOR_MAC)
236     #ifndef SkLONGLONG
237         #ifdef SK_BUILD_FOR_WIN32
238             #define SkLONGLONG  __int64
239         #else
240             #define SkLONGLONG  long long
241         #endif
242     #endif
243 #endif
244 
245 //////////////////////////////////////////////////////////////////////////////////////////////
246 #ifndef SK_BUILD_FOR_WINCE
247 #include <string.h>
248 #include <stdlib.h>
249 #else
250 #define _CMNINTRIN_DECLARE_ONLY
251 #include "cmnintrin.h"
252 #endif
253 
254 #if defined SK_DEBUG && defined SK_BUILD_FOR_WIN32
255 //#define _CRTDBG_MAP_ALLOC
256 #ifdef free
257 #undef free
258 #endif
259 #include <crtdbg.h>
260 #undef free
261 
262 #ifdef SK_DEBUGx
263 #if defined(SK_SIMULATE_FAILED_MALLOC) && defined(__cplusplus)
264     void * operator new(
265         size_t cb,
266         int nBlockUse,
267         const char * szFileName,
268         int nLine,
269         int foo
270         );
271     void * operator new[](
272         size_t cb,
273         int nBlockUse,
274         const char * szFileName,
275         int nLine,
276         int foo
277         );
278     void operator delete(
279         void *pUserData,
280         int, const char*, int, int
281         );
282     void operator delete(
283         void *pUserData
284         );
285     void operator delete[]( void * p );
286     #define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__, 0)
287 #else
288     #define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)
289 #endif
290     #define new DEBUG_CLIENTBLOCK
291 #else
292 #define DEBUG_CLIENTBLOCK
293 #endif // _DEBUG
294 
295 
296 #endif
297 
298 #endif
299 
300 //////////////////////////////////////////////////////////////////////
301 
302 #ifndef SK_OVERRIDE
303     #if defined(_MSC_VER)
304         #define SK_OVERRIDE override
305     #elif defined(__clang__) && !defined(SK_BUILD_FOR_IOS)
306         #if __has_feature(cxx_override_control)
307             // Some documentation suggests we should be using __attribute__((override)),
308             // but it doesn't work.
309             #define SK_OVERRIDE override
310         #elif defined(__has_extension)
311             #if __has_extension(cxx_override_control)
312                 #define SK_OVERRIDE override
313             #endif
314         #endif
315     #else
316         // Linux GCC ignores "__attribute__((override))" and rejects "override".
317         #define SK_OVERRIDE
318     #endif
319 #endif
320 
321 //////////////////////////////////////////////////////////////////////
322 
323 #ifndef SK_PRINTF_LIKE
324 #if defined(__clang__) || defined(__GNUC__)
325 #define SK_PRINTF_LIKE(A, B) __attribute__((format(printf, (A), (B))))
326 #else
327 #define SK_PRINTF_LIKE(A, B)
328 #endif
329 #endif
330 
331 //////////////////////////////////////////////////////////////////////
332 
333 #ifndef SK_SIZE_T_SPECIFIER
334 #if defined(_MSC_VER)
335 #define SK_SIZE_T_SPECIFIER "%Iu"
336 #else
337 #define SK_SIZE_T_SPECIFIER "%zu"
338 #endif
339 #endif
340 
341 //////////////////////////////////////////////////////////////////////
342 
343 #ifndef SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
344 #define SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 1
345 #endif
346