SkPostConfig.h revision e63c46c356708a5f0efdc0aaeaa3b1ad150ded1f
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        // FIXME: fails if multiple threads run at once (see skbug.com/1219 )
119        #define SK_ENABLE_INST_COUNT 0
120    #else
121        #define SK_ENABLE_INST_COUNT 0
122    #endif
123#endif
124
125///////////////////////////////////////////////////////////////////////////////
126
127#if defined(SK_SOFTWARE_FLOAT) && defined(SK_SCALAR_IS_FLOAT)
128    // if this is defined, we convert floats to 2scompliment ints for compares
129    #ifndef SK_SCALAR_SLOW_COMPARES
130        #define SK_SCALAR_SLOW_COMPARES
131    #endif
132    #ifndef SK_USE_FLOATBITS
133        #define SK_USE_FLOATBITS
134    #endif
135#endif
136
137#ifdef SK_BUILD_FOR_WIN
138    // we want lean_and_mean when we include windows.h
139    #ifndef WIN32_LEAN_AND_MEAN
140        #define WIN32_LEAN_AND_MEAN
141        #define WIN32_IS_MEAN_WAS_LOCALLY_DEFINED
142    #endif
143
144    #include <windows.h>
145
146    #ifdef WIN32_IS_MEAN_WAS_LOCALLY_DEFINED
147        #undef WIN32_LEAN_AND_MEAN
148    #endif
149
150    #ifndef SK_DEBUGBREAK
151        #define SK_DEBUGBREAK(cond)     do { if (!(cond)) { SkNO_RETURN_HINT(); __debugbreak(); }} while (false)
152    #endif
153
154    #ifndef SK_A32_SHIFT
155        #define SK_A32_SHIFT 24
156        #define SK_R32_SHIFT 16
157        #define SK_G32_SHIFT 8
158        #define SK_B32_SHIFT 0
159    #endif
160
161#else
162    #ifdef SK_DEBUG
163        #include <stdio.h>
164        #ifndef SK_DEBUGBREAK
165            #define SK_DEBUGBREAK(cond) do { if (cond) break; \
166                SkDebugf("%s:%d: failed assertion \"%s\"\n", \
167                __FILE__, __LINE__, #cond); SK_CRASH(); } while (false)
168        #endif
169    #endif
170#endif
171
172/*
173 *  We check to see if the SHIFT value has already been defined.
174 *  if not, we define it ourself to some default values. We default to OpenGL
175 *  order (in memory: r,g,b,a)
176 */
177#ifndef SK_A32_SHIFT
178    #ifdef SK_CPU_BENDIAN
179        #define SK_R32_SHIFT    24
180        #define SK_G32_SHIFT    16
181        #define SK_B32_SHIFT    8
182        #define SK_A32_SHIFT    0
183    #else
184        #define SK_R32_SHIFT    0
185        #define SK_G32_SHIFT    8
186        #define SK_B32_SHIFT    16
187        #define SK_A32_SHIFT    24
188    #endif
189#endif
190
191/**
192 * SK_PMCOLOR_BYTE_ORDER can be used to query the byte order of SkPMColor at compile time. The
193 * relationship between the byte order and shift values depends on machine endianness. If the shift
194 * order is R=0, G=8, B=16, A=24 then ((char*)&pmcolor)[0] will produce the R channel on a little
195 * endian machine and the A channel on a big endian machine. Thus, given those shifts values,
196 * SK_PMCOLOR_BYTE_ORDER(R,G,B,A) will be true on a little endian machine and
197 * SK_PMCOLOR_BYTE_ORDER(A,B,G,R) will be true on a big endian machine.
198 */
199#ifdef SK_CPU_BENDIAN
200    #define SK_PMCOLOR_BYTE_ORDER(C0, C1, C2, C3)     \
201        (SK_ ## C3 ## 32_SHIFT == 0  &&             \
202         SK_ ## C2 ## 32_SHIFT == 8  &&             \
203         SK_ ## C1 ## 32_SHIFT == 16 &&             \
204         SK_ ## C0 ## 32_SHIFT == 24)
205#else
206    #define SK_PMCOLOR_BYTE_ORDER(C0, C1, C2, C3)     \
207        (SK_ ## C0 ## 32_SHIFT == 0  &&             \
208         SK_ ## C1 ## 32_SHIFT == 8  &&             \
209         SK_ ## C2 ## 32_SHIFT == 16 &&             \
210         SK_ ## C3 ## 32_SHIFT == 24)
211#endif
212
213//  stdlib macros
214
215#if 0
216#if !defined(strlen) && defined(SK_DEBUG)
217    extern size_t sk_strlen(const char*);
218    #define strlen(s)   sk_strlen(s)
219#endif
220#ifndef sk_strcpy
221    #define sk_strcpy(dst, src)     strcpy(dst, src)
222#endif
223#ifndef sk_strchr
224    #define sk_strchr(s, c)         strchr(s, c)
225#endif
226#ifndef sk_strrchr
227    #define sk_strrchr(s, c)        strrchr(s, c)
228#endif
229#ifndef sk_strcmp
230    #define sk_strcmp(s, t)         strcmp(s, t)
231#endif
232#ifndef sk_strncmp
233    #define sk_strncmp(s, t, n)     strncmp(s, t, n)
234#endif
235#ifndef sk_memcpy
236    #define sk_memcpy(dst, src, n)  memcpy(dst, src, n)
237#endif
238#ifndef memmove
239    #define memmove(dst, src, n)    memmove(dst, src, n)
240#endif
241#ifndef sk_memset
242    #define sk_memset(dst, val, n)  memset(dst, val, n)
243#endif
244#ifndef sk_memcmp
245    #define sk_memcmp(s, t, n)      memcmp(s, t, n)
246#endif
247
248#define sk_strequal(s, t)           (!sk_strcmp(s, t))
249#define sk_strnequal(s, t, n)       (!sk_strncmp(s, t, n))
250#endif
251
252//////////////////////////////////////////////////////////////////////
253
254#if defined(SK_BUILD_FOR_WIN32) || defined(SK_BUILD_FOR_MAC)
255    #ifndef SkLONGLONG
256        #ifdef SK_BUILD_FOR_WIN32
257            #define SkLONGLONG  __int64
258        #else
259            #define SkLONGLONG  long long
260        #endif
261    #endif
262#endif
263
264//////////////////////////////////////////////////////////////////////////////////////////////
265#ifndef SK_BUILD_FOR_WINCE
266#include <string.h>
267#include <stdlib.h>
268#else
269#define _CMNINTRIN_DECLARE_ONLY
270#include "cmnintrin.h"
271#endif
272
273#if defined SK_DEBUG && defined SK_BUILD_FOR_WIN32
274//#define _CRTDBG_MAP_ALLOC
275#ifdef free
276#undef free
277#endif
278#include <crtdbg.h>
279#undef free
280
281#ifdef SK_DEBUGx
282#if defined(SK_SIMULATE_FAILED_MALLOC) && defined(__cplusplus)
283    void * operator new(
284        size_t cb,
285        int nBlockUse,
286        const char * szFileName,
287        int nLine,
288        int foo
289        );
290    void * operator new[](
291        size_t cb,
292        int nBlockUse,
293        const char * szFileName,
294        int nLine,
295        int foo
296        );
297    void operator delete(
298        void *pUserData,
299        int, const char*, int, int
300        );
301    void operator delete(
302        void *pUserData
303        );
304    void operator delete[]( void * p );
305    #define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__, 0)
306#else
307    #define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)
308#endif
309    #define new DEBUG_CLIENTBLOCK
310#else
311#define DEBUG_CLIENTBLOCK
312#endif // _DEBUG
313
314
315#endif
316
317#endif
318
319//////////////////////////////////////////////////////////////////////
320
321#ifndef SK_OVERRIDE
322    #if defined(_MSC_VER)
323        #define SK_OVERRIDE override
324    #elif defined(__clang__)
325        // Clang defaults to C++03 and warns about using override. Squelch that. Intentionally no
326        // push/pop here so all users of SK_OVERRIDE ignore the warning too. This is like passing
327        // -Wno-c++11-extensions, except that GCC won't die (because it won't see this pragma).
328        #pragma clang diagnostic ignored "-Wc++11-extensions"
329
330        #if __has_feature(cxx_override_control)
331            // Some documentation suggests we should be using __attribute__((override)),
332            // but it doesn't work.
333            #define SK_OVERRIDE override
334        #elif defined(__has_extension)
335            #if __has_extension(cxx_override_control)
336                #define SK_OVERRIDE override
337            #endif
338        #endif
339    #else
340        // Linux GCC ignores "__attribute__((override))" and rejects "override".
341        #define SK_OVERRIDE
342    #endif
343#endif
344
345//////////////////////////////////////////////////////////////////////
346
347#ifndef SK_PRINTF_LIKE
348#if defined(__clang__) || defined(__GNUC__)
349#define SK_PRINTF_LIKE(A, B) __attribute__((format(printf, (A), (B))))
350#else
351#define SK_PRINTF_LIKE(A, B)
352#endif
353#endif
354
355//////////////////////////////////////////////////////////////////////
356
357#ifndef SK_SIZE_T_SPECIFIER
358#if defined(_MSC_VER)
359#define SK_SIZE_T_SPECIFIER "%Iu"
360#else
361#define SK_SIZE_T_SPECIFIER "%zu"
362#endif
363#endif
364
365//////////////////////////////////////////////////////////////////////
366
367#ifndef SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
368#define SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 1
369#endif
370