mirror of https://github.com/opencv/opencv.git
Merge pull request #650 from taka-no-me:cvdef
commit
f510b49cc2
32 changed files with 511 additions and 387 deletions
@ -0,0 +1,424 @@ |
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef __OPENCV_CORE_CVDEF_H__ |
||||
#define __OPENCV_CORE_CVDEF_H__ |
||||
|
||||
#if !defined _CRT_SECURE_NO_DEPRECATE && defined _MSC_VER && _MSC_VER > 1300 |
||||
# define _CRT_SECURE_NO_DEPRECATE /* to avoid multiple Visual Studio warnings */ |
||||
#endif |
||||
|
||||
// undef problematic defines sometimes defined by system headers (windows.h in particular)
|
||||
#undef small |
||||
#undef min |
||||
#undef max |
||||
#undef abs |
||||
#undef Complex |
||||
|
||||
#if defined __ICL |
||||
# define CV_ICC __ICL |
||||
#elif defined __ICC |
||||
# define CV_ICC __ICC |
||||
#elif defined __ECL |
||||
# define CV_ICC __ECL |
||||
#elif defined __ECC |
||||
# define CV_ICC __ECC |
||||
#elif defined __INTEL_COMPILER |
||||
# define CV_ICC __INTEL_COMPILER |
||||
#endif |
||||
|
||||
#if defined CV_ICC && !defined CV_ENABLE_UNROLLED |
||||
# define CV_ENABLE_UNROLLED 0 |
||||
#else |
||||
# define CV_ENABLE_UNROLLED 1 |
||||
#endif |
||||
|
||||
#if (defined WIN32 || defined _WIN32 || defined WINCE) && defined CVAPI_EXPORTS |
||||
# define CV_EXPORTS __declspec(dllexport) |
||||
#else |
||||
# define CV_EXPORTS |
||||
#endif |
||||
|
||||
#ifndef CV_INLINE |
||||
# if defined __cplusplus |
||||
# define CV_INLINE static inline |
||||
# elif (defined WIN32 || defined _WIN32 || defined WINCE) && !defined __GNUC__ |
||||
# define CV_INLINE __inline |
||||
# else |
||||
# define CV_INLINE static |
||||
# endif |
||||
#endif |
||||
|
||||
#ifndef CV_EXTERN_C |
||||
# ifdef __cplusplus |
||||
# define CV_EXTERN_C extern "C" |
||||
# else |
||||
# define CV_EXTERN_C |
||||
# endif |
||||
#endif |
||||
|
||||
/* intrinsics support */ |
||||
#if defined __SSE2__ || defined _M_X64 || (defined _M_IX86_FP && _M_IX86_FP >= 2) |
||||
# include "emmintrin.h" |
||||
# define CV_SSE 1 |
||||
# define CV_SSE2 1 |
||||
# if defined __SSE3__ || (defined _MSC_VER && _MSC_VER >= 1500) |
||||
# include "pmmintrin.h" |
||||
# define CV_SSE3 1 |
||||
# endif |
||||
# if defined __SSSE3__ || (defined _MSC_VER && _MSC_VER >= 1500) |
||||
# include "tmmintrin.h" |
||||
# define CV_SSSE3 1 |
||||
# endif |
||||
# if defined __SSE4_1__ || (defined _MSC_VER && _MSC_VER >= 1500) |
||||
# include <smmintrin.h> |
||||
# define CV_SSE4_1 1 |
||||
# endif |
||||
# if defined __SSE4_2__ || (defined _MSC_VER && _MSC_VER >= 1500) |
||||
# include <nmmintrin.h> |
||||
# define CV_SSE4_2 1 |
||||
# endif |
||||
# if defined __AVX__ || (defined _MSC_FULL_VER && _MSC_FULL_VER >= 160040219) |
||||
// MS Visual Studio 2010 (2012?) has no macro pre-defined to identify the use of /arch:AVX
|
||||
// See: http://connect.microsoft.com/VisualStudio/feedback/details/605858/arch-avx-should-define-a-predefined-macro-in-x64-and-set-a-unique-value-for-m-ix86-fp-in-win32
|
||||
# include <immintrin.h> |
||||
# define CV_AVX 1 |
||||
# if defined(_XCR_XFEATURE_ENABLED_MASK) |
||||
# define __xgetbv() _xgetbv(_XCR_XFEATURE_ENABLED_MASK) |
||||
# else |
||||
# define __xgetbv() 0 |
||||
# endif |
||||
# endif |
||||
#endif |
||||
|
||||
#ifdef __ARM_NEON__ |
||||
# include <arm_neon.h> |
||||
# define CV_NEON 1 |
||||
#endif |
||||
|
||||
#ifndef CV_SSE |
||||
# define CV_SSE 0 |
||||
#endif |
||||
#ifndef CV_SSE2 |
||||
# define CV_SSE2 0 |
||||
#endif |
||||
#ifndef CV_SSE3 |
||||
# define CV_SSE3 0 |
||||
#endif |
||||
#ifndef CV_SSSE3 |
||||
# define CV_SSSE3 0 |
||||
#endif |
||||
#ifndef CV_SSE4_1 |
||||
# define CV_SSE4_1 0 |
||||
#endif |
||||
#ifndef CV_SSE4_2 |
||||
# define CV_SSE4_2 0 |
||||
#endif |
||||
#ifndef CV_AVX |
||||
# define CV_AVX 0 |
||||
#endif |
||||
#ifndef CV_NEON |
||||
# define CV_NEON 0 |
||||
#endif |
||||
|
||||
/* primitive types */ |
||||
/*
|
||||
schar - signed 1 byte integer |
||||
uchar - unsigned 1 byte integer |
||||
short - signed 2 byte integer |
||||
ushort - unsigned 2 byte integer |
||||
int - signed 4 byte integer |
||||
uint - unsigned 4 byte integer |
||||
int64 - signed 8 byte integer |
||||
uint64 - unsigned 8 byte integer |
||||
*/ |
||||
|
||||
#if !defined _MSC_VER && !defined __BORLANDC__ |
||||
# include <stdint.h> |
||||
#endif |
||||
|
||||
typedef signed char schar; |
||||
|
||||
#ifndef __IPL_H__ |
||||
typedef unsigned char uchar; |
||||
typedef unsigned short ushort; |
||||
#endif |
||||
|
||||
#if defined _MSC_VER || defined __BORLANDC__ |
||||
typedef __int64 int64; |
||||
typedef unsigned __int64 uint64; |
||||
# define CV_BIG_INT(n) n##I64 |
||||
# define CV_BIG_UINT(n) n##UI64 |
||||
#else |
||||
typedef int64_t int64; |
||||
typedef uint64_t uint64; |
||||
# define CV_BIG_INT(n) n##LL |
||||
# define CV_BIG_UINT(n) n##ULL |
||||
#endif |
||||
|
||||
/* special informative macros for wrapper generators */ |
||||
#define CV_EXPORTS_W CV_EXPORTS |
||||
#define CV_EXPORTS_W_SIMPLE CV_EXPORTS |
||||
#define CV_EXPORTS_AS(synonym) CV_EXPORTS |
||||
#define CV_EXPORTS_W_MAP CV_EXPORTS |
||||
#define CV_IN_OUT |
||||
#define CV_OUT |
||||
#define CV_PROP |
||||
#define CV_PROP_RW |
||||
#define CV_WRAP |
||||
#define CV_WRAP_AS(synonym) |
||||
|
||||
/* fundamental constants */ |
||||
#define CV_PI 3.1415926535897932384626433832795 |
||||
#define CV_LOG2 0.69314718055994530941723212145818 |
||||
|
||||
/****************************************************************************************\
|
||||
* Matrix type (Mat) * |
||||
\****************************************************************************************/ |
||||
|
||||
#define CV_CN_MAX 512 |
||||
#define CV_CN_SHIFT 3 |
||||
#define CV_DEPTH_MAX (1 << CV_CN_SHIFT) |
||||
|
||||
#define CV_8U 0 |
||||
#define CV_8S 1 |
||||
#define CV_16U 2 |
||||
#define CV_16S 3 |
||||
#define CV_32S 4 |
||||
#define CV_32F 5 |
||||
#define CV_64F 6 |
||||
#define CV_USRTYPE1 7 |
||||
|
||||
#define CV_MAT_DEPTH_MASK (CV_DEPTH_MAX - 1) |
||||
#define CV_MAT_DEPTH(flags) ((flags) & CV_MAT_DEPTH_MASK) |
||||
|
||||
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT)) |
||||
#define CV_MAKE_TYPE CV_MAKETYPE |
||||
|
||||
#define CV_8UC1 CV_MAKETYPE(CV_8U,1) |
||||
#define CV_8UC2 CV_MAKETYPE(CV_8U,2) |
||||
#define CV_8UC3 CV_MAKETYPE(CV_8U,3) |
||||
#define CV_8UC4 CV_MAKETYPE(CV_8U,4) |
||||
#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n)) |
||||
|
||||
#define CV_8SC1 CV_MAKETYPE(CV_8S,1) |
||||
#define CV_8SC2 CV_MAKETYPE(CV_8S,2) |
||||
#define CV_8SC3 CV_MAKETYPE(CV_8S,3) |
||||
#define CV_8SC4 CV_MAKETYPE(CV_8S,4) |
||||
#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n)) |
||||
|
||||
#define CV_16UC1 CV_MAKETYPE(CV_16U,1) |
||||
#define CV_16UC2 CV_MAKETYPE(CV_16U,2) |
||||
#define CV_16UC3 CV_MAKETYPE(CV_16U,3) |
||||
#define CV_16UC4 CV_MAKETYPE(CV_16U,4) |
||||
#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n)) |
||||
|
||||
#define CV_16SC1 CV_MAKETYPE(CV_16S,1) |
||||
#define CV_16SC2 CV_MAKETYPE(CV_16S,2) |
||||
#define CV_16SC3 CV_MAKETYPE(CV_16S,3) |
||||
#define CV_16SC4 CV_MAKETYPE(CV_16S,4) |
||||
#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n)) |
||||
|
||||
#define CV_32SC1 CV_MAKETYPE(CV_32S,1) |
||||
#define CV_32SC2 CV_MAKETYPE(CV_32S,2) |
||||
#define CV_32SC3 CV_MAKETYPE(CV_32S,3) |
||||
#define CV_32SC4 CV_MAKETYPE(CV_32S,4) |
||||
#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n)) |
||||
|
||||
#define CV_32FC1 CV_MAKETYPE(CV_32F,1) |
||||
#define CV_32FC2 CV_MAKETYPE(CV_32F,2) |
||||
#define CV_32FC3 CV_MAKETYPE(CV_32F,3) |
||||
#define CV_32FC4 CV_MAKETYPE(CV_32F,4) |
||||
#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n)) |
||||
|
||||
#define CV_64FC1 CV_MAKETYPE(CV_64F,1) |
||||
#define CV_64FC2 CV_MAKETYPE(CV_64F,2) |
||||
#define CV_64FC3 CV_MAKETYPE(CV_64F,3) |
||||
#define CV_64FC4 CV_MAKETYPE(CV_64F,4) |
||||
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n)) |
||||
|
||||
#define CV_MAT_CN_MASK ((CV_CN_MAX - 1) << CV_CN_SHIFT) |
||||
#define CV_MAT_CN(flags) ((((flags) & CV_MAT_CN_MASK) >> CV_CN_SHIFT) + 1) |
||||
#define CV_MAT_TYPE_MASK (CV_DEPTH_MAX*CV_CN_MAX - 1) |
||||
#define CV_MAT_TYPE(flags) ((flags) & CV_MAT_TYPE_MASK) |
||||
#define CV_MAT_CONT_FLAG_SHIFT 14 |
||||
#define CV_MAT_CONT_FLAG (1 << CV_MAT_CONT_FLAG_SHIFT) |
||||
#define CV_IS_MAT_CONT(flags) ((flags) & CV_MAT_CONT_FLAG) |
||||
#define CV_IS_CONT_MAT CV_IS_MAT_CONT |
||||
#define CV_SUBMAT_FLAG_SHIFT 15 |
||||
#define CV_SUBMAT_FLAG (1 << CV_SUBMAT_FLAG_SHIFT) |
||||
#define CV_IS_SUBMAT(flags) ((flags) & CV_MAT_SUBMAT_FLAG) |
||||
|
||||
/* Size of each channel item,
|
||||
0x124489 = 1000 0100 0100 0010 0010 0001 0001 ~ array of sizeof(arr_type_elem) */ |
||||
#define CV_ELEM_SIZE1(type) \ |
||||
((((sizeof(size_t)<<28)|0x8442211) >> CV_MAT_DEPTH(type)*4) & 15) |
||||
|
||||
/* 0x3a50 = 11 10 10 01 01 00 00 ~ array of log2(sizeof(arr_type_elem)) */ |
||||
#define CV_ELEM_SIZE(type) \ |
||||
(CV_MAT_CN(type) << ((((sizeof(size_t)/4+1)*16384|0x3a50) >> CV_MAT_DEPTH(type)*2) & 3)) |
||||
|
||||
|
||||
/****************************************************************************************\
|
||||
* fast math * |
||||
\****************************************************************************************/ |
||||
|
||||
#if defined __BORLANDC__ |
||||
# include <fastmath.h> |
||||
#else |
||||
# include <math.h> |
||||
#endif |
||||
|
||||
#ifdef HAVE_TEGRA_OPTIMIZATION |
||||
# include "tegra_round.hpp" |
||||
#endif |
||||
|
||||
CV_INLINE int cvRound( double value ) |
||||
{ |
||||
#if (defined _MSC_VER && defined _M_X64) || (defined __GNUC__ && defined __x86_64__ && defined __SSE2__ && !defined __APPLE__) |
||||
__m128d t = _mm_set_sd( value ); |
||||
return _mm_cvtsd_si32(t); |
||||
#elif defined _MSC_VER && defined _M_IX86 |
||||
int t; |
||||
__asm |
||||
{ |
||||
fld value; |
||||
fistp t; |
||||
} |
||||
return t; |
||||
#elif defined HAVE_LRINT || defined CV_ICC || defined __GNUC__ |
||||
# ifdef HAVE_TEGRA_OPTIMIZATION |
||||
TEGRA_ROUND(value); |
||||
# else |
||||
return (int)lrint(value); |
||||
# endif |
||||
#else |
||||
// while this is not IEEE754-compliant rounding, it's usually a good enough approximation
|
||||
return (int)(value + (value >= 0 ? 0.5 : -0.5)); |
||||
#endif |
||||
} |
||||
|
||||
CV_INLINE int cvFloor( double value ) |
||||
{ |
||||
#if defined _MSC_VER && defined _M_X64 || (defined __GNUC__ && defined __SSE2__ && !defined __APPLE__) |
||||
__m128d t = _mm_set_sd( value ); |
||||
int i = _mm_cvtsd_si32(t); |
||||
return i - _mm_movemask_pd(_mm_cmplt_sd(t, _mm_cvtsi32_sd(t,i))); |
||||
#elif defined __GNUC__ |
||||
int i = (int)value; |
||||
return i - (i > value); |
||||
#else |
||||
int i = cvRound(value); |
||||
float diff = (float)(value - i); |
||||
return i - (diff < 0); |
||||
#endif |
||||
} |
||||
|
||||
CV_INLINE int cvCeil( double value ) |
||||
{ |
||||
#if defined _MSC_VER && defined _M_X64 || (defined __GNUC__ && defined __SSE2__&& !defined __APPLE__) |
||||
__m128d t = _mm_set_sd( value ); |
||||
int i = _mm_cvtsd_si32(t); |
||||
return i + _mm_movemask_pd(_mm_cmplt_sd(_mm_cvtsi32_sd(t,i), t)); |
||||
#elif defined __GNUC__ |
||||
int i = (int)value; |
||||
return i + (i < value); |
||||
#else |
||||
int i = cvRound(value); |
||||
float diff = (float)(i - value); |
||||
return i + (diff < 0); |
||||
#endif |
||||
} |
||||
|
||||
CV_INLINE int cvIsNaN( double value ) |
||||
{ |
||||
union { uint64 u; double f; } ieee754; |
||||
ieee754.f = value; |
||||
return ((unsigned)(ieee754.u >> 32) & 0x7fffffff) + |
||||
((unsigned)ieee754.u != 0) > 0x7ff00000; |
||||
} |
||||
|
||||
CV_INLINE int cvIsInf( double value ) |
||||
{ |
||||
union { uint64 u; double f; } ieee754; |
||||
ieee754.f = value; |
||||
return ((unsigned)(ieee754.u >> 32) & 0x7fffffff) == 0x7ff00000 && |
||||
(unsigned)ieee754.u == 0; |
||||
} |
||||
|
||||
/****************************************************************************************\
|
||||
* exchange-add operation for atomic operations on reference counters * |
||||
\****************************************************************************************/ |
||||
|
||||
#if defined __INTEL_COMPILER && !(defined WIN32 || defined _WIN32) |
||||
// atomic increment on the linux version of the Intel(tm) compiler
|
||||
# define CV_XADD(addr, delta) (int)_InterlockedExchangeAdd(const_cast<void*>(reinterpret_cast<volatile void*>(addr)), delta) |
||||
#elif defined __GNUC__ |
||||
# if defined __clang__ && __clang_major__ >= 3 && !defined __ANDROID__ |
||||
# ifdef __ATOMIC_ACQ_REL |
||||
# define CV_XADD(addr, delta) __c11_atomic_fetch_add((_Atomic(int)*)(addr), delta, __ATOMIC_ACQ_REL) |
||||
# else |
||||
# define CV_XADD(addr, delta) __atomic_fetch_add((_Atomic(int)*)(addr), delta, 4) |
||||
# endif |
||||
# else |
||||
# ifdef __ATOMIC_ACQ_REL |
||||
// version for gcc >= 4.7
|
||||
# define CV_XADD(addr, delta) __atomic_fetch_add(addr, delta, __ATOMIC_ACQ_REL) |
||||
# else |
||||
# define CV_XADD(addr, delta) __sync_fetch_and_add(addr, delta) |
||||
# endif |
||||
# endif |
||||
#elif (defined WIN32 || defined _WIN32 || defined WINCE) && (!defined RC_INVOKED) |
||||
# if !defined(_M_AMD64) && !defined(_M_IA64) && !defined(_M_ARM) |
||||
CV_EXTERN_C __declspec(dllimport) long __stdcall InterlockedExchangeAdd(long volatile *Addend, long Value); |
||||
# define CV_XADD(addr, delta) (int)InterlockedExchangeAdd((long volatile*)addr, delta) |
||||
# else |
||||
CV_EXTERN_C long _InterlockedExchangeAdd (long volatile *Addend, long Value); |
||||
# pragma intrinsic(_InterlockedExchangeAdd) |
||||
# define CV_XADD(addr, delta) (int)_InterlockedExchangeAdd((long volatile*)addr, delta) |
||||
# endif |
||||
#else |
||||
CV_INLINE CV_XADD(int* addr, int delta) { int tmp = *addr; *addr += delta; return tmp; } |
||||
#endif |
||||
|
||||
#endif // __OPENCV_CORE_CVDEF_H__
|
Loading…
Reference in new issue