michael@0: michael@0: /* michael@0: * Copyright 2006 The Android Open Source Project michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: michael@0: #ifndef SkPreConfig_DEFINED michael@0: #define SkPreConfig_DEFINED michael@0: michael@0: #ifdef WEBKIT_VERSION_MIN_REQUIRED michael@0: #include "config.h" michael@0: #endif michael@0: michael@0: // Allows embedders that want to disable macros that take arguments to just michael@0: // define that symbol to be one of these michael@0: // michael@0: #define SK_NOTHING_ARG1(arg1) michael@0: #define SK_NOTHING_ARG2(arg1, arg2) michael@0: #define SK_NOTHING_ARG3(arg1, arg2, arg3) michael@0: michael@0: ////////////////////////////////////////////////////////////////////// michael@0: michael@0: #if !defined(SK_BUILD_FOR_ANDROID) && !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) && !defined(SK_BUILD_FOR_NACL) michael@0: michael@0: #ifdef __APPLE__ michael@0: #include "TargetConditionals.h" michael@0: #endif michael@0: michael@0: #if defined(PALMOS_SDK_VERSION) michael@0: #define SK_BUILD_FOR_PALM michael@0: #elif defined(UNDER_CE) michael@0: #define SK_BUILD_FOR_WINCE michael@0: #elif defined(WIN32) michael@0: #define SK_BUILD_FOR_WIN32 michael@0: #elif defined(__SYMBIAN32__) michael@0: #define SK_BUILD_FOR_WIN32 michael@0: #elif defined(ANDROID) michael@0: #define SK_BUILD_FOR_ANDROID michael@0: #elif defined(linux) || defined(__FreeBSD__) || defined(__OpenBSD__) || \ michael@0: defined(__sun) || defined(__NetBSD__) || defined(__DragonFly__) || \ michael@0: defined(__GLIBC__) || defined(__GNU__) michael@0: #define SK_BUILD_FOR_UNIX michael@0: #elif TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR michael@0: #define SK_BUILD_FOR_IOS michael@0: #else michael@0: #define SK_BUILD_FOR_MAC michael@0: #endif michael@0: michael@0: #endif michael@0: michael@0: /* Even if the user only defined the framework variant we still need to build michael@0: * the default (NDK-compliant) Android code. Therefore, when attempting to michael@0: * include/exclude something from the framework variant check first that we are michael@0: * building for Android then check the status of the framework define. michael@0: */ michael@0: #if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) && !defined(SK_BUILD_FOR_ANDROID) michael@0: #define SK_BUILD_FOR_ANDROID michael@0: #endif michael@0: michael@0: ////////////////////////////////////////////////////////////////////// michael@0: michael@0: #if !defined(SK_DEBUG) && !defined(SK_RELEASE) michael@0: #ifdef NDEBUG michael@0: #define SK_RELEASE michael@0: #else michael@0: #define SK_DEBUG michael@0: #endif michael@0: #endif michael@0: michael@0: #ifdef SK_BUILD_FOR_WIN32 michael@0: #if !defined(SK_RESTRICT) michael@0: #define SK_RESTRICT __restrict michael@0: #endif michael@0: #if !defined(SK_WARN_UNUSED_RESULT) michael@0: #define SK_WARN_UNUSED_RESULT michael@0: #endif michael@0: #endif michael@0: michael@0: ////////////////////////////////////////////////////////////////////// michael@0: michael@0: #if !defined(SK_RESTRICT) michael@0: #define SK_RESTRICT __restrict__ michael@0: #endif michael@0: michael@0: #if !defined(SK_WARN_UNUSED_RESULT) michael@0: #define SK_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) michael@0: #endif michael@0: michael@0: ////////////////////////////////////////////////////////////////////// michael@0: michael@0: #if !defined(SK_CPU_BENDIAN) && !defined(SK_CPU_LENDIAN) michael@0: #if defined (__ppc__) || defined(__PPC__) || defined(__ppc64__) \ michael@0: || defined(__PPC64__) michael@0: #define SK_CPU_BENDIAN michael@0: #else michael@0: #define SK_CPU_LENDIAN michael@0: #endif michael@0: #endif michael@0: michael@0: ////////////////////////////////////////////////////////////////////// michael@0: michael@0: /** michael@0: * SK_CPU_SSE_LEVEL michael@0: * michael@0: * If defined, SK_CPU_SSE_LEVEL should be set to the highest supported level. michael@0: * On non-intel CPU this should be undefined. michael@0: */ michael@0: michael@0: #define SK_CPU_SSE_LEVEL_SSE1 10 michael@0: #define SK_CPU_SSE_LEVEL_SSE2 20 michael@0: #define SK_CPU_SSE_LEVEL_SSE3 30 michael@0: #define SK_CPU_SSE_LEVEL_SSSE3 31 michael@0: michael@0: // Are we in GCC? michael@0: #ifndef SK_CPU_SSE_LEVEL michael@0: // These checks must be done in descending order to ensure we set the highest michael@0: // available SSE level. michael@0: #if defined(__SSSE3__) michael@0: #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSSE3 michael@0: #elif defined(__SSE3__) michael@0: #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE3 michael@0: #elif defined(__SSE2__) michael@0: #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2 michael@0: #endif michael@0: #endif michael@0: michael@0: // Are we in VisualStudio? michael@0: #ifndef SK_CPU_SSE_LEVEL michael@0: // These checks must be done in descending order to ensure we set the highest michael@0: // available SSE level. michael@0: #if defined (_M_IX86_FP) michael@0: #if _M_IX86_FP >= 2 michael@0: #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE2 michael@0: #elif _M_IX86_FP == 1 michael@0: #define SK_CPU_SSE_LEVEL SK_CPU_SSE_LEVEL_SSE1 michael@0: #endif michael@0: #endif michael@0: #endif michael@0: michael@0: ////////////////////////////////////////////////////////////////////// michael@0: // ARM defines michael@0: michael@0: #if defined(__arm__) && (!defined(__APPLE__) || !TARGET_IPHONE_SIMULATOR) michael@0: #define SK_CPU_ARM michael@0: michael@0: #if defined(__GNUC__) michael@0: #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ michael@0: || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ michael@0: || defined(__ARM_ARCH_7EM__) || defined(_ARM_ARCH_7) michael@0: #define SK_ARM_ARCH 7 michael@0: #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ michael@0: || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \ michael@0: || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \ michael@0: || defined(__ARM_ARCH_6M__) || defined(_ARM_ARCH_6) michael@0: #define SK_ARM_ARCH 6 michael@0: #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \ michael@0: || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \ michael@0: || defined(__ARM_ARCH_5TEJ__) || defined(_ARM_ARCH_5) michael@0: #define SK_ARM_ARCH 5 michael@0: #elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) || defined(_ARM_ARCH_4) michael@0: #define SK_ARM_ARCH 4 michael@0: #else michael@0: #define SK_ARM_ARCH 3 michael@0: #endif michael@0: michael@0: #if defined(__thumb2__) && (SK_ARM_ARCH >= 6) \ michael@0: || !defined(__thumb__) && ((SK_ARM_ARCH > 5) || defined(__ARM_ARCH_5E__) \ michael@0: || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__)) michael@0: #define SK_ARM_HAS_EDSP michael@0: #endif michael@0: #endif michael@0: #endif michael@0: michael@0: ////////////////////////////////////////////////////////////////////// michael@0: michael@0: #if !defined(SKIA_IMPLEMENTATION) michael@0: #define SKIA_IMPLEMENTATION 0 michael@0: #endif michael@0: michael@0: #if defined(SKIA_DLL) michael@0: #if defined(WIN32) michael@0: #if SKIA_IMPLEMENTATION michael@0: #define SK_API __declspec(dllexport) michael@0: #else michael@0: #define SK_API __declspec(dllimport) michael@0: #endif michael@0: #else michael@0: #define SK_API __attribute__((visibility("default"))) michael@0: #endif michael@0: #else michael@0: #define SK_API michael@0: #endif michael@0: michael@0: ////////////////////////////////////////////////////////////////////// michael@0: michael@0: /** michael@0: * Use SK_PURE_FUNC as an attribute to indicate that a function's michael@0: * return value only depends on the value of its parameters. This michael@0: * can help the compiler optimize out successive calls. michael@0: * michael@0: * Usage: michael@0: * void function(int params) SK_PURE_FUNC; michael@0: */ michael@0: #if defined(__GNUC__) michael@0: # define SK_PURE_FUNC __attribute__((pure)) michael@0: #else michael@0: # define SK_PURE_FUNC /* nothing */ michael@0: #endif michael@0: michael@0: ////////////////////////////////////////////////////////////////////// michael@0: michael@0: /** michael@0: * SK_HAS_ATTRIBUTE() should return true iff the compiler michael@0: * supports __attribute__(()). Mostly important because michael@0: * Clang doesn't support all of GCC attributes. michael@0: */ michael@0: #if defined(__has_attribute) michael@0: # define SK_HAS_ATTRIBUTE(x) __has_attribute(x) michael@0: #elif defined(__GNUC__) michael@0: # define SK_HAS_ATTRIBUTE(x) 1 michael@0: #else michael@0: # define SK_HAS_ATTRIBUTE(x) 0 michael@0: #endif michael@0: michael@0: /** michael@0: * SK_ATTRIBUTE_OPTIMIZE_O1 can be used as a function attribute michael@0: * to specify individual optimization level of -O1, if the compiler michael@0: * supports it. michael@0: * michael@0: * NOTE: Clang/ARM (r161757) does not support the 'optimize' attribute. michael@0: */ michael@0: #if SK_HAS_ATTRIBUTE(optimize) michael@0: # define SK_ATTRIBUTE_OPTIMIZE_O1 __attribute__((optimize("O1"))) michael@0: #else michael@0: # define SK_ATTRIBUTE_OPTIMIZE_O1 /* nothing */ michael@0: #endif michael@0: michael@0: #endif