SkPostConfig.h revision 5596a69e9f7884e3042bceba071c468dee52aa7f
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkPostConfig_DEFINED
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkPostConfig_DEFINED
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined(SK_BUILD_FOR_WIN32) || defined(SK_BUILD_FOR_WINCE)
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define SK_BUILD_FOR_WIN
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined(SK_DEBUG) && defined(SK_RELEASE)
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #error "cannot define both SK_DEBUG and SK_RELEASE"
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#elif !defined(SK_DEBUG) && !defined(SK_RELEASE)
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #error "must define either SK_DEBUG or SK_RELEASE"
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined SK_SUPPORT_UNITTEST && !defined(SK_DEBUG)
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #error "can't have unittests without debug"
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined(SK_SCALAR_IS_FIXED) && defined(SK_SCALAR_IS_FLOAT)
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #error "cannot define both SK_SCALAR_IS_FIXED and SK_SCALAR_IS_FLOAT"
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#elif !defined(SK_SCALAR_IS_FIXED) && !defined(SK_SCALAR_IS_FLOAT)
307886ad3de1aa523d5c71f1fa9f355dfcb2412d1dreed@google.com    #define SK_SCALAR_IS_FLOAT
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
335596a69e9f7884e3042bceba071c468dee52aa7fvollick@chromium.org#if defined(SK_MSCALAR_IS_DOUBLE) && defined(SK_MSCALAR_IS_FLOAT)
345596a69e9f7884e3042bceba071c468dee52aa7fvollick@chromium.org    #error "cannot define both SK_MSCALAR_IS_DOUBLE and SK_MSCALAR_IS_FLOAT"
355596a69e9f7884e3042bceba071c468dee52aa7fvollick@chromium.org#elif !defined(SK_MSCALAR_IS_DOUBLE) && !defined(SK_MSCALAR_IS_FLOAT)
365596a69e9f7884e3042bceba071c468dee52aa7fvollick@chromium.org    #define SK_MSCALAR_IS_FLOAT
375596a69e9f7884e3042bceba071c468dee52aa7fvollick@chromium.org#endif
385596a69e9f7884e3042bceba071c468dee52aa7fvollick@chromium.org
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined(SK_CPU_LENDIAN) && defined(SK_CPU_BENDIAN)
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #error "cannot define both SK_CPU_LENDIAN and SK_CPU_BENDIAN"
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#elif !defined(SK_CPU_LENDIAN) && !defined(SK_CPU_BENDIAN)
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #error "must define either SK_CPU_LENDIAN or SK_CPU_BENDIAN"
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// ensure the port has defined all of these, or none of them
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_A32_SHIFT
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #if !defined(SK_R32_SHIFT) || !defined(SK_G32_SHIFT) || !defined(SK_B32_SHIFT)
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #error "all or none of the 32bit SHIFT amounts must be defined"
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #endif
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #if defined(SK_R32_SHIFT) || defined(SK_G32_SHIFT) || defined(SK_B32_SHIFT)
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #error "all or none of the 32bit SHIFT amounts must be defined"
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #endif
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5604423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com#if !defined(SK_HAS_COMPILER_FEATURE)
5704423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com    #if defined(__has_feature)
5804423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com        #define SK_HAS_COMPILER_FEATURE(x) __has_feature(x)
5904423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com    #else
6004423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com        #define SK_HAS_COMPILER_FEATURE(x) 0
6104423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com    #endif
6204423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com#endif
6304423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com
64cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if !defined(SK_SUPPORT_GPU)
65cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com    #define SK_SUPPORT_GPU 1
66cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif
67cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com
6804423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com/**
6904423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com * The clang static analyzer likes to know that when the program is not
7004423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com * expected to continue (crash, assertion failure, etc). It will notice that
7104423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com * some combination of parameters lead to a function call that does not return.
7204423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com * It can then make appropriate assumptions about the parameters in code
7304423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com * executed only if the non-returning function was *not* called.
7404423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com */
7504423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com#if !defined(SkNO_RETURN_HINT)
7604423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com    #if SK_HAS_COMPILER_FEATURE(attribute_analyzer_noreturn)
773a52d68b4001afd8c7036e80558fba7c87f45a0cbsalomon@google.com        namespace {
783a52d68b4001afd8c7036e80558fba7c87f45a0cbsalomon@google.com            inline void SkNO_RETURN_HINT() __attribute__((analyzer_noreturn));
793a52d68b4001afd8c7036e80558fba7c87f45a0cbsalomon@google.com            inline void SkNO_RETURN_HINT() {}
803a52d68b4001afd8c7036e80558fba7c87f45a0cbsalomon@google.com        }
8104423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com    #else
8204423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com        #define SkNO_RETURN_HINT() do {} while (false)
8304423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com    #endif
8404423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com#endif
8504423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com
86fffb2f1bda1982d451bc249743b8cc414995d6a8justinlin@google.com#if defined(SK_ZLIB_INCLUDE) && defined(SK_SYSTEM_ZLIB)
87fffb2f1bda1982d451bc249743b8cc414995d6a8justinlin@google.com    #error "cannot define both SK_ZLIB_INCLUDE and SK_SYSTEM_ZLIB"
88fffb2f1bda1982d451bc249743b8cc414995d6a8justinlin@google.com#elif defined(SK_ZLIB_INCLUDE) || defined(SK_SYSTEM_ZLIB)
89fffb2f1bda1982d451bc249743b8cc414995d6a8justinlin@google.com    #define SK_HAS_ZLIB
90fffb2f1bda1982d451bc249743b8cc414995d6a8justinlin@google.com#endif
91fffb2f1bda1982d451bc249743b8cc414995d6a8justinlin@google.com
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkNEW
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define SkNEW(type_name)                new type_name
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define SkNEW_ARGS(type_name, args)     new type_name args
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define SkNEW_ARRAY(type_name, count)   new type_name[count]
98c377baf406996aed18d82d328029c82dbc3b8ddatomhudson@google.com    #define SkNEW_PLACEMENT(buf, type_name) new (buf) type_name
99c377baf406996aed18d82d328029c82dbc3b8ddatomhudson@google.com    #define SkNEW_PLACEMENT_ARGS(buf, type_name, args) \
100c377baf406996aed18d82d328029c82dbc3b8ddatomhudson@google.com                                            new (buf) type_name args
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define SkDELETE(obj)                   delete obj
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define SkDELETE_ARRAY(array)           delete[] array
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SK_CRASH
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 1   // set to 0 for infinite loop, which can help connecting gdb
107b1277c96b0818550190be134fd5e9a971087120bbsalomon@google.com    #define SK_CRASH() do { SkNO_RETURN_HINT(); *(int *)(uintptr_t)0xbbadbeef = 0; } while (false)
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else
109b1277c96b0818550190be134fd5e9a971087120bbsalomon@google.com    #define SK_CRASH() do { SkNO_RETURN_HINT(); } while (true)
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined(SK_SOFTWARE_FLOAT) && defined(SK_SCALAR_IS_FLOAT)
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // if this is defined, we convert floats to 2scompliment ints for compares
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #ifndef SK_SCALAR_SLOW_COMPARES
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SK_SCALAR_SLOW_COMPARES
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #endif
1205c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com    #ifndef SK_USE_FLOATBITS
1215c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com        #define SK_USE_FLOATBITS
1225c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com    #endif
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_BUILD_FOR_WIN
12616690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com    // we want lean_and_mean when we include windows.h
12716690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com    #ifndef WIN32_LEAN_AND_MEAN
12816690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com        #define WIN32_LEAN_AND_MEAN
12916690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com        #define WIN32_IS_MEAN_WAS_LOCALLY_DEFINED
13016690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com    #endif
13116690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #include <windows.h>
13316690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com
13416690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com    #ifdef WIN32_IS_MEAN_WAS_LOCALLY_DEFINED
13516690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com        #undef WIN32_LEAN_AND_MEAN
13616690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com    #endif
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #ifndef SK_DEBUGBREAK
13904423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com        #define SK_DEBUGBREAK(cond)     do { if (!(cond)) { SkNO_RETURN_HINT(); __debugbreak(); }} while (false)
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #endif
141f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
142f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    #ifndef SK_A32_SHIFT
143f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        #define SK_A32_SHIFT 24
144f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        #define SK_R32_SHIFT 16
145f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        #define SK_G32_SHIFT 8
146f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        #define SK_B32_SHIFT 0
147f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    #endif
148f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#elif defined(SK_BUILD_FOR_MAC)
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #ifndef SK_DEBUGBREAK
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SK_DEBUGBREAK(cond)     do { if (!(cond)) SK_CRASH(); } while (false)
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #endif
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #ifdef SK_DEBUG
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #include <stdio.h>
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #ifndef SK_DEBUGBREAK
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            #define SK_DEBUGBREAK(cond) do { if (cond) break; \
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                SkDebugf("%s:%d: failed assertion \"%s\"\n", \
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                __FILE__, __LINE__, #cond); SK_CRASH(); } while (false)
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #endif
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #endif
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
16427661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com/*
16527661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com *  We check to see if the SHIFT value has already been defined.
16627661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com *  if not, we define it ourself to some default values. We default to OpenGL
16727661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com *  order (in memory: r,g,b,a)
16827661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com */
16927661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com#ifndef SK_A32_SHIFT
17027661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com    #ifdef SK_CPU_BENDIAN
17127661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com        #define SK_R32_SHIFT    24
17227661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com        #define SK_G32_SHIFT    16
17327661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com        #define SK_B32_SHIFT    8
17427661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com        #define SK_A32_SHIFT    0
17527661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com    #else
17627661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com        #define SK_R32_SHIFT    0
17727661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com        #define SK_G32_SHIFT    8
17827661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com        #define SK_B32_SHIFT    16
17927661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com        #define SK_A32_SHIFT    24
18027661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com    #endif
18127661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com#endif
18227661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//  stdlib macros
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 0
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if !defined(strlen) && defined(SK_DEBUG)
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    extern size_t sk_strlen(const char*);
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define strlen(s)   sk_strlen(s)
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_strcpy
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define sk_strcpy(dst, src)     strcpy(dst, src)
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_strchr
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define sk_strchr(s, c)         strchr(s, c)
1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_strrchr
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define sk_strrchr(s, c)        strrchr(s, c)
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_strcmp
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define sk_strcmp(s, t)         strcmp(s, t)
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_strncmp
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define sk_strncmp(s, t, n)     strncmp(s, t, n)
2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_memcpy
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define sk_memcpy(dst, src, n)  memcpy(dst, src, n)
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef memmove
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define memmove(dst, src, n)    memmove(dst, src, n)
2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_memset
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define sk_memset(dst, val, n)  memset(dst, val, n)
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_memcmp
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define sk_memcmp(s, t, n)      memcmp(s, t, n)
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define sk_strequal(s, t)           (!sk_strcmp(s, t))
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define sk_strnequal(s, t, n)       (!sk_strncmp(s, t, n))
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2225c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com//////////////////////////////////////////////////////////////////////
2235c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com
2245c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com#if defined(SK_BUILD_FOR_WIN32) || defined(SK_BUILD_FOR_MAC)
2255c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com    #ifndef SkLONGLONG
2265c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com        #ifdef SK_BUILD_FOR_WIN32
2275c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com            #define SkLONGLONG  __int64
2285c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com        #else
2295c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com            #define SkLONGLONG  long long
2305c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com        #endif
2315c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com    #endif
2325c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com#endif
2335c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com
2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////////////////////////
2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SK_BUILD_FOR_WINCE
2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include <string.h>
2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include <stdlib.h>
2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else
2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define _CMNINTRIN_DECLARE_ONLY
2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "cmnintrin.h"
2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined SK_DEBUG && defined SK_BUILD_FOR_WIN32
2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//#define _CRTDBG_MAP_ALLOC
2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef free
2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#undef free
2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include <crtdbg.h>
2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#undef free
2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUGx
2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined(SK_SIMULATE_FAILED_MALLOC) && defined(__cplusplus)
2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void * operator new(
2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        size_t cb,
2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int nBlockUse,
2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const char * szFileName,
2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int nLine,
2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int foo
2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        );
2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void * operator new[](
2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        size_t cb,
2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int nBlockUse,
2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        const char * szFileName,
2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int nLine,
2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int foo
2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        );
2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void operator delete(
2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        void *pUserData,
2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        int, const char*, int, int
2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        );
2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void operator delete(
2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        void *pUserData
2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        );
2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void operator delete[]( void * p );
2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__, 0)
2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else
2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)
2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define new DEBUG_CLIENTBLOCK
2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else
2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define DEBUG_CLIENTBLOCK
2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif // _DEBUG
2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2841341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com
2851341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com#endif
2861341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com
2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2891341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com//////////////////////////////////////////////////////////////////////
2901341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com
2911341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com#ifndef SK_OVERRIDE
292ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com    #if defined(_MSC_VER)
293ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com        #define SK_OVERRIDE override
294867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com    #elif defined(__clang__) && !defined(SK_BUILD_FOR_IOS)
295ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com        #if __has_feature(cxx_override_control)
296ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com            // Some documentation suggests we should be using __attribute__((override)),
297ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com            // but it doesn't work.
298ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com            #define SK_OVERRIDE override
299ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com        #elif defined(__has_extension)
300ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com            #if __has_extension(cxx_override_control)
301ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com                #define SK_OVERRIDE override
302ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com            #endif
303ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com        #endif
304ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com    #else
305ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com        // Linux GCC ignores "__attribute__((override))" and rejects "override".
306ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com        #define SK_OVERRIDE
307ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com    #endif
3088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
3098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
310d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com//////////////////////////////////////////////////////////////////////
311d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com
3123a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#ifndef SK_PRINTF_LIKE
3133a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#if defined(__clang__) || defined(__GNUC__)
3143a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#define SK_PRINTF_LIKE(A, B) __attribute__((format(printf, (A), (B))))
3153a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#else
3163a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#define SK_PRINTF_LIKE(A, B)
3173a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#endif
3183a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#endif
3193a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org
3203a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org//////////////////////////////////////////////////////////////////////
3213a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org
3223a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#ifndef SK_SIZE_T_SPECIFIER
3233a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#if defined(_MSC_VER)
3243a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#define SK_SIZE_T_SPECIFIER "%Iu"
3253a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#else
3263a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#define SK_SIZE_T_SPECIFIER "%zu"
3273a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#endif
3283a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#endif
3293a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org
3303a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org//////////////////////////////////////////////////////////////////////
3313a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org
332d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#ifndef SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
333d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#define SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 1
334d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#endif
335