Home | History | Annotate | Download | only in include
      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 //                        Intel License Agreement
     11 //                For Open Source Computer Vision Library
     12 //
     13 // Copyright (C) 2000, Intel Corporation, all rights reserved.
     14 // Third party copyrights are property of their respective owners.
     15 //
     16 // Redistribution and use in source and binary forms, with or without modification,
     17 // are permitted provided that the following conditions are met:
     18 //
     19 //   * Redistribution's of source code must retain the above copyright notice,
     20 //     this list of conditions and the following disclaimer.
     21 //
     22 //   * Redistribution's in binary form must reproduce the above copyright notice,
     23 //     this list of conditions and the following disclaimer in the documentation
     24 //     and/or other materials provided with the distribution.
     25 //
     26 //   * The name of Intel Corporation may not be used to endorse or promote products
     27 //     derived from this software without specific prior written permission.
     28 //
     29 // This software is provided by the copyright holders and contributors "as is" and
     30 // any express or implied warranties, including, but not limited to, the implied
     31 // warranties of merchantability and fitness for a particular purpose are disclaimed.
     32 // In no event shall the Intel Corporation or contributors be liable for any direct,
     33 // indirect, incidental, special, exemplary, or consequential damages
     34 // (including, but not limited to, procurement of substitute goods or services;
     35 // loss of use, data, or profits; or business interruption) however caused
     36 // and on any theory of liability, whether in contract, strict liability,
     37 // or tort (including negligence or otherwise) arising in any way out of
     38 // the use of this software, even if advised of the possibility of such damage.
     39 //
     40 //M*/
     41 
     42 /* The header is mostly for internal use and it is likely to change.
     43    It contains some macro definitions that are used in cxcore, cv, cvaux
     44    and, probably, other libraries. If you need some of this functionality,
     45    the safe way is to copy it into your code and rename the macros.
     46 */
     47 #ifndef _CXCORE_MISC_H_
     48 #define _CXCORE_MISC_H_
     49 
     50 #ifdef HAVE_CONFIG_H
     51     #include "cvconfig.h"
     52 #endif
     53 
     54 #include <limits.h>
     55 #ifdef _OPENMP
     56 #include "omp.h"
     57 #endif
     58 
     59 /****************************************************************************************\
     60 *                              Compile-time tuning parameters                            *
     61 \****************************************************************************************/
     62 
     63 /* maximal size of vector to run matrix operations on it inline (i.e. w/o ipp calls) */
     64 #define  CV_MAX_INLINE_MAT_OP_SIZE  10
     65 
     66 /* maximal linear size of matrix to allocate it on stack. */
     67 #define  CV_MAX_LOCAL_MAT_SIZE  32
     68 
     69 /* maximal size of local memory storage */
     70 #define  CV_MAX_LOCAL_SIZE  \
     71     (CV_MAX_LOCAL_MAT_SIZE*CV_MAX_LOCAL_MAT_SIZE*(int)sizeof(double))
     72 
     73 /* default image row align (in bytes) */
     74 #define  CV_DEFAULT_IMAGE_ROW_ALIGN  4
     75 
     76 /* matrices are continuous by default */
     77 #define  CV_DEFAULT_MAT_ROW_ALIGN  1
     78 
     79 /* maximum size of dynamic memory buffer.
     80    cvAlloc reports an error if a larger block is requested. */
     81 #define  CV_MAX_ALLOC_SIZE    (((size_t)1 << (sizeof(size_t)*8-2)))
     82 
     83 /* the alignment of all the allocated buffers */
     84 #define  CV_MALLOC_ALIGN    32
     85 
     86 /* default alignment for dynamic data strucutures, resided in storages. */
     87 #define  CV_STRUCT_ALIGN    ((int)sizeof(double))
     88 
     89 /* default storage block size */
     90 #define  CV_STORAGE_BLOCK_SIZE   ((1<<16) - 128)
     91 
     92 /* default memory block for sparse array elements */
     93 #define  CV_SPARSE_MAT_BLOCK    (1<<12)
     94 
     95 /* initial hash table size */
     96 #define  CV_SPARSE_HASH_SIZE0    (1<<10)
     97 
     98 /* maximal average node_count/hash_size ratio beyond which hash table is resized */
     99 #define  CV_SPARSE_HASH_RATIO    3
    100 
    101 /* max length of strings */
    102 #define  CV_MAX_STRLEN  1024
    103 
    104 /* maximum possible number of threads in parallel implementations */
    105 #ifdef _OPENMP
    106 #define CV_MAX_THREADS 128
    107 #else
    108 #define CV_MAX_THREADS 1
    109 #endif
    110 
    111 #if 0 /*def  CV_CHECK_FOR_NANS*/
    112     #define CV_CHECK_NANS( arr ) cvCheckArray((arr))
    113 #else
    114     #define CV_CHECK_NANS( arr )
    115 #endif
    116 
    117 /****************************************************************************************\
    118 *                                  Common declarations                                   *
    119 \****************************************************************************************/
    120 
    121 /* get alloca declaration */
    122 #ifdef __GNUC__
    123     #undef alloca
    124     #define alloca __builtin_alloca
    125 #elif defined WIN32 || defined WIN64
    126     #if defined _MSC_VER || defined __BORLANDC__
    127         #include <malloc.h>
    128     #endif
    129 #elif defined HAVE_ALLOCA_H
    130     #include <alloca.h>
    131 #elif defined HAVE_ALLOCA
    132     #include <stdlib.h>
    133 #else
    134     #error
    135 #endif
    136 
    137 /* ! DO NOT make it an inline function */
    138 #define cvStackAlloc(size) cvAlignPtr( alloca((size) + CV_MALLOC_ALIGN), CV_MALLOC_ALIGN )
    139 
    140 #if defined _MSC_VER || defined __BORLANDC__
    141     #define CV_BIG_INT(n)   n##I64
    142     #define CV_BIG_UINT(n)  n##UI64
    143 #else
    144     #define CV_BIG_INT(n)   n##LL
    145     #define CV_BIG_UINT(n)  n##ULL
    146 #endif
    147 
    148 #define CV_IMPL CV_EXTERN_C
    149 
    150 #define CV_DBG_BREAK() { volatile int* crashMe = 0; *crashMe = 0; }
    151 
    152 /* default step, set in case of continuous data
    153    to work around checks for valid step in some ipp functions */
    154 #define  CV_STUB_STEP     (1 << 30)
    155 
    156 #define  CV_SIZEOF_FLOAT ((int)sizeof(float))
    157 #define  CV_SIZEOF_SHORT ((int)sizeof(short))
    158 
    159 #define  CV_ORIGIN_TL  0
    160 #define  CV_ORIGIN_BL  1
    161 
    162 /* IEEE754 constants and macros */
    163 #define  CV_POS_INF       0x7f800000
    164 #define  CV_NEG_INF       0x807fffff /* CV_TOGGLE_FLT(0xff800000) */
    165 #define  CV_1F            0x3f800000
    166 #define  CV_TOGGLE_FLT(x) ((x)^((int)(x) < 0 ? 0x7fffffff : 0))
    167 #define  CV_TOGGLE_DBL(x) \
    168     ((x)^((int64)(x) < 0 ? CV_BIG_INT(0x7fffffffffffffff) : 0))
    169 
    170 #define  CV_NOP(a)      (a)
    171 #define  CV_ADD(a, b)   ((a) + (b))
    172 #define  CV_SUB(a, b)   ((a) - (b))
    173 #define  CV_MUL(a, b)   ((a) * (b))
    174 #define  CV_AND(a, b)   ((a) & (b))
    175 #define  CV_OR(a, b)    ((a) | (b))
    176 #define  CV_XOR(a, b)   ((a) ^ (b))
    177 #define  CV_ANDN(a, b)  (~(a) & (b))
    178 #define  CV_ORN(a, b)   (~(a) | (b))
    179 #define  CV_SQR(a)      ((a) * (a))
    180 
    181 #define  CV_LT(a, b)    ((a) < (b))
    182 #define  CV_LE(a, b)    ((a) <= (b))
    183 #define  CV_EQ(a, b)    ((a) == (b))
    184 #define  CV_NE(a, b)    ((a) != (b))
    185 #define  CV_GT(a, b)    ((a) > (b))
    186 #define  CV_GE(a, b)    ((a) >= (b))
    187 
    188 #define  CV_NONZERO(a)      ((a) != 0)
    189 #define  CV_NONZERO_FLT(a)  (((a)+(a)) != 0)
    190 
    191 /* general-purpose saturation macros */
    192 #define  CV_CAST_8U(t)  (uchar)(!((t) & ~255) ? (t) : (t) > 0 ? 255 : 0)
    193 #define  CV_CAST_8S(t)  (schar)(!(((t)+128) & ~255) ? (t) : (t) > 0 ? 127 : -128)
    194 #define  CV_CAST_16U(t) (ushort)(!((t) & ~65535) ? (t) : (t) > 0 ? 65535 : 0)
    195 #define  CV_CAST_16S(t) (short)(!(((t)+32768) & ~65535) ? (t) : (t) > 0 ? 32767 : -32768)
    196 #define  CV_CAST_32S(t) (int)(t)
    197 #define  CV_CAST_64S(t) (int64)(t)
    198 #define  CV_CAST_32F(t) (float)(t)
    199 #define  CV_CAST_64F(t) (double)(t)
    200 
    201 #define  CV_PASTE2(a,b) a##b
    202 #define  CV_PASTE(a,b)  CV_PASTE2(a,b)
    203 
    204 #define  CV_EMPTY
    205 #define  CV_MAKE_STR(a) #a
    206 
    207 #define  CV_DEFINE_MASK         \
    208     float maskTab[2]; maskTab[0] = 0.f; maskTab[1] = 1.f;
    209 #define  CV_ANDMASK( m, x )     ((x) & (((m) == 0) - 1))
    210 
    211 /* (x) * ((m) == 1 ? 1.f : (m) == 0 ? 0.f : <ERR> */
    212 #define  CV_MULMASK( m, x )       (maskTab[(m) != 0]*(x))
    213 
    214 /* (x) * ((m) == -1 ? 1.f : (m) == 0 ? 0.f : <ERR> */
    215 #define  CV_MULMASK1( m, x )      (maskTab[(m)+1]*(x))
    216 
    217 #define  CV_ZERO_OBJ(x)  memset((x), 0, sizeof(*(x)))
    218 
    219 #define  CV_DIM(static_array) ((int)(sizeof(static_array)/sizeof((static_array)[0])))
    220 
    221 #define  CV_UN_ENTRY_C1(worktype)           \
    222     worktype s0 = scalar[0]
    223 
    224 #define  CV_UN_ENTRY_C2(worktype)           \
    225     worktype s0 = scalar[0], s1 = scalar[1]
    226 
    227 #define  CV_UN_ENTRY_C3(worktype)           \
    228     worktype s0 = scalar[0], s1 = scalar[1], s2 = scalar[2]
    229 
    230 #define  CV_UN_ENTRY_C4(worktype)           \
    231     worktype s0 = scalar[0], s1 = scalar[1], s2 = scalar[2], s3 = scalar[3]
    232 
    233 #define  cvUnsupportedFormat "Unsupported format"
    234 
    235 CV_INLINE void* cvAlignPtr( const void* ptr, int align=32 )
    236 {
    237     assert( (align & (align-1)) == 0 );
    238     return (void*)( ((size_t)ptr + align - 1) & ~(size_t)(align-1) );
    239 }
    240 
    241 CV_INLINE int cvAlign( int size, int align )
    242 {
    243     assert( (align & (align-1)) == 0 && size < INT_MAX );
    244     return (size + align - 1) & -align;
    245 }
    246 
    247 CV_INLINE  CvSize  cvGetMatSize( const CvMat* mat )
    248 {
    249     CvSize size = { mat->width, mat->height };
    250     return size;
    251 }
    252 
    253 #define  CV_DESCALE(x,n)     (((x) + (1 << ((n)-1))) >> (n))
    254 #define  CV_FLT_TO_FIX(x,n)  cvRound((x)*(1<<(n)))
    255 
    256 #if 0
    257 /* This is a small engine for performing fast division of multiple numbers
    258    by the same constant. Most compilers do it too if they know the divisor value
    259    at compile-time. The algorithm was taken from Agner Fog's optimization guide
    260    at http://www.agner.org/assem */
    261 typedef struct CvFastDiv
    262 {
    263     unsigned delta, scale, divisor;
    264 }
    265 CvFastDiv;
    266 
    267 #define CV_FAST_DIV_SHIFT 32
    268 
    269 CV_INLINE CvFastDiv cvFastDiv( int divisor )
    270 {
    271     CvFastDiv fastdiv;
    272 
    273     assert( divisor >= 1 );
    274     uint64 temp = ((uint64)1 << CV_FAST_DIV_SHIFT)/divisor;
    275 
    276     fastdiv.divisor = divisor;
    277     fastdiv.delta = (unsigned)(((temp & 1) ^ 1) + divisor - 1);
    278     fastdiv.scale = (unsigned)((temp + 1) >> 1);
    279 
    280     return fastdiv;
    281 }
    282 
    283 #define CV_FAST_DIV( x, fastdiv )  \
    284     ((int)(((int64)((x)*2 + (int)(fastdiv).delta))*(int)(fastdiv).scale>>CV_FAST_DIV_SHIFT))
    285 
    286 #define CV_FAST_UDIV( x, fastdiv )  \
    287     ((int)(((uint64)((x)*2 + (fastdiv).delta))*(fastdiv).scale>>CV_FAST_DIV_SHIFT))
    288 #endif
    289 
    290 #define CV_MEMCPY_CHAR( dst, src, len )                                             \
    291 {                                                                                   \
    292     size_t _icv_memcpy_i_, _icv_memcpy_len_ = (len);                                \
    293     char* _icv_memcpy_dst_ = (char*)(dst);                                          \
    294     const char* _icv_memcpy_src_ = (const char*)(src);                              \
    295                                                                                     \
    296     for( _icv_memcpy_i_ = 0; _icv_memcpy_i_ < _icv_memcpy_len_; _icv_memcpy_i_++ )  \
    297         _icv_memcpy_dst_[_icv_memcpy_i_] = _icv_memcpy_src_[_icv_memcpy_i_];        \
    298 }
    299 
    300 
    301 #define CV_MEMCPY_INT( dst, src, len )                                              \
    302 {                                                                                   \
    303     size_t _icv_memcpy_i_, _icv_memcpy_len_ = (len);                                \
    304     int* _icv_memcpy_dst_ = (int*)(dst);                                            \
    305     const int* _icv_memcpy_src_ = (const int*)(src);                                \
    306     assert( ((size_t)_icv_memcpy_src_&(sizeof(int)-1)) == 0 &&                      \
    307             ((size_t)_icv_memcpy_dst_&(sizeof(int)-1)) == 0 );                      \
    308                                                                                     \
    309     for(_icv_memcpy_i_=0;_icv_memcpy_i_<_icv_memcpy_len_;_icv_memcpy_i_++)          \
    310         _icv_memcpy_dst_[_icv_memcpy_i_] = _icv_memcpy_src_[_icv_memcpy_i_];        \
    311 }
    312 
    313 
    314 #define CV_MEMCPY_AUTO( dst, src, len )                                             \
    315 {                                                                                   \
    316     size_t _icv_memcpy_i_, _icv_memcpy_len_ = (len);                                \
    317     char* _icv_memcpy_dst_ = (char*)(dst);                                          \
    318     const char* _icv_memcpy_src_ = (const char*)(src);                              \
    319     if( (_icv_memcpy_len_ & (sizeof(int)-1)) == 0 )                                 \
    320     {                                                                               \
    321         assert( ((size_t)_icv_memcpy_src_&(sizeof(int)-1)) == 0 &&                  \
    322                 ((size_t)_icv_memcpy_dst_&(sizeof(int)-1)) == 0 );                  \
    323         for( _icv_memcpy_i_ = 0; _icv_memcpy_i_ < _icv_memcpy_len_;                 \
    324             _icv_memcpy_i_+=sizeof(int) )                                           \
    325         {                                                                           \
    326             *(int*)(_icv_memcpy_dst_+_icv_memcpy_i_) =                              \
    327             *(const int*)(_icv_memcpy_src_+_icv_memcpy_i_);                         \
    328         }                                                                           \
    329     }                                                                               \
    330     else                                                                            \
    331     {                                                                               \
    332         for(_icv_memcpy_i_ = 0; _icv_memcpy_i_ < _icv_memcpy_len_; _icv_memcpy_i_++)\
    333             _icv_memcpy_dst_[_icv_memcpy_i_] = _icv_memcpy_src_[_icv_memcpy_i_];    \
    334     }                                                                               \
    335 }
    336 
    337 
    338 #define CV_ZERO_CHAR( dst, len )                                                    \
    339 {                                                                                   \
    340     size_t _icv_memcpy_i_, _icv_memcpy_len_ = (len);                                \
    341     char* _icv_memcpy_dst_ = (char*)(dst);                                          \
    342                                                                                     \
    343     for( _icv_memcpy_i_ = 0; _icv_memcpy_i_ < _icv_memcpy_len_; _icv_memcpy_i_++ )  \
    344         _icv_memcpy_dst_[_icv_memcpy_i_] = '\0';                                    \
    345 }
    346 
    347 
    348 #define CV_ZERO_INT( dst, len )                                                     \
    349 {                                                                                   \
    350     size_t _icv_memcpy_i_, _icv_memcpy_len_ = (len);                                \
    351     int* _icv_memcpy_dst_ = (int*)(dst);                                            \
    352     assert( ((size_t)_icv_memcpy_dst_&(sizeof(int)-1)) == 0 );                      \
    353                                                                                     \
    354     for(_icv_memcpy_i_=0;_icv_memcpy_i_<_icv_memcpy_len_;_icv_memcpy_i_++)          \
    355         _icv_memcpy_dst_[_icv_memcpy_i_] = 0;                                       \
    356 }
    357 
    358 
    359 /****************************************************************************************\
    360 
    361   Generic implementation of QuickSort algorithm.
    362   ----------------------------------------------
    363   Using this macro user can declare customized sort function that can be much faster
    364   than built-in qsort function because of lower overhead on elements
    365   comparison and exchange. The macro takes less_than (or LT) argument - a macro or function
    366   that takes 2 arguments returns non-zero if the first argument should be before the second
    367   one in the sorted sequence and zero otherwise.
    368 
    369   Example:
    370 
    371     Suppose that the task is to sort points by ascending of y coordinates and if
    372     y's are equal x's should ascend.
    373 
    374     The code is:
    375     ------------------------------------------------------------------------------
    376            #define cmp_pts( pt1, pt2 ) \
    377                ((pt1).y < (pt2).y || ((pt1).y < (pt2).y && (pt1).x < (pt2).x))
    378 
    379            [static] CV_IMPLEMENT_QSORT( icvSortPoints, CvPoint, cmp_pts )
    380     ------------------------------------------------------------------------------
    381 
    382     After that the function "void icvSortPoints( CvPoint* array, size_t total, int aux );"
    383     is available to user.
    384 
    385   aux is an additional parameter, which can be used when comparing elements.
    386   The current implementation was derived from *BSD system qsort():
    387 
    388     * Copyright (c) 1992, 1993
    389     *  The Regents of the University of California.  All rights reserved.
    390     *
    391     * Redistribution and use in source and binary forms, with or without
    392     * modification, are permitted provided that the following conditions
    393     * are met:
    394     * 1. Redistributions of source code must retain the above copyright
    395     *    notice, this list of conditions and the following disclaimer.
    396     * 2. Redistributions in binary form must reproduce the above copyright
    397     *    notice, this list of conditions and the following disclaimer in the
    398     *    documentation and/or other materials provided with the distribution.
    399     * 3. All advertising materials mentioning features or use of this software
    400     *    must display the following acknowledgement:
    401     *  This product includes software developed by the University of
    402     *  California, Berkeley and its contributors.
    403     * 4. Neither the name of the University nor the names of its contributors
    404     *    may be used to endorse or promote products derived from this software
    405     *    without specific prior written permission.
    406     *
    407     * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
    408     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    409     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    410     * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
    411     * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    412     * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    413     * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    414     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    415     * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    416     * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    417     * SUCH DAMAGE.
    418 
    419 \****************************************************************************************/
    420 
    421 #define CV_IMPLEMENT_QSORT_EX( func_name, T, LT, user_data_type )                   \
    422 void func_name( T *array, size_t total, user_data_type aux )                        \
    423 {                                                                                   \
    424     int isort_thresh = 7;                                                           \
    425     T t;                                                                            \
    426     int sp = 0;                                                                     \
    427                                                                                     \
    428     struct                                                                          \
    429     {                                                                               \
    430         T *lb;                                                                      \
    431         T *ub;                                                                      \
    432     }                                                                               \
    433     stack[48];                                                                      \
    434                                                                                     \
    435     aux = aux;                                                                      \
    436                                                                                     \
    437     if( total <= 1 )                                                                \
    438         return;                                                                     \
    439                                                                                     \
    440     stack[0].lb = array;                                                            \
    441     stack[0].ub = array + (total - 1);                                              \
    442                                                                                     \
    443     while( sp >= 0 )                                                                \
    444     {                                                                               \
    445         T* left = stack[sp].lb;                                                     \
    446         T* right = stack[sp--].ub;                                                  \
    447                                                                                     \
    448         for(;;)                                                                     \
    449         {                                                                           \
    450             int i, n = (int)(right - left) + 1, m;                                  \
    451             T* ptr;                                                                 \
    452             T* ptr2;                                                                \
    453                                                                                     \
    454             if( n <= isort_thresh )                                                 \
    455             {                                                                       \
    456             insert_sort:                                                            \
    457                 for( ptr = left + 1; ptr <= right; ptr++ )                          \
    458                 {                                                                   \
    459                     for( ptr2 = ptr; ptr2 > left && LT(ptr2[0],ptr2[-1]); ptr2--)   \
    460                         CV_SWAP( ptr2[0], ptr2[-1], t );                            \
    461                 }                                                                   \
    462                 break;                                                              \
    463             }                                                                       \
    464             else                                                                    \
    465             {                                                                       \
    466                 T* left0;                                                           \
    467                 T* left1;                                                           \
    468                 T* right0;                                                          \
    469                 T* right1;                                                          \
    470                 T* pivot;                                                           \
    471                 T* a;                                                               \
    472                 T* b;                                                               \
    473                 T* c;                                                               \
    474                 int swap_cnt = 0;                                                   \
    475                                                                                     \
    476                 left0 = left;                                                       \
    477                 right0 = right;                                                     \
    478                 pivot = left + (n/2);                                               \
    479                                                                                     \
    480                 if( n > 40 )                                                        \
    481                 {                                                                   \
    482                     int d = n / 8;                                                  \
    483                     a = left, b = left + d, c = left + 2*d;                         \
    484                     left = LT(*a, *b) ? (LT(*b, *c) ? b : (LT(*a, *c) ? c : a))     \
    485                                       : (LT(*c, *b) ? b : (LT(*a, *c) ? a : c));    \
    486                                                                                     \
    487                     a = pivot - d, b = pivot, c = pivot + d;                        \
    488                     pivot = LT(*a, *b) ? (LT(*b, *c) ? b : (LT(*a, *c) ? c : a))    \
    489                                       : (LT(*c, *b) ? b : (LT(*a, *c) ? a : c));    \
    490                                                                                     \
    491                     a = right - 2*d, b = right - d, c = right;                      \
    492                     right = LT(*a, *b) ? (LT(*b, *c) ? b : (LT(*a, *c) ? c : a))    \
    493                                       : (LT(*c, *b) ? b : (LT(*a, *c) ? a : c));    \
    494                 }                                                                   \
    495                                                                                     \
    496                 a = left, b = pivot, c = right;                                     \
    497                 pivot = LT(*a, *b) ? (LT(*b, *c) ? b : (LT(*a, *c) ? c : a))        \
    498                                    : (LT(*c, *b) ? b : (LT(*a, *c) ? a : c));       \
    499                 if( pivot != left0 )                                                \
    500                 {                                                                   \
    501                     CV_SWAP( *pivot, *left0, t );                                   \
    502                     pivot = left0;                                                  \
    503                 }                                                                   \
    504                 left = left1 = left0 + 1;                                           \
    505                 right = right1 = right0;                                            \
    506                                                                                     \
    507                 for(;;)                                                             \
    508                 {                                                                   \
    509                     while( left <= right && !LT(*pivot, *left) )                    \
    510                     {                                                               \
    511                         if( !LT(*left, *pivot) )                                    \
    512                         {                                                           \
    513                             if( left > left1 )                                      \
    514                                 CV_SWAP( *left1, *left, t );                        \
    515                             swap_cnt = 1;                                           \
    516                             left1++;                                                \
    517                         }                                                           \
    518                         left++;                                                     \
    519                     }                                                               \
    520                                                                                     \
    521                     while( left <= right && !LT(*right, *pivot) )                   \
    522                     {                                                               \
    523                         if( !LT(*pivot, *right) )                                   \
    524                         {                                                           \
    525                             if( right < right1 )                                    \
    526                                 CV_SWAP( *right1, *right, t );                      \
    527                             swap_cnt = 1;                                           \
    528                             right1--;                                               \
    529                         }                                                           \
    530                         right--;                                                    \
    531                     }                                                               \
    532                                                                                     \
    533                     if( left > right )                                              \
    534                         break;                                                      \
    535                     CV_SWAP( *left, *right, t );                                    \
    536                     swap_cnt = 1;                                                   \
    537                     left++;                                                         \
    538                     right--;                                                        \
    539                 }                                                                   \
    540                                                                                     \
    541                 if( swap_cnt == 0 )                                                 \
    542                 {                                                                   \
    543                     left = left0, right = right0;                                   \
    544                     goto insert_sort;                                               \
    545                 }                                                                   \
    546                                                                                     \
    547                 n = MIN( (int)(left1 - left0), (int)(left - left1) );               \
    548                 for( i = 0; i < n; i++ )                                            \
    549                     CV_SWAP( left0[i], left[i-n], t );                              \
    550                                                                                     \
    551                 n = MIN( (int)(right0 - right1), (int)(right1 - right) );           \
    552                 for( i = 0; i < n; i++ )                                            \
    553                     CV_SWAP( left[i], right0[i-n+1], t );                           \
    554                 n = (int)(left - left1);                                            \
    555                 m = (int)(right1 - right);                                          \
    556                 if( n > 1 )                                                         \
    557                 {                                                                   \
    558                     if( m > 1 )                                                     \
    559                     {                                                               \
    560                         if( n > m )                                                 \
    561                         {                                                           \
    562                             stack[++sp].lb = left0;                                 \
    563                             stack[sp].ub = left0 + n - 1;                           \
    564                             left = right0 - m + 1, right = right0;                  \
    565                         }                                                           \
    566                         else                                                        \
    567                         {                                                           \
    568                             stack[++sp].lb = right0 - m + 1;                        \
    569                             stack[sp].ub = right0;                                  \
    570                             left = left0, right = left0 + n - 1;                    \
    571                         }                                                           \
    572                     }                                                               \
    573                     else                                                            \
    574                         left = left0, right = left0 + n - 1;                        \
    575                 }                                                                   \
    576                 else if( m > 1 )                                                    \
    577                     left = right0 - m + 1, right = right0;                          \
    578                 else                                                                \
    579                     break;                                                          \
    580             }                                                                       \
    581         }                                                                           \
    582     }                                                                               \
    583 }
    584 
    585 #define CV_IMPLEMENT_QSORT( func_name, T, cmp )  \
    586     CV_IMPLEMENT_QSORT_EX( func_name, T, cmp, int )
    587 
    588 /****************************************************************************************\
    589 *                     Structures and macros for integration with IPP                     *
    590 \****************************************************************************************/
    591 
    592 /* IPP-compatible return codes */
    593 typedef enum CvStatus
    594 {
    595     CV_BADMEMBLOCK_ERR          = -113,
    596     CV_INPLACE_NOT_SUPPORTED_ERR= -112,
    597     CV_UNMATCHED_ROI_ERR        = -111,
    598     CV_NOTFOUND_ERR             = -110,
    599     CV_BADCONVERGENCE_ERR       = -109,
    600 
    601     CV_BADDEPTH_ERR             = -107,
    602     CV_BADROI_ERR               = -106,
    603     CV_BADHEADER_ERR            = -105,
    604     CV_UNMATCHED_FORMATS_ERR    = -104,
    605     CV_UNSUPPORTED_COI_ERR      = -103,
    606     CV_UNSUPPORTED_CHANNELS_ERR = -102,
    607     CV_UNSUPPORTED_DEPTH_ERR    = -101,
    608     CV_UNSUPPORTED_FORMAT_ERR   = -100,
    609 
    610     CV_BADARG_ERR      = -49,  //ipp comp
    611     CV_NOTDEFINED_ERR  = -48,  //ipp comp
    612 
    613     CV_BADCHANNELS_ERR = -47,  //ipp comp
    614     CV_BADRANGE_ERR    = -44,  //ipp comp
    615     CV_BADSTEP_ERR     = -29,  //ipp comp
    616 
    617     CV_BADFLAG_ERR     =  -12,
    618     CV_DIV_BY_ZERO_ERR =  -11, //ipp comp
    619     CV_BADCOEF_ERR     =  -10,
    620 
    621     CV_BADFACTOR_ERR   =  -7,
    622     CV_BADPOINT_ERR    =  -6,
    623     CV_BADSCALE_ERR    =  -4,
    624     CV_OUTOFMEM_ERR    =  -3,
    625     CV_NULLPTR_ERR     =  -2,
    626     CV_BADSIZE_ERR     =  -1,
    627     CV_NO_ERR          =   0,
    628     CV_OK              =   CV_NO_ERR
    629 }
    630 CvStatus;
    631 
    632 #define CV_ERROR_FROM_STATUS( result )                \
    633     CV_ERROR( cvErrorFromIppStatus( result ), "OpenCV function failed" )
    634 
    635 #define IPPI_CALL( Func )                                              \
    636 {                                                                      \
    637       CvStatus  ippi_call_result;                                      \
    638       ippi_call_result = Func;                                         \
    639                                                                        \
    640       if( ippi_call_result < 0 )                                       \
    641             CV_ERROR_FROM_STATUS( (ippi_call_result));                 \
    642 }
    643 
    644 #define CV_PLUGIN_NONE      0
    645 #define CV_PLUGIN_OPTCV     1 /* custom "emerged" ippopencv library */
    646 #define CV_PLUGIN_IPPCV     2 /* IPP: computer vision */
    647 #define CV_PLUGIN_IPPI      3 /* IPP: image processing */
    648 #define CV_PLUGIN_IPPS      4 /* IPP: signal processing */
    649 #define CV_PLUGIN_IPPVM     5 /* IPP: vector math functions */
    650 #define CV_PLUGIN_IPPCC     6 /* IPP: color space conversion */
    651 #define CV_PLUGIN_MKL       8 /* Intel Math Kernel Library */
    652 
    653 #define CV_PLUGIN_MAX      16
    654 
    655 #define CV_PLUGINS1(lib1) ((lib1)&15)
    656 #define CV_PLUGINS2(lib1,lib2) (((lib1)&15)|(((lib2)&15)<<4))
    657 #define CV_PLUGINS3(lib1,lib2,lib3) (((lib1)&15)|(((lib2)&15)<<4)|(((lib2)&15)<<8))
    658 
    659 #define CV_NOTHROW throw()
    660 
    661 #ifndef IPCVAPI
    662 #define IPCVAPI(type,declspec,name,args)                        \
    663     /* function pointer */                                      \
    664     typedef type (declspec* name##_t) args;                     \
    665     extern name##_t name##_p;                                   \
    666     type declspec name args;
    667 #endif
    668 
    669 #define IPCVAPI_EX(type,name,ipp_name,ipp_search_modules,args)  \
    670     IPCVAPI(type,CV_STDCALL,name,args)
    671 
    672 #define IPCVAPI_C_EX(type,name,ipp_name,ipp_search_modules,args)\
    673     IPCVAPI(type,CV_CDECL,name,args)
    674 
    675 #ifndef IPCVAPI_IMPL
    676 #define IPCVAPI_IMPL(type,name,args,arg_names)                  \
    677     static type CV_STDCALL name##_f args;                       \
    678     name##_t name##_p = name##_f;                               \
    679     type CV_STDCALL name args { return name##_p arg_names; }    \
    680     static type CV_STDCALL name##_f args
    681 #endif
    682 
    683 /* IPP types' enumeration */
    684 typedef enum CvDataType {
    685     cv1u,
    686     cv8u, cv8s,
    687     cv16u, cv16s, cv16sc,
    688     cv32u, cv32s, cv32sc,
    689     cv32f, cv32fc,
    690     cv64u, cv64s, cv64sc,
    691     cv64f, cv64fc
    692 } CvDataType;
    693 
    694 typedef enum CvHintAlgorithm {
    695     cvAlgHintNone,
    696     cvAlgHintFast,
    697     cvAlgHintAccurate
    698 } CvHintAlgorithm;
    699 
    700 typedef enum CvCmpOp {
    701     cvCmpLess,
    702     cvCmpLessEq,
    703     cvCmpEq,
    704     cvCmpGreaterEq,
    705     cvCmpGreater
    706 } CvCmpOp;
    707 
    708 typedef struct CvFuncTable
    709 {
    710     void*   fn_2d[CV_DEPTH_MAX];
    711 }
    712 CvFuncTable;
    713 
    714 typedef struct CvBigFuncTable
    715 {
    716     void*   fn_2d[CV_DEPTH_MAX*CV_CN_MAX];
    717 }
    718 CvBigFuncTable;
    719 
    720 
    721 typedef struct CvBtFuncTable
    722 {
    723     void*   fn_2d[33];
    724 }
    725 CvBtFuncTable;
    726 
    727 typedef CvStatus (CV_STDCALL *CvFunc2D_1A)(void* arr, int step, CvSize size);
    728 
    729 typedef CvStatus (CV_STDCALL *CvFunc2D_1A1P)(void* arr, int step, CvSize size, void* param);
    730 
    731 typedef CvStatus (CV_STDCALL *CvFunc2D_1A1P1I)(void* arr, int step, CvSize size,
    732                                                void* param, int flag);
    733 
    734 typedef CvStatus (CV_STDCALL *CvFunc2DnC_1A1P)( void* arr, int step, CvSize size,
    735                                                 int cn, int coi, void* param );
    736 
    737 typedef CvStatus (CV_STDCALL *CvFunc2DnC_1A1P)( void* arr, int step, CvSize size,
    738                                                 int cn, int coi, void* param );
    739 
    740 typedef CvStatus (CV_STDCALL *CvFunc2D_1A2P)( void* arr, int step, CvSize size,
    741                                               void* param1, void* param2 );
    742 
    743 typedef CvStatus (CV_STDCALL *CvFunc2DnC_1A2P)( void* arr, int step,
    744                                                 CvSize size, int cn, int coi,
    745                                                 void* param1, void* param2 );
    746 
    747 typedef CvStatus (CV_STDCALL *CvFunc2D_1A4P)( void* arr, int step, CvSize size,
    748                                               void* param1, void* param2,
    749                                               void* param3, void* param4 );
    750 
    751 typedef CvStatus (CV_STDCALL *CvFunc2DnC_1A4P)( void* arr, int step,
    752                                                 CvSize size, int cn, int coi,
    753                                                 void* param1, void* param2,
    754                                                 void* param3, void* param4 );
    755 
    756 typedef CvStatus (CV_STDCALL *CvFunc2D_2A)( void* arr0, int step0,
    757                                             void* arr1, int step1, CvSize size );
    758 
    759 typedef CvStatus (CV_STDCALL *CvFunc2D_2A1P)( void* arr0, int step0,
    760                                               void* arr1, int step1,
    761                                               CvSize size, void* param );
    762 
    763 typedef CvStatus (CV_STDCALL *CvFunc2DnC_2A1P)( void* arr0, int step0,
    764                                                 void* arr1, int step1,
    765                                                 CvSize size, int cn,
    766                                                 int coi, void* param );
    767 
    768 typedef CvStatus (CV_STDCALL *CvFunc2DnC_2A1P)( void* arr0, int step0,
    769                                                 void* arr1, int step1,
    770                                                 CvSize size, int cn,
    771                                                 int coi, void* param );
    772 
    773 typedef CvStatus (CV_STDCALL *CvFunc2D_2A2P)( void* arr0, int step0,
    774                                               void* arr1, int step1, CvSize size,
    775                                               void* param1, void* param2 );
    776 
    777 typedef CvStatus (CV_STDCALL *CvFunc2DnC_2A2P)( void* arr0, int step0,
    778                                                 void* arr1, int step1,
    779                                                 CvSize size, int cn, int coi,
    780                                                 void* param1, void* param2 );
    781 
    782 typedef CvStatus (CV_STDCALL *CvFunc2D_2A1P1I)( void* arr0, int step0,
    783                                                 void* arr1, int step1, CvSize size,
    784                                                 void* param, int flag );
    785 
    786 typedef CvStatus (CV_STDCALL *CvFunc2D_2A4P)( void* arr0, int step0,
    787                                               void* arr1, int step1, CvSize size,
    788                                               void* param1, void* param2,
    789                                               void* param3, void* param4 );
    790 
    791 typedef CvStatus (CV_STDCALL *CvFunc2DnC_2A4P)( void* arr0, int step0,
    792                                                 void* arr1, int step1, CvSize size,
    793                                                 int cn, int coi,
    794                                                 void* param1, void* param2,
    795                                                 void* param3, void* param4 );
    796 
    797 typedef CvStatus (CV_STDCALL *CvFunc2D_3A)( void* arr0, int step0,
    798                                             void* arr1, int step1,
    799                                             void* arr2, int step2, CvSize size );
    800 
    801 typedef CvStatus (CV_STDCALL *CvFunc2D_3A1P)( void* arr0, int step0,
    802                                               void* arr1, int step1,
    803                                               void* arr2, int step2,
    804                                               CvSize size, void* param );
    805 
    806 typedef CvStatus (CV_STDCALL *CvFunc2D_3A1I)( void* arr0, int step0,
    807                                               void* arr1, int step1,
    808                                               void* arr2, int step2,
    809                                               CvSize size, int flag );
    810 
    811 typedef CvStatus (CV_STDCALL *CvFunc2DnC_3A1P)( void* arr0, int step0,
    812                                                 void* arr1, int step1,
    813                                                 void* arr2, int step2,
    814                                                 CvSize size, int cn,
    815                                                 int coi, void* param );
    816 
    817 typedef CvStatus (CV_STDCALL *CvFunc2D_4A)( void* arr0, int step0,
    818                                             void* arr1, int step1,
    819                                             void* arr2, int step2,
    820                                             void* arr3, int step3,
    821                                             CvSize size );
    822 
    823 typedef CvStatus (CV_STDCALL *CvFunc0D)( const void* src, void* dst, int param );
    824 
    825 #define CV_DEF_INIT_FUNC_TAB_2D( FUNCNAME, FLAG )                   \
    826 static void  icvInit##FUNCNAME##FLAG##Table( CvFuncTable* tab )     \
    827 {                                                                   \
    828     assert( tab );                                                  \
    829                                                                     \
    830     tab->fn_2d[CV_8U]  = (void*)icv##FUNCNAME##_8u_##FLAG;          \
    831     tab->fn_2d[CV_8S]  = (void*)icv##FUNCNAME##_8s_##FLAG;          \
    832     tab->fn_2d[CV_16U] = (void*)icv##FUNCNAME##_16u_##FLAG;         \
    833     tab->fn_2d[CV_16S] = (void*)icv##FUNCNAME##_16s_##FLAG;         \
    834     tab->fn_2d[CV_32S] = (void*)icv##FUNCNAME##_32s_##FLAG;         \
    835     tab->fn_2d[CV_32F] = (void*)icv##FUNCNAME##_32f_##FLAG;         \
    836     tab->fn_2d[CV_64F] = (void*)icv##FUNCNAME##_64f_##FLAG;         \
    837 }
    838 
    839 
    840 #define CV_DEF_INIT_BIG_FUNC_TAB_2D( FUNCNAME, FLAG )               \
    841 static void  icvInit##FUNCNAME##FLAG##Table( CvBigFuncTable* tab )  \
    842 {                                                                   \
    843     assert( tab );                                                  \
    844                                                                     \
    845     tab->fn_2d[CV_8UC1]  = (void*)icv##FUNCNAME##_8u_C1##FLAG;      \
    846     tab->fn_2d[CV_8UC2]  = (void*)icv##FUNCNAME##_8u_C2##FLAG;      \
    847     tab->fn_2d[CV_8UC3]  = (void*)icv##FUNCNAME##_8u_C3##FLAG;      \
    848     tab->fn_2d[CV_8UC4]  = (void*)icv##FUNCNAME##_8u_C4##FLAG;      \
    849                                                                     \
    850     tab->fn_2d[CV_8SC1]  = (void*)icv##FUNCNAME##_8s_C1##FLAG;      \
    851     tab->fn_2d[CV_8SC2]  = (void*)icv##FUNCNAME##_8s_C2##FLAG;      \
    852     tab->fn_2d[CV_8SC3]  = (void*)icv##FUNCNAME##_8s_C3##FLAG;      \
    853     tab->fn_2d[CV_8SC4]  = (void*)icv##FUNCNAME##_8s_C4##FLAG;      \
    854                                                                     \
    855     tab->fn_2d[CV_16UC1] = (void*)icv##FUNCNAME##_16u_C1##FLAG;     \
    856     tab->fn_2d[CV_16UC2] = (void*)icv##FUNCNAME##_16u_C2##FLAG;     \
    857     tab->fn_2d[CV_16UC3] = (void*)icv##FUNCNAME##_16u_C3##FLAG;     \
    858     tab->fn_2d[CV_16UC4] = (void*)icv##FUNCNAME##_16u_C4##FLAG;     \
    859                                                                     \
    860     tab->fn_2d[CV_16SC1] = (void*)icv##FUNCNAME##_16s_C1##FLAG;     \
    861     tab->fn_2d[CV_16SC2] = (void*)icv##FUNCNAME##_16s_C2##FLAG;     \
    862     tab->fn_2d[CV_16SC3] = (void*)icv##FUNCNAME##_16s_C3##FLAG;     \
    863     tab->fn_2d[CV_16SC4] = (void*)icv##FUNCNAME##_16s_C4##FLAG;     \
    864                                                                     \
    865     tab->fn_2d[CV_32SC1] = (void*)icv##FUNCNAME##_32s_C1##FLAG;     \
    866     tab->fn_2d[CV_32SC2] = (void*)icv##FUNCNAME##_32s_C2##FLAG;     \
    867     tab->fn_2d[CV_32SC3] = (void*)icv##FUNCNAME##_32s_C3##FLAG;     \
    868     tab->fn_2d[CV_32SC4] = (void*)icv##FUNCNAME##_32s_C4##FLAG;     \
    869                                                                     \
    870     tab->fn_2d[CV_32FC1] = (void*)icv##FUNCNAME##_32f_C1##FLAG;     \
    871     tab->fn_2d[CV_32FC2] = (void*)icv##FUNCNAME##_32f_C2##FLAG;     \
    872     tab->fn_2d[CV_32FC3] = (void*)icv##FUNCNAME##_32f_C3##FLAG;     \
    873     tab->fn_2d[CV_32FC4] = (void*)icv##FUNCNAME##_32f_C4##FLAG;     \
    874                                                                     \
    875     tab->fn_2d[CV_64FC1] = (void*)icv##FUNCNAME##_64f_C1##FLAG;     \
    876     tab->fn_2d[CV_64FC2] = (void*)icv##FUNCNAME##_64f_C2##FLAG;     \
    877     tab->fn_2d[CV_64FC3] = (void*)icv##FUNCNAME##_64f_C3##FLAG;     \
    878     tab->fn_2d[CV_64FC4] = (void*)icv##FUNCNAME##_64f_C4##FLAG;     \
    879 }
    880 
    881 #define CV_DEF_INIT_FUNC_TAB_0D( FUNCNAME )                         \
    882 static void  icvInit##FUNCNAME##Table( CvFuncTable* tab )           \
    883 {                                                                   \
    884     tab->fn_2d[CV_8U]  = (void*)icv##FUNCNAME##_8u;                 \
    885     tab->fn_2d[CV_8S]  = (void*)icv##FUNCNAME##_8s;                 \
    886     tab->fn_2d[CV_16U] = (void*)icv##FUNCNAME##_16u;                \
    887     tab->fn_2d[CV_16S] = (void*)icv##FUNCNAME##_16s;                \
    888     tab->fn_2d[CV_32S] = (void*)icv##FUNCNAME##_32s;                \
    889     tab->fn_2d[CV_32F] = (void*)icv##FUNCNAME##_32f;                \
    890     tab->fn_2d[CV_64F] = (void*)icv##FUNCNAME##_64f;                \
    891 }
    892 
    893 #define CV_DEF_INIT_FUNC_TAB_1D  CV_DEF_INIT_FUNC_TAB_0D
    894 
    895 
    896 #define CV_DEF_INIT_PIXSIZE_TAB_2D( FUNCNAME, FLAG )                \
    897 static void icvInit##FUNCNAME##FLAG##Table( CvBtFuncTable* table )  \
    898 {                                                                   \
    899     table->fn_2d[1]  = (void*)icv##FUNCNAME##_8u_C1##FLAG;          \
    900     table->fn_2d[2]  = (void*)icv##FUNCNAME##_8u_C2##FLAG;          \
    901     table->fn_2d[3]  = (void*)icv##FUNCNAME##_8u_C3##FLAG;          \
    902     table->fn_2d[4]  = (void*)icv##FUNCNAME##_16u_C2##FLAG;         \
    903     table->fn_2d[6]  = (void*)icv##FUNCNAME##_16u_C3##FLAG;         \
    904     table->fn_2d[8]  = (void*)icv##FUNCNAME##_32s_C2##FLAG;         \
    905     table->fn_2d[12] = (void*)icv##FUNCNAME##_32s_C3##FLAG;         \
    906     table->fn_2d[16] = (void*)icv##FUNCNAME##_64s_C2##FLAG;         \
    907     table->fn_2d[24] = (void*)icv##FUNCNAME##_64s_C3##FLAG;         \
    908     table->fn_2d[32] = (void*)icv##FUNCNAME##_64s_C4##FLAG;         \
    909 }
    910 
    911 #define  CV_GET_FUNC_PTR( func, table_entry )  \
    912     func = (table_entry);                      \
    913                                                \
    914     if( !func )                                \
    915         CV_ERROR( CV_StsUnsupportedFormat, "" )
    916 
    917 
    918 #endif /*_CXCORE_MISC_H_*/
    919