16acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*M///////////////////////////////////////////////////////////////////////////////////////
26acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
36acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
46acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
56acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  By downloading, copying, installing or using the software you agree to this license.
66acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  If you do not agree to this license, do not download, install,
76acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//  copy or use the software.
86acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
96acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                        Intel License Agreement
116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//                For Open Source Computer Vision Library
126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Copyright (C) 2000, Intel Corporation, all rights reserved.
146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Third party copyrights are property of their respective owners.
156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// Redistribution and use in source and binary forms, with or without modification,
176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// are permitted provided that the following conditions are met:
186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's of source code must retain the above copyright notice,
206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer.
216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * Redistribution's in binary form must reproduce the above copyright notice,
236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     this list of conditions and the following disclaimer in the documentation
246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     and/or other materials provided with the distribution.
256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//   * The name of Intel Corporation may not be used to endorse or promote products
276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//     derived from this software without specific prior written permission.
286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// This software is provided by the copyright holders and contributors "as is" and
306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// any express or implied warranties, including, but not limited to, the implied
316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// warranties of merchantability and fitness for a particular purpose are disclaimed.
326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// In no event shall the Intel Corporation or contributors be liable for any direct,
336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// indirect, incidental, special, exemplary, or consequential damages
346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// (including, but not limited to, procurement of substitute goods or services;
356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// loss of use, data, or profits; or business interruption) however caused
366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// and on any theory of liability, whether in contract, strict liability,
376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// or tort (including negligence or otherwise) arising in any way out of
386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn// the use of this software, even if advised of the possibility of such damage.
396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//
406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn//M*/
416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* The header is mostly for internal use and it is likely to change.
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   It contains some macro definitions that are used in cxcore, cv, cvaux
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   and, probably, other libraries. If you need some of this functionality,
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   the safe way is to copy it into your code and rename the macros.
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef _CXCORE_MISC_H_
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define _CXCORE_MISC_H_
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef HAVE_CONFIG_H
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #include "cvconfig.h"
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include <limits.h>
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef _OPENMP
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#include "omp.h"
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                              Compile-time tuning parameters                            *
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* maximal size of vector to run matrix operations on it inline (i.e. w/o ipp calls) */
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_MAX_INLINE_MAT_OP_SIZE  10
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* maximal linear size of matrix to allocate it on stack. */
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_MAX_LOCAL_MAT_SIZE  32
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* maximal size of local memory storage */
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_MAX_LOCAL_SIZE  \
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (CV_MAX_LOCAL_MAT_SIZE*CV_MAX_LOCAL_MAT_SIZE*(int)sizeof(double))
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* default image row align (in bytes) */
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_DEFAULT_IMAGE_ROW_ALIGN  4
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* matrices are continuous by default */
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_DEFAULT_MAT_ROW_ALIGN  1
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* maximum size of dynamic memory buffer.
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   cvAlloc reports an error if a larger block is requested. */
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_MAX_ALLOC_SIZE    (((size_t)1 << (sizeof(size_t)*8-2)))
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* the alignment of all the allocated buffers */
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_MALLOC_ALIGN    32
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* default alignment for dynamic data strucutures, resided in storages. */
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_STRUCT_ALIGN    ((int)sizeof(double))
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* default storage block size */
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_STORAGE_BLOCK_SIZE   ((1<<16) - 128)
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* default memory block for sparse array elements */
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_SPARSE_MAT_BLOCK    (1<<12)
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* initial hash table size */
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_SPARSE_HASH_SIZE0    (1<<10)
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* maximal average node_count/hash_size ratio beyond which hash table is resized */
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_SPARSE_HASH_RATIO    3
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* max length of strings */
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_MAX_STRLEN  1024
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* maximum possible number of threads in parallel implementations */
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef _OPENMP
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAX_THREADS 128
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAX_THREADS 1
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if 0 /*def  CV_CHECK_FOR_NANS*/
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_CHECK_NANS( arr ) cvCheckArray((arr))
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_CHECK_NANS( arr )
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                  Common declarations                                   *
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* get alloca declaration */
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef __GNUC__
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #undef alloca
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define alloca __builtin_alloca
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#elif defined WIN32 || defined WIN64
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #if defined _MSC_VER || defined __BORLANDC__
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        #include <malloc.h>
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #endif
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#elif defined HAVE_ALLOCA_H
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #include <alloca.h>
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#elif defined HAVE_ALLOCA
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #include <stdlib.h>
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #error
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* ! DO NOT make it an inline function */
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define cvStackAlloc(size) cvAlignPtr( alloca((size) + CV_MALLOC_ALIGN), CV_MALLOC_ALIGN )
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined _MSC_VER || defined __BORLANDC__
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_BIG_INT(n)   n##I64
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_BIG_UINT(n)  n##UI64
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_BIG_INT(n)   n##LL
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_BIG_UINT(n)  n##ULL
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IMPL CV_EXTERN_C
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_DBG_BREAK() { volatile int* crashMe = 0; *crashMe = 0; }
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* default step, set in case of continuous data
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   to work around checks for valid step in some ipp functions */
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_STUB_STEP     (1 << 30)
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_SIZEOF_FLOAT ((int)sizeof(float))
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_SIZEOF_SHORT ((int)sizeof(short))
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_ORIGIN_TL  0
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_ORIGIN_BL  1
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* IEEE754 constants and macros */
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_POS_INF       0x7f800000
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_NEG_INF       0x807fffff /* CV_TOGGLE_FLT(0xff800000) */
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_1F            0x3f800000
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_TOGGLE_FLT(x) ((x)^((int)(x) < 0 ? 0x7fffffff : 0))
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_TOGGLE_DBL(x) \
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((x)^((int64)(x) < 0 ? CV_BIG_INT(0x7fffffffffffffff) : 0))
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_NOP(a)      (a)
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_ADD(a, b)   ((a) + (b))
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_SUB(a, b)   ((a) - (b))
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_MUL(a, b)   ((a) * (b))
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_AND(a, b)   ((a) & (b))
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_OR(a, b)    ((a) | (b))
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_XOR(a, b)   ((a) ^ (b))
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_ANDN(a, b)  (~(a) & (b))
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_ORN(a, b)   (~(a) | (b))
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_SQR(a)      ((a) * (a))
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_LT(a, b)    ((a) < (b))
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_LE(a, b)    ((a) <= (b))
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_EQ(a, b)    ((a) == (b))
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_NE(a, b)    ((a) != (b))
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_GT(a, b)    ((a) > (b))
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_GE(a, b)    ((a) >= (b))
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_NONZERO(a)      ((a) != 0)
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_NONZERO_FLT(a)  (((a)+(a)) != 0)
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* general-purpose saturation macros */
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_CAST_8U(t)  (uchar)(!((t) & ~255) ? (t) : (t) > 0 ? 255 : 0)
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_CAST_8S(t)  (schar)(!(((t)+128) & ~255) ? (t) : (t) > 0 ? 127 : -128)
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_CAST_16U(t) (ushort)(!((t) & ~65535) ? (t) : (t) > 0 ? 65535 : 0)
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_CAST_16S(t) (short)(!(((t)+32768) & ~65535) ? (t) : (t) > 0 ? 32767 : -32768)
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_CAST_32S(t) (int)(t)
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_CAST_64S(t) (int64)(t)
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_CAST_32F(t) (float)(t)
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_CAST_64F(t) (double)(t)
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_PASTE2(a,b) a##b
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_PASTE(a,b)  CV_PASTE2(a,b)
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_EMPTY
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_MAKE_STR(a) #a
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_DEFINE_MASK         \
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float maskTab[2]; maskTab[0] = 0.f; maskTab[1] = 1.f;
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_ANDMASK( m, x )     ((x) & (((m) == 0) - 1))
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* (x) * ((m) == 1 ? 1.f : (m) == 0 ? 0.f : <ERR> */
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_MULMASK( m, x )       (maskTab[(m) != 0]*(x))
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* (x) * ((m) == -1 ? 1.f : (m) == 0 ? 0.f : <ERR> */
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_MULMASK1( m, x )      (maskTab[(m)+1]*(x))
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_ZERO_OBJ(x)  memset((x), 0, sizeof(*(x)))
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_DIM(static_array) ((int)(sizeof(static_array)/sizeof((static_array)[0])))
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_UN_ENTRY_C1(worktype)           \
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype s0 = scalar[0]
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_UN_ENTRY_C2(worktype)           \
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype s0 = scalar[0], s1 = scalar[1]
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_UN_ENTRY_C3(worktype)           \
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype s0 = scalar[0], s1 = scalar[1], s2 = scalar[2]
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_UN_ENTRY_C4(worktype)           \
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    worktype s0 = scalar[0], s1 = scalar[1], s2 = scalar[2], s3 = scalar[3]
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  cvUnsupportedFormat "Unsupported format"
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE void* cvAlignPtr( const void* ptr, int align=32 )
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( (align & (align-1)) == 0 );
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return (void*)( ((size_t)ptr + align - 1) & ~(size_t)(align-1) );
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE int cvAlign( int size, int align )
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( (align & (align-1)) == 0 && size < INT_MAX );
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return (size + align - 1) & -align;
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvSize  cvGetMatSize( const CvMat* mat )
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize size = { mat->width, mat->height };
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return size;
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_DESCALE(x,n)     (((x) + (1 << ((n)-1))) >> (n))
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_FLT_TO_FIX(x,n)  cvRound((x)*(1<<(n)))
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if 0
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* This is a small engine for performing fast division of multiple numbers
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   by the same constant. Most compilers do it too if they know the divisor value
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   at compile-time. The algorithm was taken from Agner Fog's optimization guide
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   at http://www.agner.org/assem */
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvFastDiv
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    unsigned delta, scale, divisor;
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvFastDiv;
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_FAST_DIV_SHIFT 32
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE CvFastDiv cvFastDiv( int divisor )
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvFastDiv fastdiv;
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( divisor >= 1 );
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uint64 temp = ((uint64)1 << CV_FAST_DIV_SHIFT)/divisor;
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    fastdiv.divisor = divisor;
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    fastdiv.delta = (unsigned)(((temp & 1) ^ 1) + divisor - 1);
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    fastdiv.scale = (unsigned)((temp + 1) >> 1);
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return fastdiv;
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_FAST_DIV( x, fastdiv )  \
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((int)(((int64)((x)*2 + (int)(fastdiv).delta))*(int)(fastdiv).scale>>CV_FAST_DIV_SHIFT))
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_FAST_UDIV( x, fastdiv )  \
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((int)(((uint64)((x)*2 + (fastdiv).delta))*(fastdiv).scale>>CV_FAST_DIV_SHIFT))
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MEMCPY_CHAR( dst, src, len )                                             \
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                                   \
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size_t _icv_memcpy_i_, _icv_memcpy_len_ = (len);                                \
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char* _icv_memcpy_dst_ = (char*)(dst);                                          \
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const char* _icv_memcpy_src_ = (const char*)(src);                              \
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( _icv_memcpy_i_ = 0; _icv_memcpy_i_ < _icv_memcpy_len_; _icv_memcpy_i_++ )  \
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        _icv_memcpy_dst_[_icv_memcpy_i_] = _icv_memcpy_src_[_icv_memcpy_i_];        \
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MEMCPY_INT( dst, src, len )                                              \
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                                   \
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size_t _icv_memcpy_i_, _icv_memcpy_len_ = (len);                                \
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int* _icv_memcpy_dst_ = (int*)(dst);                                            \
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const int* _icv_memcpy_src_ = (const int*)(src);                                \
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( ((size_t)_icv_memcpy_src_&(sizeof(int)-1)) == 0 &&                      \
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            ((size_t)_icv_memcpy_dst_&(sizeof(int)-1)) == 0 );                      \
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for(_icv_memcpy_i_=0;_icv_memcpy_i_<_icv_memcpy_len_;_icv_memcpy_i_++)          \
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        _icv_memcpy_dst_[_icv_memcpy_i_] = _icv_memcpy_src_[_icv_memcpy_i_];        \
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MEMCPY_AUTO( dst, src, len )                                             \
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                                   \
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size_t _icv_memcpy_i_, _icv_memcpy_len_ = (len);                                \
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char* _icv_memcpy_dst_ = (char*)(dst);                                          \
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const char* _icv_memcpy_src_ = (const char*)(src);                              \
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (_icv_memcpy_len_ & (sizeof(int)-1)) == 0 )                                 \
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                               \
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        assert( ((size_t)_icv_memcpy_src_&(sizeof(int)-1)) == 0 &&                  \
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                ((size_t)_icv_memcpy_dst_&(sizeof(int)-1)) == 0 );                  \
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for( _icv_memcpy_i_ = 0; _icv_memcpy_i_ < _icv_memcpy_len_;                 \
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            _icv_memcpy_i_+=sizeof(int) )                                           \
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                           \
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *(int*)(_icv_memcpy_dst_+_icv_memcpy_i_) =                              \
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            *(const int*)(_icv_memcpy_src_+_icv_memcpy_i_);                         \
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                           \
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                               \
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else                                                                            \
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                               \
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(_icv_memcpy_i_ = 0; _icv_memcpy_i_ < _icv_memcpy_len_; _icv_memcpy_i_++)\
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            _icv_memcpy_dst_[_icv_memcpy_i_] = _icv_memcpy_src_[_icv_memcpy_i_];    \
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                               \
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_ZERO_CHAR( dst, len )                                                    \
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                                   \
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size_t _icv_memcpy_i_, _icv_memcpy_len_ = (len);                                \
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char* _icv_memcpy_dst_ = (char*)(dst);                                          \
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for( _icv_memcpy_i_ = 0; _icv_memcpy_i_ < _icv_memcpy_len_; _icv_memcpy_i_++ )  \
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        _icv_memcpy_dst_[_icv_memcpy_i_] = '\0';                                    \
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_ZERO_INT( dst, len )                                                     \
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                                   \
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    size_t _icv_memcpy_i_, _icv_memcpy_len_ = (len);                                \
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int* _icv_memcpy_dst_ = (int*)(dst);                                            \
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( ((size_t)_icv_memcpy_dst_&(sizeof(int)-1)) == 0 );                      \
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    for(_icv_memcpy_i_=0;_icv_memcpy_i_<_icv_memcpy_len_;_icv_memcpy_i_++)          \
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        _icv_memcpy_dst_[_icv_memcpy_i_] = 0;                                       \
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  Generic implementation of QuickSort algorithm.
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  ----------------------------------------------
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  Using this macro user can declare customized sort function that can be much faster
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  than built-in qsort function because of lower overhead on elements
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  comparison and exchange. The macro takes less_than (or LT) argument - a macro or function
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  that takes 2 arguments returns non-zero if the first argument should be before the second
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  one in the sorted sequence and zero otherwise.
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  Example:
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Suppose that the task is to sort points by ascending of y coordinates and if
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    y's are equal x's should ascend.
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    The code is:
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ------------------------------------------------------------------------------
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn           #define cmp_pts( pt1, pt2 ) \
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn               ((pt1).y < (pt2).y || ((pt1).y < (pt2).y && (pt1).x < (pt2).x))
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn           [static] CV_IMPLEMENT_QSORT( icvSortPoints, CvPoint, cmp_pts )
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ------------------------------------------------------------------------------
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    After that the function "void icvSortPoints( CvPoint* array, size_t total, int aux );"
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    is available to user.
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  aux is an additional parameter, which can be used when comparing elements.
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  The current implementation was derived from *BSD system qsort():
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * Copyright (c) 1992, 1993
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *  The Regents of the University of California.  All rights reserved.
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * Redistribution and use in source and binary forms, with or without
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * modification, are permitted provided that the following conditions
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * are met:
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * 1. Redistributions of source code must retain the above copyright
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *    notice, this list of conditions and the following disclaimer.
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * 2. Redistributions in binary form must reproduce the above copyright
3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *    notice, this list of conditions and the following disclaimer in the
3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *    documentation and/or other materials provided with the distribution.
3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * 3. All advertising materials mentioning features or use of this software
4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *    must display the following acknowledgement:
4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *  This product includes software developed by the University of
4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *  California, Berkeley and its contributors.
4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * 4. Neither the name of the University nor the names of its contributors
4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *    may be used to endorse or promote products derived from this software
4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *    without specific prior written permission.
4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *
4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    * SUCH DAMAGE.
4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IMPLEMENT_QSORT_EX( func_name, T, LT, user_data_type )                   \
4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennvoid func_name( T *array, size_t total, user_data_type aux )                        \
4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                                   \
4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int isort_thresh = 7;                                                           \
4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    T t;                                                                            \
4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int sp = 0;                                                                     \
4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct                                                                          \
4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                               \
4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        T *lb;                                                                      \
4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        T *ub;                                                                      \
4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                               \
4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    stack[48];                                                                      \
4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    aux = aux;                                                                      \
4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( total <= 1 )                                                                \
4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return;                                                                     \
4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    stack[0].lb = array;                                                            \
4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    stack[0].ub = array + (total - 1);                                              \
4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    while( sp >= 0 )                                                                \
4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                               \
4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        T* left = stack[sp].lb;                                                     \
4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        T* right = stack[sp--].ub;                                                  \
4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        for(;;)                                                                     \
4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        {                                                                           \
4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            int i, n = (int)(right - left) + 1, m;                                  \
4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            T* ptr;                                                                 \
4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            T* ptr2;                                                                \
4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            if( n <= isort_thresh )                                                 \
4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                                       \
4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            insert_sort:                                                            \
4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( ptr = left + 1; ptr <= right; ptr++ )                          \
4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {                                                                   \
4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    for( ptr2 = ptr; ptr2 > left && LT(ptr2[0],ptr2[-1]); ptr2--)   \
4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        CV_SWAP( ptr2[0], ptr2[-1], t );                            \
4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }                                                                   \
4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                break;                                                              \
4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                                       \
4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            else                                                                    \
4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            {                                                                       \
4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                T* left0;                                                           \
4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                T* left1;                                                           \
4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                T* right0;                                                          \
4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                T* right1;                                                          \
4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                T* pivot;                                                           \
4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                T* a;                                                               \
4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                T* b;                                                               \
4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                T* c;                                                               \
4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                int swap_cnt = 0;                                                   \
4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                left0 = left;                                                       \
4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                right0 = right;                                                     \
4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                pivot = left + (n/2);                                               \
4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( n > 40 )                                                        \
4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {                                                                   \
4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    int d = n / 8;                                                  \
4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    a = left, b = left + d, c = left + 2*d;                         \
4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    left = LT(*a, *b) ? (LT(*b, *c) ? b : (LT(*a, *c) ? c : a))     \
4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                      : (LT(*c, *b) ? b : (LT(*a, *c) ? a : c));    \
4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    a = pivot - d, b = pivot, c = pivot + d;                        \
4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    pivot = LT(*a, *b) ? (LT(*b, *c) ? b : (LT(*a, *c) ? c : a))    \
4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                      : (LT(*c, *b) ? b : (LT(*a, *c) ? a : c));    \
4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    a = right - 2*d, b = right - d, c = right;                      \
4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    right = LT(*a, *b) ? (LT(*b, *c) ? b : (LT(*a, *c) ? c : a))    \
4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                      : (LT(*c, *b) ? b : (LT(*a, *c) ? a : c));    \
4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }                                                                   \
4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                a = left, b = pivot, c = right;                                     \
4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                pivot = LT(*a, *b) ? (LT(*b, *c) ? b : (LT(*a, *c) ? c : a))        \
4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                   : (LT(*c, *b) ? b : (LT(*a, *c) ? a : c));       \
4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( pivot != left0 )                                                \
5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {                                                                   \
5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_SWAP( *pivot, *left0, t );                                   \
5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    pivot = left0;                                                  \
5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }                                                                   \
5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                left = left1 = left0 + 1;                                           \
5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                right = right1 = right0;                                            \
5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for(;;)                                                             \
5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {                                                                   \
5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    while( left <= right && !LT(*pivot, *left) )                    \
5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {                                                               \
5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        if( !LT(*left, *pivot) )                                    \
5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        {                                                           \
5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            if( left > left1 )                                      \
5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                CV_SWAP( *left1, *left, t );                        \
5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            swap_cnt = 1;                                           \
5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            left1++;                                                \
5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        }                                                           \
5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        left++;                                                     \
5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }                                                               \
5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    while( left <= right && !LT(*right, *pivot) )                   \
5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {                                                               \
5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        if( !LT(*pivot, *right) )                                   \
5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        {                                                           \
5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            if( right < right1 )                                    \
5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                CV_SWAP( *right1, *right, t );                      \
5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            swap_cnt = 1;                                           \
5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            right1--;                                               \
5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        }                                                           \
5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        right--;                                                    \
5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }                                                               \
5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( left > right )                                              \
5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        break;                                                      \
5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_SWAP( *left, *right, t );                                    \
5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    swap_cnt = 1;                                                   \
5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    left++;                                                         \
5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    right--;                                                        \
5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }                                                                   \
5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( swap_cnt == 0 )                                                 \
5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {                                                                   \
5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    left = left0, right = right0;                                   \
5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    goto insert_sort;                                               \
5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }                                                                   \
5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                n = MIN( (int)(left1 - left0), (int)(left - left1) );               \
5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( i = 0; i < n; i++ )                                            \
5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_SWAP( left0[i], left[i-n], t );                              \
5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                                    \
5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                n = MIN( (int)(right0 - right1), (int)(right1 - right) );           \
5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                for( i = 0; i < n; i++ )                                            \
5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    CV_SWAP( left[i], right0[i-n+1], t );                           \
5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                n = (int)(left - left1);                                            \
5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                m = (int)(right1 - right);                                          \
5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                if( n > 1 )                                                         \
5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                {                                                                   \
5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    if( m > 1 )                                                     \
5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    {                                                               \
5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        if( n > m )                                                 \
5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        {                                                           \
5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            stack[++sp].lb = left0;                                 \
5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            stack[sp].ub = left0 + n - 1;                           \
5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            left = right0 - m + 1, right = right0;                  \
5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        }                                                           \
5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        else                                                        \
5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        {                                                           \
5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            stack[++sp].lb = right0 - m + 1;                        \
5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            stack[sp].ub = right0;                                  \
5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                            left = left0, right = left0 + n - 1;                    \
5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        }                                                           \
5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    }                                                               \
5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    else                                                            \
5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                        left = left0, right = left0 + n - 1;                        \
5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                }                                                                   \
5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else if( m > 1 )                                                    \
5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    left = right0 - m + 1, right = right0;                          \
5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                else                                                                \
5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                    break;                                                          \
5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            }                                                                       \
5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        }                                                                           \
5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                               \
5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IMPLEMENT_QSORT( func_name, T, cmp )  \
5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_IMPLEMENT_QSORT_EX( func_name, T, cmp, int )
5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                     Structures and macros for integration with IPP                     *
5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* IPP-compatible return codes */
5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef enum CvStatus
5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_BADMEMBLOCK_ERR          = -113,
5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_INPLACE_NOT_SUPPORTED_ERR= -112,
5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_UNMATCHED_ROI_ERR        = -111,
5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_NOTFOUND_ERR             = -110,
5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_BADCONVERGENCE_ERR       = -109,
6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_BADDEPTH_ERR             = -107,
6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_BADROI_ERR               = -106,
6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_BADHEADER_ERR            = -105,
6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_UNMATCHED_FORMATS_ERR    = -104,
6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_UNSUPPORTED_COI_ERR      = -103,
6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_UNSUPPORTED_CHANNELS_ERR = -102,
6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_UNSUPPORTED_DEPTH_ERR    = -101,
6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_UNSUPPORTED_FORMAT_ERR   = -100,
6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_BADARG_ERR      = -49,  //ipp comp
6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_NOTDEFINED_ERR  = -48,  //ipp comp
6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_BADCHANNELS_ERR = -47,  //ipp comp
6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_BADRANGE_ERR    = -44,  //ipp comp
6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_BADSTEP_ERR     = -29,  //ipp comp
6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_BADFLAG_ERR     =  -12,
6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_DIV_BY_ZERO_ERR =  -11, //ipp comp
6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_BADCOEF_ERR     =  -10,
6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_BADFACTOR_ERR   =  -7,
6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_BADPOINT_ERR    =  -6,
6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_BADSCALE_ERR    =  -4,
6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_OUTOFMEM_ERR    =  -3,
6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_NULLPTR_ERR     =  -2,
6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_BADSIZE_ERR     =  -1,
6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_NO_ERR          =   0,
6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_OK              =   CV_NO_ERR
6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStatus;
6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_ERROR_FROM_STATUS( result )                \
6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_ERROR( cvErrorFromIppStatus( result ), "OpenCV function failed" )
6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPPI_CALL( Func )                                              \
6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                      \
6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      CvStatus  ippi_call_result;                                      \
6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      ippi_call_result = Func;                                         \
6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                       \
6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      if( ippi_call_result < 0 )                                       \
6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            CV_ERROR_FROM_STATUS( (ippi_call_result));                 \
6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_PLUGIN_NONE      0
6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_PLUGIN_OPTCV     1 /* custom "emerged" ippopencv library */
6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_PLUGIN_IPPCV     2 /* IPP: computer vision */
6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_PLUGIN_IPPI      3 /* IPP: image processing */
6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_PLUGIN_IPPS      4 /* IPP: signal processing */
6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_PLUGIN_IPPVM     5 /* IPP: vector math functions */
6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_PLUGIN_IPPCC     6 /* IPP: color space conversion */
6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_PLUGIN_MKL       8 /* Intel Math Kernel Library */
6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_PLUGIN_MAX      16
6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_PLUGINS1(lib1) ((lib1)&15)
6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_PLUGINS2(lib1,lib2) (((lib1)&15)|(((lib2)&15)<<4))
6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_PLUGINS3(lib1,lib2,lib3) (((lib1)&15)|(((lib2)&15)<<4)|(((lib2)&15)<<8))
6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NOTHROW throw()
6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef IPCVAPI
6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPCVAPI(type,declspec,name,args)                        \
6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* function pointer */                                      \
6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    typedef type (declspec* name##_t) args;                     \
6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    extern name##_t name##_p;                                   \
6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type declspec name args;
6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPCVAPI_EX(type,name,ipp_name,ipp_search_modules,args)  \
6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IPCVAPI(type,CV_STDCALL,name,args)
6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPCVAPI_C_EX(type,name,ipp_name,ipp_search_modules,args)\
6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IPCVAPI(type,CV_CDECL,name,args)
6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef IPCVAPI_IMPL
6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPCVAPI_IMPL(type,name,args,arg_names)                  \
6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static type CV_STDCALL name##_f args;                       \
6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    name##_t name##_p = name##_f;                               \
6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type CV_STDCALL name args { return name##_p arg_names; }    \
6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    static type CV_STDCALL name##_f args
6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* IPP types' enumeration */
6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef enum CvDataType {
6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cv1u,
6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cv8u, cv8s,
6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cv16u, cv16s, cv16sc,
6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cv32u, cv32s, cv32sc,
6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cv32f, cv32fc,
6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cv64u, cv64s, cv64sc,
6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cv64f, cv64fc
6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} CvDataType;
6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef enum CvHintAlgorithm {
6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvAlgHintNone,
6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvAlgHintFast,
6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvAlgHintAccurate
6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} CvHintAlgorithm;
6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef enum CvCmpOp {
7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvCmpLess,
7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvCmpLessEq,
7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvCmpEq,
7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvCmpGreaterEq,
7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvCmpGreater
7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn} CvCmpOp;
7076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvFuncTable
7096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void*   fn_2d[CV_DEPTH_MAX];
7116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvFuncTable;
7136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvBigFuncTable
7156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void*   fn_2d[CV_DEPTH_MAX*CV_CN_MAX];
7176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvBigFuncTable;
7196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvBtFuncTable
7226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void*   fn_2d[33];
7246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvBtFuncTable;
7266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2D_1A)(void* arr, int step, CvSize size);
7286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2D_1A1P)(void* arr, int step, CvSize size, void* param);
7306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2D_1A1P1I)(void* arr, int step, CvSize size,
7326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                               void* param, int flag);
7336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2DnC_1A1P)( void* arr, int step, CvSize size,
7356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                int cn, int coi, void* param );
7366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2DnC_1A1P)( void* arr, int step, CvSize size,
7386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                int cn, int coi, void* param );
7396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2D_1A2P)( void* arr, int step, CvSize size,
7416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              void* param1, void* param2 );
7426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2DnC_1A2P)( void* arr, int step,
7446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                CvSize size, int cn, int coi,
7456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                void* param1, void* param2 );
7466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2D_1A4P)( void* arr, int step, CvSize size,
7486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              void* param1, void* param2,
7496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              void* param3, void* param4 );
7506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2DnC_1A4P)( void* arr, int step,
7526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                CvSize size, int cn, int coi,
7536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                void* param1, void* param2,
7546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                void* param3, void* param4 );
7556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2D_2A)( void* arr0, int step0,
7576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            void* arr1, int step1, CvSize size );
7586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2D_2A1P)( void* arr0, int step0,
7606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              void* arr1, int step1,
7616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              CvSize size, void* param );
7626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2DnC_2A1P)( void* arr0, int step0,
7646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                void* arr1, int step1,
7656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                CvSize size, int cn,
7666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                int coi, void* param );
7676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2DnC_2A1P)( void* arr0, int step0,
7696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                void* arr1, int step1,
7706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                CvSize size, int cn,
7716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                int coi, void* param );
7726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2D_2A2P)( void* arr0, int step0,
7746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              void* arr1, int step1, CvSize size,
7756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              void* param1, void* param2 );
7766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2DnC_2A2P)( void* arr0, int step0,
7786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                void* arr1, int step1,
7796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                CvSize size, int cn, int coi,
7806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                void* param1, void* param2 );
7816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2D_2A1P1I)( void* arr0, int step0,
7836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                void* arr1, int step1, CvSize size,
7846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                void* param, int flag );
7856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2D_2A4P)( void* arr0, int step0,
7876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              void* arr1, int step1, CvSize size,
7886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              void* param1, void* param2,
7896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              void* param3, void* param4 );
7906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2DnC_2A4P)( void* arr0, int step0,
7926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                void* arr1, int step1, CvSize size,
7936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                int cn, int coi,
7946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                void* param1, void* param2,
7956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                void* param3, void* param4 );
7966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2D_3A)( void* arr0, int step0,
7986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            void* arr1, int step1,
7996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            void* arr2, int step2, CvSize size );
8006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2D_3A1P)( void* arr0, int step0,
8026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              void* arr1, int step1,
8036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              void* arr2, int step2,
8046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              CvSize size, void* param );
8056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2D_3A1I)( void* arr0, int step0,
8076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              void* arr1, int step1,
8086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              void* arr2, int step2,
8096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                              CvSize size, int flag );
8106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2DnC_3A1P)( void* arr0, int step0,
8126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                void* arr1, int step1,
8136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                void* arr2, int step2,
8146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                CvSize size, int cn,
8156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                int coi, void* param );
8166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc2D_4A)( void* arr0, int step0,
8186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            void* arr1, int step1,
8196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            void* arr2, int step2,
8206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            void* arr3, int step3,
8216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                            CvSize size );
8226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvStatus (CV_STDCALL *CvFunc0D)( const void* src, void* dst, int param );
8246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_DEF_INIT_FUNC_TAB_2D( FUNCNAME, FLAG )                   \
8266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void  icvInit##FUNCNAME##FLAG##Table( CvFuncTable* tab )     \
8276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
8286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( tab );                                                  \
8296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
8306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8U]  = (void*)icv##FUNCNAME##_8u_##FLAG;          \
8316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8S]  = (void*)icv##FUNCNAME##_8s_##FLAG;          \
8326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16U] = (void*)icv##FUNCNAME##_16u_##FLAG;         \
8336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16S] = (void*)icv##FUNCNAME##_16s_##FLAG;         \
8346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32S] = (void*)icv##FUNCNAME##_32s_##FLAG;         \
8356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32F] = (void*)icv##FUNCNAME##_32f_##FLAG;         \
8366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_64F] = (void*)icv##FUNCNAME##_64f_##FLAG;         \
8376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_DEF_INIT_BIG_FUNC_TAB_2D( FUNCNAME, FLAG )               \
8416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void  icvInit##FUNCNAME##FLAG##Table( CvBigFuncTable* tab )  \
8426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
8436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( tab );                                                  \
8446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
8456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8UC1]  = (void*)icv##FUNCNAME##_8u_C1##FLAG;      \
8466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8UC2]  = (void*)icv##FUNCNAME##_8u_C2##FLAG;      \
8476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8UC3]  = (void*)icv##FUNCNAME##_8u_C3##FLAG;      \
8486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8UC4]  = (void*)icv##FUNCNAME##_8u_C4##FLAG;      \
8496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
8506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8SC1]  = (void*)icv##FUNCNAME##_8s_C1##FLAG;      \
8516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8SC2]  = (void*)icv##FUNCNAME##_8s_C2##FLAG;      \
8526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8SC3]  = (void*)icv##FUNCNAME##_8s_C3##FLAG;      \
8536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8SC4]  = (void*)icv##FUNCNAME##_8s_C4##FLAG;      \
8546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
8556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16UC1] = (void*)icv##FUNCNAME##_16u_C1##FLAG;     \
8566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16UC2] = (void*)icv##FUNCNAME##_16u_C2##FLAG;     \
8576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16UC3] = (void*)icv##FUNCNAME##_16u_C3##FLAG;     \
8586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16UC4] = (void*)icv##FUNCNAME##_16u_C4##FLAG;     \
8596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
8606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16SC1] = (void*)icv##FUNCNAME##_16s_C1##FLAG;     \
8616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16SC2] = (void*)icv##FUNCNAME##_16s_C2##FLAG;     \
8626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16SC3] = (void*)icv##FUNCNAME##_16s_C3##FLAG;     \
8636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16SC4] = (void*)icv##FUNCNAME##_16s_C4##FLAG;     \
8646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
8656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32SC1] = (void*)icv##FUNCNAME##_32s_C1##FLAG;     \
8666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32SC2] = (void*)icv##FUNCNAME##_32s_C2##FLAG;     \
8676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32SC3] = (void*)icv##FUNCNAME##_32s_C3##FLAG;     \
8686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32SC4] = (void*)icv##FUNCNAME##_32s_C4##FLAG;     \
8696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
8706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32FC1] = (void*)icv##FUNCNAME##_32f_C1##FLAG;     \
8716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32FC2] = (void*)icv##FUNCNAME##_32f_C2##FLAG;     \
8726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32FC3] = (void*)icv##FUNCNAME##_32f_C3##FLAG;     \
8736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32FC4] = (void*)icv##FUNCNAME##_32f_C4##FLAG;     \
8746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                                                    \
8756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_64FC1] = (void*)icv##FUNCNAME##_64f_C1##FLAG;     \
8766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_64FC2] = (void*)icv##FUNCNAME##_64f_C2##FLAG;     \
8776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_64FC3] = (void*)icv##FUNCNAME##_64f_C3##FLAG;     \
8786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_64FC4] = (void*)icv##FUNCNAME##_64f_C4##FLAG;     \
8796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_DEF_INIT_FUNC_TAB_0D( FUNCNAME )                         \
8826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void  icvInit##FUNCNAME##Table( CvFuncTable* tab )           \
8836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
8846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8U]  = (void*)icv##FUNCNAME##_8u;                 \
8856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_8S]  = (void*)icv##FUNCNAME##_8s;                 \
8866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16U] = (void*)icv##FUNCNAME##_16u;                \
8876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_16S] = (void*)icv##FUNCNAME##_16s;                \
8886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32S] = (void*)icv##FUNCNAME##_32s;                \
8896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_32F] = (void*)icv##FUNCNAME##_32f;                \
8906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    tab->fn_2d[CV_64F] = (void*)icv##FUNCNAME##_64f;                \
8916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_DEF_INIT_FUNC_TAB_1D  CV_DEF_INIT_FUNC_TAB_0D
8946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_DEF_INIT_PIXSIZE_TAB_2D( FUNCNAME, FLAG )                \
8976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstatic void icvInit##FUNCNAME##FLAG##Table( CvBtFuncTable* table )  \
8986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                   \
8996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[1]  = (void*)icv##FUNCNAME##_8u_C1##FLAG;          \
9006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[2]  = (void*)icv##FUNCNAME##_8u_C2##FLAG;          \
9016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[3]  = (void*)icv##FUNCNAME##_8u_C3##FLAG;          \
9026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[4]  = (void*)icv##FUNCNAME##_16u_C2##FLAG;         \
9036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[6]  = (void*)icv##FUNCNAME##_16u_C3##FLAG;         \
9046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[8]  = (void*)icv##FUNCNAME##_32s_C2##FLAG;         \
9056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[12] = (void*)icv##FUNCNAME##_32s_C3##FLAG;         \
9066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[16] = (void*)icv##FUNCNAME##_64s_C2##FLAG;         \
9076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[24] = (void*)icv##FUNCNAME##_64s_C3##FLAG;         \
9086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    table->fn_2d[32] = (void*)icv##FUNCNAME##_64s_C4##FLAG;         \
9096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_GET_FUNC_PTR( func, table_entry )  \
9126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    func = (table_entry);                      \
9136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                               \
9146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( !func )                                \
9156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_ERROR( CV_StsUnsupportedFormat, "" )
9166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif /*_CXCORE_MISC_H_*/
919