180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkPostConfig_DEFINED 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkPostConfig_DEFINED 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined(SK_BUILD_FOR_WIN32) || defined(SK_BUILD_FOR_WINCE) 12910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_BUILD_FOR_WIN 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined(SK_DEBUG) && defined(SK_RELEASE) 16910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# error "cannot define both SK_DEBUG and SK_RELEASE" 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#elif !defined(SK_DEBUG) && !defined(SK_RELEASE) 18910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# error "must define either SK_DEBUG or SK_RELEASE" 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 21910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger#if defined(SK_SUPPORT_UNITTEST) && !defined(SK_DEBUG) 22910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# error "can't have unittests without debug" 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined(SK_SCALAR_IS_FIXED) && defined(SK_SCALAR_IS_FLOAT) 26910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# error "cannot define both SK_SCALAR_IS_FIXED and SK_SCALAR_IS_FLOAT" 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#elif !defined(SK_SCALAR_IS_FIXED) && !defined(SK_SCALAR_IS_FLOAT) 28910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_SCALAR_IS_FLOAT 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 31910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger/** 32910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger * Matrix calculations may be float or double. 33910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger * The default is double, as that is faster given our impl uses doubles 34910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger * for intermediate calculations. 35910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger */ 36363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#if defined(SK_MSCALAR_IS_DOUBLE) && defined(SK_MSCALAR_IS_FLOAT) 37910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# error "cannot define both SK_MSCALAR_IS_DOUBLE and SK_MSCALAR_IS_FLOAT" 38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#elif !defined(SK_MSCALAR_IS_DOUBLE) && !defined(SK_MSCALAR_IS_FLOAT) 39910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_MSCALAR_IS_DOUBLE 40363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined(SK_CPU_LENDIAN) && defined(SK_CPU_BENDIAN) 43910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# error "cannot define both SK_CPU_LENDIAN and SK_CPU_BENDIAN" 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#elif !defined(SK_CPU_LENDIAN) && !defined(SK_CPU_BENDIAN) 45910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# error "must define either SK_CPU_LENDIAN or SK_CPU_BENDIAN" 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 48910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger/** 49910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger * Ensure the port has defined all of SK_X32_SHIFT, or none of them. 50910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger */ 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_A32_SHIFT 52910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# if !defined(SK_R32_SHIFT) || !defined(SK_G32_SHIFT) || !defined(SK_B32_SHIFT) 53910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# error "all or none of the 32bit SHIFT amounts must be defined" 54910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else 56910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# if defined(SK_R32_SHIFT) || defined(SK_G32_SHIFT) || defined(SK_B32_SHIFT) 57910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# error "all or none of the 32bit SHIFT amounts must be defined" 58910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if !defined(SK_HAS_COMPILER_FEATURE) 62910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# if defined(__has_feature) 63910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_HAS_COMPILER_FEATURE(x) __has_feature(x) 64910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# else 65910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_HAS_COMPILER_FEATURE(x) 0 66910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 69e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger#if !defined(SK_ATTRIBUTE) 70910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# if defined(__clang__) || defined(__GNUC__) 71910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_ATTRIBUTE(attr) __attribute__((attr)) 72910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# else 73910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_ATTRIBUTE(attr) 74910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 75e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger#endif 76e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if !defined(SK_SUPPORT_GPU) 78910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_SUPPORT_GPU 1 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * The clang static analyzer likes to know that when the program is not 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * expected to continue (crash, assertion failure, etc). It will notice that 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * some combination of parameters lead to a function call that does not return. 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * It can then make appropriate assumptions about the parameters in code 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * executed only if the non-returning function was *not* called. 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if !defined(SkNO_RETURN_HINT) 89910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# if SK_HAS_COMPILER_FEATURE(attribute_analyzer_noreturn) 90910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger static inline void SkNO_RETURN_HINT() __attribute__((analyzer_noreturn)); 91910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger static inline void SkNO_RETURN_HINT() {} 92910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# else 93910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SkNO_RETURN_HINT() do {} while (false) 94910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined(SK_ZLIB_INCLUDE) && defined(SK_SYSTEM_ZLIB) 98910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# error "cannot define both SK_ZLIB_INCLUDE and SK_SYSTEM_ZLIB" 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#elif defined(SK_ZLIB_INCLUDE) || defined(SK_SYSTEM_ZLIB) 100910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_HAS_ZLIB 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkNEW 106910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SkNEW(type_name) (new type_name) 107910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SkNEW_ARGS(type_name, args) (new type_name args) 108910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SkNEW_ARRAY(type_name, count) (new type_name[(count)]) 109910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SkNEW_PLACEMENT(buf, type_name) (new (buf) type_name) 110910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SkNEW_PLACEMENT_ARGS(buf, type_name, args) (new (buf) type_name args) 111910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SkDELETE(obj) (delete (obj)) 112910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SkDELETE_ARRAY(array) (delete[] (array)) 11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SK_CRASH 116910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# if 1 // set to 0 for infinite loop, which can help connecting gdb 117910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_CRASH() do { SkNO_RETURN_HINT(); *(int *)(uintptr_t)0xbbadbeef = 0; } while (false) 118910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# else 119910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_CRASH() do { SkNO_RETURN_HINT(); } while (true) 120910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 125910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger/** 126910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger * SK_ENABLE_INST_COUNT controlls printing how many reference counted objects 127910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger * are still held on exit. 128910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger * Defaults to 1 in DEBUG and 0 in RELEASE. 129910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger * FIXME: currently always 0, since it fails if multiple threads run at once 130910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger * (see skbug.com/1219 ). 131910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger */ 132d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#ifndef SK_ENABLE_INST_COUNT 133910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifdef SK_DEBUG 134910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_ENABLE_INST_COUNT 0 135910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# else 136910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_ENABLE_INST_COUNT 0 137910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 138d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#endif 139d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 140d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 141d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined(SK_SOFTWARE_FLOAT) && defined(SK_SCALAR_IS_FLOAT) 143910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger // if this is defined, we convert floats to 2s compliment ints for compares. 144910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifndef SK_SCALAR_SLOW_COMPARES 145910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_SCALAR_SLOW_COMPARES 146910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 147910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifndef SK_USE_FLOATBITS 148910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_USE_FLOATBITS 149910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_BUILD_FOR_WIN 153910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifndef WIN32_LEAN_AND_MEAN 154910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define WIN32_LEAN_AND_MEAN 155910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define WIN32_IS_MEAN_WAS_LOCALLY_DEFINED 156910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 157910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifndef NOMINMAX 158910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define NOMINMAX 159910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define NOMINMAX_WAS_LOCALLY_DEFINED 160910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 161910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# 162910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# include <windows.h> 163910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# 164910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifdef WIN32_IS_MEAN_WAS_LOCALLY_DEFINED 165910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# undef WIN32_IS_MEAN_WAS_LOCALLY_DEFINED 166910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# undef WIN32_LEAN_AND_MEAN 167910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 168910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifdef NOMINMAX_WAS_LOCALLY_DEFINED 169910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# undef NOMINMAX_WAS_LOCALLY_DEFINED 170910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# undef NOMINMAX 171910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 172910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# 173910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifndef SK_DEBUGBREAK 174910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_DEBUGBREAK(p) do { if (!(p)) { SkNO_RETURN_HINT(); __debugbreak(); }} while (false) 175910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 176910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# 177910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifndef SK_A32_SHIFT 178910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_A32_SHIFT 24 179910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_R32_SHIFT 16 180910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_G32_SHIFT 8 181910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_B32_SHIFT 0 182910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 183910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# 18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else 185910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifdef SK_DEBUG 186910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# include <stdio.h> 187910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifndef SK_DEBUGBREAK 188910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_DEBUGBREAK(cond) do { if (cond) break; \ 18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDebugf("%s:%d: failed assertion \"%s\"\n", \ 19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru __FILE__, __LINE__, #cond); SK_CRASH(); } while (false) 191910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 192910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 195910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger/** 19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * We check to see if the SHIFT value has already been defined. 19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * if not, we define it ourself to some default values. We default to OpenGL 19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * order (in memory: r,g,b,a) 19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SK_A32_SHIFT 201910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifdef SK_CPU_BENDIAN 202910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_R32_SHIFT 24 203910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_G32_SHIFT 16 204910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_B32_SHIFT 8 205910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_A32_SHIFT 0 206910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# else 207910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_R32_SHIFT 0 208910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_G32_SHIFT 8 209910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_B32_SHIFT 16 210910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_A32_SHIFT 24 211910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 214096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger/** 2150a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * SkColor has well defined shift values, but SkPMColor is configurable. This 2160a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * macro is a convenience that returns true if the shift values are equal while 2170a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * ignoring the machine's endianness. 2180a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger */ 2190a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#define SK_COLOR_MATCHES_PMCOLOR_BYTE_ORDER \ 2200a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger (SK_A32_SHIFT == 24 && SK_R32_SHIFT == 16 && SK_G32_SHIFT == 8 && SK_B32_SHIFT == 0) 2210a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 2220a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger/** 223096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * SK_PMCOLOR_BYTE_ORDER can be used to query the byte order of SkPMColor at compile time. The 224096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * relationship between the byte order and shift values depends on machine endianness. If the shift 225096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * order is R=0, G=8, B=16, A=24 then ((char*)&pmcolor)[0] will produce the R channel on a little 226096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * endian machine and the A channel on a big endian machine. Thus, given those shifts values, 227096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * SK_PMCOLOR_BYTE_ORDER(R,G,B,A) will be true on a little endian machine and 228096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * SK_PMCOLOR_BYTE_ORDER(A,B,G,R) will be true on a big endian machine. 229096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 230096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#ifdef SK_CPU_BENDIAN 231910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_PMCOLOR_BYTE_ORDER(C0, C1, C2, C3) \ 232096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger (SK_ ## C3 ## 32_SHIFT == 0 && \ 233096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SK_ ## C2 ## 32_SHIFT == 8 && \ 234096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SK_ ## C1 ## 32_SHIFT == 16 && \ 235096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SK_ ## C0 ## 32_SHIFT == 24) 236096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#else 237910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_PMCOLOR_BYTE_ORDER(C0, C1, C2, C3) \ 238096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger (SK_ ## C0 ## 32_SHIFT == 0 && \ 239096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SK_ ## C1 ## 32_SHIFT == 8 && \ 240096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SK_ ## C2 ## 32_SHIFT == 16 && \ 241096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SK_ ## C3 ## 32_SHIFT == 24) 242096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#endif 243096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru////////////////////////////////////////////////////////////////////// 24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined(SK_BUILD_FOR_WIN32) || defined(SK_BUILD_FOR_MAC) 247910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifndef SkLONGLONG 248910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifdef SK_BUILD_FOR_WIN32 249910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SkLONGLONG __int64 250910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# else 251910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SkLONGLONG long long 252910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 253910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 25680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru////////////////////////////////////////////////////////////////////////////////////////////// 25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SK_BUILD_FOR_WINCE 258910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# include <string.h> 259910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# include <stdlib.h> 26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else 261910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define _CMNINTRIN_DECLARE_ONLY 262910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# include "cmnintrin.h" 26380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 26480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined SK_DEBUG && defined SK_BUILD_FOR_WIN32 266910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifdef free 267910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# undef free 268910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 269910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# include <crtdbg.h> 270910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# undef free 271910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# 272910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifdef SK_DEBUGx 273910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# if defined(SK_SIMULATE_FAILED_MALLOC) && defined(__cplusplus) 274910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger void * operator new( 275910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger size_t cb, 276910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger int nBlockUse, 277910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger const char * szFileName, 278910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger int nLine, 279910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger int foo 280910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger ); 281910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger void * operator new[]( 282910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger size_t cb, 283910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger int nBlockUse, 284910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger const char * szFileName, 285910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger int nLine, 286910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger int foo 287910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger ); 288910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger void operator delete( 289910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger void *pUserData, 290910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger int, const char*, int, int 291910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger ); 292910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger void operator delete( 293910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger void *pUserData 294910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger ); 295910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger void operator delete[]( void * p ); 296910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__, 0) 297910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# else 298910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__) 299910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 300910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define new DEBUG_CLIENTBLOCK 301910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# else 302910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define DEBUG_CLIENTBLOCK 303910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 30480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 30580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 30680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru////////////////////////////////////////////////////////////////////// 30780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 30880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SK_OVERRIDE 309910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# if defined(_MSC_VER) 310910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_OVERRIDE override 311910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# elif defined(__clang__) 312910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger // Using __attribute__((override)) on clang does not appear to always work. 313910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger // Clang defaults to C++03 and warns about using override. Squelch that. Intentionally no 314910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger // push/pop here so all users of SK_OVERRIDE ignore the warning too. This is like passing 315910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger // -Wno-c++11-extensions, except that GCC won't die (because it won't see this pragma). 316910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# pragma clang diagnostic ignored "-Wc++11-extensions" 317910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# 318910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# if __has_feature(cxx_override_control) 319910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_OVERRIDE override 320910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# elif defined(__has_extension) && __has_extension(cxx_override_control) 321910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_OVERRIDE override 322910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 323910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 324910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# ifndef SK_OVERRIDE 325910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_OVERRIDE 326910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 32780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 32880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 32980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru////////////////////////////////////////////////////////////////////// 33080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 331e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger#if !defined(SK_UNUSED) 332910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_UNUSED SK_ATTRIBUTE(unused) 333e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger#endif 334e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger 3350a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#if !defined(SK_ATTR_DEPRECATED) 336910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger // FIXME: we ignore msg for now... 337910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_ATTR_DEPRECATED(msg) SK_ATTRIBUTE(deprecated) 338910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger#endif 339910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger 340910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger/** 341910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger * If your judgment is better than the compiler's (i.e. you've profiled it), 342910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger * you can use SK_ALWAYS_INLINE to force inlining. E.g. 343910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger * inline void someMethod() { ... } // may not be inlined 344910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger * SK_ALWAYS_INLINE void someMethod() { ... } // should always be inlined 345910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger */ 346910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger#if !defined(SK_ALWAYS_INLINE) 347910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# if defined(SK_BUILD_FOR_WIN) 348910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_ALWAYS_INLINE __forceinline 349910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# else 350910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_ALWAYS_INLINE SK_ATTRIBUTE(always_inline) inline 351910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 3520a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#endif 3530a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 354e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger////////////////////////////////////////////////////////////////////// 355e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger 35680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined(__clang__) || defined(__GNUC__) 357910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_PREFETCH(ptr) __builtin_prefetch(ptr) 358910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_WRITE_PREFETCH(ptr) __builtin_prefetch(ptr, 1) 35980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else 360910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_PREFETCH(ptr) 361910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_WRITE_PREFETCH(ptr) 36280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 363910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger 364910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger////////////////////////////////////////////////////////////////////// 365910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger 366910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger#ifndef SK_PRINTF_LIKE 367910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# if defined(__clang__) || defined(__GNUC__) 368910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_PRINTF_LIKE(A, B) __attribute__((format(printf, (A), (B)))) 369910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# else 370910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_PRINTF_LIKE(A, B) 371910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 37280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 37380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 37480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru////////////////////////////////////////////////////////////////////// 37580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 37680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SK_SIZE_T_SPECIFIER 377910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# if defined(_MSC_VER) 378910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_SIZE_T_SPECIFIER "%Iu" 379910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# else 380910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_SIZE_T_SPECIFIER "%zu" 381910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# endif 38280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 38380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 38480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru////////////////////////////////////////////////////////////////////// 38580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 38680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 387910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger# define SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 1 38880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 389910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger 390910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger#endif // SkPostConfig_DEFINED 391