SkPreConfig.h revision 867cbd8bc29371a360194aed648c4d43307b0639
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 SkPreConfig_DEFINED
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkPreConfig_DEFINED
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
13f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#ifdef WEBKIT_VERSION_MIN_REQUIRED
14f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    #include "config.h"
15f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#endif
16f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
19e9fdfb545d8e6af89f5b91cd55e44dfefc21d923reed@google.com#if !defined(SK_BUILD_FOR_ANDROID) && !defined(SK_BUILD_FOR_ANDROID_NDK) && !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_PALM) && !defined(SK_BUILD_FOR_WINCE) && !defined(SK_BUILD_FOR_WIN32) && !defined(SK_BUILD_FOR_UNIX) && !defined(SK_BUILD_FOR_MAC) && !defined(SK_BUILD_FOR_SDL) && !defined(SK_BUILD_FOR_BREW)
20f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
21f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    #ifdef __APPLE__
22f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        #include "TargetConditionals.h"
23f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    #endif
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #if defined(PALMOS_SDK_VERSION)
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SK_BUILD_FOR_PALM
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #elif defined(UNDER_CE)
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SK_BUILD_FOR_WINCE
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #elif defined(WIN32)
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SK_BUILD_FOR_WIN32
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #elif defined(__SYMBIAN32__)
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SK_BUILD_FOR_WIN32
3360abb078e5597c9c6ceaba1ef495c4916ff4df0ddjsollen@google.com    #elif defined(ANDROID_NDK)
3460abb078e5597c9c6ceaba1ef495c4916ff4df0ddjsollen@google.com        #define SK_BUILD_FOR_ANDROID_NDK
3560abb078e5597c9c6ceaba1ef495c4916ff4df0ddjsollen@google.com    #elif defined(ANDROID)
3660abb078e5597c9c6ceaba1ef495c4916ff4df0ddjsollen@google.com        #define SK_BUILD_FOR_ANDROID
37ea6805d2224eaccfcd95f4a019cfcc57ac89afcereed@google.com    #elif defined(linux) || defined(__FreeBSD__) || defined(__OpenBSD__) || \
3879c865a5c8f585880d48771194c8cd82ab8cda98george@mozilla.com          defined(__sun) || defined(__NetBSD__) || defined(__DragonFly__) || \
3979c865a5c8f585880d48771194c8cd82ab8cda98george@mozilla.com          defined(__GLIBC__) || defined(__GNU__)
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SK_BUILD_FOR_UNIX
41f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    #elif TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
42f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com        #define SK_BUILD_FOR_IOS
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #else
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SK_BUILD_FOR_MAC
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #endif
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4958629291bc145edca8fb303e465c8537bed65314djsollen@google.com/* Even if the user only defined the NDK variant we still need to build
5058629291bc145edca8fb303e465c8537bed65314djsollen@google.com * the default Android code. Therefore, when attempting to include/exclude
51fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com * something from the NDK variant check first that we are building for
5258629291bc145edca8fb303e465c8537bed65314djsollen@google.com * Android then check the status of the NDK define.
5358629291bc145edca8fb303e465c8537bed65314djsollen@google.com */
5458629291bc145edca8fb303e465c8537bed65314djsollen@google.com#if defined(SK_BUILD_FOR_ANDROID_NDK) && !defined(SK_BUILD_FOR_ANDROID)
5558629291bc145edca8fb303e465c8537bed65314djsollen@google.com    #define SK_BUILD_FOR_ANDROID
5658629291bc145edca8fb303e465c8537bed65314djsollen@google.com#endif
5758629291bc145edca8fb303e465c8537bed65314djsollen@google.com
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if !defined(SK_DEBUG) && !defined(SK_RELEASE)
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #ifdef NDEBUG
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SK_RELEASE
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #else
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SK_DEBUG
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #endif
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
6863debae4c1020fa1e0ccd92ef3cbfdc8735acf8ereed@android.com#ifdef SK_BUILD_FOR_WIN32
69333d6cb2448d0febcbeb7c8c7310c0ff2d1a6104tomhudson@google.com    #if !defined(SK_RESTRICT)
70333d6cb2448d0febcbeb7c8c7310c0ff2d1a6104tomhudson@google.com        #define SK_RESTRICT __restrict
71333d6cb2448d0febcbeb7c8c7310c0ff2d1a6104tomhudson@google.com    #endif
72363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com    #if !defined(SK_WARN_UNUSED_RESULT)
73363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com        #define SK_WARN_UNUSED_RESULT
74363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com    #endif
7563debae4c1020fa1e0ccd92ef3cbfdc8735acf8ereed@android.com    #include "sk_stdint.h"
7663debae4c1020fa1e0ccd92ef3cbfdc8735acf8ereed@android.com#endif
7763debae4c1020fa1e0ccd92ef3cbfdc8735acf8ereed@android.com
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
805c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com#if !defined(SK_RESTRICT)
815c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com    #define SK_RESTRICT __restrict__
825c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com#endif
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
84363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com#if !defined(SK_WARN_UNUSED_RESULT)
85363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com    #define SK_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
86363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com#endif
87363a4c22af71b8afedc00050ee5cc97fe4bd6f76bungeman@google.com
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
905c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com#if !defined(SK_SCALAR_IS_FLOAT) && !defined(SK_SCALAR_IS_FIXED)
915c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com    #define SK_SCALAR_IS_FLOAT
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if !defined(SK_CPU_BENDIAN) && !defined(SK_CPU_LENDIAN)
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #if defined (__ppc__) || defined(__ppc64__)
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SK_CPU_BENDIAN
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #else
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        #define SK_CPU_LENDIAN
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #endif
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1064a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com/**
107126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com *  SK_CPU_SSE_LEVEL
108126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com *
109ab69788571ed968dc0bcc934b9979195c6a28310reed@google.com *  If defined, SK_CPU_SSE_LEVEL should be set to the highest supported level.
110ab69788571ed968dc0bcc934b9979195c6a28310reed@google.com *  On non-intel CPU this should be undefined.
1114a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com */
112126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com
11300aad94f01a9078d26363db3116f8005d84440f2reed@google.com#define SK_CPU_SSE_LEVEL_SSE1     10
1148dbd5725c0a6681425c7a019c58c4cacdad2a238reed@google.com#define SK_CPU_SSE_LEVEL_SSE2     20
1158dbd5725c0a6681425c7a019c58c4cacdad2a238reed@google.com#define SK_CPU_SSE_LEVEL_SSE3     30
1168dbd5725c0a6681425c7a019c58c4cacdad2a238reed@google.com#define SK_CPU_SSE_LEVEL_SSSE3    31
117ab69788571ed968dc0bcc934b9979195c6a28310reed@google.com
118126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com// Are we in GCC?
1194a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com#ifndef SK_CPU_SSE_LEVEL
12000aad94f01a9078d26363db3116f8005d84440f2reed@google.com    #if defined(__SSE2__)
1218dbd5725c0a6681425c7a019c58c4cacdad2a238reed@google.com        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE2
122ab69788571ed968dc0bcc934b9979195c6a28310reed@google.com    #elif defined(__SSE3__)
1238dbd5725c0a6681425c7a019c58c4cacdad2a238reed@google.com        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE3
12400aad94f01a9078d26363db3116f8005d84440f2reed@google.com    #elif defined(__SSSE3__)
1258dbd5725c0a6681425c7a019c58c4cacdad2a238reed@google.com        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSSE3
1264a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com    #endif
1274a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com#endif
1284a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com
129126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com// Are we in VisualStudio?
130126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com#ifndef SK_CPU_SSE_LEVEL
13100aad94f01a9078d26363db3116f8005d84440f2reed@google.com    #if _M_IX86_FP == 1
13200aad94f01a9078d26363db3116f8005d84440f2reed@google.com        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE1
13300aad94f01a9078d26363db3116f8005d84440f2reed@google.com    #elif _M_IX86_FP >= 2
13400aad94f01a9078d26363db3116f8005d84440f2reed@google.com        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE2
13500aad94f01a9078d26363db3116f8005d84440f2reed@google.com    #endif
13600aad94f01a9078d26363db3116f8005d84440f2reed@google.com#endif
13700aad94f01a9078d26363db3116f8005d84440f2reed@google.com
13800aad94f01a9078d26363db3116f8005d84440f2reed@google.com// 64bit intel guarantees at least SSE2
13900aad94f01a9078d26363db3116f8005d84440f2reed@google.com#if defined(__x86_64__) || defined(_WIN64)
14000aad94f01a9078d26363db3116f8005d84440f2reed@google.com    #if !defined(SK_CPU_SSE_LEVEL) || (SK_CPU_SSE_LEVEL < SK_CPU_SSE_LEVEL_SSE2)
14100aad94f01a9078d26363db3116f8005d84440f2reed@google.com        #undef SK_CPU_SSE_LEVEL
1428dbd5725c0a6681425c7a019c58c4cacdad2a238reed@google.com        #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE2
143126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com    #endif
144867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com#endif
145867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com
146867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com//////////////////////////////////////////////////////////////////////
147867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com// ARM defines
148867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com
149867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com#if defined(__arm__) && (!defined(__APPLE__) || !TARGET_IPHONE_SIMULATOR)
150867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com    #define SK_CPU_ARM
151867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com
152867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com    #if defined(__GNUC__)
153867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com        #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
154867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com                || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
155867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com                || defined(__ARM_ARCH_7EM__) || defined(_ARM_ARCH_7)
156867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com            #define SK_ARM_ARCH 7
157867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com        #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
158867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com                || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \
159867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com                || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \
160867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com                || defined(__ARM_ARCH_6M__) || defined(_ARM_ARCH_6)
161867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com            #define SK_ARM_ARCH 6
162867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com        #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \
163867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com                || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \
164867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com                || defined(__ARM_ARCH_5TEJ__) || defined(_ARM_ARCH_5)
165867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com            #define SK_ARM_ARCH 5
166867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com        #elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) || defined(_ARM_ARCH_4)
167867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com            #define SK_ARM_ARCH 4
168867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com        #else
169867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com            #define SK_ARM_ARCH 3
170867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com        #endif
171867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com
172867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com        #if defined(__thumb2__) && (SK_ARM_ARCH >= 6) \
173867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com                || !defined(__thumb__) && ((SK_ARM_ARCH > 5) || defined(__ARM_ARCH_5E__) \
174867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com                || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__))
175867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com            #define SK_ARM_HAS_EDSP
176867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com        #endif
177867cbd8bc29371a360194aed648c4d43307b0639caryclark@google.com    #endif
178126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com#endif
179126b4362be3bb43ef8f7a10df710b40e8bba869dreed@google.com
1804a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com//////////////////////////////////////////////////////////////////////
1814a2cb30accbd5f9b0b60904a55e0bfecf706255areed@google.com
182e9fdfb545d8e6af89f5b91cd55e44dfefc21d923reed@google.com/**
183e9fdfb545d8e6af89f5b91cd55e44dfefc21d923reed@google.com *  THUMB is the only known config where we avoid small branches in
184e9fdfb545d8e6af89f5b91cd55e44dfefc21d923reed@google.com *  favor of more complex math.
185e9fdfb545d8e6af89f5b91cd55e44dfefc21d923reed@google.com */
186e9fdfb545d8e6af89f5b91cd55e44dfefc21d923reed@google.com#if !(defined(__arm__) && defined(__thumb__))
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    #define SK_CPU_HAS_CONDITIONAL_INSTR
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1907ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org//////////////////////////////////////////////////////////////////////
1917ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org
1927ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org#if !defined(SKIA_IMPLEMENTATION)
1937ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org    #define SKIA_IMPLEMENTATION 0
1947ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org#endif
195c0091114461339c7e6a78a0f1669cecad1e22146reed@google.com
196c0091114461339c7e6a78a0f1669cecad1e22146reed@google.com#if defined(SKIA_DLL)
197c0091114461339c7e6a78a0f1669cecad1e22146reed@google.com    #if defined(WIN32)
198c0091114461339c7e6a78a0f1669cecad1e22146reed@google.com        #if SKIA_IMPLEMENTATION
199c0091114461339c7e6a78a0f1669cecad1e22146reed@google.com            #define SK_API __declspec(dllexport)
200c0091114461339c7e6a78a0f1669cecad1e22146reed@google.com        #else
201c0091114461339c7e6a78a0f1669cecad1e22146reed@google.com            #define SK_API __declspec(dllimport)
202c0091114461339c7e6a78a0f1669cecad1e22146reed@google.com        #endif
2037ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org    #else
204c0091114461339c7e6a78a0f1669cecad1e22146reed@google.com        #define SK_API __attribute__((visibility("default")))
2057ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org    #endif
2067ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org#else
2077ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org    #define SK_API
2087ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org#endif
2097ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.org
210157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com//////////////////////////////////////////////////////////////////////
211157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com
212157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com/**
213157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com * Use SK_PURE_FUNC as an attribute to indicate that a function's
214157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com * return value only depends on the value of its parameters. This
215157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com * can help the compiler optimize out successive calls.
216157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com *
217157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com * Usage:
218157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com *      void  function(int params)  SK_PURE_FUNC;
219157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com */
220157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com#if defined(__GNUC__)
221157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com#  define  SK_PURE_FUNC  __attribute__((pure))
222157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com#else
223157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com#  define  SK_PURE_FUNC  /* nothing */
224157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com#endif
225157d94465a47a57e30e5cf49cd57dccd903e27e2digit@google.com
226536079b2099e986853c82c874059a6bcd7602742digit@google.com//////////////////////////////////////////////////////////////////////
227536079b2099e986853c82c874059a6bcd7602742digit@google.com
228536079b2099e986853c82c874059a6bcd7602742digit@google.com/**
229536079b2099e986853c82c874059a6bcd7602742digit@google.com * SK_HAS_ATTRIBUTE(<name>) should return true iff the compiler
230536079b2099e986853c82c874059a6bcd7602742digit@google.com * supports __attribute__((<name>)). Mostly important because
231536079b2099e986853c82c874059a6bcd7602742digit@google.com * Clang doesn't support all of GCC attributes.
232536079b2099e986853c82c874059a6bcd7602742digit@google.com */
233536079b2099e986853c82c874059a6bcd7602742digit@google.com#if defined(__has_attribute)
234536079b2099e986853c82c874059a6bcd7602742digit@google.com#   define SK_HAS_ATTRIBUTE(x) __has_attribute(x)
235536079b2099e986853c82c874059a6bcd7602742digit@google.com#elif defined(__GNUC__)
236536079b2099e986853c82c874059a6bcd7602742digit@google.com#   define SK_HAS_ATTRIBUTE(x) 1
237536079b2099e986853c82c874059a6bcd7602742digit@google.com#else
238536079b2099e986853c82c874059a6bcd7602742digit@google.com#   define SK_HAS_ATTRIBUTE(x) 0
239536079b2099e986853c82c874059a6bcd7602742digit@google.com#endif
240536079b2099e986853c82c874059a6bcd7602742digit@google.com
241536079b2099e986853c82c874059a6bcd7602742digit@google.com/**
242536079b2099e986853c82c874059a6bcd7602742digit@google.com * SK_ATTRIBUTE_OPTIMIZE_O1 can be used as a function attribute
243536079b2099e986853c82c874059a6bcd7602742digit@google.com * to specify individual optimization level of -O1, if the compiler
244536079b2099e986853c82c874059a6bcd7602742digit@google.com * supports it.
245536079b2099e986853c82c874059a6bcd7602742digit@google.com *
246536079b2099e986853c82c874059a6bcd7602742digit@google.com * NOTE: Clang/ARM (r161757) does not support the 'optimize' attribute.
247536079b2099e986853c82c874059a6bcd7602742digit@google.com */
248536079b2099e986853c82c874059a6bcd7602742digit@google.com#if SK_HAS_ATTRIBUTE(optimize)
249536079b2099e986853c82c874059a6bcd7602742digit@google.com#   define SK_ATTRIBUTE_OPTIMIZE_O1 __attribute__((optimize("O1")))
250536079b2099e986853c82c874059a6bcd7602742digit@google.com#else
251536079b2099e986853c82c874059a6bcd7602742digit@google.com#   define SK_ATTRIBUTE_OPTIMIZE_O1 /* nothing */
2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
254536079b2099e986853c82c874059a6bcd7602742digit@google.com#endif
255