SkPostConfig.h revision cfb7b91b57aa37714f914c86e84928f88c7ad2d7
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));
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#else
161    #ifdef SK_DEBUG
162        #include <stdio.h>
163        #ifndef SK_DEBUGBREAK
164            #define SK_DEBUGBREAK(cond) do { if (cond) break; \
165                SkDebugf("%s:%d: failed assertion \"%s\"\n", \
166                __FILE__, __LINE__, #cond); SK_CRASH(); } while (false)
167        #endif
168    #endif
169#endif
170
171/*
172 *  We check to see if the SHIFT value has already been defined.
173 *  if not, we define it ourself to some default values. We default to OpenGL
174 *  order (in memory: r,g,b,a)
175 */
176#ifndef SK_A32_SHIFT
177    #ifdef SK_CPU_BENDIAN
178        #define SK_R32_SHIFT    24
179        #define SK_G32_SHIFT    16
180        #define SK_B32_SHIFT    8
181        #define SK_A32_SHIFT    0
182    #else
183        #define SK_R32_SHIFT    0
184        #define SK_G32_SHIFT    8
185        #define SK_B32_SHIFT    16
186        #define SK_A32_SHIFT    24
187    #endif
188#endif
189
190//  stdlib macros
191
192#if 0
193#if !defined(strlen) && defined(SK_DEBUG)
194    extern size_t sk_strlen(const char*);
195    #define strlen(s)   sk_strlen(s)
196#endif
197#ifndef sk_strcpy
198    #define sk_strcpy(dst, src)     strcpy(dst, src)
199#endif
200#ifndef sk_strchr
201    #define sk_strchr(s, c)         strchr(s, c)
202#endif
203#ifndef sk_strrchr
204    #define sk_strrchr(s, c)        strrchr(s, c)
205#endif
206#ifndef sk_strcmp
207    #define sk_strcmp(s, t)         strcmp(s, t)
208#endif
209#ifndef sk_strncmp
210    #define sk_strncmp(s, t, n)     strncmp(s, t, n)
211#endif
212#ifndef sk_memcpy
213    #define sk_memcpy(dst, src, n)  memcpy(dst, src, n)
214#endif
215#ifndef memmove
216    #define memmove(dst, src, n)    memmove(dst, src, n)
217#endif
218#ifndef sk_memset
219    #define sk_memset(dst, val, n)  memset(dst, val, n)
220#endif
221#ifndef sk_memcmp
222    #define sk_memcmp(s, t, n)      memcmp(s, t, n)
223#endif
224
225#define sk_strequal(s, t)           (!sk_strcmp(s, t))
226#define sk_strnequal(s, t, n)       (!sk_strncmp(s, t, n))
227#endif
228
229//////////////////////////////////////////////////////////////////////
230
231#if defined(SK_BUILD_FOR_WIN32) || defined(SK_BUILD_FOR_MAC)
232    #ifndef SkLONGLONG
233        #ifdef SK_BUILD_FOR_WIN32
234            #define SkLONGLONG  __int64
235        #else
236            #define SkLONGLONG  long long
237        #endif
238    #endif
239#endif
240
241//////////////////////////////////////////////////////////////////////////////////////////////
242#ifndef SK_BUILD_FOR_WINCE
243#include <string.h>
244#include <stdlib.h>
245#else
246#define _CMNINTRIN_DECLARE_ONLY
247#include "cmnintrin.h"
248#endif
249
250#if defined SK_DEBUG && defined SK_BUILD_FOR_WIN32
251//#define _CRTDBG_MAP_ALLOC
252#ifdef free
253#undef free
254#endif
255#include <crtdbg.h>
256#undef free
257
258#ifdef SK_DEBUGx
259#if defined(SK_SIMULATE_FAILED_MALLOC) && defined(__cplusplus)
260    void * operator new(
261        size_t cb,
262        int nBlockUse,
263        const char * szFileName,
264        int nLine,
265        int foo
266        );
267    void * operator new[](
268        size_t cb,
269        int nBlockUse,
270        const char * szFileName,
271        int nLine,
272        int foo
273        );
274    void operator delete(
275        void *pUserData,
276        int, const char*, int, int
277        );
278    void operator delete(
279        void *pUserData
280        );
281    void operator delete[]( void * p );
282    #define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__, 0)
283#else
284    #define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)
285#endif
286    #define new DEBUG_CLIENTBLOCK
287#else
288#define DEBUG_CLIENTBLOCK
289#endif // _DEBUG
290
291
292#endif
293
294#endif
295
296//////////////////////////////////////////////////////////////////////
297
298#ifndef SK_OVERRIDE
299    #if defined(_MSC_VER)
300        #define SK_OVERRIDE override
301    #elif defined(__clang__) && !defined(SK_BUILD_FOR_IOS)
302        #if __has_feature(cxx_override_control)
303            // Some documentation suggests we should be using __attribute__((override)),
304            // but it doesn't work.
305            #define SK_OVERRIDE override
306        #elif defined(__has_extension)
307            #if __has_extension(cxx_override_control)
308                #define SK_OVERRIDE override
309            #endif
310        #endif
311    #else
312        // Linux GCC ignores "__attribute__((override))" and rejects "override".
313        #define SK_OVERRIDE
314    #endif
315#endif
316
317//////////////////////////////////////////////////////////////////////
318
319#ifndef SK_PRINTF_LIKE
320#if defined(__clang__) || defined(__GNUC__)
321#define SK_PRINTF_LIKE(A, B) __attribute__((format(printf, (A), (B))))
322#else
323#define SK_PRINTF_LIKE(A, B)
324#endif
325#endif
326
327//////////////////////////////////////////////////////////////////////
328
329#ifndef SK_SIZE_T_SPECIFIER
330#if defined(_MSC_VER)
331#define SK_SIZE_T_SPECIFIER "%Iu"
332#else
333#define SK_SIZE_T_SPECIFIER "%zu"
334#endif
335#endif
336
337//////////////////////////////////////////////////////////////////////
338
339#ifndef SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
340#define SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 1
341#endif
342