SkPostConfig.h revision 5ebbbe53779cfe93741dc66f433107d04da74486
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) 367d68335eb427547606497eb4edea81acce7891f9reed@google.com // default is double, as that is faster given our impl uses doubles 377d68335eb427547606497eb4edea81acce7891f9reed@google.com // for intermediate calculations. 387d68335eb427547606497eb4edea81acce7891f9reed@google.com #define SK_MSCALAR_IS_DOUBLE 395596a69e9f7884e3042bceba071c468dee52aa7fvollick@chromium.org#endif 405596a69e9f7884e3042bceba071c468dee52aa7fvollick@chromium.org 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined(SK_CPU_LENDIAN) && defined(SK_CPU_BENDIAN) 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #error "cannot define both SK_CPU_LENDIAN and SK_CPU_BENDIAN" 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#elif !defined(SK_CPU_LENDIAN) && !defined(SK_CPU_BENDIAN) 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #error "must define either SK_CPU_LENDIAN or SK_CPU_BENDIAN" 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// ensure the port has defined all of these, or none of them 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_A32_SHIFT 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #if !defined(SK_R32_SHIFT) || !defined(SK_G32_SHIFT) || !defined(SK_B32_SHIFT) 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #error "all or none of the 32bit SHIFT amounts must be defined" 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #endif 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #if defined(SK_R32_SHIFT) || defined(SK_G32_SHIFT) || defined(SK_B32_SHIFT) 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #error "all or none of the 32bit SHIFT amounts must be defined" 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #endif 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 5804423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com#if !defined(SK_HAS_COMPILER_FEATURE) 5904423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com #if defined(__has_feature) 6004423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com #define SK_HAS_COMPILER_FEATURE(x) __has_feature(x) 6104423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com #else 6204423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com #define SK_HAS_COMPILER_FEATURE(x) 0 6304423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com #endif 6404423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com#endif 6504423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com 665ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com#if !defined(SK_ATTRIBUTE) 675ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com #if defined(__clang__) || defined(__GNUC__) 685ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com #define SK_ATTRIBUTE(attr) __attribute__((attr)) 695ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com #else 705ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com #define SK_ATTRIBUTE(attr) 715ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com #endif 725ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com#endif 735ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com 74cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if !defined(SK_SUPPORT_GPU) 75cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com #define SK_SUPPORT_GPU 1 76cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif 77cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com 7804423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com/** 7904423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com * The clang static analyzer likes to know that when the program is not 8004423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com * expected to continue (crash, assertion failure, etc). It will notice that 8104423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com * some combination of parameters lead to a function call that does not return. 8204423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com * It can then make appropriate assumptions about the parameters in code 8304423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com * executed only if the non-returning function was *not* called. 8404423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com */ 8504423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com#if !defined(SkNO_RETURN_HINT) 8604423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com #if SK_HAS_COMPILER_FEATURE(attribute_analyzer_noreturn) 87672d5c2014fc7d4edc915e597f0be3d321bb3a17bsalomon@google.com static inline void SkNO_RETURN_HINT() __attribute__((analyzer_noreturn)); 88672d5c2014fc7d4edc915e597f0be3d321bb3a17bsalomon@google.com static inline void SkNO_RETURN_HINT() {} 8904423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com #else 9004423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com #define SkNO_RETURN_HINT() do {} while (false) 9104423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com #endif 9204423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com#endif 9304423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com 94fffb2f1bda1982d451bc249743b8cc414995d6a8justinlin@google.com#if defined(SK_ZLIB_INCLUDE) && defined(SK_SYSTEM_ZLIB) 95fffb2f1bda1982d451bc249743b8cc414995d6a8justinlin@google.com #error "cannot define both SK_ZLIB_INCLUDE and SK_SYSTEM_ZLIB" 96fffb2f1bda1982d451bc249743b8cc414995d6a8justinlin@google.com#elif defined(SK_ZLIB_INCLUDE) || defined(SK_SYSTEM_ZLIB) 97fffb2f1bda1982d451bc249743b8cc414995d6a8justinlin@google.com #define SK_HAS_ZLIB 98fffb2f1bda1982d451bc249743b8cc414995d6a8justinlin@google.com#endif 99fffb2f1bda1982d451bc249743b8cc414995d6a8justinlin@google.com 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkNEW 1030ac6af49975c54c2debf41e9200af416ecd2d973bsalomon@google.com #define SkNEW(type_name) (new type_name) 1040ac6af49975c54c2debf41e9200af416ecd2d973bsalomon@google.com #define SkNEW_ARGS(type_name, args) (new type_name args) 1050ac6af49975c54c2debf41e9200af416ecd2d973bsalomon@google.com #define SkNEW_ARRAY(type_name, count) (new type_name[(count)]) 1060ac6af49975c54c2debf41e9200af416ecd2d973bsalomon@google.com #define SkNEW_PLACEMENT(buf, type_name) (new (buf) type_name) 107c377baf406996aed18d82d328029c82dbc3b8ddatomhudson@google.com #define SkNEW_PLACEMENT_ARGS(buf, type_name, args) \ 1080ac6af49975c54c2debf41e9200af416ecd2d973bsalomon@google.com (new (buf) type_name args) 1090ac6af49975c54c2debf41e9200af416ecd2d973bsalomon@google.com #define SkDELETE(obj) (delete (obj)) 1100ac6af49975c54c2debf41e9200af416ecd2d973bsalomon@google.com #define SkDELETE_ARRAY(array) (delete[] (array)) 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SK_CRASH 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 1 // set to 0 for infinite loop, which can help connecting gdb 115b1277c96b0818550190be134fd5e9a971087120bbsalomon@google.com #define SK_CRASH() do { SkNO_RETURN_HINT(); *(int *)(uintptr_t)0xbbadbeef = 0; } while (false) 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else 117b1277c96b0818550190be134fd5e9a971087120bbsalomon@google.com #define SK_CRASH() do { SkNO_RETURN_HINT(); } while (true) 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1234e23068b374023d43c4c725138d523721d975892bsalomon@google.com// SK_ENABLE_INST_COUNT defaults to 1 in DEBUG and 0 in RELEASE 1244e23068b374023d43c4c725138d523721d975892bsalomon@google.com#ifndef SK_ENABLE_INST_COUNT 1254e23068b374023d43c4c725138d523721d975892bsalomon@google.com #ifdef SK_DEBUG 1267abfa49390bac6c07161435324ba5f2d3b270635caryclark@google.com // FIXME: fails if multiple threads run at once (see skbug.com/1219 ) 1277abfa49390bac6c07161435324ba5f2d3b270635caryclark@google.com #define SK_ENABLE_INST_COUNT 0 1284e23068b374023d43c4c725138d523721d975892bsalomon@google.com #else 1294e23068b374023d43c4c725138d523721d975892bsalomon@google.com #define SK_ENABLE_INST_COUNT 0 1304e23068b374023d43c4c725138d523721d975892bsalomon@google.com #endif 1314e23068b374023d43c4c725138d523721d975892bsalomon@google.com#endif 1324e23068b374023d43c4c725138d523721d975892bsalomon@google.com 1334e23068b374023d43c4c725138d523721d975892bsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 1344e23068b374023d43c4c725138d523721d975892bsalomon@google.com 1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined(SK_SOFTWARE_FLOAT) && defined(SK_SCALAR_IS_FLOAT) 1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // if this is defined, we convert floats to 2scompliment ints for compares 1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #ifndef SK_SCALAR_SLOW_COMPARES 1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SK_SCALAR_SLOW_COMPARES 1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #endif 1405c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com #ifndef SK_USE_FLOATBITS 1415c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com #define SK_USE_FLOATBITS 1425c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com #endif 1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_BUILD_FOR_WIN 14616690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com // we want lean_and_mean when we include windows.h 14716690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com #ifndef WIN32_LEAN_AND_MEAN 14816690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com #define WIN32_LEAN_AND_MEAN 14916690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com #define WIN32_IS_MEAN_WAS_LOCALLY_DEFINED 15016690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com #endif 151f3f2d1619e34deb6a1a8cf623f432927e09d0d3cbsalomon@google.com #ifndef NOMINMAX 152f3f2d1619e34deb6a1a8cf623f432927e09d0d3cbsalomon@google.com #define NOMINMAX 153f3f2d1619e34deb6a1a8cf623f432927e09d0d3cbsalomon@google.com #define NOMINMAX_WAS_LOCALLY_DEFINED 154f3f2d1619e34deb6a1a8cf623f432927e09d0d3cbsalomon@google.com #endif 15516690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com 1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #include <windows.h> 15716690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com 15816690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com #ifdef WIN32_IS_MEAN_WAS_LOCALLY_DEFINED 159f3f2d1619e34deb6a1a8cf623f432927e09d0d3cbsalomon@google.com #undef WIN32_IS_MEAN_WAS_LOCALLY_DEFINED 16016690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com #undef WIN32_LEAN_AND_MEAN 16116690af1c21dead3eedb25ebd0a4b9a091684ed4reed@android.com #endif 1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 163f3f2d1619e34deb6a1a8cf623f432927e09d0d3cbsalomon@google.com #ifdef NOMINMAX_WAS_LOCALLY_DEFINED 164f3f2d1619e34deb6a1a8cf623f432927e09d0d3cbsalomon@google.com #undef NOMINMAX_WAS_LOCALLY_DEFINED 165f3f2d1619e34deb6a1a8cf623f432927e09d0d3cbsalomon@google.com #undef NOMINMAX 166f3f2d1619e34deb6a1a8cf623f432927e09d0d3cbsalomon@google.com #endif 167f3f2d1619e34deb6a1a8cf623f432927e09d0d3cbsalomon@google.com 1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #ifndef SK_DEBUGBREAK 16904423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com #define SK_DEBUGBREAK(cond) do { if (!(cond)) { SkNO_RETURN_HINT(); __debugbreak(); }} while (false) 1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #endif 171f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 172f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com #ifndef SK_A32_SHIFT 173f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com #define SK_A32_SHIFT 24 174f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com #define SK_R32_SHIFT 16 175f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com #define SK_G32_SHIFT 8 176f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com #define SK_B32_SHIFT 0 177f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com #endif 178f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com 1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else 1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #ifdef SK_DEBUG 1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #include <stdio.h> 1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #ifndef SK_DEBUGBREAK 1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define SK_DEBUGBREAK(cond) do { if (cond) break; \ 1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("%s:%d: failed assertion \"%s\"\n", \ 1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com __FILE__, __LINE__, #cond); SK_CRASH(); } while (false) 1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #endif 1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #endif 1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 19027661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com/* 19127661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com * We check to see if the SHIFT value has already been defined. 19227661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com * if not, we define it ourself to some default values. We default to OpenGL 19327661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com * order (in memory: r,g,b,a) 19427661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com */ 19527661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com#ifndef SK_A32_SHIFT 19627661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com #ifdef SK_CPU_BENDIAN 19727661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com #define SK_R32_SHIFT 24 19827661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com #define SK_G32_SHIFT 16 19927661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com #define SK_B32_SHIFT 8 20027661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com #define SK_A32_SHIFT 0 20127661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com #else 20227661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com #define SK_R32_SHIFT 0 20327661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com #define SK_G32_SHIFT 8 20427661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com #define SK_B32_SHIFT 16 20527661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com #define SK_A32_SHIFT 24 20627661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com #endif 20727661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com#endif 20827661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com 209e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org/** 210e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org * SK_PMCOLOR_BYTE_ORDER can be used to query the byte order of SkPMColor at compile time. The 211e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org * relationship between the byte order and shift values depends on machine endianness. If the shift 212e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org * order is R=0, G=8, B=16, A=24 then ((char*)&pmcolor)[0] will produce the R channel on a little 213e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org * endian machine and the A channel on a big endian machine. Thus, given those shifts values, 214e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org * SK_PMCOLOR_BYTE_ORDER(R,G,B,A) will be true on a little endian machine and 215e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org * SK_PMCOLOR_BYTE_ORDER(A,B,G,R) will be true on a big endian machine. 216e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org */ 217e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org#ifdef SK_CPU_BENDIAN 218e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org #define SK_PMCOLOR_BYTE_ORDER(C0, C1, C2, C3) \ 219e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org (SK_ ## C3 ## 32_SHIFT == 0 && \ 220e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org SK_ ## C2 ## 32_SHIFT == 8 && \ 221e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org SK_ ## C1 ## 32_SHIFT == 16 && \ 222e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org SK_ ## C0 ## 32_SHIFT == 24) 223e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org#else 224e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org #define SK_PMCOLOR_BYTE_ORDER(C0, C1, C2, C3) \ 225e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org (SK_ ## C0 ## 32_SHIFT == 0 && \ 226e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org SK_ ## C1 ## 32_SHIFT == 8 && \ 227e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org SK_ ## C2 ## 32_SHIFT == 16 && \ 228e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org SK_ ## C3 ## 32_SHIFT == 24) 229e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org#endif 230e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org 2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// stdlib macros 2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 0 2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if !defined(strlen) && defined(SK_DEBUG) 2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com extern size_t sk_strlen(const char*); 2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define strlen(s) sk_strlen(s) 2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_strcpy 2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define sk_strcpy(dst, src) strcpy(dst, src) 2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_strchr 2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define sk_strchr(s, c) strchr(s, c) 2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_strrchr 2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define sk_strrchr(s, c) strrchr(s, c) 2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_strcmp 2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define sk_strcmp(s, t) strcmp(s, t) 2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_strncmp 2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define sk_strncmp(s, t, n) strncmp(s, t, n) 2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_memcpy 2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define sk_memcpy(dst, src, n) memcpy(dst, src, n) 2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef memmove 2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define memmove(dst, src, n) memmove(dst, src, n) 2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_memset 2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define sk_memset(dst, val, n) memset(dst, val, n) 2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_memcmp 2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define sk_memcmp(s, t, n) memcmp(s, t, n) 2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define sk_strequal(s, t) (!sk_strcmp(s, t)) 2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define sk_strnequal(s, t, n) (!sk_strncmp(s, t, n)) 2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2705c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com////////////////////////////////////////////////////////////////////// 2715c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com 2725c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com#if defined(SK_BUILD_FOR_WIN32) || defined(SK_BUILD_FOR_MAC) 2735c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com #ifndef SkLONGLONG 2745c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com #ifdef SK_BUILD_FOR_WIN32 2755c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com #define SkLONGLONG __int64 2765c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com #else 2775c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com #define SkLONGLONG long long 2785c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com #endif 2795c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com #endif 2805c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com#endif 2815c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com 2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////////////////////////////// 2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SK_BUILD_FOR_WINCE 2848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include <string.h> 2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include <stdlib.h> 2868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else 2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define _CMNINTRIN_DECLARE_ONLY 2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "cmnintrin.h" 2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined SK_DEBUG && defined SK_BUILD_FOR_WIN32 2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//#define _CRTDBG_MAP_ALLOC 2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef free 2948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#undef free 2958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include <crtdbg.h> 2978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#undef free 2988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUGx 3008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined(SK_SIMULATE_FAILED_MALLOC) && defined(__cplusplus) 3018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void * operator new( 3028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com size_t cb, 3038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int nBlockUse, 3048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char * szFileName, 3058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int nLine, 3068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int foo 3078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ); 3088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void * operator new[]( 3098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com size_t cb, 3108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int nBlockUse, 3118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char * szFileName, 3128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int nLine, 3138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int foo 3148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ); 3158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void operator delete( 3168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void *pUserData, 3178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int, const char*, int, int 3188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ); 3198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void operator delete( 3208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void *pUserData 3218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ); 3228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void operator delete[]( void * p ); 3238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__, 0) 3248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else 3258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__) 3268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 3278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define new DEBUG_CLIENTBLOCK 3288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else 3298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define DEBUG_CLIENTBLOCK 3308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif // _DEBUG 3318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3321341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com 3331341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com#endif 3341341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com 3358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 3368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3371341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com////////////////////////////////////////////////////////////////////// 3381341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com 3391341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com#ifndef SK_OVERRIDE 340ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #if defined(_MSC_VER) 341ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #define SK_OVERRIDE override 342e63c46c356708a5f0efdc0aaeaa3b1ad150ded1fcommit-bot@chromium.org #elif defined(__clang__) 343aa2c2ffe5ad006cdee376e9c6850f615eac13b4dcommit-bot@chromium.org // Clang defaults to C++03 and warns about using override. Squelch that. Intentionally no 344aa2c2ffe5ad006cdee376e9c6850f615eac13b4dcommit-bot@chromium.org // push/pop here so all users of SK_OVERRIDE ignore the warning too. This is like passing 345aa2c2ffe5ad006cdee376e9c6850f615eac13b4dcommit-bot@chromium.org // -Wno-c++11-extensions, except that GCC won't die (because it won't see this pragma). 346aa2c2ffe5ad006cdee376e9c6850f615eac13b4dcommit-bot@chromium.org #pragma clang diagnostic ignored "-Wc++11-extensions" 347aa2c2ffe5ad006cdee376e9c6850f615eac13b4dcommit-bot@chromium.org 348ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #if __has_feature(cxx_override_control) 349ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com // Some documentation suggests we should be using __attribute__((override)), 350ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com // but it doesn't work. 351ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #define SK_OVERRIDE override 352ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #elif defined(__has_extension) 353ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #if __has_extension(cxx_override_control) 354ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #define SK_OVERRIDE override 355ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #endif 356ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #endif 357ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #else 358ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com // Linux GCC ignores "__attribute__((override))" and rejects "override". 359ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #define SK_OVERRIDE 360ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #endif 3618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 3628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 363d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com////////////////////////////////////////////////////////////////////// 364d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com 3655ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com#if !defined(SK_UNUSED) 3665ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com #define SK_UNUSED SK_ATTRIBUTE(unused) 3675ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com#endif 3685ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com 3695ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com////////////////////////////////////////////////////////////////////// 3705ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com 3713a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#ifndef SK_PRINTF_LIKE 3723a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#if defined(__clang__) || defined(__GNUC__) 3733a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#define SK_PRINTF_LIKE(A, B) __attribute__((format(printf, (A), (B)))) 3743a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#else 3753a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#define SK_PRINTF_LIKE(A, B) 3763a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#endif 3773a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#endif 3783a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org 3793a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org////////////////////////////////////////////////////////////////////// 3803a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org 3813a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#ifndef SK_SIZE_T_SPECIFIER 3823a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#if defined(_MSC_VER) 3833a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#define SK_SIZE_T_SPECIFIER "%Iu" 3843a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#else 3853a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#define SK_SIZE_T_SPECIFIER "%zu" 3863a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#endif 3873a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#endif 3883a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org 3893a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org////////////////////////////////////////////////////////////////////// 3903a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org 391d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#ifndef SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 392d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#define SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 1 393d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#endif 394