Home | History | Annotate | Download | only in core
      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