Home | History | Annotate | Download | only in core
      1 
      2 /*
      3  * Copyright 2006 The Android Open Source Project
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 
     10 #ifndef SkPreConfig_DEFINED
     11 #define SkPreConfig_DEFINED
     12 
     13 #ifdef WEBKIT_VERSION_MIN_REQUIRED
     14     #include "config.h"
     15 #endif
     16 
     17 //////////////////////////////////////////////////////////////////////
     18 
     19 #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)
     20 
     21     #ifdef __APPLE__
     22         #include "TargetConditionals.h"
     23     #endif
     24 
     25     #if defined(PALMOS_SDK_VERSION)
     26         #define SK_BUILD_FOR_PALM
     27     #elif defined(UNDER_CE)
     28         #define SK_BUILD_FOR_WINCE
     29     #elif defined(WIN32)
     30         #define SK_BUILD_FOR_WIN32
     31     #elif defined(__SYMBIAN32__)
     32         #define SK_BUILD_FOR_WIN32
     33     #elif defined(ANDROID)
     34         #define SK_BUILD_FOR_ANDROID
     35     #elif defined(linux) || defined(__FreeBSD__) || defined(__OpenBSD__) || \
     36           defined(__sun) || defined(__NetBSD__) || defined(__DragonFly__) || \
     37           defined(__GLIBC__) || defined(__GNU__)
     38         #define SK_BUILD_FOR_UNIX
     39     #elif TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
     40         #define SK_BUILD_FOR_IOS
     41     #else
     42         #define SK_BUILD_FOR_MAC
     43     #endif
     44 
     45 #endif
     46 
     47 /* Even if the user only defined the framework variant we still need to build
     48  * the default (NDK-compliant) Android code. Therefore, when attempting to
     49  * include/exclude something from the framework variant check first that we are
     50  * building for Android then check the status of the framework define.
     51  */
     52 #if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) && !defined(SK_BUILD_FOR_ANDROID)
     53     #define SK_BUILD_FOR_ANDROID
     54 #endif
     55 
     56 
     57 // USE_CHROMIUM_SKIA is defined when building Skia for the Chromium
     58 // browser.
     59 #if defined(USE_CHROMIUM_SKIA)
     60     #define SK_BUILD_FOR_CHROMIUM
     61 #endif
     62 
     63 //////////////////////////////////////////////////////////////////////
     64 
     65 #if !defined(SK_DEBUG) && !defined(SK_RELEASE)
     66     #ifdef NDEBUG
     67         #define SK_RELEASE
     68     #else
     69         #define SK_DEBUG
     70     #endif
     71 #endif
     72 
     73 #ifdef SK_BUILD_FOR_WIN32
     74     #if !defined(SK_RESTRICT)
     75         #define SK_RESTRICT __restrict
     76     #endif
     77     #if !defined(SK_WARN_UNUSED_RESULT)
     78         #define SK_WARN_UNUSED_RESULT
     79     #endif
     80     #include "sk_stdint.h"
     81 #endif
     82 
     83 //////////////////////////////////////////////////////////////////////
     84 
     85 #if !defined(SK_RESTRICT)
     86     #define SK_RESTRICT __restrict__
     87 #endif
     88 
     89 #if !defined(SK_WARN_UNUSED_RESULT)
     90     #define SK_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
     91 #endif
     92 
     93 //////////////////////////////////////////////////////////////////////
     94 
     95 #if !defined(SK_SCALAR_IS_FLOAT) && !defined(SK_SCALAR_IS_FIXED)
     96     #define SK_SCALAR_IS_FLOAT
     97 #endif
     98 
     99 //////////////////////////////////////////////////////////////////////
    100 
    101 #if !defined(SK_CPU_BENDIAN) && !defined(SK_CPU_LENDIAN)
    102     #if defined (__ppc__) || defined(__PPC__) || defined(__ppc64__) \
    103         || defined(__PPC64__)
    104         #define SK_CPU_BENDIAN
    105     #else
    106         #define SK_CPU_LENDIAN
    107     #endif
    108 #endif
    109 
    110 //////////////////////////////////////////////////////////////////////
    111 
    112 #ifndef SK_MMAP_SUPPORT
    113     #ifdef SK_BUILD_FOR_WIN32
    114         // by default, if we're windows, we assume we don't have mmap
    115         #define SK_MMAP_SUPPORT 0
    116     #else
    117         #define SK_MMAP_SUPPORT 1
    118     #endif
    119 #endif
    120 
    121 //////////////////////////////////////////////////////////////////////
    122 
    123 /**
    124  *  SK_CPU_SSE_LEVEL
    125  *
    126  *  If defined, SK_CPU_SSE_LEVEL should be set to the highest supported level.
    127  *  On non-intel CPU this should be undefined.
    128  */
    129 
    130 #define SK_CPU_SSE_LEVEL_SSE1     10
    131 #define SK_CPU_SSE_LEVEL_SSE2     20
    132 #define SK_CPU_SSE_LEVEL_SSE3     30
    133 #define SK_CPU_SSE_LEVEL_SSSE3    31
    134 
    135 // Are we in GCC?
    136 #ifndef SK_CPU_SSE_LEVEL
    137     #if defined(__SSE2__)
    138         #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE2
    139     #elif defined(__SSE3__)
    140         #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE3
    141     #elif defined(__SSSE3__)
    142         #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSSE3
    143     #endif
    144 #endif
    145 
    146 // Are we in VisualStudio?
    147 #ifndef SK_CPU_SSE_LEVEL
    148     #if _M_IX86_FP == 1
    149         #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE1
    150     #elif _M_IX86_FP >= 2
    151         #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE2
    152     #endif
    153 #endif
    154 
    155 // 64bit intel guarantees at least SSE2
    156 #if defined(__x86_64__) || defined(_WIN64)
    157     #if !defined(SK_CPU_SSE_LEVEL) || (SK_CPU_SSE_LEVEL < SK_CPU_SSE_LEVEL_SSE2)
    158         #undef SK_CPU_SSE_LEVEL
    159         #define SK_CPU_SSE_LEVEL    SK_CPU_SSE_LEVEL_SSE2
    160     #endif
    161 #endif
    162 
    163 //////////////////////////////////////////////////////////////////////
    164 // ARM defines
    165 
    166 #if defined(__arm__) && (!defined(__APPLE__) || !TARGET_IPHONE_SIMULATOR)
    167     #define SK_CPU_ARM
    168 
    169     #if defined(__GNUC__)
    170         #if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
    171                 || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
    172                 || defined(__ARM_ARCH_7EM__) || defined(_ARM_ARCH_7)
    173             #define SK_ARM_ARCH 7
    174         #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
    175                 || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \
    176                 || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \
    177                 || defined(__ARM_ARCH_6M__) || defined(_ARM_ARCH_6)
    178             #define SK_ARM_ARCH 6
    179         #elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \
    180                 || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \
    181                 || defined(__ARM_ARCH_5TEJ__) || defined(_ARM_ARCH_5)
    182             #define SK_ARM_ARCH 5
    183         #elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) || defined(_ARM_ARCH_4)
    184             #define SK_ARM_ARCH 4
    185         #else
    186             #define SK_ARM_ARCH 3
    187         #endif
    188 
    189         #if defined(__thumb2__) && (SK_ARM_ARCH >= 6) \
    190                 || !defined(__thumb__) && ((SK_ARM_ARCH > 5) || defined(__ARM_ARCH_5E__) \
    191                 || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__))
    192             #define SK_ARM_HAS_EDSP
    193         #endif
    194     #endif
    195 #endif
    196 
    197 //////////////////////////////////////////////////////////////////////
    198 
    199 #if !defined(SKIA_IMPLEMENTATION)
    200     #define SKIA_IMPLEMENTATION 0
    201 #endif
    202 
    203 #if defined(SKIA_DLL)
    204     #if defined(WIN32)
    205         #if SKIA_IMPLEMENTATION
    206             #define SK_API __declspec(dllexport)
    207         #else
    208             #define SK_API __declspec(dllimport)
    209         #endif
    210     #else
    211         #define SK_API __attribute__((visibility("default")))
    212     #endif
    213 #else
    214     #define SK_API
    215 #endif
    216 
    217 //////////////////////////////////////////////////////////////////////
    218 
    219 /**
    220  * Use SK_PURE_FUNC as an attribute to indicate that a function's
    221  * return value only depends on the value of its parameters. This
    222  * can help the compiler optimize out successive calls.
    223  *
    224  * Usage:
    225  *      void  function(int params)  SK_PURE_FUNC;
    226  */
    227 #if defined(__GNUC__)
    228 #  define  SK_PURE_FUNC  __attribute__((pure))
    229 #else
    230 #  define  SK_PURE_FUNC  /* nothing */
    231 #endif
    232 
    233 //////////////////////////////////////////////////////////////////////
    234 
    235 /**
    236  * SK_HAS_ATTRIBUTE(<name>) should return true iff the compiler
    237  * supports __attribute__((<name>)). Mostly important because
    238  * Clang doesn't support all of GCC attributes.
    239  */
    240 #if defined(__has_attribute)
    241 #   define SK_HAS_ATTRIBUTE(x) __has_attribute(x)
    242 #elif defined(__GNUC__)
    243 #   define SK_HAS_ATTRIBUTE(x) 1
    244 #else
    245 #   define SK_HAS_ATTRIBUTE(x) 0
    246 #endif
    247 
    248 /**
    249  * SK_ATTRIBUTE_OPTIMIZE_O1 can be used as a function attribute
    250  * to specify individual optimization level of -O1, if the compiler
    251  * supports it.
    252  *
    253  * NOTE: Clang/ARM (r161757) does not support the 'optimize' attribute.
    254  */
    255 #if SK_HAS_ATTRIBUTE(optimize)
    256 #   define SK_ATTRIBUTE_OPTIMIZE_O1 __attribute__((optimize("O1")))
    257 #else
    258 #   define SK_ATTRIBUTE_OPTIMIZE_O1 /* nothing */
    259 #endif
    260 
    261 #endif
    262