123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923 |
- /*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.
- //
- //
- // Intel License Agreement
- // For Open Source Computer Vision Library
- //
- // Copyright (C) 2000, Intel Corporation, 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 Intel Corporation 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*/
- /* The header is mostly for internal use and it is likely to change.
- It contains some macro definitions that are used in cxcore, cv, cvaux
- and, probably, other libraries. If you need some of this functionality,
- the safe way is to copy it into your code and rename the macros.
- */
- #ifndef _CXCORE_MISC_H_
- #define _CXCORE_MISC_H_
- #ifdef HAVE_CONFIG_H
- #include "cvconfig.h"
- #endif
- #include <limits.h>
- #ifdef _OPENMP
- #include "omp.h"
- #endif
- /****************************************************************************************\
- * Compile-time tuning parameters *
- \****************************************************************************************/
- /* maximal size of vector to run matrix operations on it inline (i.e. w/o ipp calls) */
- #define CV_MAX_INLINE_MAT_OP_SIZE 10
- /* maximal linear size of matrix to allocate it on stack. */
- #define CV_MAX_LOCAL_MAT_SIZE 32
- /* maximal size of local memory storage */
- #define CV_MAX_LOCAL_SIZE \
- (CV_MAX_LOCAL_MAT_SIZE*CV_MAX_LOCAL_MAT_SIZE*(int)sizeof(double))
- /* default image row align (in bytes) */
- #define CV_DEFAULT_IMAGE_ROW_ALIGN 4
- /* matrices are continuous by default */
- #define CV_DEFAULT_MAT_ROW_ALIGN 1
- /* maximum size of dynamic memory buffer.
- cvAlloc reports an error if a larger block is requested. */
- #define CV_MAX_ALLOC_SIZE (((size_t)1 << (sizeof(size_t)*8-2)))
- /* the alignment of all the allocated buffers */
- #define CV_MALLOC_ALIGN 32
- /* default alignment for dynamic data strucutures, resided in storages. */
- #define CV_STRUCT_ALIGN ((int)sizeof(double))
- /* default storage block size */
- #define CV_STORAGE_BLOCK_SIZE ((1<<16) - 128)
- /* default memory block for sparse array elements */
- #define CV_SPARSE_MAT_BLOCK (1<<12)
- /* initial hash table size */
- #define CV_SPARSE_HASH_SIZE0 (1<<10)
- /* maximal average node_count/hash_size ratio beyond which hash table is resized */
- #define CV_SPARSE_HASH_RATIO 3
- /* max length of strings */
- #define CV_MAX_STRLEN 1024
- /* maximum possible number of threads in parallel implementations */
- #ifdef _OPENMP
- #define CV_MAX_THREADS 128
- #else
- #define CV_MAX_THREADS 1
- #endif
- #if 0 /*def CV_CHECK_FOR_NANS*/
- #define CV_CHECK_NANS( arr ) cvCheckArray((arr))
- #else
- #define CV_CHECK_NANS( arr )
- #endif
- /****************************************************************************************\
- * Common declarations *
- \****************************************************************************************/
- /* get alloca declaration */
- #ifdef __GNUC__
- #undef alloca
- #define alloca __builtin_alloca
- #elif defined WIN32 || defined WIN64
- #if defined _MSC_VER || defined __BORLANDC__
- #include <malloc.h>
- #endif
- #elif defined HAVE_ALLOCA_H
- #include <alloca.h>
- #elif defined HAVE_ALLOCA
- #include <stdlib.h>
- #elif
- #error
- #endif
- /* ! DO NOT make it an inline function */
- #define cvStackAlloc(size) cvAlignPtr( alloca((size) + CV_MALLOC_ALIGN), CV_MALLOC_ALIGN )
- #if defined _MSC_VER || defined __BORLANDC__
- #define CV_BIG_INT(n) n##I64
- #define CV_BIG_UINT(n) n##UI64
- #else
- #define CV_BIG_INT(n) n##LL
- #define CV_BIG_UINT(n) n##ULL
- #endif
- #define CV_IMPL CV_EXTERN_C
- #if defined WIN32 && !defined WIN64 && (_MSC_VER >= 1200 || defined CV_ICC)
- #define CV_DBG_BREAK() __asm int 3
- #else
- #define CV_DBG_BREAK() assert(0);
- #endif
- /* default step, set in case of continuous data
- to work around checks for valid step in some ipp functions */
- #define CV_STUB_STEP (1 << 30)
- #define CV_SIZEOF_FLOAT ((int)sizeof(float))
- #define CV_SIZEOF_SHORT ((int)sizeof(short))
- #define CV_ORIGIN_TL 0
- #define CV_ORIGIN_BL 1
- /* IEEE754 constants and macros */
- #define CV_POS_INF 0x7f800000
- #define CV_NEG_INF 0x807fffff /* CV_TOGGLE_FLT(0xff800000) */
- #define CV_1F 0x3f800000
- #define CV_TOGGLE_FLT(x) ((x)^((int)(x) < 0 ? 0x7fffffff : 0))
- #define CV_TOGGLE_DBL(x) \
- ((x)^((int64)(x) < 0 ? CV_BIG_INT(0x7fffffffffffffff) : 0))
- #define CV_NOP(a) (a)
- #define CV_ADD(a, b) ((a) + (b))
- #define CV_SUB(a, b) ((a) - (b))
- #define CV_MUL(a, b) ((a) * (b))
- #define CV_AND(a, b) ((a) & (b))
- #define CV_OR(a, b) ((a) | (b))
- #define CV_XOR(a, b) ((a) ^ (b))
- #define CV_ANDN(a, b) (~(a) & (b))
- #define CV_ORN(a, b) (~(a) | (b))
- #define CV_SQR(a) ((a) * (a))
- #define CV_LT(a, b) ((a) < (b))
- #define CV_LE(a, b) ((a) <= (b))
- #define CV_EQ(a, b) ((a) == (b))
- #define CV_NE(a, b) ((a) != (b))
- #define CV_GT(a, b) ((a) > (b))
- #define CV_GE(a, b) ((a) >= (b))
- #define CV_NONZERO(a) ((a) != 0)
- #define CV_NONZERO_FLT(a) (((a)+(a)) != 0)
- /* general-purpose saturation macros */
- #define CV_CAST_8U(t) (uchar)(!((t) & ~255) ? (t) : (t) > 0 ? 255 : 0)
- #define CV_CAST_8S(t) (char)(!(((t)+128) & ~255) ? (t) : (t) > 0 ? 127 : -128)
- #define CV_CAST_16U(t) (ushort)(!((t) & ~65535) ? (t) : (t) > 0 ? 65535 : 0)
- #define CV_CAST_16S(t) (short)(!(((t)+32768) & ~65535) ? (t) : (t) > 0 ? 32767 : -32768)
- #define CV_CAST_32S(t) (int)(t)
- #define CV_CAST_64S(t) (int64)(t)
- #define CV_CAST_32F(t) (float)(t)
- #define CV_CAST_64F(t) (double)(t)
- #define CV_PASTE2(a,b) a##b
- #define CV_PASTE(a,b) CV_PASTE2(a,b)
- #define CV_EMPTY
- #define CV_MAKE_STR(a) #a
- #define CV_DEFINE_MASK \
- float maskTab[2]; maskTab[0] = 0.f; maskTab[1] = 1.f;
- #define CV_ANDMASK( m, x ) ((x) & (((m) == 0) - 1))
- /* (x) * ((m) == 1 ? 1.f : (m) == 0 ? 0.f : <ERR> */
- #define CV_MULMASK( m, x ) (maskTab[(m) != 0]*(x))
- /* (x) * ((m) == -1 ? 1.f : (m) == 0 ? 0.f : <ERR> */
- #define CV_MULMASK1( m, x ) (maskTab[(m)+1]*(x))
- #define CV_ZERO_OBJ(x) memset((x), 0, sizeof(*(x)))
- #define CV_DIM(static_array) ((int)(sizeof(static_array)/sizeof((static_array)[0])))
- #define CV_UN_ENTRY_C1(worktype) \
- worktype s0 = scalar[0]
-
- #define CV_UN_ENTRY_C2(worktype) \
- worktype s0 = scalar[0], s1 = scalar[1]
- #define CV_UN_ENTRY_C3(worktype) \
- worktype s0 = scalar[0], s1 = scalar[1], s2 = scalar[2]
- #define CV_UN_ENTRY_C4(worktype) \
- worktype s0 = scalar[0], s1 = scalar[1], s2 = scalar[2], s3 = scalar[3]
- #define cvUnsupportedFormat "Unsupported format"
- CV_INLINE void* cvAlignPtr( const void* ptr, int align=32 )
- {
- assert( (align & (align-1)) == 0 );
- return (void*)( ((size_t)ptr + align - 1) & ~(size_t)(align-1) );
- }
- CV_INLINE int cvAlign( int size, int align )
- {
- assert( (align & (align-1)) == 0 && size < INT_MAX );
- return (size + align - 1) & -align;
- }
- CV_INLINE CvSize cvGetMatSize( const CvMat* mat )
- {
- CvSize size = { mat->width, mat->height };
- return size;
- }
- #define CV_DESCALE(x,n) (((x) + (1 << ((n)-1))) >> (n))
- #define CV_FLT_TO_FIX(x,n) cvRound((x)*(1<<(n)))
- #if 0
- /* This is a small engine for performing fast division of multiple numbers
- by the same constant. Most compilers do it too if they know the divisor value
- at compile-time. The algorithm was taken from Agner Fog's optimization guide
- at http://www.agner.org/assem */
- typedef struct CvFastDiv
- {
- unsigned delta, scale, divisor;
- }
- CvFastDiv;
- #define CV_FAST_DIV_SHIFT 32
- CV_INLINE CvFastDiv cvFastDiv( int divisor )
- {
- CvFastDiv fastdiv;
-
- assert( divisor >= 1 );
- uint64 temp = ((uint64)1 << CV_FAST_DIV_SHIFT)/divisor;
- fastdiv.divisor = divisor;
- fastdiv.delta = (unsigned)(((temp & 1) ^ 1) + divisor - 1);
- fastdiv.scale = (unsigned)((temp + 1) >> 1);
-
- return fastdiv;
- }
- #define CV_FAST_DIV( x, fastdiv ) \
- ((int)(((int64)((x)*2 + (int)(fastdiv).delta))*(int)(fastdiv).scale>>CV_FAST_DIV_SHIFT))
- #define CV_FAST_UDIV( x, fastdiv ) \
- ((int)(((uint64)((x)*2 + (fastdiv).delta))*(fastdiv).scale>>CV_FAST_DIV_SHIFT))
- #endif
- #define CV_MEMCPY_CHAR( dst, src, len ) \
- { \
- size_t _icv_memcpy_i_, _icv_memcpy_len_ = (len); \
- char* _icv_memcpy_dst_ = (char*)(dst); \
- const char* _icv_memcpy_src_ = (const char*)(src); \
- \
- for( _icv_memcpy_i_ = 0; _icv_memcpy_i_ < _icv_memcpy_len_; _icv_memcpy_i_++ ) \
- _icv_memcpy_dst_[_icv_memcpy_i_] = _icv_memcpy_src_[_icv_memcpy_i_]; \
- }
- #define CV_MEMCPY_INT( dst, src, len ) \
- { \
- size_t _icv_memcpy_i_, _icv_memcpy_len_ = (len); \
- int* _icv_memcpy_dst_ = (int*)(dst); \
- const int* _icv_memcpy_src_ = (const int*)(src); \
- assert( ((size_t)_icv_memcpy_src_&(sizeof(int)-1)) == 0 && \
- ((size_t)_icv_memcpy_dst_&(sizeof(int)-1)) == 0 ); \
- \
- for(_icv_memcpy_i_=0;_icv_memcpy_i_<_icv_memcpy_len_;_icv_memcpy_i_++) \
- _icv_memcpy_dst_[_icv_memcpy_i_] = _icv_memcpy_src_[_icv_memcpy_i_]; \
- }
- #define CV_MEMCPY_AUTO( dst, src, len ) \
- { \
- size_t _icv_memcpy_i_, _icv_memcpy_len_ = (len); \
- char* _icv_memcpy_dst_ = (char*)(dst); \
- const char* _icv_memcpy_src_ = (const char*)(src); \
- if( (_icv_memcpy_len_ & (sizeof(int)-1)) == 0 ) \
- { \
- assert( ((size_t)_icv_memcpy_src_&(sizeof(int)-1)) == 0 && \
- ((size_t)_icv_memcpy_dst_&(sizeof(int)-1)) == 0 ); \
- for( _icv_memcpy_i_ = 0; _icv_memcpy_i_ < _icv_memcpy_len_; \
- _icv_memcpy_i_+=sizeof(int) ) \
- { \
- *(int*)(_icv_memcpy_dst_+_icv_memcpy_i_) = \
- *(const int*)(_icv_memcpy_src_+_icv_memcpy_i_); \
- } \
- } \
- else \
- { \
- for(_icv_memcpy_i_ = 0; _icv_memcpy_i_ < _icv_memcpy_len_; _icv_memcpy_i_++)\
- _icv_memcpy_dst_[_icv_memcpy_i_] = _icv_memcpy_src_[_icv_memcpy_i_]; \
- } \
- }
- #define CV_ZERO_CHAR( dst, len ) \
- { \
- size_t _icv_memcpy_i_, _icv_memcpy_len_ = (len); \
- char* _icv_memcpy_dst_ = (char*)(dst); \
- \
- for( _icv_memcpy_i_ = 0; _icv_memcpy_i_ < _icv_memcpy_len_; _icv_memcpy_i_++ ) \
- _icv_memcpy_dst_[_icv_memcpy_i_] = '\0'; \
- }
- #define CV_ZERO_INT( dst, len ) \
- { \
- size_t _icv_memcpy_i_, _icv_memcpy_len_ = (len); \
- int* _icv_memcpy_dst_ = (int*)(dst); \
- assert( ((size_t)_icv_memcpy_dst_&(sizeof(int)-1)) == 0 ); \
- \
- for(_icv_memcpy_i_=0;_icv_memcpy_i_<_icv_memcpy_len_;_icv_memcpy_i_++) \
- _icv_memcpy_dst_[_icv_memcpy_i_] = 0; \
- }
- /****************************************************************************************\
-
- Generic implementation of QuickSort algorithm.
- ----------------------------------------------
- Using this macro user can declare customized sort function that can be much faster
- than built-in qsort function because of lower overhead on elements
- comparison and exchange. The macro takes less_than (or LT) argument - a macro or function
- that takes 2 arguments returns non-zero if the first argument should be before the second
- one in the sorted sequence and zero otherwise.
- Example:
- Suppose that the task is to sort points by ascending of y coordinates and if
- y's are equal x's should ascend.
- The code is:
- ------------------------------------------------------------------------------
- #define cmp_pts( pt1, pt2 ) \
- ((pt1).y < (pt2).y || ((pt1).y < (pt2).y && (pt1).x < (pt2).x))
- [static] CV_IMPLEMENT_QSORT( icvSortPoints, CvPoint, cmp_pts )
- ------------------------------------------------------------------------------
- After that the function "void icvSortPoints( CvPoint* array, size_t total, int aux );"
- is available to user.
- aux is an additional parameter, which can be used when comparing elements.
- The current implementation was derived from *BSD system qsort():
- * Copyright (c) 1992, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions 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.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
- \****************************************************************************************/
- #define CV_IMPLEMENT_QSORT_EX( func_name, T, LT, user_data_type ) \
- void func_name( T *array, size_t total, user_data_type aux ) \
- { \
- int isort_thresh = 7; \
- T t; \
- int sp = 0; \
- \
- struct \
- { \
- T *lb; \
- T *ub; \
- } \
- stack[48]; \
- \
- aux = aux; \
- \
- if( total <= 1 ) \
- return; \
- \
- stack[0].lb = array; \
- stack[0].ub = array + (total - 1); \
- \
- while( sp >= 0 ) \
- { \
- T* left = stack[sp].lb; \
- T* right = stack[sp--].ub; \
- \
- for(;;) \
- { \
- int i, n = (int)(right - left) + 1, m; \
- T* ptr; \
- T* ptr2; \
- \
- if( n <= isort_thresh ) \
- { \
- insert_sort: \
- for( ptr = left + 1; ptr <= right; ptr++ ) \
- { \
- for( ptr2 = ptr; ptr2 > left && LT(ptr2[0],ptr2[-1]); ptr2--) \
- CV_SWAP( ptr2[0], ptr2[-1], t ); \
- } \
- break; \
- } \
- else \
- { \
- T* left0; \
- T* left1; \
- T* right0; \
- T* right1; \
- T* pivot; \
- T* a; \
- T* b; \
- T* c; \
- int swap_cnt = 0; \
- \
- left0 = left; \
- right0 = right; \
- pivot = left + (n/2); \
- \
- if( n > 40 ) \
- { \
- int d = n / 8; \
- a = left, b = left + d, c = left + 2*d; \
- left = LT(*a, *b) ? (LT(*b, *c) ? b : (LT(*a, *c) ? c : a)) \
- : (LT(*c, *b) ? b : (LT(*a, *c) ? a : c)); \
- \
- a = pivot - d, b = pivot, c = pivot + d; \
- pivot = LT(*a, *b) ? (LT(*b, *c) ? b : (LT(*a, *c) ? c : a)) \
- : (LT(*c, *b) ? b : (LT(*a, *c) ? a : c)); \
- \
- a = right - 2*d, b = right - d, c = right; \
- right = LT(*a, *b) ? (LT(*b, *c) ? b : (LT(*a, *c) ? c : a)) \
- : (LT(*c, *b) ? b : (LT(*a, *c) ? a : c)); \
- } \
- \
- a = left, b = pivot, c = right; \
- pivot = LT(*a, *b) ? (LT(*b, *c) ? b : (LT(*a, *c) ? c : a)) \
- : (LT(*c, *b) ? b : (LT(*a, *c) ? a : c)); \
- if( pivot != left0 ) \
- { \
- CV_SWAP( *pivot, *left0, t ); \
- pivot = left0; \
- } \
- left = left1 = left0 + 1; \
- right = right1 = right0; \
- \
- for(;;) \
- { \
- while( left <= right && !LT(*pivot, *left) ) \
- { \
- if( !LT(*left, *pivot) ) \
- { \
- if( left > left1 ) \
- CV_SWAP( *left1, *left, t ); \
- swap_cnt = 1; \
- left1++; \
- } \
- left++; \
- } \
- \
- while( left <= right && !LT(*right, *pivot) ) \
- { \
- if( !LT(*pivot, *right) ) \
- { \
- if( right < right1 ) \
- CV_SWAP( *right1, *right, t ); \
- swap_cnt = 1; \
- right1--; \
- } \
- right--; \
- } \
- \
- if( left > right ) \
- break; \
- CV_SWAP( *left, *right, t ); \
- swap_cnt = 1; \
- left++; \
- right--; \
- } \
- \
- if( swap_cnt == 0 ) \
- { \
- left = left0, right = right0; \
- goto insert_sort; \
- } \
- \
- n = MIN( (int)(left1 - left0), (int)(left - left1) ); \
- for( i = 0; i < n; i++ ) \
- CV_SWAP( left0[i], left[i-n], t ); \
- \
- n = MIN( (int)(right0 - right1), (int)(right1 - right) ); \
- for( i = 0; i < n; i++ ) \
- CV_SWAP( left[i], right0[i-n+1], t ); \
- n = (int)(left - left1); \
- m = (int)(right1 - right); \
- if( n > 1 ) \
- { \
- if( m > 1 ) \
- { \
- if( n > m ) \
- { \
- stack[++sp].lb = left0; \
- stack[sp].ub = left0 + n - 1; \
- left = right0 - m + 1, right = right0; \
- } \
- else \
- { \
- stack[++sp].lb = right0 - m + 1; \
- stack[sp].ub = right0; \
- left = left0, right = left0 + n - 1; \
- } \
- } \
- else \
- left = left0, right = left0 + n - 1; \
- } \
- else if( m > 1 ) \
- left = right0 - m + 1, right = right0; \
- else \
- break; \
- } \
- } \
- } \
- }
- #define CV_IMPLEMENT_QSORT( func_name, T, cmp ) \
- CV_IMPLEMENT_QSORT_EX( func_name, T, cmp, int )
- /****************************************************************************************\
- * Structures and macros for integration with IPP *
- \****************************************************************************************/
- /* IPP-compatible return codes */
- typedef enum CvStatus
- {
- CV_BADMEMBLOCK_ERR = -113,
- CV_INPLACE_NOT_SUPPORTED_ERR= -112,
- CV_UNMATCHED_ROI_ERR = -111,
- CV_NOTFOUND_ERR = -110,
- CV_BADCONVERGENCE_ERR = -109,
- CV_BADDEPTH_ERR = -107,
- CV_BADROI_ERR = -106,
- CV_BADHEADER_ERR = -105,
- CV_UNMATCHED_FORMATS_ERR = -104,
- CV_UNSUPPORTED_COI_ERR = -103,
- CV_UNSUPPORTED_CHANNELS_ERR = -102,
- CV_UNSUPPORTED_DEPTH_ERR = -101,
- CV_UNSUPPORTED_FORMAT_ERR = -100,
- CV_BADARG_ERR = -49, //ipp comp
- CV_NOTDEFINED_ERR = -48, //ipp comp
- CV_BADCHANNELS_ERR = -47, //ipp comp
- CV_BADRANGE_ERR = -44, //ipp comp
- CV_BADSTEP_ERR = -29, //ipp comp
- CV_BADFLAG_ERR = -12,
- CV_DIV_BY_ZERO_ERR = -11, //ipp comp
- CV_BADCOEF_ERR = -10,
- CV_BADFACTOR_ERR = -7,
- CV_BADPOINT_ERR = -6,
- CV_BADSCALE_ERR = -4,
- CV_OUTOFMEM_ERR = -3,
- CV_NULLPTR_ERR = -2,
- CV_BADSIZE_ERR = -1,
- CV_NO_ERR = 0,
- CV_OK = CV_NO_ERR
- }
- CvStatus;
- #define CV_ERROR_FROM_STATUS( result ) \
- CV_ERROR( cvErrorFromIppStatus( result ), "OpenCV function failed" )
- #define IPPI_CALL( Func ) \
- { \
- CvStatus ippi_call_result; \
- ippi_call_result = Func; \
- \
- if( ippi_call_result < 0 ) \
- CV_ERROR_FROM_STATUS( (ippi_call_result)); \
- }
- #define CV_PLUGIN_NONE 0
- #define CV_PLUGIN_OPTCV 1 /* custom "emerged" ippopencv library */
- #define CV_PLUGIN_IPPCV 2 /* IPP: computer vision */
- #define CV_PLUGIN_IPPI 3 /* IPP: image processing */
- #define CV_PLUGIN_IPPS 4 /* IPP: signal processing */
- #define CV_PLUGIN_IPPVM 5 /* IPP: vector math functions */
- #define CV_PLUGIN_IPPCC 6 /* IPP: color space conversion */
- #define CV_PLUGIN_MKL 8 /* Intel Math Kernel Library */
- #define CV_PLUGIN_MAX 16
- #define CV_PLUGINS1(lib1) ((lib1)&15)
- #define CV_PLUGINS2(lib1,lib2) (((lib1)&15)|(((lib2)&15)<<4))
- #define CV_PLUGINS3(lib1,lib2,lib3) (((lib1)&15)|(((lib2)&15)<<4)|(((lib2)&15)<<8))
- #define CV_NOTHROW throw()
- #ifndef IPCVAPI
- #define IPCVAPI(type,declspec,name,args) \
- /* function pointer */ \
- typedef type (declspec* name##_t) args; \
- extern name##_t name##_p; \
- type declspec name args;
- #endif
- #define IPCVAPI_EX(type,name,ipp_name,ipp_search_modules,args) \
- IPCVAPI(type,CV_STDCALL,name,args)
- #define IPCVAPI_C_EX(type,name,ipp_name,ipp_search_modules,args)\
- IPCVAPI(type,CV_CDECL,name,args)
- #ifndef IPCVAPI_IMPL
- #define IPCVAPI_IMPL(type,name,args,arg_names) \
- static type CV_STDCALL name##_f args; \
- name##_t name##_p = name##_f; \
- type CV_STDCALL name args { return name##_p arg_names; } \
- static type CV_STDCALL name##_f args
- #endif
- /* IPP types' enumeration */
- typedef enum CvDataType {
- cv1u,
- cv8u, cv8s,
- cv16u, cv16s, cv16sc,
- cv32u, cv32s, cv32sc,
- cv32f, cv32fc,
- cv64u, cv64s, cv64sc,
- cv64f, cv64fc
- } CvDataType;
- typedef enum CvHintAlgorithm {
- cvAlgHintNone,
- cvAlgHintFast,
- cvAlgHintAccurate
- } CvHintAlgorithm;
- typedef enum CvCmpOp {
- cvCmpLess,
- cvCmpLessEq,
- cvCmpEq,
- cvCmpGreaterEq,
- cvCmpGreater
- } CvCmpOp;
- typedef struct CvFuncTable
- {
- void* fn_2d[CV_DEPTH_MAX];
- }
- CvFuncTable;
- typedef struct CvBigFuncTable
- {
- void* fn_2d[CV_DEPTH_MAX*CV_CN_MAX];
- }
- CvBigFuncTable;
- typedef struct CvBtFuncTable
- {
- void* fn_2d[33];
- }
- CvBtFuncTable;
- typedef CvStatus (CV_STDCALL *CvFunc2D_1A)(void* arr, int step, CvSize size);
- typedef CvStatus (CV_STDCALL *CvFunc2D_1A1P)(void* arr, int step, CvSize size, void* param);
- typedef CvStatus (CV_STDCALL *CvFunc2D_1A1P1I)(void* arr, int step, CvSize size,
- void* param, int flag);
- typedef CvStatus (CV_STDCALL *CvFunc2DnC_1A1P)( void* arr, int step, CvSize size,
- int cn, int coi, void* param );
- typedef CvStatus (CV_STDCALL *CvFunc2DnC_1A1P)( void* arr, int step, CvSize size,
- int cn, int coi, void* param );
- typedef CvStatus (CV_STDCALL *CvFunc2D_1A2P)( void* arr, int step, CvSize size,
- void* param1, void* param2 );
- typedef CvStatus (CV_STDCALL *CvFunc2DnC_1A2P)( void* arr, int step,
- CvSize size, int cn, int coi,
- void* param1, void* param2 );
- typedef CvStatus (CV_STDCALL *CvFunc2D_1A4P)( void* arr, int step, CvSize size,
- void* param1, void* param2,
- void* param3, void* param4 );
- typedef CvStatus (CV_STDCALL *CvFunc2DnC_1A4P)( void* arr, int step,
- CvSize size, int cn, int coi,
- void* param1, void* param2,
- void* param3, void* param4 );
- typedef CvStatus (CV_STDCALL *CvFunc2D_2A)( void* arr0, int step0,
- void* arr1, int step1, CvSize size );
- typedef CvStatus (CV_STDCALL *CvFunc2D_2A1P)( void* arr0, int step0,
- void* arr1, int step1,
- CvSize size, void* param );
- typedef CvStatus (CV_STDCALL *CvFunc2DnC_2A1P)( void* arr0, int step0,
- void* arr1, int step1,
- CvSize size, int cn,
- int coi, void* param );
- typedef CvStatus (CV_STDCALL *CvFunc2DnC_2A1P)( void* arr0, int step0,
- void* arr1, int step1,
- CvSize size, int cn,
- int coi, void* param );
- typedef CvStatus (CV_STDCALL *CvFunc2D_2A2P)( void* arr0, int step0,
- void* arr1, int step1, CvSize size,
- void* param1, void* param2 );
- typedef CvStatus (CV_STDCALL *CvFunc2DnC_2A2P)( void* arr0, int step0,
- void* arr1, int step1,
- CvSize size, int cn, int coi,
- void* param1, void* param2 );
- typedef CvStatus (CV_STDCALL *CvFunc2D_2A1P1I)( void* arr0, int step0,
- void* arr1, int step1, CvSize size,
- void* param, int flag );
- typedef CvStatus (CV_STDCALL *CvFunc2D_2A4P)( void* arr0, int step0,
- void* arr1, int step1, CvSize size,
- void* param1, void* param2,
- void* param3, void* param4 );
- typedef CvStatus (CV_STDCALL *CvFunc2DnC_2A4P)( void* arr0, int step0,
- void* arr1, int step1, CvSize size,
- int cn, int coi,
- void* param1, void* param2,
- void* param3, void* param4 );
- typedef CvStatus (CV_STDCALL *CvFunc2D_3A)( void* arr0, int step0,
- void* arr1, int step1,
- void* arr2, int step2, CvSize size );
- typedef CvStatus (CV_STDCALL *CvFunc2D_3A1P)( void* arr0, int step0,
- void* arr1, int step1,
- void* arr2, int step2,
- CvSize size, void* param );
- typedef CvStatus (CV_STDCALL *CvFunc2D_3A1I)( void* arr0, int step0,
- void* arr1, int step1,
- void* arr2, int step2,
- CvSize size, int flag );
- typedef CvStatus (CV_STDCALL *CvFunc2DnC_3A1P)( void* arr0, int step0,
- void* arr1, int step1,
- void* arr2, int step2,
- CvSize size, int cn,
- int coi, void* param );
- typedef CvStatus (CV_STDCALL *CvFunc2D_4A)( void* arr0, int step0,
- void* arr1, int step1,
- void* arr2, int step2,
- void* arr3, int step3,
- CvSize size );
- typedef CvStatus (CV_STDCALL *CvFunc0D)( const void* src, void* dst, int param );
- #define CV_DEF_INIT_FUNC_TAB_2D( FUNCNAME, FLAG ) \
- static void icvInit##FUNCNAME##FLAG##Table( CvFuncTable* tab ) \
- { \
- assert( tab ); \
- \
- tab->fn_2d[CV_8U] = (void*)icv##FUNCNAME##_8u_##FLAG; \
- tab->fn_2d[CV_8S] = (void*)icv##FUNCNAME##_8s_##FLAG; \
- tab->fn_2d[CV_16U] = (void*)icv##FUNCNAME##_16u_##FLAG; \
- tab->fn_2d[CV_16S] = (void*)icv##FUNCNAME##_16s_##FLAG; \
- tab->fn_2d[CV_32S] = (void*)icv##FUNCNAME##_32s_##FLAG; \
- tab->fn_2d[CV_32F] = (void*)icv##FUNCNAME##_32f_##FLAG; \
- tab->fn_2d[CV_64F] = (void*)icv##FUNCNAME##_64f_##FLAG; \
- }
- #define CV_DEF_INIT_BIG_FUNC_TAB_2D( FUNCNAME, FLAG ) \
- static void icvInit##FUNCNAME##FLAG##Table( CvBigFuncTable* tab ) \
- { \
- assert( tab ); \
- \
- tab->fn_2d[CV_8UC1] = (void*)icv##FUNCNAME##_8u_C1##FLAG; \
- tab->fn_2d[CV_8UC2] = (void*)icv##FUNCNAME##_8u_C2##FLAG; \
- tab->fn_2d[CV_8UC3] = (void*)icv##FUNCNAME##_8u_C3##FLAG; \
- tab->fn_2d[CV_8UC4] = (void*)icv##FUNCNAME##_8u_C4##FLAG; \
- \
- tab->fn_2d[CV_8SC1] = (void*)icv##FUNCNAME##_8s_C1##FLAG; \
- tab->fn_2d[CV_8SC2] = (void*)icv##FUNCNAME##_8s_C2##FLAG; \
- tab->fn_2d[CV_8SC3] = (void*)icv##FUNCNAME##_8s_C3##FLAG; \
- tab->fn_2d[CV_8SC4] = (void*)icv##FUNCNAME##_8s_C4##FLAG; \
- \
- tab->fn_2d[CV_16UC1] = (void*)icv##FUNCNAME##_16u_C1##FLAG; \
- tab->fn_2d[CV_16UC2] = (void*)icv##FUNCNAME##_16u_C2##FLAG; \
- tab->fn_2d[CV_16UC3] = (void*)icv##FUNCNAME##_16u_C3##FLAG; \
- tab->fn_2d[CV_16UC4] = (void*)icv##FUNCNAME##_16u_C4##FLAG; \
- \
- tab->fn_2d[CV_16SC1] = (void*)icv##FUNCNAME##_16s_C1##FLAG; \
- tab->fn_2d[CV_16SC2] = (void*)icv##FUNCNAME##_16s_C2##FLAG; \
- tab->fn_2d[CV_16SC3] = (void*)icv##FUNCNAME##_16s_C3##FLAG; \
- tab->fn_2d[CV_16SC4] = (void*)icv##FUNCNAME##_16s_C4##FLAG; \
- \
- tab->fn_2d[CV_32SC1] = (void*)icv##FUNCNAME##_32s_C1##FLAG; \
- tab->fn_2d[CV_32SC2] = (void*)icv##FUNCNAME##_32s_C2##FLAG; \
- tab->fn_2d[CV_32SC3] = (void*)icv##FUNCNAME##_32s_C3##FLAG; \
- tab->fn_2d[CV_32SC4] = (void*)icv##FUNCNAME##_32s_C4##FLAG; \
- \
- tab->fn_2d[CV_32FC1] = (void*)icv##FUNCNAME##_32f_C1##FLAG; \
- tab->fn_2d[CV_32FC2] = (void*)icv##FUNCNAME##_32f_C2##FLAG; \
- tab->fn_2d[CV_32FC3] = (void*)icv##FUNCNAME##_32f_C3##FLAG; \
- tab->fn_2d[CV_32FC4] = (void*)icv##FUNCNAME##_32f_C4##FLAG; \
- \
- tab->fn_2d[CV_64FC1] = (void*)icv##FUNCNAME##_64f_C1##FLAG; \
- tab->fn_2d[CV_64FC2] = (void*)icv##FUNCNAME##_64f_C2##FLAG; \
- tab->fn_2d[CV_64FC3] = (void*)icv##FUNCNAME##_64f_C3##FLAG; \
- tab->fn_2d[CV_64FC4] = (void*)icv##FUNCNAME##_64f_C4##FLAG; \
- }
- #define CV_DEF_INIT_FUNC_TAB_0D( FUNCNAME ) \
- static void icvInit##FUNCNAME##Table( CvFuncTable* tab ) \
- { \
- tab->fn_2d[CV_8U] = (void*)icv##FUNCNAME##_8u; \
- tab->fn_2d[CV_8S] = (void*)icv##FUNCNAME##_8s; \
- tab->fn_2d[CV_16U] = (void*)icv##FUNCNAME##_16u; \
- tab->fn_2d[CV_16S] = (void*)icv##FUNCNAME##_16s; \
- tab->fn_2d[CV_32S] = (void*)icv##FUNCNAME##_32s; \
- tab->fn_2d[CV_32F] = (void*)icv##FUNCNAME##_32f; \
- tab->fn_2d[CV_64F] = (void*)icv##FUNCNAME##_64f; \
- }
- #define CV_DEF_INIT_FUNC_TAB_1D CV_DEF_INIT_FUNC_TAB_0D
- #define CV_DEF_INIT_PIXSIZE_TAB_2D( FUNCNAME, FLAG ) \
- static void icvInit##FUNCNAME##FLAG##Table( CvBtFuncTable* table ) \
- { \
- table->fn_2d[1] = (void*)icv##FUNCNAME##_8u_C1##FLAG; \
- table->fn_2d[2] = (void*)icv##FUNCNAME##_8u_C2##FLAG; \
- table->fn_2d[3] = (void*)icv##FUNCNAME##_8u_C3##FLAG; \
- table->fn_2d[4] = (void*)icv##FUNCNAME##_16u_C2##FLAG; \
- table->fn_2d[6] = (void*)icv##FUNCNAME##_16u_C3##FLAG; \
- table->fn_2d[8] = (void*)icv##FUNCNAME##_32s_C2##FLAG; \
- table->fn_2d[12] = (void*)icv##FUNCNAME##_32s_C3##FLAG; \
- table->fn_2d[16] = (void*)icv##FUNCNAME##_64s_C2##FLAG; \
- table->fn_2d[24] = (void*)icv##FUNCNAME##_64s_C3##FLAG; \
- table->fn_2d[32] = (void*)icv##FUNCNAME##_64s_C4##FLAG; \
- }
- #define CV_GET_FUNC_PTR( func, table_entry ) \
- func = (table_entry); \
- \
- if( !func ) \
- CV_ERROR( CV_StsUnsupportedFormat, "" )
- #endif /*_CXCORE_MISC_H_*/
|