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