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#ifndef _CXCORE_TYPES_H_
436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define _CXCORE_TYPES_H_
446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if !defined _CRT_SECURE_NO_DEPRECATE && _MSC_VER > 1300
466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define _CRT_SECURE_NO_DEPRECATE /* to avoid multiple Visual Studio 2005 warnings */
476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef SKIP_INCLUDES
506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #include <assert.h>
516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #include <stdlib.h>
526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #include <string.h>
536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #include <float.h>
546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #if defined __ICL
566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_ICC   __ICL
576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #elif defined __ICC
586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_ICC   __ICC
596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #elif defined __ECL
606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_ICC   __ECL
616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #elif defined __ECC
626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_ICC   __ECC
636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #endif
646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #if defined WIN32 && (!defined WIN64 || defined EM64T) && \
666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      (_MSC_VER >= 1400 || defined CV_ICC) \
676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      || (defined __SSE2__ && defined __GNUC__ && __GNUC__ >= 4)
686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #include <emmintrin.h>
696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_SSE2 1
706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #else
716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_SSE2 0
726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #endif
736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #if defined __BORLANDC__
756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #include <fastmath.h>
766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #elif defined WIN64 && !defined EM64T && defined CV_ICC
776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #include <mathimf.h>
786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #else
796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #include <math.h>
806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #endif
816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #ifdef HAVE_IPL
836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      #ifndef __IPL_H__
846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn          #if defined WIN32 || defined WIN64
856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn              #include <ipl.h>
866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn          #else
876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn              #include <ipl/ipl.h>
886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn          #endif
896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      #endif
906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #elif defined __IPL_H__
916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      #define HAVE_IPL
926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  #endif
936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif // SKIP_INCLUDES
946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined WIN32 || defined WIN64
966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_CDECL __cdecl
976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_STDCALL __stdcall
986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_CDECL
1006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_STDCALL
1016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef CV_EXTERN_C
1046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #ifdef __cplusplus
1056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        #define CV_EXTERN_C extern "C"
1066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        #define CV_DEFAULT(val) = val
1076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #else
1086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        #define CV_EXTERN_C
1096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        #define CV_DEFAULT(val)
1106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #endif
1116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef CV_EXTERN_C_FUNCPTR
1146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #ifdef __cplusplus
1156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        #define CV_EXTERN_C_FUNCPTR(x) extern "C" { typedef x; }
1166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #else
1176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        #define CV_EXTERN_C_FUNCPTR(x) typedef x
1186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #endif
1196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef CV_INLINE
1226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined __cplusplus
1236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_INLINE inline
1246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#elif (defined WIN32 || defined WIN64) && !defined __GNUC__
1256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_INLINE __inline
1266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
1276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_INLINE static
1286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif /* CV_INLINE */
1306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if (defined WIN32 || defined WIN64) && defined CVAPI_EXPORTS
1326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_EXPORTS __declspec(dllexport)
1336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
1346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CV_EXPORTS
1356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef CVAPI
1386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    #define CVAPI(rettype) CV_EXTERN_C CV_EXPORTS rettype CV_CDECL
1396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if defined _MSC_VER || defined __BORLANDC__
1426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef __int64 int64;
1436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef unsigned __int64 uint64;
1446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
1456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef long long int64;
1466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef unsigned long long uint64;
1476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef HAVE_IPL
1506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef unsigned char uchar;
1516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef unsigned short ushort;
1526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef signed char schar;
1556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* CvArr* is used to pass arbitrary
1576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * array-like data structures
1586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * into functions where the particular
1596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * array type is recognized at runtime:
1606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn */
1616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef void CvArr;
1626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef union Cv32suf
1646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i;
1666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    unsigned u;
1676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float f;
1686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCv32suf;
1706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef union Cv64suf
1726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
1736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int64 i;
1746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uint64 u;
1756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double f;
1766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
1776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCv64suf;
1786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
1806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                             Common macros and inline functions                         *
1816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
1826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_PI   3.1415926535897932384626433832795
1846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_LOG2 0.69314718055994530941723212145818
1856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SWAP(a,b,t) ((t) = (a), (a) = (b), (b) = (t))
1876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef MIN
1896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define MIN(a,b)  ((a) > (b) ? (b) : (a))
1906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef MAX
1936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define MAX(a,b)  ((a) < (b) ? (b) : (a))
1946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
1956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* min & max without jumps */
1976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_IMIN(a, b)  ((a) ^ (((a)^(b)) & (((a) < (b)) - 1)))
1986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
1996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_IMAX(a, b)  ((a) ^ (((a)^(b)) & (((a) > (b)) - 1)))
2006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* absolute value without jumps */
2026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef __cplusplus
2036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_IABS(a)     (((a) ^ ((a) < 0 ? -1 : 0)) - ((a) < 0 ? -1 : 0))
2046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
2056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_IABS(a)     abs(a)
2066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
2076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_CMP(a,b)    (((a) > (b)) - ((a) < (b)))
2086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_SIGN(a)     CV_CMP((a),0)
2096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  int  cvRound( double value )
2116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if CV_SSE2
2136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __m128d t = _mm_load_sd( &value );
2146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return _mm_cvtsd_si32(t);
2156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#elif defined WIN32 && !defined WIN64 && defined _MSC_VER
2166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int t;
2176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __asm
2186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
2196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        fld value;
2206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        fistp t;
2216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
2226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return t;
2236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#elif (defined HAVE_LRINT) || (defined WIN64 && !defined EM64T && defined CV_ICC)
2246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return (int)lrint(value);
2256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
2266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /*
2276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     the algorithm was taken from Agner Fog's optimization guide
2286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     at http://www.agner.org/assem
2296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     */
2306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Cv64suf temp;
2316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    temp.f = value + 6755399441055744.0;
2326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return (int)temp.u;
2336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
2346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  int  cvFloor( double value )
2386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if CV_SSE2
2406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __m128d t = _mm_load_sd( &value );
2416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i = _mm_cvtsd_si32(t);
2426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return i - _mm_movemask_pd(_mm_cmplt_sd(t,_mm_cvtsi32_sd(t,i)));
2436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
2446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int temp = cvRound(value);
2456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Cv32suf diff;
2466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    diff.f = (float)(value - temp);
2476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return temp - (diff.i < 0);
2486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
2496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  int  cvCeil( double value )
2536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if CV_SSE2
2556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    __m128d t = _mm_load_sd( &value );
2566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int i = _mm_cvtsd_si32(t);
2576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return i + _mm_movemask_pd(_mm_cmplt_sd(_mm_cvtsi32_sd(t,i),t));
2586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
2596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int temp = cvRound(value);
2606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Cv32suf diff;
2616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    diff.f = (float)(temp - value);
2626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return temp + (diff.i < 0);
2636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
2646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define cvInvSqrt(value) ((float)(1./sqrt(value)))
2676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define cvSqrt(value)  ((float)sqrt(value))
2686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE int cvIsNaN( double value )
2706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if 1/*defined _MSC_VER || defined __BORLANDC__
2726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return _isnan(value);
2736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#elif defined __GNUC__
2746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return isnan(value);
2756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else*/
2766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Cv64suf ieee754;
2776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ieee754.f = value;
2786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return ((unsigned)(ieee754.u >> 32) & 0x7fffffff) +
2796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn           ((unsigned)ieee754.u != 0) > 0x7ff00000;
2806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
2816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE int cvIsInf( double value )
2856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
2866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#if 1/*defined _MSC_VER || defined __BORLANDC__
2876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return !_finite(value);
2886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#elif defined __GNUC__
2896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return isinf(value);
2906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else*/
2916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    Cv64suf ieee754;
2926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ieee754.f = value;
2936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return ((unsigned)(ieee754.u >> 32) & 0x7fffffff) == 0x7ff00000 &&
2946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn           (unsigned)ieee754.u == 0;
2956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
2966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
2976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
2996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*************** Random number generation *******************/
3006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef uint64 CvRNG;
3026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE CvRNG cvRNG( int64 seed CV_DEFAULT(-1))
3046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvRNG rng = seed ? (uint64)seed : (uint64)(int64)-1;
3066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return rng;
3076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Return random 32-bit unsigned integer: */
3106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE unsigned cvRandInt( CvRNG* rng )
3116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uint64 temp = *rng;
3136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    temp = (uint64)(unsigned)temp*1554115554 + (temp >> 32);
3146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    *rng = temp;
3156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return (unsigned)temp;
3166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Returns random floating-point number between 0 and 1: */
3196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE double cvRandReal( CvRNG* rng )
3206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return cvRandInt(rng)*2.3283064365386962890625e-10 /* 2^-32 */;
3226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
3256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                  Image type (IplImage)                                 *
3266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
3276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifndef HAVE_IPL
3296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
3316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * The following definitions (until #endif)
3326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * is an extract from IPL headers.
3336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * Copyright (c) 1995 Intel Corporation.
3346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn */
3356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_DEPTH_SIGN 0x80000000
3366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_DEPTH_1U     1
3386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_DEPTH_8U     8
3396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_DEPTH_16U   16
3406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_DEPTH_32F   32
3416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_DEPTH_8S  (IPL_DEPTH_SIGN| 8)
3436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_DEPTH_16S (IPL_DEPTH_SIGN|16)
3446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_DEPTH_32S (IPL_DEPTH_SIGN|32)
3456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_DATA_ORDER_PIXEL  0
3476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_DATA_ORDER_PLANE  1
3486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_ORIGIN_TL 0
3506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_ORIGIN_BL 1
3516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_ALIGN_4BYTES   4
3536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_ALIGN_8BYTES   8
3546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_ALIGN_16BYTES 16
3556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_ALIGN_32BYTES 32
3566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_ALIGN_DWORD   IPL_ALIGN_4BYTES
3586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_ALIGN_QWORD   IPL_ALIGN_8BYTES
3596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_BORDER_CONSTANT   0
3616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_BORDER_REPLICATE  1
3626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_BORDER_REFLECT    2
3636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_BORDER_WRAP       3
3646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
3656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct _IplImage
3666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
3676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  nSize;             /* sizeof(IplImage) */
3686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  ID;                /* version (=0)*/
3696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  nChannels;         /* Most of OpenCV functions support 1,2,3 or 4 channels */
3706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  alphaChannel;      /* Ignored by OpenCV */
3716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  depth;             /* Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
3726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported.  */
3736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char colorModel[4];     /* Ignored by OpenCV */
3746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char channelSeq[4];     /* ditto */
3756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  dataOrder;         /* 0 - interleaved color channels, 1 - separate color channels.
3766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               cvCreateImage can only create interleaved images */
3776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  origin;            /* 0 - top-left origin,
3786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               1 - bottom-left origin (Windows bitmaps style).  */
3796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  align;             /* Alignment of image rows (4 or 8).
3806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               OpenCV ignores it and uses widthStep instead.    */
3816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  width;             /* Image width in pixels.                           */
3826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  height;            /* Image height in pixels.                          */
3836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct _IplROI *roi;    /* Image ROI. If NULL, the whole image is selected. */
3846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct _IplImage *maskROI;      /* Must be NULL. */
3856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void  *imageId;                 /* "           " */
3866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct _IplTileInfo *tileInfo;  /* "           " */
3876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  imageSize;         /* Image data size in bytes
3886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               (==image->height*image->widthStep
3896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               in case of interleaved data)*/
3906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char *imageData;        /* Pointer to aligned image data.         */
3916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  widthStep;         /* Size of aligned image row in bytes.    */
3926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  BorderMode[4];     /* Ignored by OpenCV.                     */
3936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  BorderConst[4];    /* Ditto.                                 */
3946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char *imageDataOrigin;  /* Pointer to very origin of image data
3956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               (not necessarily aligned) -
3966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               needed for correct deallocation */
3976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
3986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIplImage;
3996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct _IplTileInfo IplTileInfo;
4016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct _IplROI
4036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
4046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  coi; /* 0 - no COI (all channels are selected), 1 - 0th channel is selected ...*/
4056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  xOffset;
4066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  yOffset;
4076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  width;
4086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  height;
4096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIplROI;
4116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct _IplConvKernel
4136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
4146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  nCols;
4156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  nRows;
4166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  anchorX;
4176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  anchorY;
4186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int *values;
4196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  nShiftR;
4206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIplConvKernel;
4226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct _IplConvKernelFP
4246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
4256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  nCols;
4266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  nRows;
4276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  anchorX;
4286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  anchorY;
4296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float *values;
4306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
4316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennIplConvKernelFP;
4326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_IMAGE_HEADER 1
4346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_IMAGE_DATA   2
4356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_IMAGE_ROI    4
4366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif/*HAVE_IPL*/
4386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* extra border mode */
4406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_BORDER_REFLECT_101    4
4416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_IMAGE_MAGIC_VAL  ((int)sizeof(IplImage))
4436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TYPE_NAME_IMAGE "opencv-image"
4446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_IMAGE_HDR(img) \
4466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((img) != NULL && ((const IplImage*)(img))->nSize == sizeof(IplImage))
4476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_IMAGE(img) \
4496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (CV_IS_IMAGE_HDR(img) && ((IplImage*)img)->imageData != NULL)
4506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* for storing double-precision
4526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   floating point data in IplImage's */
4536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define IPL_DEPTH_64F  64
4546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* get reference to pixel at (col,row),
4566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   for multi-channel images (col) should be multiplied by number of channels */
4576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IMAGE_ELEM( image, elemtype, row, col )       \
4586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)])
4596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
4616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                  Matrix type (CvMat)                                   *
4626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
4636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_CN_MAX     64
4656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_CN_SHIFT   3
4666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)
4676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_8U   0
4696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_8S   1
4706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_16U  2
4716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_16S  3
4726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_32S  4
4736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_32F  5
4746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_64F  6
4756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_USRTYPE1 7
4766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAKETYPE(depth,cn) ((depth) + (((cn)-1) << CV_CN_SHIFT))
4786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAKE_TYPE CV_MAKETYPE
4796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
4816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_8UC2 CV_MAKETYPE(CV_8U,2)
4826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
4836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_8UC4 CV_MAKETYPE(CV_8U,4)
4846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))
4856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_8SC1 CV_MAKETYPE(CV_8S,1)
4876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_8SC2 CV_MAKETYPE(CV_8S,2)
4886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_8SC3 CV_MAKETYPE(CV_8S,3)
4896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_8SC4 CV_MAKETYPE(CV_8S,4)
4906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))
4916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_16UC1 CV_MAKETYPE(CV_16U,1)
4936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_16UC2 CV_MAKETYPE(CV_16U,2)
4946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_16UC3 CV_MAKETYPE(CV_16U,3)
4956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_16UC4 CV_MAKETYPE(CV_16U,4)
4966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))
4976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
4986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_16SC1 CV_MAKETYPE(CV_16S,1)
4996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_16SC2 CV_MAKETYPE(CV_16S,2)
5006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_16SC3 CV_MAKETYPE(CV_16S,3)
5016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_16SC4 CV_MAKETYPE(CV_16S,4)
5026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))
5036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_32SC1 CV_MAKETYPE(CV_32S,1)
5056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_32SC2 CV_MAKETYPE(CV_32S,2)
5066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_32SC3 CV_MAKETYPE(CV_32S,3)
5076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_32SC4 CV_MAKETYPE(CV_32S,4)
5086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))
5096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_32FC1 CV_MAKETYPE(CV_32F,1)
5116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_32FC2 CV_MAKETYPE(CV_32F,2)
5126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_32FC3 CV_MAKETYPE(CV_32F,3)
5136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_32FC4 CV_MAKETYPE(CV_32F,4)
5146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))
5156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_64FC1 CV_MAKETYPE(CV_64F,1)
5176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_64FC2 CV_MAKETYPE(CV_64F,2)
5186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_64FC3 CV_MAKETYPE(CV_64F,3)
5196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_64FC4 CV_MAKETYPE(CV_64F,4)
5206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))
5216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_AUTO_STEP  0x7fffffff
5236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_WHOLE_ARR  cvSlice( 0, 0x3fffffff )
5246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAT_CN_MASK          ((CV_CN_MAX - 1) << CV_CN_SHIFT)
5266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAT_CN(flags)        ((((flags) & CV_MAT_CN_MASK) >> CV_CN_SHIFT) + 1)
5276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)
5286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAT_DEPTH(flags)     ((flags) & CV_MAT_DEPTH_MASK)
5296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAT_TYPE_MASK        (CV_DEPTH_MAX*CV_CN_MAX - 1)
5306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAT_TYPE(flags)      ((flags) & CV_MAT_TYPE_MASK)
5316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAT_CONT_FLAG_SHIFT  14
5326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAT_CONT_FLAG        (1 << CV_MAT_CONT_FLAG_SHIFT)
5336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_MAT_CONT(flags)   ((flags) & CV_MAT_CONT_FLAG)
5346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_CONT_MAT          CV_IS_MAT_CONT
5356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAT_TEMP_FLAG_SHIFT  15
5366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAT_TEMP_FLAG        (1 << CV_MAT_TEMP_FLAG_SHIFT)
5376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_TEMP_MAT(flags)   ((flags) & CV_MAT_TEMP_FLAG)
5386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAGIC_MASK       0xFFFF0000
5406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAT_MAGIC_VAL    0x42420000
5416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TYPE_NAME_MAT    "opencv-matrix"
5426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvMat
5446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
5456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type;
5466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int step;
5476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* for internal use only */
5496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int* refcount;
5506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int hdr_refcount;
5516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    union
5536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        uchar* ptr;
5556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        short* s;
5566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int* i;
5576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        float* fl;
5586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double* db;
5596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    } data;
5606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef __cplusplus
5626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    union
5636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int rows;
5656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int height;
5666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
5676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    union
5696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
5706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int cols;
5716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int width;
5726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    };
5736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#else
5746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int rows;
5756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int cols;
5766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
5776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
5796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvMat;
5806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_MAT_HDR(mat) \
5836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((mat) != NULL && \
5846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (((const CvMat*)(mat))->type & CV_MAGIC_MASK) == CV_MAT_MAGIC_VAL && \
5856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((const CvMat*)(mat))->cols > 0 && ((const CvMat*)(mat))->rows > 0)
5866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_MAT(mat) \
5886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (CV_IS_MAT_HDR(mat) && ((const CvMat*)(mat))->data.ptr != NULL)
5896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_MASK_ARR(mat) \
5916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (((mat)->type & (CV_MAT_TYPE_MASK & ~CV_8SC1)) == 0)
5926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_ARE_TYPES_EQ(mat1, mat2) \
5946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((((mat1)->type ^ (mat2)->type) & CV_MAT_TYPE_MASK) == 0)
5956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_ARE_CNS_EQ(mat1, mat2) \
5976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((((mat1)->type ^ (mat2)->type) & CV_MAT_CN_MASK) == 0)
5986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
5996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_ARE_DEPTHS_EQ(mat1, mat2) \
6006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((((mat1)->type ^ (mat2)->type) & CV_MAT_DEPTH_MASK) == 0)
6016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_ARE_SIZES_EQ(mat1, mat2) \
6036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((mat1)->rows == (mat2)->rows && (mat1)->cols == (mat2)->cols)
6046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_MAT_CONST(mat)  \
6066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (((mat)->rows|(mat)->cols) == 1)
6076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Size of each channel item,
6096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   0x124489 = 1000 0100 0100 0010 0010 0001 0001 ~ array of sizeof(arr_type_elem) */
6106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_ELEM_SIZE1(type) \
6116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((((sizeof(size_t)<<28)|0x8442211) >> CV_MAT_DEPTH(type)*4) & 15)
6126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* 0x3a50 = 11 10 10 01 01 00 00 ~ array of log2(sizeof(arr_type_elem)) */
6146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_ELEM_SIZE(type) \
6156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (CV_MAT_CN(type) << ((((sizeof(size_t)/4+1)*16384|0x3a50) >> CV_MAT_DEPTH(type)*2) & 3))
6166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Inline constructor. No data is allocated internally!!!
6186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * (Use together with cvCreateData, or use cvCreateMat instead to
6196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn * get a matrix with allocated data):
6206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn */
6216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE CvMat cvMat( int rows, int cols, int type, void* data CV_DEFAULT(NULL))
6226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMat m;
6246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( (unsigned)CV_MAT_DEPTH(type) <= CV_64F );
6266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE(type);
6276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    m.type = CV_MAT_MAGIC_VAL | CV_MAT_CONT_FLAG | type;
6286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    m.cols = cols;
6296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    m.rows = rows;
6306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    m.step = rows > 1 ? m.cols*CV_ELEM_SIZE(type) : 0;
6316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    m.data.ptr = (uchar*)data;
6326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    m.refcount = NULL;
6336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    m.hdr_refcount = 0;
6346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return m;
6366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAT_ELEM_PTR_FAST( mat, row, col, pix_size )  \
6406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (assert( (unsigned)(row) < (unsigned)(mat).rows &&   \
6416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn             (unsigned)(col) < (unsigned)(mat).cols ),   \
6426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     (mat).data.ptr + (size_t)(mat).step*(row) + (pix_size)*(col))
6436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAT_ELEM_PTR( mat, row, col )                 \
6456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_MAT_ELEM_PTR_FAST( mat, row, col, CV_ELEM_SIZE((mat).type) )
6466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAT_ELEM( mat, elemtype, row, col )           \
6486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype)))
6496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  double  cvmGet( const CvMat* mat, int row, int col )
6526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type;
6546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE(mat->type);
6566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( (unsigned)row < (unsigned)mat->rows &&
6576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)col < (unsigned)mat->cols );
6586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( type == CV_32FC1 )
6606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return ((float*)(mat->data.ptr + (size_t)mat->step*row))[col];
6616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
6626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        assert( type == CV_64FC1 );
6646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        return ((double*)(mat->data.ptr + (size_t)mat->step*row))[col];
6656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  void  cvmSet( CvMat* mat, int row, int col, double value )
6706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type;
6726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    type = CV_MAT_TYPE(mat->type);
6736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( (unsigned)row < (unsigned)mat->rows &&
6746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (unsigned)col < (unsigned)mat->cols );
6756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( type == CV_32FC1 )
6776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ((float*)(mat->data.ptr + (size_t)mat->step*row))[col] = (float)value;
6786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    else
6796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
6806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        assert( type == CV_64FC1 );
6816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        ((double*)(mat->data.ptr + (size_t)mat->step*row))[col] = (double)value;
6826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
6836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE int cvCvToIplDepth( int type )
6876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
6886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int depth = CV_MAT_DEPTH(type);
6896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return CV_ELEM_SIZE1(depth)*8 | (depth == CV_8S || depth == CV_16S ||
6906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn           depth == CV_32S ? IPL_DEPTH_SIGN : 0);
6916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
6926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
6956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                       Multi-dimensional dense array (CvMatND)                          *
6966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
6976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
6986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MATND_MAGIC_VAL    0x42430000
6996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TYPE_NAME_MATND    "opencv-nd-matrix"
7006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAX_DIM            32
7026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_MAX_DIM_HEAP       (1 << 16)
7036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvMatND
7056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type;
7076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int dims;
7086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int* refcount;
7106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int hdr_refcount;
7116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    union
7136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        uchar* ptr;
7156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        float* fl;
7166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double* db;
7176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int* i;
7186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        short* s;
7196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    } data;
7206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct
7226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
7236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int size;
7246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int step;
7256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }
7266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    dim[CV_MAX_DIM];
7276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvMatND;
7296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_MATND_HDR(mat) \
7316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((mat) != NULL && (((const CvMatND*)(mat))->type & CV_MAGIC_MASK) == CV_MATND_MAGIC_VAL)
7326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_MATND(mat) \
7346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (CV_IS_MATND_HDR(mat) && ((const CvMatND*)(mat))->data.ptr != NULL)
7356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
7386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                      Multi-dimensional sparse array (CvSparseMat)                      *
7396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
7406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SPARSE_MAT_MAGIC_VAL    0x42440000
7426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TYPE_NAME_SPARSE_MAT    "opencv-sparse-matrix"
7436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct CvSet;
7456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvSparseMat
7476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int type;
7496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int dims;
7506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int* refcount;
7516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int hdr_refcount;
7526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct CvSet* heap;
7546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void** hashtable;
7556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int hashsize;
7566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int valoffset;
7576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int idxoffset;
7586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int size[CV_MAX_DIM];
7596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSparseMat;
7616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SPARSE_MAT_HDR(mat) \
7636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((mat) != NULL && \
7646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (((const CvSparseMat*)(mat))->type & CV_MAGIC_MASK) == CV_SPARSE_MAT_MAGIC_VAL)
7656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SPARSE_MAT(mat) \
7676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_IS_SPARSE_MAT_HDR(mat)
7686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/**************** iteration through a sparse array *****************/
7706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvSparseNode
7726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    unsigned hashval;
7746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct CvSparseNode* next;
7756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSparseNode;
7776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvSparseMatIterator
7796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
7806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSparseMat* mat;
7816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSparseNode* node;
7826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int curidx;
7836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
7846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSparseMatIterator;
7856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_VAL(mat,node)   ((void*)((uchar*)(node) + (mat)->valoffset))
7876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_IDX(mat,node)   ((int*)((uchar*)(node) + (mat)->idxoffset))
7886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
7906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                         Histogram                                      *
7916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
7926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef int CvHistType;
7946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_HIST_MAGIC_VAL     0x42450000
7966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_HIST_UNIFORM_FLAG  (1 << 10)
7976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
7986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* indicates whether bin ranges are set already or not */
7996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_HIST_RANGES_FLAG   (1 << 11)
8006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_HIST_ARRAY         0
8026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_HIST_SPARSE        1
8036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_HIST_TREE          CV_HIST_SPARSE
8046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* should be used as a parameter only,
8066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   it turns to CV_HIST_UNIFORM_FLAG of hist->type */
8076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_HIST_UNIFORM       1
8086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvHistogram
8106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
8116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int     type;
8126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvArr*  bins;
8136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float   thresh[CV_MAX_DIM][2];  /* For uniform histograms.                      */
8146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float** thresh2;                /* For non-uniform histograms.                  */
8156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMatND mat;                    /* Embedded matrix header for array histograms. */
8166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvHistogram;
8186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_HIST( hist ) \
8206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((hist) != NULL  && \
8216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     (((CvHistogram*)(hist))->type & CV_MAGIC_MASK) == CV_HIST_MAGIC_VAL && \
8226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     (hist)->bins != NULL)
8236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_UNIFORM_HIST( hist ) \
8256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (((hist)->type & CV_HIST_UNIFORM_FLAG) != 0)
8266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SPARSE_HIST( hist ) \
8286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_IS_SPARSE_MAT((hist)->bins)
8296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_HIST_HAS_RANGES( hist ) \
8316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (((hist)->type & CV_HIST_RANGES_FLAG) != 0)
8326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
8346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                      Other supplementary data type definitions                         *
8356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
8366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*************************************** CvRect *****************************************/
8386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvRect
8406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
8416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int x;
8426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int y;
8436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int width;
8446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int height;
8456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvRect;
8476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvRect  cvRect( int x, int y, int width, int height )
8496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
8506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvRect r;
8516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r.x = x;
8536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r.y = y;
8546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r.width = width;
8556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    r.height = height;
8566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return r;
8586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  IplROI  cvRectToROI( CvRect rect, int coi )
8626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
8636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    IplROI roi;
8646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    roi.xOffset = rect.x;
8656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    roi.yOffset = rect.y;
8666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    roi.width = rect.width;
8676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    roi.height = rect.height;
8686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    roi.coi = coi;
8696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return roi;
8716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvRect  cvROIToRect( IplROI roi )
8756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
8766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return cvRect( roi.xOffset, roi.yOffset, roi.width, roi.height );
8776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*********************************** CvTermCriteria *************************************/
8806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TERMCRIT_ITER    1
8826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TERMCRIT_NUMBER  CV_TERMCRIT_ITER
8836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TERMCRIT_EPS     2
8846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvTermCriteria
8866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
8876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int    type;  /* may be combination of
8886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     CV_TERMCRIT_ITER
8896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                     CV_TERMCRIT_EPS */
8906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int    max_iter;
8916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double epsilon;
8926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
8936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvTermCriteria;
8946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvTermCriteria  cvTermCriteria( int type, int max_iter, double epsilon )
8966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
8976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvTermCriteria t;
8986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
8996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    t.type = type;
9006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    t.max_iter = max_iter;
9016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    t.epsilon = (float)epsilon;
9026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return t;
9046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/******************************* CvPoint and variants ***********************************/
9086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvPoint
9106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int x;
9126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int y;
9136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvPoint;
9156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvPoint  cvPoint( int x, int y )
9186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint p;
9206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    p.x = x;
9226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    p.y = y;
9236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return p;
9256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvPoint2D32f
9296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float x;
9316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float y;
9326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvPoint2D32f;
9346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvPoint2D32f  cvPoint2D32f( double x, double y )
9376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint2D32f p;
9396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    p.x = (float)x;
9416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    p.y = (float)y;
9426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return p;
9446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvPoint2D32f  cvPointTo32f( CvPoint point )
9486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return cvPoint2D32f( (float)point.x, (float)point.y );
9506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvPoint  cvPointFrom32f( CvPoint2D32f point )
9546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint ipt;
9566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ipt.x = cvRound(point.x);
9576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ipt.y = cvRound(point.y);
9586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return ipt;
9606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvPoint3D32f
9646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float x;
9666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float y;
9676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float z;
9686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvPoint3D32f;
9706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvPoint3D32f  cvPoint3D32f( double x, double y, double z )
9736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint3D32f p;
9756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    p.x = (float)x;
9776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    p.y = (float)y;
9786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    p.z = (float)z;
9796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return p;
9816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvPoint2D64f
9856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double x;
9876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double y;
9886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
9896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvPoint2D64f;
9906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvPoint2D64f  cvPoint2D64f( double x, double y )
9936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
9946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint2D64f p;
9956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    p.x = x;
9976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    p.y = y;
9986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
9996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return p;
10006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvPoint3D64f
10046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double x;
10066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double y;
10076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double z;
10086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvPoint3D64f;
10106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvPoint3D64f  cvPoint3D64f( double x, double y, double z )
10136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint3D64f p;
10156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    p.x = x;
10176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    p.y = y;
10186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    p.z = z;
10196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return p;
10216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/******************************** CvSize's & CvBox **************************************/
10256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct
10276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int width;
10296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int height;
10306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSize;
10326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvSize  cvSize( int width, int height )
10346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize s;
10366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    s.width = width;
10386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    s.height = height;
10396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return s;
10416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvSize2D32f
10446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float width;
10466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float height;
10476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSize2D32f;
10496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvSize2D32f  cvSize2D32f( double width, double height )
10526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize2D32f s;
10546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    s.width = (float)width;
10566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    s.height = (float)height;
10576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return s;
10596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvBox2D
10626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint2D32f center;  /* Center of the box.                          */
10646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSize2D32f  size;    /* Box width and length.                       */
10656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float angle;          /* Angle between the horizontal axis           */
10666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                          /* and the first side (i.e. length) in degrees */
10676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvBox2D;
10696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Line iterator state: */
10726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvLineIterator
10736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Pointer to the current point: */
10756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    uchar* ptr;
10766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    /* Bresenham algorithm state: */
10786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  err;
10796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  plus_delta;
10806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  minus_delta;
10816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  plus_step;
10826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  minus_step;
10836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvLineIterator;
10856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/************************************* CvSlice ******************************************/
10896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvSlice
10916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  start_index, end_index;
10936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
10946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSlice;
10956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
10966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvSlice  cvSlice( int start, int end )
10976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
10986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSlice slice;
10996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    slice.start_index = start;
11006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    slice.end_index = end;
11016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return slice;
11036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
11046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_WHOLE_SEQ_END_INDEX 0x3fffffff
11066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_WHOLE_SEQ  cvSlice(0, CV_WHOLE_SEQ_END_INDEX)
11076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/************************************* CvScalar *****************************************/
11106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvScalar
11126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    double val[4];
11146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
11156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvScalar;
11166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvScalar  cvScalar( double val0, double val1 CV_DEFAULT(0),
11186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                               double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0))
11196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvScalar scalar;
11216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    scalar.val[0] = val0; scalar.val[1] = val1;
11226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    scalar.val[2] = val2; scalar.val[3] = val3;
11236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return scalar;
11246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
11256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvScalar  cvRealScalar( double val0 )
11286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvScalar scalar;
11306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    scalar.val[0] = val0;
11316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    scalar.val[1] = scalar.val[2] = scalar.val[3] = 0;
11326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return scalar;
11336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
11346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE  CvScalar  cvScalarAll( double val0123 )
11366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvScalar scalar;
11386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    scalar.val[0] = val0123;
11396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    scalar.val[1] = val0123;
11406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    scalar.val[2] = val0123;
11416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    scalar.val[3] = val0123;
11426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return scalar;
11436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
11446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
11466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                   Dynamic Data structures                              *
11476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
11486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/******************************** Memory storage ****************************************/
11506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvMemBlock
11526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct CvMemBlock*  prev;
11546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct CvMemBlock*  next;
11556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
11566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvMemBlock;
11576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_STORAGE_MAGIC_VAL    0x42890000
11596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvMemStorage
11616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int signature;
11636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMemBlock* bottom;           /* First allocated block.                   */
11646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMemBlock* top;              /* Current memory block - top of the stack. */
11656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct  CvMemStorage* parent; /* We get new blocks from parent as needed. */
11666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int block_size;               /* Block size.                              */
11676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int free_space;               /* Remaining free space in current block.   */
11686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
11696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvMemStorage;
11706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_STORAGE(storage)  \
11726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((storage) != NULL &&       \
11736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (((CvMemStorage*)(storage))->signature & CV_MAGIC_MASK) == CV_STORAGE_MAGIC_VAL)
11746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvMemStoragePos
11776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMemBlock* top;
11796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int free_space;
11806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
11816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvMemStoragePos;
11826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*********************************** Sequence *******************************************/
11856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvSeqBlock
11876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
11886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct CvSeqBlock*  prev; /* Previous sequence block.                   */
11896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct CvSeqBlock*  next; /* Next sequence block.                       */
11906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  int    start_index;         /* Index of the first element in the block +  */
11916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                              /* sequence->first->start_index.              */
11926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int    count;             /* Number of elements in the block.           */
11936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    schar* data;              /* Pointer to the first element of the block. */
11946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
11956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSeqBlock;
11966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
11986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TREE_NODE_FIELDS(node_type)                               \
11996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int       flags;             /* Miscellaneous flags.     */      \
12006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int       header_size;       /* Size of sequence header. */      \
12016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct    node_type* h_prev; /* Previous sequence.       */      \
12026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct    node_type* h_next; /* Next sequence.           */      \
12036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct    node_type* v_prev; /* 2nd previous sequence.   */      \
12046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct    node_type* v_next  /* 2nd next sequence.       */
12056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
12076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   Read/Write sequence.
12086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   Elements can be dynamically inserted to or deleted from the sequence.
12096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/
12106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQUENCE_FIELDS()                                              \
12116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_TREE_NODE_FIELDS(CvSeq);                                           \
12126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int       total;          /* Total number of elements.            */  \
12136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int       elem_size;      /* Size of sequence element in bytes.   */  \
12146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    schar*    block_max;      /* Maximal bound of the last block.     */  \
12156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    schar*    ptr;            /* Current write pointer.               */  \
12166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int       delta_elems;    /* Grow seq this many at a time.        */  \
12176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvMemStorage* storage;    /* Where the seq is stored.             */  \
12186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSeqBlock* free_blocks;  /* Free blocks list.                    */  \
12196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSeqBlock* first;        /* Pointer to the first sequence block. */
12206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvSeq
12226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
12236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_SEQUENCE_FIELDS()
12246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
12256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSeq;
12266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TYPE_NAME_SEQ             "opencv-sequence"
12286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TYPE_NAME_SEQ_TREE        "opencv-sequence-tree"
12296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*************************************** Set ********************************************/
12316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
12326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  Set.
12336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  Order is not preserved. There can be gaps between sequence elements.
12346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  After the element has been inserted it stays in the same place all the time.
12356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  The MSB(most-significant or sign bit) of the first field (flags) is 0 iff the element exists.
12366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/
12376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SET_ELEM_FIELDS(elem_type)   \
12386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int  flags;                         \
12396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct elem_type* next_free;
12406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvSetElem
12426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
12436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_SET_ELEM_FIELDS(CvSetElem)
12446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
12456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSetElem;
12466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SET_FIELDS()      \
12486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_SEQUENCE_FIELDS()     \
12496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSetElem* free_elems;   \
12506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int active_count;
12516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvSet
12536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
12546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_SET_FIELDS()
12556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
12566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSet;
12576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SET_ELEM_IDX_MASK   ((1 << 26) - 1)
12606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SET_ELEM_FREE_FLAG  (1 << (sizeof(int)*8-1))
12616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Checks whether the element pointed by ptr belongs to a set or not */
12636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SET_ELEM( ptr )  (((CvSetElem*)(ptr))->flags >= 0)
12646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/************************************* Graph ********************************************/
12666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
12686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  We represent a graph as a set of vertices.
12696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  Vertices contain their adjacency lists (more exactly, pointers to first incoming or
12706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  outcoming edge (or 0 if isolated vertex)). Edges are stored in another set.
12716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  There is a singly-linked list of incoming/outcoming edges for each vertex.
12726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn  Each edge consists of
12746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     o   Two pointers to the starting and ending vertices
12766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn         (vtx[0] and vtx[1] respectively).
12776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn	 A graph may be oriented or not. In the latter case, edges between
12796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn	 vertex i to vertex j are not distinguished during search operations.
12806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     o   Two pointers to next edges for the starting and ending vertices, where
12826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn         next[0] points to the next edge in the vtx[0] adjacency list and
12836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn         next[1] points to the next edge in the vtx[1] adjacency list.
12846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/
12856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_GRAPH_EDGE_FIELDS()      \
12866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int flags;                      \
12876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    float weight;                   \
12886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct CvGraphEdge* next[2];    \
12896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct CvGraphVtx* vtx[2];
12906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_GRAPH_VERTEX_FIELDS()    \
12936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int flags;                      \
12946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct CvGraphEdge* first;
12956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
12976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvGraphEdge
12986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
12996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_GRAPH_EDGE_FIELDS()
13006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
13016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvGraphEdge;
13026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvGraphVtx
13046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
13056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_GRAPH_VERTEX_FIELDS()
13066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
13076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvGraphVtx;
13086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvGraphVtx2D
13106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
13116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_GRAPH_VERTEX_FIELDS()
13126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint2D32f* ptr;
13136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
13146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvGraphVtx2D;
13156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*
13176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   Graph is "derived" from the set (this is set a of vertices)
13186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   and includes another set (edges)
13196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*/
13206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_GRAPH_FIELDS()   \
13216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_SET_FIELDS()          \
13226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSet* edges;
13236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvGraph
13256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
13266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_GRAPH_FIELDS()
13276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
13286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvGraph;
13296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_TYPE_NAME_GRAPH "opencv-graph"
13316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*********************************** Chain/Countour *************************************/
13336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvChain
13356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
13366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_SEQUENCE_FIELDS()
13376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPoint  origin;
13386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
13396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvChain;
13406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_CONTOUR_FIELDS()  \
13426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_SEQUENCE_FIELDS()     \
13436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvRect rect;             \
13446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int color;               \
13456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int reserved[3];
13466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvContour
13486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
13496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_CONTOUR_FIELDS()
13506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
13516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvContour;
13526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef CvContour CvPoint2DSeq;
13546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
13566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*                                    Sequence types                                      *
13576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
13586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_MAGIC_VAL             0x42990000
13606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SEQ(seq) \
13626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((seq) != NULL && (((CvSeq*)(seq))->flags & CV_MAGIC_MASK) == CV_SEQ_MAGIC_VAL)
13636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SET_MAGIC_VAL             0x42980000
13656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SET(set) \
13666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((set) != NULL && (((CvSeq*)(set))->flags & CV_MAGIC_MASK) == CV_SET_MAGIC_VAL)
13676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_ELTYPE_BITS           9
13696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_ELTYPE_MASK           ((1 << CV_SEQ_ELTYPE_BITS) - 1)
13706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_ELTYPE_POINT          CV_32SC2  /* (x,y) */
13726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_ELTYPE_CODE           CV_8UC1   /* freeman code: 0..7 */
13736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_ELTYPE_GENERIC        0
13746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_ELTYPE_PTR            CV_USRTYPE1
13756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_ELTYPE_PPOINT         CV_SEQ_ELTYPE_PTR  /* &(x,y) */
13766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_ELTYPE_INDEX          CV_32SC1  /* #(x,y) */
13776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_ELTYPE_GRAPH_EDGE     0  /* &next_o, &next_d, &vtx_o, &vtx_d */
13786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_ELTYPE_GRAPH_VERTEX   0  /* first_edge, &(x,y) */
13796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_ELTYPE_TRIAN_ATR      0  /* vertex of the binary tree   */
13806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_ELTYPE_CONNECTED_COMP 0  /* connected component  */
13816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_ELTYPE_POINT3D        CV_32FC3  /* (x,y,z)  */
13826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_KIND_BITS        3
13846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_KIND_MASK        (((1 << CV_SEQ_KIND_BITS) - 1)<<CV_SEQ_ELTYPE_BITS)
13856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* types of sequences */
13876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_KIND_GENERIC     (0 << CV_SEQ_ELTYPE_BITS)
13886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_KIND_CURVE       (1 << CV_SEQ_ELTYPE_BITS)
13896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_KIND_BIN_TREE    (2 << CV_SEQ_ELTYPE_BITS)
13906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* types of sparse sequences (sets) */
13926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_KIND_GRAPH       (3 << CV_SEQ_ELTYPE_BITS)
13936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_KIND_SUBDIV2D    (4 << CV_SEQ_ELTYPE_BITS)
13946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_FLAG_SHIFT       (CV_SEQ_KIND_BITS + CV_SEQ_ELTYPE_BITS)
13966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
13976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* flags for curves */
13986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_FLAG_CLOSED     (1 << CV_SEQ_FLAG_SHIFT)
13996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_FLAG_SIMPLE     (2 << CV_SEQ_FLAG_SHIFT)
14006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_FLAG_CONVEX     (4 << CV_SEQ_FLAG_SHIFT)
14016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_FLAG_HOLE       (8 << CV_SEQ_FLAG_SHIFT)
14026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* flags for graphs */
14046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_GRAPH_FLAG_ORIENTED (1 << CV_SEQ_FLAG_SHIFT)
14056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_GRAPH               CV_SEQ_KIND_GRAPH
14076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_ORIENTED_GRAPH      (CV_SEQ_KIND_GRAPH|CV_GRAPH_FLAG_ORIENTED)
14086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* point sets */
14106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_POINT_SET       (CV_SEQ_KIND_GENERIC| CV_SEQ_ELTYPE_POINT)
14116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_POINT3D_SET     (CV_SEQ_KIND_GENERIC| CV_SEQ_ELTYPE_POINT3D)
14126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_POLYLINE        (CV_SEQ_KIND_CURVE  | CV_SEQ_ELTYPE_POINT)
14136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_POLYGON         (CV_SEQ_FLAG_CLOSED | CV_SEQ_POLYLINE )
14146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_CONTOUR         CV_SEQ_POLYGON
14156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_SIMPLE_POLYGON  (CV_SEQ_FLAG_SIMPLE | CV_SEQ_POLYGON  )
14166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* chain-coded curves */
14186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_CHAIN           (CV_SEQ_KIND_CURVE  | CV_SEQ_ELTYPE_CODE)
14196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_CHAIN_CONTOUR   (CV_SEQ_FLAG_CLOSED | CV_SEQ_CHAIN)
14206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* binary tree for the contour */
14226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_POLYGON_TREE    (CV_SEQ_KIND_BIN_TREE  | CV_SEQ_ELTYPE_TRIAN_ATR)
14236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* sequence of the connected components */
14256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_CONNECTED_COMP  (CV_SEQ_KIND_GENERIC  | CV_SEQ_ELTYPE_CONNECTED_COMP)
14266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* sequence of the integer numbers */
14286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_INDEX           (CV_SEQ_KIND_GENERIC  | CV_SEQ_ELTYPE_INDEX)
14296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_ELTYPE( seq )   ((seq)->flags & CV_SEQ_ELTYPE_MASK)
14316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_KIND( seq )     ((seq)->flags & CV_SEQ_KIND_MASK )
14326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* flag checking */
14346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SEQ_INDEX( seq )      ((CV_SEQ_ELTYPE(seq) == CV_SEQ_ELTYPE_INDEX) && \
14356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                     (CV_SEQ_KIND(seq) == CV_SEQ_KIND_GENERIC))
14366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SEQ_CURVE( seq )      (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE)
14386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SEQ_CLOSED( seq )     (((seq)->flags & CV_SEQ_FLAG_CLOSED) != 0)
14396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SEQ_CONVEX( seq )     (((seq)->flags & CV_SEQ_FLAG_CONVEX) != 0)
14406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SEQ_HOLE( seq )       (((seq)->flags & CV_SEQ_FLAG_HOLE) != 0)
14416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SEQ_SIMPLE( seq )     ((((seq)->flags & CV_SEQ_FLAG_SIMPLE) != 0) || \
14426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                    CV_IS_SEQ_CONVEX(seq))
14436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* type checking macros */
14456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SEQ_POINT_SET( seq ) \
14466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    ((CV_SEQ_ELTYPE(seq) == CV_32SC2 || CV_SEQ_ELTYPE(seq) == CV_32FC2))
14476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SEQ_POINT_SUBSET( seq ) \
14496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (CV_IS_SEQ_INDEX( seq ) || CV_SEQ_ELTYPE(seq) == CV_SEQ_ELTYPE_PPOINT)
14506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SEQ_POLYLINE( seq )   \
14526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE && CV_IS_SEQ_POINT_SET(seq))
14536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SEQ_POLYGON( seq )   \
14556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (CV_IS_SEQ_POLYLINE(seq) && CV_IS_SEQ_CLOSED(seq))
14566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SEQ_CHAIN( seq )   \
14586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE && (seq)->elem_size == 1)
14596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SEQ_CONTOUR( seq )   \
14616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (CV_IS_SEQ_CLOSED(seq) && (CV_IS_SEQ_POLYLINE(seq) || CV_IS_SEQ_CHAIN(seq)))
14626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SEQ_CHAIN_CONTOUR( seq ) \
14646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (CV_IS_SEQ_CHAIN( seq ) && CV_IS_SEQ_CLOSED( seq ))
14656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SEQ_POLYGON_TREE( seq ) \
14676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (CV_SEQ_ELTYPE (seq) ==  CV_SEQ_ELTYPE_TRIAN_ATR &&    \
14686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_SEQ_KIND( seq ) ==  CV_SEQ_KIND_BIN_TREE )
14696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_GRAPH( seq )    \
14716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (CV_IS_SET(seq) && CV_SEQ_KIND((CvSet*)(seq)) == CV_SEQ_KIND_GRAPH)
14726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_GRAPH_ORIENTED( seq )   \
14746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (((seq)->flags & CV_GRAPH_FLAG_ORIENTED) != 0)
14756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_IS_SUBDIV2D( seq )  \
14776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (CV_IS_SET(seq) && CV_SEQ_KIND((CvSet*)(seq)) == CV_SEQ_KIND_SUBDIV2D)
14786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************/
14806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*                            Sequence writer & reader                                  */
14816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************/
14826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_WRITER_FIELDS()                                     \
14846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int          header_size;                                      \
14856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSeq*       seq;        /* the sequence written */            \
14866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSeqBlock*  block;      /* current block */                   \
14876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    schar*       ptr;        /* pointer to free space */           \
14886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    schar*       block_min;  /* pointer to the beginning of block*/\
14896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    schar*       block_max;  /* pointer to the end of block */
14906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvSeqWriter
14926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
14936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_SEQ_WRITER_FIELDS()
14946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
14956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSeqWriter;
14966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
14986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_SEQ_READER_FIELDS()                                      \
14996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int          header_size;                                       \
15006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSeq*       seq;        /* sequence, beign read */             \
15016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvSeqBlock*  block;      /* current block */                    \
15026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    schar*       ptr;        /* pointer to element be read next */  \
15036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    schar*       block_min;  /* pointer to the beginning of block */\
15046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    schar*       block_max;  /* pointer to the end of block */      \
15056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int          delta_index;/* = seq->first->start_index   */      \
15066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    schar*       prev_elem;  /* pointer to previous element */
15076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvSeqReader
15106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
15116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_SEQ_READER_FIELDS()
15126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
15136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvSeqReader;
15146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************/
15166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/*                                Operations on sequences                               */
15176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************/
15186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_SEQ_ELEM( seq, elem_type, index )                    \
15206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* assert gives some guarantee that <seq> parameter is valid */  \
15216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn(   assert(sizeof((seq)->first[0]) == sizeof(CvSeqBlock) &&      \
15226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (seq)->elem_size == sizeof(elem_type)),                      \
15236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (elem_type*)((seq)->first && (unsigned)index <               \
15246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (unsigned)((seq)->first->count) ?                            \
15256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (seq)->first->data + (index) * sizeof(elem_type) :           \
15266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    cvGetSeqElem( (CvSeq*)(seq), (index) )))
15276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_GET_SEQ_ELEM( elem_type, seq, index ) CV_SEQ_ELEM( (seq), elem_type, (index) )
15286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Add element to sequence: */
15306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_WRITE_SEQ_ELEM_VAR( elem_ptr, writer )     \
15316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                     \
15326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (writer).ptr >= (writer).block_max )          \
15336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                 \
15346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvCreateSeqBlock( &writer);                   \
15356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                 \
15366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    memcpy((writer).ptr, elem_ptr, (writer).seq->elem_size);\
15376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (writer).ptr += (writer).seq->elem_size;          \
15386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
15396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_WRITE_SEQ_ELEM( elem, writer )             \
15416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                     \
15426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( (writer).seq->elem_size == sizeof(elem)); \
15436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (writer).ptr >= (writer).block_max )          \
15446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                 \
15456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvCreateSeqBlock( &writer);                   \
15466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                 \
15476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( (writer).ptr <= (writer).block_max - sizeof(elem));\
15486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    memcpy((writer).ptr, &(elem), sizeof(elem));      \
15496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (writer).ptr += sizeof(elem);                     \
15506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
15516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Move reader position forward: */
15546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NEXT_SEQ_ELEM( elem_size, reader )                 \
15556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                             \
15566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( ((reader).ptr += (elem_size)) >= (reader).block_max ) \
15576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                         \
15586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvChangeSeqBlock( &(reader), 1 );                     \
15596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                         \
15606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
15616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Move reader position backward: */
15646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_PREV_SEQ_ELEM( elem_size, reader )                \
15656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                            \
15666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( ((reader).ptr -= (elem_size)) < (reader).block_min ) \
15676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                        \
15686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        cvChangeSeqBlock( &(reader), -1 );                   \
15696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                        \
15706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
15716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Read element and move read position forward: */
15736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_READ_SEQ_ELEM( elem, reader )                       \
15746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                              \
15756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( (reader).seq->elem_size == sizeof(elem));          \
15766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    memcpy( &(elem), (reader).ptr, sizeof((elem)));            \
15776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_NEXT_SEQ_ELEM( sizeof(elem), reader )                   \
15786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
15796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Read element and move read position backward: */
15816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_REV_READ_SEQ_ELEM( elem, reader )                     \
15826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                \
15836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( (reader).seq->elem_size == sizeof(elem));            \
15846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    memcpy(&(elem), (reader).ptr, sizeof((elem)));               \
15856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_PREV_SEQ_ELEM( sizeof(elem), reader )                     \
15866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
15876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
15896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_READ_CHAIN_POINT( _pt, reader )                              \
15906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                                       \
15916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (_pt) = (reader).pt;                                                \
15926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    if( (reader).ptr )                                                  \
15936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {                                                                   \
15946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CV_READ_SEQ_ELEM( (reader).code, (reader));                     \
15956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        assert( ((reader).code & ~7) == 0 );                            \
15966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (reader).pt.x += (reader).deltas[(int)(reader).code][0];        \
15976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        (reader).pt.y += (reader).deltas[(int)(reader).code][1];        \
15986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    }                                                                   \
15996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
16006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_CURRENT_POINT( reader )  (*((CvPoint*)((reader).ptr)))
16026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_PREV_POINT( reader )     (*((CvPoint*)((reader).prev_elem)))
16036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_READ_EDGE( pt1, pt2, reader )               \
16056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{                                                      \
16066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    assert( sizeof(pt1) == sizeof(CvPoint) &&          \
16076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            sizeof(pt2) == sizeof(CvPoint) &&          \
16086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            reader.seq->elem_size == sizeof(CvPoint)); \
16096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (pt1) = CV_PREV_POINT( reader );                   \
16106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (pt2) = CV_CURRENT_POINT( reader );                \
16116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    (reader).prev_elem = (reader).ptr;                 \
16126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CV_NEXT_SEQ_ELEM( sizeof(CvPoint), (reader));      \
16136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
16146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/************ Graph macros ************/
16166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Return next graph edge for given vertex: */
16186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define  CV_NEXT_GRAPH_EDGE( edge, vertex )                              \
16196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn     (assert((edge)->vtx[0] == (vertex) || (edge)->vtx[1] == (vertex)),  \
16206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn      (edge)->next[(edge)->vtx[1] == (vertex)])
16216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/****************************************************************************************\
16256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn*             Data structures for persistence (a.k.a serialization) functionality        *
16266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn\****************************************************************************************/
16276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* "black box" file storage */
16296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvFileStorage CvFileStorage;
16306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Storage flags: */
16326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_STORAGE_READ          0
16336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_STORAGE_WRITE         1
16346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_STORAGE_WRITE_TEXT    CV_STORAGE_WRITE
16356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_STORAGE_WRITE_BINARY  CV_STORAGE_WRITE
16366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_STORAGE_APPEND        2
16376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* List of attributes: */
16396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvAttrList
16406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
16416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const char** attr;         /* NULL-terminated array of (attribute_name,attribute_value) pairs. */
16426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct CvAttrList* next;   /* Pointer to next chunk of the attributes list.                    */
16436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
16446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvAttrList;
16456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCV_INLINE CvAttrList cvAttrList( const char** attr CV_DEFAULT(NULL),
16476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                 CvAttrList* next CV_DEFAULT(NULL) )
16486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
16496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvAttrList l;
16506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l.attr = attr;
16516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    l.next = next;
16526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    return l;
16546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
16556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennstruct CvTypeInfo;
16576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_NONE        0
16596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_INT         1
16606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_INTEGER     CV_NODE_INT
16616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_REAL        2
16626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_FLOAT       CV_NODE_REAL
16636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_STR         3
16646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_STRING      CV_NODE_STR
16656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_REF         4 /* not used */
16666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_SEQ         5
16676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_MAP         6
16686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_TYPE_MASK   7
16696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_TYPE(flags)  ((flags) & CV_NODE_TYPE_MASK)
16716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* file node flags */
16736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_FLOW        8 /* Used only for writing structures in YAML format. */
16746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_USER        16
16756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_EMPTY       32
16766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_NAMED       64
16776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_IS_INT(flags)        (CV_NODE_TYPE(flags) == CV_NODE_INT)
16796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_IS_REAL(flags)       (CV_NODE_TYPE(flags) == CV_NODE_REAL)
16806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_IS_STRING(flags)     (CV_NODE_TYPE(flags) == CV_NODE_STRING)
16816acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_IS_SEQ(flags)        (CV_NODE_TYPE(flags) == CV_NODE_SEQ)
16826acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_IS_MAP(flags)        (CV_NODE_TYPE(flags) == CV_NODE_MAP)
16836acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_IS_COLLECTION(flags) (CV_NODE_TYPE(flags) >= CV_NODE_SEQ)
16846acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_IS_FLOW(flags)       (((flags) & CV_NODE_FLOW) != 0)
16856acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_IS_EMPTY(flags)      (((flags) & CV_NODE_EMPTY) != 0)
16866acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_IS_USER(flags)       (((flags) & CV_NODE_USER) != 0)
16876acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_HAS_NAME(flags)      (((flags) & CV_NODE_NAMED) != 0)
16886acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16896acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_SEQ_SIMPLE 256
16906acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#define CV_NODE_SEQ_IS_SIMPLE(seq) (((seq)->flags & CV_NODE_SEQ_SIMPLE) != 0)
16916acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16926acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvString
16936acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
16946acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int len;
16956acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    char* ptr;
16966acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
16976acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvString;
16986acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
16996acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* All the keys (names) of elements in the readed file storage
17006acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn   are stored in the hash to speed up the lookup operations: */
17016acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvStringHashNode
17026acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
17036acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    unsigned hashval;
17046acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvString str;
17056acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct CvStringHashNode* next;
17066acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
17076acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvStringHashNode;
17086acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17096acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvGenericHash CvFileNodeHash;
17106acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17116acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* Basic element of the file storage - scalar or collection: */
17126acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvFileNode
17136acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
17146acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int tag;
17156acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct CvTypeInfo* info; /* type information
17166acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn            (only for user-defined object, for others it is 0) */
17176acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    union
17186acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    {
17196acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        double f; /* scalar floating-point number */
17206acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        int i;    /* scalar integer number */
17216acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvString str; /* text string */
17226acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvSeq* seq; /* sequence (ordered collection of file nodes) */
17236acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn        CvFileNodeHash* map; /* map (collection of named file nodes) */
17246acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    } data;
17256acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
17266acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvFileNode;
17276acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17286acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef __cplusplus
17296acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Rennextern "C" {
17306acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
17316acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef int (CV_CDECL *CvIsInstanceFunc)( const void* struct_ptr );
17326acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef void (CV_CDECL *CvReleaseFunc)( void** struct_dblptr );
17336acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef void* (CV_CDECL *CvReadFunc)( CvFileStorage* storage, CvFileNode* node );
17346acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef void (CV_CDECL *CvWriteFunc)( CvFileStorage* storage, const char* name,
17356acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn                                      const void* struct_ptr, CvAttrList attributes );
17366acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef void* (CV_CDECL *CvCloneFunc)( const void* struct_ptr );
17376acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#ifdef __cplusplus
17386acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
17396acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif
17406acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17416acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvTypeInfo
17426acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
17436acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int flags;
17446acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int header_size;
17456acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct CvTypeInfo* prev;
17466acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct CvTypeInfo* next;
17476acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const char* type_name;
17486acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvIsInstanceFunc is_instance;
17496acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvReleaseFunc release;
17506acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvReadFunc read;
17516acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvWriteFunc write;
17526acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvCloneFunc clone;
17536acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
17546acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvTypeInfo;
17556acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17566acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17576acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/**** System data types ******/
17586acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17596acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvPluginFuncInfo
17606acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
17616acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void** func_addr;
17626acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    void* default_func_addr;
17636acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const char* func_names;
17646acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int search_modules;
17656acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    int loaded_from;
17666acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
17676acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvPluginFuncInfo;
17686acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17696acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renntypedef struct CvModuleInfo
17706acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn{
17716acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    struct CvModuleInfo* next;
17726acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const char* name;
17736acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    const char* version;
17746acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn    CvPluginFuncInfo* func_tab;
17756acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn}
17766acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius RennCvModuleInfo;
17776acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17786acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn#endif /*_CXCORE_TYPES_H_*/
17796acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn
17806acb9a7ea3d7564944e12cbc73a857b88c1301eeMarius Renn/* End of file. */
1781