SkPostConfig.h revision 4e23068b374023d43c4c725138d523721d975892
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#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