SkPostConfig.h revision 4469938e92d779dff05e745559e67907bbf21e78
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/** 2102b343cc2557aa7921fa8b04bf6800ebf37af186bdjsollen@google.com * SkColor has well defined shift values, but SkPMColor is configurable. This 2112b343cc2557aa7921fa8b04bf6800ebf37af186bdjsollen@google.com * macro is a convenience that returns true if the shift values are equal while 2122b343cc2557aa7921fa8b04bf6800ebf37af186bdjsollen@google.com * ignoring the machine's endianness. 2132b343cc2557aa7921fa8b04bf6800ebf37af186bdjsollen@google.com */ 2142b343cc2557aa7921fa8b04bf6800ebf37af186bdjsollen@google.com#define SK_COLOR_MATCHES_PMCOLOR_BYTE_ORDER \ 2152b343cc2557aa7921fa8b04bf6800ebf37af186bdjsollen@google.com (SK_A32_SHIFT == 24 && SK_R32_SHIFT == 16 && SK_G32_SHIFT == 8 && SK_B32_SHIFT == 0) 2162b343cc2557aa7921fa8b04bf6800ebf37af186bdjsollen@google.com 2172b343cc2557aa7921fa8b04bf6800ebf37af186bdjsollen@google.com/** 218e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org * SK_PMCOLOR_BYTE_ORDER can be used to query the byte order of SkPMColor at compile time. The 219e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org * relationship between the byte order and shift values depends on machine endianness. If the shift 220e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-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 221e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org * endian machine and the A channel on a big endian machine. Thus, given those shifts values, 222e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org * SK_PMCOLOR_BYTE_ORDER(R,G,B,A) will be true on a little endian machine and 223e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org * SK_PMCOLOR_BYTE_ORDER(A,B,G,R) will be true on a big endian machine. 224e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org */ 225e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org#ifdef SK_CPU_BENDIAN 226e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org #define SK_PMCOLOR_BYTE_ORDER(C0, C1, C2, C3) \ 227e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org (SK_ ## C3 ## 32_SHIFT == 0 && \ 228e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org SK_ ## C2 ## 32_SHIFT == 8 && \ 229e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org SK_ ## C1 ## 32_SHIFT == 16 && \ 230e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org SK_ ## C0 ## 32_SHIFT == 24) 231e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org#else 232e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org #define SK_PMCOLOR_BYTE_ORDER(C0, C1, C2, C3) \ 233e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org (SK_ ## C0 ## 32_SHIFT == 0 && \ 234e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org SK_ ## C1 ## 32_SHIFT == 8 && \ 235e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org SK_ ## C2 ## 32_SHIFT == 16 && \ 236e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org SK_ ## C3 ## 32_SHIFT == 24) 237e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org#endif 238e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org 2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// stdlib macros 2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if 0 2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if !defined(strlen) && defined(SK_DEBUG) 2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com extern size_t sk_strlen(const char*); 2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define strlen(s) sk_strlen(s) 2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_strcpy 2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define sk_strcpy(dst, src) strcpy(dst, src) 2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_strchr 2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define sk_strchr(s, c) strchr(s, c) 2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_strrchr 2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define sk_strrchr(s, c) strrchr(s, c) 2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_strcmp 2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define sk_strcmp(s, t) strcmp(s, t) 2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_strncmp 2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define sk_strncmp(s, t, n) strncmp(s, t, n) 2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_memcpy 2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define sk_memcpy(dst, src, n) memcpy(dst, src, n) 2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef memmove 2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define memmove(dst, src, n) memmove(dst, src, n) 2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_memset 2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define sk_memset(dst, val, n) memset(dst, val, n) 2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef sk_memcmp 2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define sk_memcmp(s, t, n) memcmp(s, t, n) 2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define sk_strequal(s, t) (!sk_strcmp(s, t)) 2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define sk_strnequal(s, t, n) (!sk_strncmp(s, t, n)) 2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2785c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com////////////////////////////////////////////////////////////////////// 2795c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com 2800e6e8cc627242cc7e301401cfe112ba98a008101robertphillips@google.com#if defined(SK_BUILD_FOR_WIN32) || defined(SK_BUILD_FOR_MAC) 2810e6e8cc627242cc7e301401cfe112ba98a008101robertphillips@google.com #ifndef SkLONGLONG 2820e6e8cc627242cc7e301401cfe112ba98a008101robertphillips@google.com #ifdef SK_BUILD_FOR_WIN32 2830e6e8cc627242cc7e301401cfe112ba98a008101robertphillips@google.com #define SkLONGLONG __int64 2840e6e8cc627242cc7e301401cfe112ba98a008101robertphillips@google.com #else 2850e6e8cc627242cc7e301401cfe112ba98a008101robertphillips@google.com #define SkLONGLONG long long 2860e6e8cc627242cc7e301401cfe112ba98a008101robertphillips@google.com #endif 2870e6e8cc627242cc7e301401cfe112ba98a008101robertphillips@google.com #endif 2880e6e8cc627242cc7e301401cfe112ba98a008101robertphillips@google.com#endif 2890e6e8cc627242cc7e301401cfe112ba98a008101robertphillips@google.com 2900e6e8cc627242cc7e301401cfe112ba98a008101robertphillips@google.com////////////////////////////////////////////////////////////////////////////////////////////// 2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SK_BUILD_FOR_WINCE 2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include <string.h> 2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include <stdlib.h> 2948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else 2958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define _CMNINTRIN_DECLARE_ONLY 2968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "cmnintrin.h" 2978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined SK_DEBUG && defined SK_BUILD_FOR_WIN32 3008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//#define _CRTDBG_MAP_ALLOC 3018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef free 3028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#undef free 3038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 3048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include <crtdbg.h> 3058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#undef free 3068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUGx 3088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if defined(SK_SIMULATE_FAILED_MALLOC) && defined(__cplusplus) 3098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void * operator new( 3108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com size_t cb, 3118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int nBlockUse, 3128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char * szFileName, 3138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int nLine, 3148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int foo 3158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ); 3168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void * operator new[]( 3178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com size_t cb, 3188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int nBlockUse, 3198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char * szFileName, 3208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int nLine, 3218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int foo 3228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ); 3238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void operator delete( 3248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void *pUserData, 3258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int, const char*, int, int 3268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ); 3278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void operator delete( 3288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void *pUserData 3298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ); 3308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void operator delete[]( void * p ); 3318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__, 0) 3328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else 3338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__) 3348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 3358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com #define new DEBUG_CLIENTBLOCK 3368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#else 3378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define DEBUG_CLIENTBLOCK 3388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif // _DEBUG 3398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3401341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com 3411341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com#endif 3421341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com 3438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 3448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 3451341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com////////////////////////////////////////////////////////////////////// 3461341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com 3471341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com#ifndef SK_OVERRIDE 348ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #if defined(_MSC_VER) 349ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #define SK_OVERRIDE override 350e63c46c356708a5f0efdc0aaeaa3b1ad150ded1fcommit-bot@chromium.org #elif defined(__clang__) 351aa2c2ffe5ad006cdee376e9c6850f615eac13b4dcommit-bot@chromium.org // Clang defaults to C++03 and warns about using override. Squelch that. Intentionally no 352aa2c2ffe5ad006cdee376e9c6850f615eac13b4dcommit-bot@chromium.org // push/pop here so all users of SK_OVERRIDE ignore the warning too. This is like passing 353aa2c2ffe5ad006cdee376e9c6850f615eac13b4dcommit-bot@chromium.org // -Wno-c++11-extensions, except that GCC won't die (because it won't see this pragma). 354aa2c2ffe5ad006cdee376e9c6850f615eac13b4dcommit-bot@chromium.org #pragma clang diagnostic ignored "-Wc++11-extensions" 355aa2c2ffe5ad006cdee376e9c6850f615eac13b4dcommit-bot@chromium.org 356ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #if __has_feature(cxx_override_control) 357ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com // Some documentation suggests we should be using __attribute__((override)), 358ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com // but it doesn't work. 359ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #define SK_OVERRIDE override 360ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #elif defined(__has_extension) 361ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #if __has_extension(cxx_override_control) 362ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #define SK_OVERRIDE override 363ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #endif 364ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #endif 3652d9526715e1f50e56da6df40c9219c8afeb97973george@mozilla.com #endif 3662d9526715e1f50e56da6df40c9219c8afeb97973george@mozilla.com #ifndef SK_OVERRIDE 367ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #define SK_OVERRIDE 368ece0100c22e2184245efc380c8dede0fe47517b2george@mozilla.com #endif 3698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 3708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 371d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com////////////////////////////////////////////////////////////////////// 372d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com 3735ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com#if !defined(SK_UNUSED) 3745ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com #define SK_UNUSED SK_ATTRIBUTE(unused) 3755ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com#endif 3765ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com 3774469938e92d779dff05e745559e67907bbf21e78reed@google.com#if !defined(SK_ATTR_DEPRECATED) 3784469938e92d779dff05e745559e67907bbf21e78reed@google.com // we ignore msg for now... 3794469938e92d779dff05e745559e67907bbf21e78reed@google.com #define SK_ATTR_DEPRECATED(msg) SK_ATTRIBUTE(deprecated) 3804469938e92d779dff05e745559e67907bbf21e78reed@google.com#endif 3814469938e92d779dff05e745559e67907bbf21e78reed@google.com 3825ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com////////////////////////////////////////////////////////////////////// 3835ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com 3843a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#ifndef SK_PRINTF_LIKE 3853a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#if defined(__clang__) || defined(__GNUC__) 3863a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#define SK_PRINTF_LIKE(A, B) __attribute__((format(printf, (A), (B)))) 3873a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#else 3883a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#define SK_PRINTF_LIKE(A, B) 3893a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#endif 3903a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#endif 3913a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org 3923a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org////////////////////////////////////////////////////////////////////// 3933a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org 3943a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#ifndef SK_SIZE_T_SPECIFIER 3953a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#if defined(_MSC_VER) 3963a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#define SK_SIZE_T_SPECIFIER "%Iu" 3973a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#else 3983a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#define SK_SIZE_T_SPECIFIER "%zu" 3993a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#endif 4003a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org#endif 4013a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org 4023a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org////////////////////////////////////////////////////////////////////// 4033a67a668dbdc3a6bba68700a6dfdef8164ae0c69senorblanco@chromium.org 404d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#ifndef SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 405d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#define SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 1 406d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#endif 407