Home | History | Annotate | Download | only in core
      1 /*M///////////////////////////////////////////////////////////////////////////////////////
      2 //
      3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
      4 //
      5 //  By downloading, copying, installing or using the software you agree to this license.
      6 //  If you do not agree to this license, do not download, install,
      7 //  copy or use the software.
      8 //
      9 //
     10 //                          License Agreement
     11 //                For Open Source Computer Vision Library
     12 //
     13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
     14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
     15 // Copyright (C) 2013, OpenCV Foundation, all rights reserved.
     16 // Copyright (C) 2015, Itseez Inc., all rights reserved.
     17 // Third party copyrights are property of their respective owners.
     18 //
     19 // Redistribution and use in source and binary forms, with or without modification,
     20 // are permitted provided that the following conditions are met:
     21 //
     22 //   * Redistribution's of source code must retain the above copyright notice,
     23 //     this list of conditions and the following disclaimer.
     24 //
     25 //   * Redistribution's in binary form must reproduce the above copyright notice,
     26 //     this list of conditions and the following disclaimer in the documentation
     27 //     and/or other materials provided with the distribution.
     28 //
     29 //   * The name of the copyright holders may not be used to endorse or promote products
     30 //     derived from this software without specific prior written permission.
     31 //
     32 // This software is provided by the copyright holders and contributors "as is" and
     33 // any express or implied warranties, including, but not limited to, the implied
     34 // warranties of merchantability and fitness for a particular purpose are disclaimed.
     35 // In no event shall the Intel Corporation or contributors be liable for any direct,
     36 // indirect, incidental, special, exemplary, or consequential damages
     37 // (including, but not limited to, procurement of substitute goods or services;
     38 // loss of use, data, or profits; or business interruption) however caused
     39 // and on any theory of liability, whether in contract, strict liability,
     40 // or tort (including negligence or otherwise) arising in any way out of
     41 // the use of this software, even if advised of the possibility of such damage.
     42 //
     43 //M*/
     44 
     45 #ifndef __OPENCV_CORE_CVDEF_H__
     46 #define __OPENCV_CORE_CVDEF_H__
     47 
     48 #if !defined _CRT_SECURE_NO_DEPRECATE && defined _MSC_VER && _MSC_VER > 1300
     49 #  define _CRT_SECURE_NO_DEPRECATE /* to avoid multiple Visual Studio warnings */
     50 #endif
     51 
     52 // undef problematic defines sometimes defined by system headers (windows.h in particular)
     53 #undef small
     54 #undef min
     55 #undef max
     56 #undef abs
     57 #undef Complex
     58 
     59 #include "opencv2/hal/defs.h"
     60 
     61 #ifdef __OPENCV_BUILD
     62 #  define DISABLE_OPENCV_24_COMPATIBILITY
     63 #endif
     64 
     65 #if (defined WIN32 || defined _WIN32 || defined WINCE || defined __CYGWIN__) && defined CVAPI_EXPORTS
     66 #  define CV_EXPORTS __declspec(dllexport)
     67 #elif defined __GNUC__ && __GNUC__ >= 4
     68 #  define CV_EXPORTS __attribute__ ((visibility ("default")))
     69 #else
     70 #  define CV_EXPORTS
     71 #endif
     72 
     73 #ifndef CV_EXTERN_C
     74 #  ifdef __cplusplus
     75 #    define CV_EXTERN_C extern "C"
     76 #  else
     77 #    define CV_EXTERN_C
     78 #  endif
     79 #endif
     80 
     81 /* special informative macros for wrapper generators */
     82 #define CV_EXPORTS_W CV_EXPORTS
     83 #define CV_EXPORTS_W_SIMPLE CV_EXPORTS
     84 #define CV_EXPORTS_AS(synonym) CV_EXPORTS
     85 #define CV_EXPORTS_W_MAP CV_EXPORTS
     86 #define CV_IN_OUT
     87 #define CV_OUT
     88 #define CV_PROP
     89 #define CV_PROP_RW
     90 #define CV_WRAP
     91 #define CV_WRAP_AS(synonym)
     92 
     93 /****************************************************************************************\
     94 *                                  Matrix type (Mat)                                     *
     95 \****************************************************************************************/
     96 
     97 #define CV_CN_MAX     512
     98 #define CV_CN_SHIFT   3
     99 #define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)
    100 
    101 #define CV_8U   0
    102 #define CV_8S   1
    103 #define CV_16U  2
    104 #define CV_16S  3
    105 #define CV_32S  4
    106 #define CV_32F  5
    107 #define CV_64F  6
    108 #define CV_USRTYPE1 7
    109 
    110 #define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)
    111 #define CV_MAT_DEPTH(flags)     ((flags) & CV_MAT_DEPTH_MASK)
    112 
    113 #define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
    114 #define CV_MAKE_TYPE CV_MAKETYPE
    115 
    116 #define CV_8UC1 CV_MAKETYPE(CV_8U,1)
    117 #define CV_8UC2 CV_MAKETYPE(CV_8U,2)
    118 #define CV_8UC3 CV_MAKETYPE(CV_8U,3)
    119 #define CV_8UC4 CV_MAKETYPE(CV_8U,4)
    120 #define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))
    121 
    122 #define CV_8SC1 CV_MAKETYPE(CV_8S,1)
    123 #define CV_8SC2 CV_MAKETYPE(CV_8S,2)
    124 #define CV_8SC3 CV_MAKETYPE(CV_8S,3)
    125 #define CV_8SC4 CV_MAKETYPE(CV_8S,4)
    126 #define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))
    127 
    128 #define CV_16UC1 CV_MAKETYPE(CV_16U,1)
    129 #define CV_16UC2 CV_MAKETYPE(CV_16U,2)
    130 #define CV_16UC3 CV_MAKETYPE(CV_16U,3)
    131 #define CV_16UC4 CV_MAKETYPE(CV_16U,4)
    132 #define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))
    133 
    134 #define CV_16SC1 CV_MAKETYPE(CV_16S,1)
    135 #define CV_16SC2 CV_MAKETYPE(CV_16S,2)
    136 #define CV_16SC3 CV_MAKETYPE(CV_16S,3)
    137 #define CV_16SC4 CV_MAKETYPE(CV_16S,4)
    138 #define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))
    139 
    140 #define CV_32SC1 CV_MAKETYPE(CV_32S,1)
    141 #define CV_32SC2 CV_MAKETYPE(CV_32S,2)
    142 #define CV_32SC3 CV_MAKETYPE(CV_32S,3)
    143 #define CV_32SC4 CV_MAKETYPE(CV_32S,4)
    144 #define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))
    145 
    146 #define CV_32FC1 CV_MAKETYPE(CV_32F,1)
    147 #define CV_32FC2 CV_MAKETYPE(CV_32F,2)
    148 #define CV_32FC3 CV_MAKETYPE(CV_32F,3)
    149 #define CV_32FC4 CV_MAKETYPE(CV_32F,4)
    150 #define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))
    151 
    152 #define CV_64FC1 CV_MAKETYPE(CV_64F,1)
    153 #define CV_64FC2 CV_MAKETYPE(CV_64F,2)
    154 #define CV_64FC3 CV_MAKETYPE(CV_64F,3)
    155 #define CV_64FC4 CV_MAKETYPE(CV_64F,4)
    156 #define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))
    157 
    158 #define CV_MAT_CN_MASK          ((CV_CN_MAX - 1) << CV_CN_SHIFT)
    159 #define CV_MAT_CN(flags)        ((((flags) & CV_MAT_CN_MASK) >> CV_CN_SHIFT) + 1)
    160 #define CV_MAT_TYPE_MASK        (CV_DEPTH_MAX*CV_CN_MAX - 1)
    161 #define CV_MAT_TYPE(flags)      ((flags) & CV_MAT_TYPE_MASK)
    162 #define CV_MAT_CONT_FLAG_SHIFT  14
    163 #define CV_MAT_CONT_FLAG        (1 << CV_MAT_CONT_FLAG_SHIFT)
    164 #define CV_IS_MAT_CONT(flags)   ((flags) & CV_MAT_CONT_FLAG)
    165 #define CV_IS_CONT_MAT          CV_IS_MAT_CONT
    166 #define CV_SUBMAT_FLAG_SHIFT    15
    167 #define CV_SUBMAT_FLAG          (1 << CV_SUBMAT_FLAG_SHIFT)
    168 #define CV_IS_SUBMAT(flags)     ((flags) & CV_MAT_SUBMAT_FLAG)
    169 
    170 /* Size of each channel item,
    171    0x124489 = 1000 0100 0100 0010 0010 0001 0001 ~ array of sizeof(arr_type_elem) */
    172 #define CV_ELEM_SIZE1(type) \
    173     ((((sizeof(size_t)<<28)|0x8442211) >> CV_MAT_DEPTH(type)*4) & 15)
    174 
    175 /* 0x3a50 = 11 10 10 01 01 00 00 ~ array of log2(sizeof(arr_type_elem)) */
    176 #define CV_ELEM_SIZE(type) \
    177     (CV_MAT_CN(type) << ((((sizeof(size_t)/4+1)*16384|0x3a50) >> CV_MAT_DEPTH(type)*2) & 3))
    178 
    179 #ifndef MIN
    180 #  define MIN(a,b)  ((a) > (b) ? (b) : (a))
    181 #endif
    182 
    183 #ifndef MAX
    184 #  define MAX(a,b)  ((a) < (b) ? (b) : (a))
    185 #endif
    186 
    187 /****************************************************************************************\
    188 *          exchange-add operation for atomic operations on reference counters            *
    189 \****************************************************************************************/
    190 
    191 #if defined __INTEL_COMPILER && !(defined WIN32 || defined _WIN32)
    192    // atomic increment on the linux version of the Intel(tm) compiler
    193 #  define CV_XADD(addr, delta) (int)_InterlockedExchangeAdd(const_cast<void*>(reinterpret_cast<volatile void*>(addr)), delta)
    194 #elif defined __GNUC__
    195 #  if defined __clang__ && __clang_major__ >= 3 && !defined __ANDROID__ && !defined __EMSCRIPTEN__ && !defined(__CUDACC__)
    196 #    ifdef __ATOMIC_ACQ_REL
    197 #      define CV_XADD(addr, delta) __c11_atomic_fetch_add((_Atomic(int)*)(addr), delta, __ATOMIC_ACQ_REL)
    198 #    else
    199 #      define CV_XADD(addr, delta) __atomic_fetch_add((_Atomic(int)*)(addr), delta, 4)
    200 #    endif
    201 #  else
    202 #    if defined __ATOMIC_ACQ_REL && !defined __clang__
    203        // version for gcc >= 4.7
    204 #      define CV_XADD(addr, delta) (int)__atomic_fetch_add((unsigned*)(addr), (unsigned)(delta), __ATOMIC_ACQ_REL)
    205 #    else
    206 #      define CV_XADD(addr, delta) (int)__sync_fetch_and_add((unsigned*)(addr), (unsigned)(delta))
    207 #    endif
    208 #  endif
    209 #elif defined _MSC_VER && !defined RC_INVOKED
    210 #  include <intrin.h>
    211 #  define CV_XADD(addr, delta) (int)_InterlockedExchangeAdd((long volatile*)addr, delta)
    212 #else
    213    CV_INLINE CV_XADD(int* addr, int delta) { int tmp = *addr; *addr += delta; return tmp; }
    214 #endif
    215 
    216 
    217 /****************************************************************************************\
    218 *                                  CV_NORETURN attribute                                 *
    219 \****************************************************************************************/
    220 
    221 #ifndef CV_NORETURN
    222 #  if defined(__GNUC__)
    223 #    define CV_NORETURN __attribute__((__noreturn__))
    224 #  elif defined(_MSC_VER) && (_MSC_VER >= 1300)
    225 #    define CV_NORETURN __declspec(noreturn)
    226 #  else
    227 #    define CV_NORETURN /* nothing by default */
    228 #  endif
    229 #endif
    230 
    231 #endif // __OPENCV_CORE_CVDEF_H__
    232