root / branches / tbeta / ccv_ofx_0061 / Windows / addons / ofxOpenCv / libs / opencv / include / cxtypes.h @ 214

View | Annotate | Download (51.2 KB)

1
/*M///////////////////////////////////////////////////////////////////////////////////////
2
//
3
//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4
//
5
//  By downloading, copying, installing or using the software you agree to this license.
6
//  If you do not agree to this license, do not download, install,
7
//  copy or use the software.
8
//
9
//
10
//                        Intel License Agreement
11
//                For Open Source Computer Vision Library
12
//
13
// Copyright (C) 2000, Intel Corporation, all rights reserved.
14
// Third party copyrights are property of their respective owners.
15
//
16
// Redistribution and use in source and binary forms, with or without modification,
17
// are permitted provided that the following conditions are met:
18
//
19
//   * Redistribution's of source code must retain the above copyright notice,
20
//     this list of conditions and the following disclaimer.
21
//
22
//   * Redistribution's in binary form must reproduce the above copyright notice,
23
//     this list of conditions and the following disclaimer in the documentation
24
//     and/or other materials provided with the distribution.
25
//
26
//   * The name of Intel Corporation may not be used to endorse or promote products
27
//     derived from this software without specific prior written permission.
28
//
29
// This software is provided by the copyright holders and contributors "as is" and
30
// any express or implied warranties, including, but not limited to, the implied
31
// warranties of merchantability and fitness for a particular purpose are disclaimed.
32
// In no event shall the Intel Corporation or contributors be liable for any direct,
33
// indirect, incidental, special, exemplary, or consequential damages
34
// (including, but not limited to, procurement of substitute goods or services;
35
// loss of use, data, or profits; or business interruption) however caused
36
// and on any theory of liability, whether in contract, strict liability,
37
// or tort (including negligence or otherwise) arising in any way out of
38
// the use of this software, even if advised of the possibility of such damage.
39
//
40
//M*/
41
42
#ifndef _CXCORE_TYPES_H_
43
#define _CXCORE_TYPES_H_
44
45
#if !defined _CRT_SECURE_NO_DEPRECATE && _MSC_VER > 1300
46
#define _CRT_SECURE_NO_DEPRECATE /* to avoid multiple Visual Studio 2005 warnings */
47
#endif
48
49
#ifndef SKIP_INCLUDES
50
  #include <assert.h>
51
  #include <stdlib.h>
52
  #include <string.h>
53
  #include <float.h>
54
55
  #if defined __ICL
56
    #define CV_ICC   __ICL
57
  #elif defined __ICC
58
    #define CV_ICC   __ICC
59
  #elif defined __ECL
60
    #define CV_ICC   __ECL
61
  #elif defined __ECC
62
    #define CV_ICC   __ECC
63
  #endif
64
65
  #if defined WIN32 && (!defined WIN64 || defined EM64T) && \
66
      (_MSC_VER >= 1400 || defined CV_ICC) \
67
      || (defined __SSE2__ && defined __GNUC__ && __GNUC__ >= 4)
68
    #include <emmintrin.h>
69
    #define CV_SSE2 1
70
  #else
71
    #define CV_SSE2 0
72
  #endif
73
74
  #if defined __BORLANDC__
75
    #include <fastmath.h>
76
  #elif defined WIN64 && !defined EM64T && defined CV_ICC
77
    #include <mathimf.h>
78
  #else
79
    #include <math.h>
80
  #endif
81
82
  #ifdef HAVE_IPL
83
      #ifndef __IPL_H__
84
          #if defined WIN32 || defined WIN64
85
              #include <ipl.h>
86
          #else
87
              #include <ipl/ipl.h>
88
          #endif
89
      #endif
90
  #elif defined __IPL_H__
91
      #define HAVE_IPL
92
  #endif
93
#endif // SKIP_INCLUDES
94
95
#if defined WIN32 || defined WIN64
96
    #define CV_CDECL __cdecl
97
    #define CV_STDCALL __stdcall
98
#else
99
    #define CV_CDECL
100
    #define CV_STDCALL
101
#endif
102
103
#ifndef CV_EXTERN_C
104
    #ifdef __cplusplus
105
        #define CV_EXTERN_C extern "C"
106
        #define CV_DEFAULT(val) = val
107
    #else
108
        #define CV_EXTERN_C
109
        #define CV_DEFAULT(val)
110
    #endif
111
#endif
112
113
#ifndef CV_EXTERN_C_FUNCPTR
114
    #ifdef __cplusplus
115
        #define CV_EXTERN_C_FUNCPTR(x) extern "C" { typedef x; }
116
    #else
117
        #define CV_EXTERN_C_FUNCPTR(x) typedef x
118
    #endif
119
#endif
120
121
#ifndef CV_INLINE
122
#if defined __cplusplus
123
    #define CV_INLINE inline
124
#elif (defined WIN32 || defined WIN64) && !defined __GNUC__
125
    #define CV_INLINE __inline
126
#else
127
    #define CV_INLINE static
128
#endif
129
#endif /* CV_INLINE */
130
131
#if (defined WIN32 || defined WIN64) && defined CVAPI_EXPORTS
132
    #define CV_EXPORTS __declspec(dllexport)
133
#else
134
    #define CV_EXPORTS
135
#endif
136
137
#ifndef CVAPI
138
    #define CVAPI(rettype) CV_EXTERN_C CV_EXPORTS rettype CV_CDECL
139
#endif
140
141
#if defined _MSC_VER || defined __BORLANDC__
142
typedef __int64 int64;
143
typedef unsigned __int64 uint64;
144
#else
145
typedef long long int64;
146
typedef unsigned long long uint64;
147
#endif
148
149
#ifndef HAVE_IPL
150
typedef unsigned char uchar;
151
typedef unsigned short ushort;
152
#endif
153
154
typedef signed char schar;
155
156
/* CvArr* is used to pass arbitrary
157
 * array-like data structures
158
 * into functions where the particular
159
 * array type is recognized at runtime:
160
 */
161
typedef void CvArr;
162
163
typedef union Cv32suf
164
{
165
    int i;
166
    unsigned u;
167
    float f;
168
}
169
Cv32suf;
170
171
typedef union Cv64suf
172
{
173
    int64 i;
174
    uint64 u;
175
    double f;
176
}
177
Cv64suf;
178
179
/****************************************************************************************\
180
*                             Common macros and inline functions                         *
181
\****************************************************************************************/
182
183
#define CV_PI   3.1415926535897932384626433832795
184
#define CV_LOG2 0.69314718055994530941723212145818
185
186
#define CV_SWAP(a,b,t) ((t) = (a), (a) = (b), (b) = (t))
187
188
#ifndef MIN
189
#define MIN(a,b)  ((a) > (b) ? (b) : (a))
190
#endif
191
192
#ifndef MAX
193
#define MAX(a,b)  ((a) < (b) ? (b) : (a))
194
#endif
195
196
/* min & max without jumps */
197
#define  CV_IMIN(a, b)  ((a) ^ (((a)^(b)) & (((a) < (b)) - 1)))
198
199
#define  CV_IMAX(a, b)  ((a) ^ (((a)^(b)) & (((a) > (b)) - 1)))
200
201
/* absolute value without jumps */
202
#ifndef __cplusplus
203
#define  CV_IABS(a)     (((a) ^ ((a) < 0 ? -1 : 0)) - ((a) < 0 ? -1 : 0))
204
#else
205
#define  CV_IABS(a)     abs(a)
206
#endif
207
#define  CV_CMP(a,b)    (((a) > (b)) - ((a) < (b)))
208
#define  CV_SIGN(a)     CV_CMP((a),0)
209
210
CV_INLINE  int  cvRound( double value )
211
{
212
#if CV_SSE2
213
    __m128d t = _mm_load_sd( &value );
214
    return _mm_cvtsd_si32(t);
215
#elif defined WIN32 && !defined WIN64 && defined _MSC_VER
216
    int t;
217
    __asm
218
    {
219
        fld value;
220
        fistp t;
221
    }
222
    return t;
223
#elif (defined HAVE_LRINT) || (defined WIN64 && !defined EM64T && defined CV_ICC)
224
    return (int)lrint(value);
225
#else
226
    /*
227
     the algorithm was taken from Agner Fog's optimization guide
228
     at http://www.agner.org/assem
229
     */
230
    Cv64suf temp;
231
    temp.f = value + 6755399441055744.0;
232
    return (int)temp.u;
233
#endif
234
}
235
236
237
CV_INLINE  int  cvFloor( double value )
238
{
239
#if CV_SSE2
240
    __m128d t = _mm_load_sd( &value );
241
    int i = _mm_cvtsd_si32(t);
242
    return i - _mm_movemask_pd(_mm_cmplt_sd(t,_mm_cvtsi32_sd(t,i)));
243
#else
244
    int temp = cvRound(value);
245
    Cv32suf diff;
246
    diff.f = (float)(value - temp);
247
    return temp - (diff.i < 0);
248
#endif
249
}
250
251
252
CV_INLINE  int  cvCeil( double value )
253
{
254
#if CV_SSE2
255
    __m128d t = _mm_load_sd( &value );
256
    int i = _mm_cvtsd_si32(t);
257
    return i + _mm_movemask_pd(_mm_cmplt_sd(_mm_cvtsi32_sd(t,i),t));
258
#else
259
    int temp = cvRound(value);
260
    Cv32suf diff;
261
    diff.f = (float)(temp - value);
262
    return temp + (diff.i < 0);
263
#endif
264
}
265
266
#define cvInvSqrt(value) ((float)(1./sqrt(value)))
267
#define cvSqrt(value)  ((float)sqrt(value))
268
269
CV_INLINE int cvIsNaN( double value )
270
{
271
#if 1/*defined _MSC_VER || defined __BORLANDC__
272
    return _isnan(value);
273
#elif defined __GNUC__
274
    return isnan(value);
275
#else*/
276
    Cv64suf ieee754;
277
    ieee754.f = value;
278
    return ((unsigned)(ieee754.u >> 32) & 0x7fffffff) +
279
           ((unsigned)ieee754.u != 0) > 0x7ff00000;
280
#endif
281
}
282
283
284
CV_INLINE int cvIsInf( double value )
285
{
286
#if 1/*defined _MSC_VER || defined __BORLANDC__
287
    return !_finite(value);
288
#elif defined __GNUC__
289
    return isinf(value);
290
#else*/
291
    Cv64suf ieee754;
292
    ieee754.f = value;
293
    return ((unsigned)(ieee754.u >> 32) & 0x7fffffff) == 0x7ff00000 &&
294
           (unsigned)ieee754.u == 0;
295
#endif
296
}
297
298
299
/*************** Random number generation *******************/
300
301
typedef uint64 CvRNG;
302
303
CV_INLINE CvRNG cvRNG( int64 seed CV_DEFAULT(-1))
304
{
305
    CvRNG rng = seed ? (uint64)seed : (uint64)(int64)-1;
306
    return rng;
307
}
308
309
/* Return random 32-bit unsigned integer: */
310
CV_INLINE unsigned cvRandInt( CvRNG* rng )
311
{
312
    uint64 temp = *rng;
313
    temp = (uint64)(unsigned)temp*1554115554 + (temp >> 32);
314
    *rng = temp;
315
    return (unsigned)temp;
316
}
317
318
/* Returns random floating-point number between 0 and 1: */
319
CV_INLINE double cvRandReal( CvRNG* rng )
320
{
321
    return cvRandInt(rng)*2.3283064365386962890625e-10 /* 2^-32 */;
322
}
323
324
/****************************************************************************************\
325
*                                  Image type (IplImage)                                 *
326
\****************************************************************************************/
327
328
#ifndef HAVE_IPL
329
330
/*
331
 * The following definitions (until #endif)
332
 * is an extract from IPL headers.
333
 * Copyright (c) 1995 Intel Corporation.
334
 */
335
#define IPL_DEPTH_SIGN 0x80000000
336
337
#define IPL_DEPTH_1U     1
338
#define IPL_DEPTH_8U     8
339
#define IPL_DEPTH_16U   16
340
#define IPL_DEPTH_32F   32
341
342
#define IPL_DEPTH_8S  (IPL_DEPTH_SIGN| 8)
343
#define IPL_DEPTH_16S (IPL_DEPTH_SIGN|16)
344
#define IPL_DEPTH_32S (IPL_DEPTH_SIGN|32)
345
346
#define IPL_DATA_ORDER_PIXEL  0
347
#define IPL_DATA_ORDER_PLANE  1
348
349
#define IPL_ORIGIN_TL 0
350
#define IPL_ORIGIN_BL 1
351
352
#define IPL_ALIGN_4BYTES   4
353
#define IPL_ALIGN_8BYTES   8
354
#define IPL_ALIGN_16BYTES 16
355
#define IPL_ALIGN_32BYTES 32
356
357
#define IPL_ALIGN_DWORD   IPL_ALIGN_4BYTES
358
#define IPL_ALIGN_QWORD   IPL_ALIGN_8BYTES
359
360
#define IPL_BORDER_CONSTANT   0
361
#define IPL_BORDER_REPLICATE  1
362
#define IPL_BORDER_REFLECT    2
363
#define IPL_BORDER_WRAP       3
364
365
typedef struct _IplImage
366
{
367
    int  nSize;             /* sizeof(IplImage) */
368
    int  ID;                /* version (=0)*/
369
    int  nChannels;         /* Most of OpenCV functions support 1,2,3 or 4 channels */
370
    int  alphaChannel;      /* Ignored by OpenCV */
371
    int  depth;             /* Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
372
                               IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported.  */
373
    char colorModel[4];     /* Ignored by OpenCV */
374
    char channelSeq[4];     /* ditto */
375
    int  dataOrder;         /* 0 - interleaved color channels, 1 - separate color channels.
376
                               cvCreateImage can only create interleaved images */
377
    int  origin;            /* 0 - top-left origin,
378
                               1 - bottom-left origin (Windows bitmaps style).  */
379
    int  align;             /* Alignment of image rows (4 or 8).
380
                               OpenCV ignores it and uses widthStep instead.    */
381
    int  width;             /* Image width in pixels.                           */
382
    int  height;            /* Image height in pixels.                          */
383
    struct _IplROI *roi;    /* Image ROI. If NULL, the whole image is selected. */
384
    struct _IplImage *maskROI;      /* Must be NULL. */
385
    void  *imageId;                 /* "           " */
386
    struct _IplTileInfo *tileInfo;  /* "           " */
387
    int  imageSize;         /* Image data size in bytes
388
                               (==image->height*image->widthStep
389
                               in case of interleaved data)*/
390
    char *imageData;        /* Pointer to aligned image data.         */
391
    int  widthStep;         /* Size of aligned image row in bytes.    */
392
    int  BorderMode[4];     /* Ignored by OpenCV.                     */
393
    int  BorderConst[4];    /* Ditto.                                 */
394
    char *imageDataOrigin;  /* Pointer to very origin of image data
395
                               (not necessarily aligned) -
396
                               needed for correct deallocation */
397
}
398
IplImage;
399
400
typedef struct _IplTileInfo IplTileInfo;
401
402
typedef struct _IplROI
403
{
404
    int  coi; /* 0 - no COI (all channels are selected), 1 - 0th channel is selected ...*/
405
    int  xOffset;
406
    int  yOffset;
407
    int  width;
408
    int  height;
409
}
410
IplROI;
411
412
typedef struct _IplConvKernel
413
{
414
    int  nCols;
415
    int  nRows;
416
    int  anchorX;
417
    int  anchorY;
418
    int *values;
419
    int  nShiftR;
420
}
421
IplConvKernel;
422
423
typedef struct _IplConvKernelFP
424
{
425
    int  nCols;
426
    int  nRows;
427
    int  anchorX;
428
    int  anchorY;
429
    float *values;
430
}
431
IplConvKernelFP;
432
433
#define IPL_IMAGE_HEADER 1
434
#define IPL_IMAGE_DATA   2
435
#define IPL_IMAGE_ROI    4
436
437
#endif/*HAVE_IPL*/
438
439
/* extra border mode */
440
#define IPL_BORDER_REFLECT_101    4
441
442
#define IPL_IMAGE_MAGIC_VAL  ((int)sizeof(IplImage))
443
#define CV_TYPE_NAME_IMAGE "opencv-image"
444
445
#define CV_IS_IMAGE_HDR(img) \
446
    ((img) != NULL && ((const IplImage*)(img))->nSize == sizeof(IplImage))
447
448
#define CV_IS_IMAGE(img) \
449
    (CV_IS_IMAGE_HDR(img) && ((IplImage*)img)->imageData != NULL)
450
451
/* for storing double-precision
452
   floating point data in IplImage's */
453
#define IPL_DEPTH_64F  64
454
455
/* get reference to pixel at (col,row),
456
   for multi-channel images (col) should be multiplied by number of channels */
457
#define CV_IMAGE_ELEM( image, elemtype, row, col )       \
458
    (((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)])
459
460
/****************************************************************************************\
461
*                                  Matrix type (CvMat)                                   *
462
\****************************************************************************************/
463
464
#define CV_CN_MAX     64
465
#define CV_CN_SHIFT   3
466
#define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)
467
468
#define CV_8U   0
469
#define CV_8S   1
470
#define CV_16U  2
471
#define CV_16S  3
472
#define CV_32S  4
473
#define CV_32F  5
474
#define CV_64F  6
475
#define CV_USRTYPE1 7
476
477
#define CV_MAKETYPE(depth,cn) ((depth) + (((cn)-1) << CV_CN_SHIFT))
478
#define CV_MAKE_TYPE CV_MAKETYPE
479
480
#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
481
#define CV_8UC2 CV_MAKETYPE(CV_8U,2)
482
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
483
#define CV_8UC4 CV_MAKETYPE(CV_8U,4)
484
#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))
485
486
#define CV_8SC1 CV_MAKETYPE(CV_8S,1)
487
#define CV_8SC2 CV_MAKETYPE(CV_8S,2)
488
#define CV_8SC3 CV_MAKETYPE(CV_8S,3)
489
#define CV_8SC4 CV_MAKETYPE(CV_8S,4)
490
#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))
491
492
#define CV_16UC1 CV_MAKETYPE(CV_16U,1)
493
#define CV_16UC2 CV_MAKETYPE(CV_16U,2)
494
#define CV_16UC3 CV_MAKETYPE(CV_16U,3)
495
#define CV_16UC4 CV_MAKETYPE(CV_16U,4)
496
#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))
497
498
#define CV_16SC1 CV_MAKETYPE(CV_16S,1)
499
#define CV_16SC2 CV_MAKETYPE(CV_16S,2)
500
#define CV_16SC3 CV_MAKETYPE(CV_16S,3)
501
#define CV_16SC4 CV_MAKETYPE(CV_16S,4)
502
#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))
503
504
#define CV_32SC1 CV_MAKETYPE(CV_32S,1)
505
#define CV_32SC2 CV_MAKETYPE(CV_32S,2)
506
#define CV_32SC3 CV_MAKETYPE(CV_32S,3)
507
#define CV_32SC4 CV_MAKETYPE(CV_32S,4)
508
#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))
509
510
#define CV_32FC1 CV_MAKETYPE(CV_32F,1)
511
#define CV_32FC2 CV_MAKETYPE(CV_32F,2)
512
#define CV_32FC3 CV_MAKETYPE(CV_32F,3)
513
#define CV_32FC4 CV_MAKETYPE(CV_32F,4)
514
#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))
515
516
#define CV_64FC1 CV_MAKETYPE(CV_64F,1)
517
#define CV_64FC2 CV_MAKETYPE(CV_64F,2)
518
#define CV_64FC3 CV_MAKETYPE(CV_64F,3)
519
#define CV_64FC4 CV_MAKETYPE(CV_64F,4)
520
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))
521
522
#define CV_AUTO_STEP  0x7fffffff
523
#define CV_WHOLE_ARR  cvSlice( 0, 0x3fffffff )
524
525
#define CV_MAT_CN_MASK          ((CV_CN_MAX - 1) << CV_CN_SHIFT)
526
#define CV_MAT_CN(flags)        ((((flags) & CV_MAT_CN_MASK) >> CV_CN_SHIFT) + 1)
527
#define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)
528
#define CV_MAT_DEPTH(flags)     ((flags) & CV_MAT_DEPTH_MASK)
529
#define CV_MAT_TYPE_MASK        (CV_DEPTH_MAX*CV_CN_MAX - 1)
530
#define CV_MAT_TYPE(flags)      ((flags) & CV_MAT_TYPE_MASK)
531
#define CV_MAT_CONT_FLAG_SHIFT  14
532
#define CV_MAT_CONT_FLAG        (1 << CV_MAT_CONT_FLAG_SHIFT)
533
#define CV_IS_MAT_CONT(flags)   ((flags) & CV_MAT_CONT_FLAG)
534
#define CV_IS_CONT_MAT          CV_IS_MAT_CONT
535
#define CV_MAT_TEMP_FLAG_SHIFT  15
536
#define CV_MAT_TEMP_FLAG        (1 << CV_MAT_TEMP_FLAG_SHIFT)
537
#define CV_IS_TEMP_MAT(flags)   ((flags) & CV_MAT_TEMP_FLAG)
538
539
#define CV_MAGIC_MASK       0xFFFF0000
540
#define CV_MAT_MAGIC_VAL    0x42420000
541
#define CV_TYPE_NAME_MAT    "opencv-matrix"
542
543
typedef struct CvMat
544
{
545
    int type;
546
    int step;
547
548
    /* for internal use only */
549
    int* refcount;
550
    int hdr_refcount;
551
552
    union
553
    {
554
        uchar* ptr;
555
        short* s;
556
        int* i;
557
        float* fl;
558
        double* db;
559
    } data;
560
561
#ifdef __cplusplus
562
    union
563
    {
564
        int rows;
565
        int height;
566
    };
567
568
    union
569
    {
570
        int cols;
571
        int width;
572
    };
573
#else
574
    int rows;
575
    int cols;
576
#endif
577
578
}
579
CvMat;
580
581
582
#define CV_IS_MAT_HDR(mat) \
583
    ((mat) != NULL && \
584
    (((const CvMat*)(mat))->type & CV_MAGIC_MASK) == CV_MAT_MAGIC_VAL && \
585
    ((const CvMat*)(mat))->cols > 0 && ((const CvMat*)(mat))->rows > 0)
586
587
#define CV_IS_MAT(mat) \
588
    (CV_IS_MAT_HDR(mat) && ((const CvMat*)(mat))->data.ptr != NULL)
589
590
#define CV_IS_MASK_ARR(mat) \
591
    (((mat)->type & (CV_MAT_TYPE_MASK & ~CV_8SC1)) == 0)
592
593
#define CV_ARE_TYPES_EQ(mat1, mat2) \
594
    ((((mat1)->type ^ (mat2)->type) & CV_MAT_TYPE_MASK) == 0)
595
596
#define CV_ARE_CNS_EQ(mat1, mat2) \
597
    ((((mat1)->type ^ (mat2)->type) & CV_MAT_CN_MASK) == 0)
598
599
#define CV_ARE_DEPTHS_EQ(mat1, mat2) \
600
    ((((mat1)->type ^ (mat2)->type) & CV_MAT_DEPTH_MASK) == 0)
601
602
#define CV_ARE_SIZES_EQ(mat1, mat2) \
603
    ((mat1)->rows == (mat2)->rows && (mat1)->cols == (mat2)->cols)
604
605
#define CV_IS_MAT_CONST(mat)  \
606
    (((mat)->rows|(mat)->cols) == 1)
607
608
/* Size of each channel item,
609
   0x124489 = 1000 0100 0100 0010 0010 0001 0001 ~ array of sizeof(arr_type_elem) */
610
#define CV_ELEM_SIZE1(type) \
611
    ((((sizeof(size_t)<<28)|0x8442211) >> CV_MAT_DEPTH(type)*4) & 15)
612
613
/* 0x3a50 = 11 10 10 01 01 00 00 ~ array of log2(sizeof(arr_type_elem)) */
614
#define CV_ELEM_SIZE(type) \
615
    (CV_MAT_CN(type) << ((((sizeof(size_t)/4+1)*16384|0x3a50) >> CV_MAT_DEPTH(type)*2) & 3))
616
617
/* Inline constructor. No data is allocated internally!!!
618
 * (Use together with cvCreateData, or use cvCreateMat instead to
619
 * get a matrix with allocated data):
620
 */
621
CV_INLINE CvMat cvMat( int rows, int cols, int type, void* data CV_DEFAULT(NULL))
622
{
623
    CvMat m;
624
625
    assert( (unsigned)CV_MAT_DEPTH(type) <= CV_64F );
626
    type = CV_MAT_TYPE(type);
627
    m.type = CV_MAT_MAGIC_VAL | CV_MAT_CONT_FLAG | type;
628
    m.cols = cols;
629
    m.rows = rows;
630
    m.step = rows > 1 ? m.cols*CV_ELEM_SIZE(type) : 0;
631
    m.data.ptr = (uchar*)data;
632
    m.refcount = NULL;
633
    m.hdr_refcount = 0;
634
635
    return m;
636
}
637
638
639
#define CV_MAT_ELEM_PTR_FAST( mat, row, col, pix_size )  \
640
    (assert( (unsigned)(row) < (unsigned)(mat).rows &&   \
641
             (unsigned)(col) < (unsigned)(mat).cols ),   \
642
     (mat).data.ptr + (size_t)(mat).step*(row) + (pix_size)*(col))
643
644
#define CV_MAT_ELEM_PTR( mat, row, col )                 \
645
    CV_MAT_ELEM_PTR_FAST( mat, row, col, CV_ELEM_SIZE((mat).type) )
646
647
#define CV_MAT_ELEM( mat, elemtype, row, col )           \
648
    (*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype)))
649
650
651
CV_INLINE  double  cvmGet( const CvMat* mat, int row, int col )
652
{
653
    int type;
654
655
    type = CV_MAT_TYPE(mat->type);
656
    assert( (unsigned)row < (unsigned)mat->rows &&
657
            (unsigned)col < (unsigned)mat->cols );
658
659
    if( type == CV_32FC1 )
660
        return ((float*)(mat->data.ptr + (size_t)mat->step*row))[col];
661
    else
662
    {
663
        assert( type == CV_64FC1 );
664
        return ((double*)(mat->data.ptr + (size_t)mat->step*row))[col];
665
    }
666
}
667
668
669
CV_INLINE  void  cvmSet( CvMat* mat, int row, int col, double value )
670
{
671
    int type;
672
    type = CV_MAT_TYPE(mat->type);
673
    assert( (unsigned)row < (unsigned)mat->rows &&
674
            (unsigned)col < (unsigned)mat->cols );
675
676
    if( type == CV_32FC1 )
677
        ((float*)(mat->data.ptr + (size_t)mat->step*row))[col] = (float)value;
678
    else
679
    {
680
        assert( type == CV_64FC1 );
681
        ((double*)(mat->data.ptr + (size_t)mat->step*row))[col] = (double)value;
682
    }
683
}
684
685
686
CV_INLINE int cvCvToIplDepth( int type )
687
{
688
    int depth = CV_MAT_DEPTH(type);
689
    return CV_ELEM_SIZE1(depth)*8 | (depth == CV_8S || depth == CV_16S ||
690
           depth == CV_32S ? IPL_DEPTH_SIGN : 0);
691
}
692
693
694
/****************************************************************************************\
695
*                       Multi-dimensional dense array (CvMatND)                          *
696
\****************************************************************************************/
697
698
#define CV_MATND_MAGIC_VAL    0x42430000
699
#define CV_TYPE_NAME_MATND    "opencv-nd-matrix"
700
701
#define CV_MAX_DIM            32
702
#define CV_MAX_DIM_HEAP       (1 << 16)
703
704
typedef struct CvMatND
705
{
706
    int type;
707
    int dims;
708
709
    int* refcount;
710
    int hdr_refcount;
711
712
    union
713
    {
714
        uchar* ptr;
715
        float* fl;
716
        double* db;
717
        int* i;
718
        short* s;
719
    } data;
720
721
    struct
722
    {
723
        int size;
724
        int step;
725
    }
726
    dim[CV_MAX_DIM];
727
}
728
CvMatND;
729
730
#define CV_IS_MATND_HDR(mat) \
731
    ((mat) != NULL && (((const CvMatND*)(mat))->type & CV_MAGIC_MASK) == CV_MATND_MAGIC_VAL)
732
733
#define CV_IS_MATND(mat) \
734
    (CV_IS_MATND_HDR(mat) && ((const CvMatND*)(mat))->data.ptr != NULL)
735
736
737
/****************************************************************************************\
738
*                      Multi-dimensional sparse array (CvSparseMat)                      *
739
\****************************************************************************************/
740
741
#define CV_SPARSE_MAT_MAGIC_VAL    0x42440000
742
#define CV_TYPE_NAME_SPARSE_MAT    "opencv-sparse-matrix"
743
744
struct CvSet;
745
746
typedef struct CvSparseMat
747
{
748
    int type;
749
    int dims;
750
    int* refcount;
751
    int hdr_refcount;
752
753
    struct CvSet* heap;
754
    void** hashtable;
755
    int hashsize;
756
    int valoffset;
757
    int idxoffset;
758
    int size[CV_MAX_DIM];
759
}
760
CvSparseMat;
761
762
#define CV_IS_SPARSE_MAT_HDR(mat) \
763
    ((mat) != NULL && \
764
    (((const CvSparseMat*)(mat))->type & CV_MAGIC_MASK) == CV_SPARSE_MAT_MAGIC_VAL)
765
766
#define CV_IS_SPARSE_MAT(mat) \
767
    CV_IS_SPARSE_MAT_HDR(mat)
768
769
/**************** iteration through a sparse array *****************/
770
771
typedef struct CvSparseNode
772
{
773
    unsigned hashval;
774
    struct CvSparseNode* next;
775
}
776
CvSparseNode;
777
778
typedef struct CvSparseMatIterator
779
{
780
    CvSparseMat* mat;
781
    CvSparseNode* node;
782
    int curidx;
783
}
784
CvSparseMatIterator;
785
786
#define CV_NODE_VAL(mat,node)   ((void*)((uchar*)(node) + (mat)->valoffset))
787
#define CV_NODE_IDX(mat,node)   ((int*)((uchar*)(node) + (mat)->idxoffset))
788
789
/****************************************************************************************\
790
*                                         Histogram                                      *
791
\****************************************************************************************/
792
793
typedef int CvHistType;
794
795
#define CV_HIST_MAGIC_VAL     0x42450000
796
#define CV_HIST_UNIFORM_FLAG  (1 << 10)
797
798
/* indicates whether bin ranges are set already or not */
799
#define CV_HIST_RANGES_FLAG   (1 << 11)
800
801
#define CV_HIST_ARRAY         0
802
#define CV_HIST_SPARSE        1
803
#define CV_HIST_TREE          CV_HIST_SPARSE
804
805
/* should be used as a parameter only,
806
   it turns to CV_HIST_UNIFORM_FLAG of hist->type */
807
#define CV_HIST_UNIFORM       1
808
809
typedef struct CvHistogram
810
{
811
    int     type;
812
    CvArr*  bins;
813
    float   thresh[CV_MAX_DIM][2];  /* For uniform histograms.                      */
814
    float** thresh2;                /* For non-uniform histograms.                  */
815
    CvMatND mat;                    /* Embedded matrix header for array histograms. */
816
}
817
CvHistogram;
818
819
#define CV_IS_HIST( hist ) \
820
    ((hist) != NULL  && \
821
     (((CvHistogram*)(hist))->type & CV_MAGIC_MASK) == CV_HIST_MAGIC_VAL && \
822
     (hist)->bins != NULL)
823
824
#define CV_IS_UNIFORM_HIST( hist ) \
825
    (((hist)->type & CV_HIST_UNIFORM_FLAG) != 0)
826
827
#define CV_IS_SPARSE_HIST( hist ) \
828
    CV_IS_SPARSE_MAT((hist)->bins)
829
830
#define CV_HIST_HAS_RANGES( hist ) \
831
    (((hist)->type & CV_HIST_RANGES_FLAG) != 0)
832
833
/****************************************************************************************\
834
*                      Other supplementary data type definitions                         *
835
\****************************************************************************************/
836
837
/*************************************** CvRect *****************************************/
838
839
typedef struct CvRect
840
{
841
    int x;
842
    int y;
843
    int width;
844
    int height;
845
}
846
CvRect;
847
848
CV_INLINE  CvRect  cvRect( int x, int y, int width, int height )
849
{
850
    CvRect r;
851
852
    r.x = x;
853
    r.y = y;
854
    r.width = width;
855
    r.height = height;
856
857
    return r;
858
}
859
860
861
CV_INLINE  IplROI  cvRectToROI( CvRect rect, int coi )
862
{
863
    IplROI roi;
864
    roi.xOffset = rect.x;
865
    roi.yOffset = rect.y;
866
    roi.width = rect.width;
867
    roi.height = rect.height;
868
    roi.coi = coi;
869
870
    return roi;
871
}
872
873
874
CV_INLINE  CvRect  cvROIToRect( IplROI roi )
875
{
876
    return cvRect( roi.xOffset, roi.yOffset, roi.width, roi.height );
877
}
878
879
/*********************************** CvTermCriteria *************************************/
880
881
#define CV_TERMCRIT_ITER    1
882
#define CV_TERMCRIT_NUMBER  CV_TERMCRIT_ITER
883
#define CV_TERMCRIT_EPS     2
884
885
typedef struct CvTermCriteria
886
{
887
    int    type;  /* may be combination of
888
                     CV_TERMCRIT_ITER
889
                     CV_TERMCRIT_EPS */
890
    int    max_iter;
891
    double epsilon;
892
}
893
CvTermCriteria;
894
895
CV_INLINE  CvTermCriteria  cvTermCriteria( int type, int max_iter, double epsilon )
896
{
897
    CvTermCriteria t;
898
899
    t.type = type;
900
    t.max_iter = max_iter;
901
    t.epsilon = (float)epsilon;
902
903
    return t;
904
}
905
906
907
/******************************* CvPoint and variants ***********************************/
908
909
typedef struct CvPoint
910
{
911
    int x;
912
    int y;
913
}
914
CvPoint;
915
916
917
CV_INLINE  CvPoint  cvPoint( int x, int y )
918
{
919
    CvPoint p;
920
921
    p.x = x;
922
    p.y = y;
923
924
    return p;
925
}
926
927
928
typedef struct CvPoint2D32f
929
{
930
    float x;
931
    float y;
932
}
933
CvPoint2D32f;
934
935
936
CV_INLINE  CvPoint2D32f  cvPoint2D32f( double x, double y )
937
{
938
    CvPoint2D32f p;
939
940
    p.x = (float)x;
941
    p.y = (float)y;
942
943
    return p;
944
}
945
946
947
CV_INLINE  CvPoint2D32f  cvPointTo32f( CvPoint point )
948
{
949
    return cvPoint2D32f( (float)point.x, (float)point.y );
950
}
951
952
953
CV_INLINE  CvPoint  cvPointFrom32f( CvPoint2D32f point )
954
{
955
    CvPoint ipt;
956
    ipt.x = cvRound(point.x);
957
    ipt.y = cvRound(point.y);
958
959
    return ipt;
960
}
961
962
963
typedef struct CvPoint3D32f
964
{
965
    float x;
966
    float y;
967
    float z;
968
}
969
CvPoint3D32f;
970
971
972
CV_INLINE  CvPoint3D32f  cvPoint3D32f( double x, double y, double z )
973
{
974
    CvPoint3D32f p;
975
976
    p.x = (float)x;
977
    p.y = (float)y;
978
    p.z = (float)z;
979
980
    return p;
981
}
982
983
984
typedef struct CvPoint2D64f
985
{
986
    double x;
987
    double y;
988
}
989
CvPoint2D64f;
990
991
992
CV_INLINE  CvPoint2D64f  cvPoint2D64f( double x, double y )
993
{
994
    CvPoint2D64f p;
995
996
    p.x = x;
997
    p.y = y;
998
999
    return p;
1000
}
1001
1002
1003
typedef struct CvPoint3D64f
1004
{
1005
    double x;
1006
    double y;
1007
    double z;
1008
}
1009
CvPoint3D64f;
1010
1011
1012
CV_INLINE  CvPoint3D64f  cvPoint3D64f( double x, double y, double z )
1013
{
1014
    CvPoint3D64f p;
1015
1016
    p.x = x;
1017
    p.y = y;
1018
    p.z = z;
1019
1020
    return p;
1021
}
1022
1023
1024
/******************************** CvSize's & CvBox **************************************/
1025
1026
typedef struct
1027
{
1028
    int width;
1029
    int height;
1030
}
1031
CvSize;
1032
1033
CV_INLINE  CvSize  cvSize( int width, int height )
1034
{
1035
    CvSize s;
1036
1037
    s.width = width;
1038
    s.height = height;
1039
1040
    return s;
1041
}
1042
1043
typedef struct CvSize2D32f
1044
{
1045
    float width;
1046
    float height;
1047
}
1048
CvSize2D32f;
1049
1050
1051
CV_INLINE  CvSize2D32f  cvSize2D32f( double width, double height )
1052
{
1053
    CvSize2D32f s;
1054
1055
    s.width = (float)width;
1056
    s.height = (float)height;
1057
1058
    return s;
1059
}
1060
1061
typedef struct CvBox2D
1062
{
1063
    CvPoint2D32f center;  /* Center of the box.                          */
1064
    CvSize2D32f  size;    /* Box width and length.                       */
1065
    float angle;          /* Angle between the horizontal axis           */
1066
                          /* and the first side (i.e. length) in degrees */
1067
}
1068
CvBox2D;
1069
1070
1071
/* Line iterator state: */
1072
typedef struct CvLineIterator
1073
{
1074
    /* Pointer to the current point: */
1075
    uchar* ptr;
1076
1077
    /* Bresenham algorithm state: */
1078
    int  err;
1079
    int  plus_delta;
1080
    int  minus_delta;
1081
    int  plus_step;
1082
    int  minus_step;
1083
}
1084
CvLineIterator;
1085
1086
1087
1088
/************************************* CvSlice ******************************************/
1089
1090
typedef struct CvSlice
1091
{
1092
    int  start_index, end_index;
1093
}
1094
CvSlice;
1095
1096
CV_INLINE  CvSlice  cvSlice( int start, int end )
1097
{
1098
    CvSlice slice;
1099
    slice.start_index = start;
1100
    slice.end_index = end;
1101
1102
    return slice;
1103
}
1104
1105
#define CV_WHOLE_SEQ_END_INDEX 0x3fffffff
1106
#define CV_WHOLE_SEQ  cvSlice(0, CV_WHOLE_SEQ_END_INDEX)
1107
1108
1109
/************************************* CvScalar *****************************************/
1110
1111
typedef struct CvScalar
1112
{
1113
    double val[4];
1114
}
1115
CvScalar;
1116
1117
CV_INLINE  CvScalar  cvScalar( double val0, double val1 CV_DEFAULT(0),
1118
                               double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0))
1119
{
1120
    CvScalar scalar;
1121
    scalar.val[0] = val0; scalar.val[1] = val1;
1122
    scalar.val[2] = val2; scalar.val[3] = val3;
1123
    return scalar;
1124
}
1125
1126
1127
CV_INLINE  CvScalar  cvRealScalar( double val0 )
1128
{
1129
    CvScalar scalar;
1130
    scalar.val[0] = val0;
1131
    scalar.val[1] = scalar.val[2] = scalar.val[3] = 0;
1132
    return scalar;
1133
}
1134
1135
CV_INLINE  CvScalar  cvScalarAll( double val0123 )
1136
{
1137
    CvScalar scalar;
1138
    scalar.val[0] = val0123;
1139
    scalar.val[1] = val0123;
1140
    scalar.val[2] = val0123;
1141
    scalar.val[3] = val0123;
1142
    return scalar;
1143
}
1144
1145
/****************************************************************************************\
1146
*                                   Dynamic Data structures                              *
1147
\****************************************************************************************/
1148
1149
/******************************** Memory storage ****************************************/
1150
1151
typedef struct CvMemBlock
1152
{
1153
    struct CvMemBlock*  prev;
1154
    struct CvMemBlock*  next;
1155
}
1156
CvMemBlock;
1157
1158
#define CV_STORAGE_MAGIC_VAL    0x42890000
1159
1160
typedef struct CvMemStorage
1161
{
1162
    int signature;
1163
    CvMemBlock* bottom;           /* First allocated block.                   */
1164
    CvMemBlock* top;              /* Current memory block - top of the stack. */
1165
    struct  CvMemStorage* parent; /* We get new blocks from parent as needed. */
1166
    int block_size;               /* Block size.                              */
1167
    int free_space;               /* Remaining free space in current block.   */
1168
}
1169
CvMemStorage;
1170
1171
#define CV_IS_STORAGE(storage)  \
1172
    ((storage) != NULL &&       \
1173
    (((CvMemStorage*)(storage))->signature & CV_MAGIC_MASK) == CV_STORAGE_MAGIC_VAL)
1174
1175
1176
typedef struct CvMemStoragePos
1177
{
1178
    CvMemBlock* top;
1179
    int free_space;
1180
}
1181
CvMemStoragePos;
1182
1183
1184
/*********************************** Sequence *******************************************/
1185
1186
typedef struct CvSeqBlock
1187
{
1188
    struct CvSeqBlock*  prev; /* Previous sequence block.                   */
1189
    struct CvSeqBlock*  next; /* Next sequence block.                       */
1190
  int    start_index;         /* Index of the first element in the block +  */
1191
                              /* sequence->first->start_index.              */
1192
    int    count;             /* Number of elements in the block.           */
1193
    schar* data;              /* Pointer to the first element of the block. */
1194
}
1195
CvSeqBlock;
1196
1197
1198
#define CV_TREE_NODE_FIELDS(node_type)                               \
1199
    int       flags;             /* Miscellaneous flags.     */      \
1200
    int       header_size;       /* Size of sequence header. */      \
1201
    struct    node_type* h_prev; /* Previous sequence.       */      \
1202
    struct    node_type* h_next; /* Next sequence.           */      \
1203
    struct    node_type* v_prev; /* 2nd previous sequence.   */      \
1204
    struct    node_type* v_next  /* 2nd next sequence.       */
1205
1206
/*
1207
   Read/Write sequence.
1208
   Elements can be dynamically inserted to or deleted from the sequence.
1209
*/
1210
#define CV_SEQUENCE_FIELDS()                                              \
1211
    CV_TREE_NODE_FIELDS(CvSeq);                                           \
1212
    int       total;          /* Total number of elements.            */  \
1213
    int       elem_size;      /* Size of sequence element in bytes.   */  \
1214
    schar*    block_max;      /* Maximal bound of the last block.     */  \
1215
    schar*    ptr;            /* Current write pointer.               */  \
1216
    int       delta_elems;    /* Grow seq this many at a time.        */  \
1217
    CvMemStorage* storage;    /* Where the seq is stored.             */  \
1218
    CvSeqBlock* free_blocks;  /* Free blocks list.                    */  \
1219
    CvSeqBlock* first;        /* Pointer to the first sequence block. */
1220
1221
typedef struct CvSeq
1222
{
1223
    CV_SEQUENCE_FIELDS()
1224
}
1225
CvSeq;
1226
1227
#define CV_TYPE_NAME_SEQ             "opencv-sequence"
1228
#define CV_TYPE_NAME_SEQ_TREE        "opencv-sequence-tree"
1229
1230
/*************************************** Set ********************************************/
1231
/*
1232
  Set.
1233
  Order is not preserved. There can be gaps between sequence elements.
1234
  After the element has been inserted it stays in the same place all the time.
1235
  The MSB(most-significant or sign bit) of the first field (flags) is 0 iff the element exists.
1236
*/
1237
#define CV_SET_ELEM_FIELDS(elem_type)   \
1238
    int  flags;                         \
1239
    struct elem_type* next_free;
1240
1241
typedef struct CvSetElem
1242
{
1243
    CV_SET_ELEM_FIELDS(CvSetElem)
1244
}
1245
CvSetElem;
1246
1247
#define CV_SET_FIELDS()      \
1248
    CV_SEQUENCE_FIELDS()     \
1249
    CvSetElem* free_elems;   \
1250
    int active_count;
1251
1252
typedef struct CvSet
1253
{
1254
    CV_SET_FIELDS()
1255
}
1256
CvSet;
1257
1258
1259
#define CV_SET_ELEM_IDX_MASK   ((1 << 26) - 1)
1260
#define CV_SET_ELEM_FREE_FLAG  (1 << (sizeof(int)*8-1))
1261
1262
/* Checks whether the element pointed by ptr belongs to a set or not */
1263
#define CV_IS_SET_ELEM( ptr )  (((CvSetElem*)(ptr))->flags >= 0)
1264
1265
/************************************* Graph ********************************************/
1266
1267
/*
1268
  We represent a graph as a set of vertices.
1269
  Vertices contain their adjacency lists (more exactly, pointers to first incoming or
1270
  outcoming edge (or 0 if isolated vertex)). Edges are stored in another set.
1271
  There is a singly-linked list of incoming/outcoming edges for each vertex.
1272
1273
  Each edge consists of
1274
1275
     o   Two pointers to the starting and ending vertices
1276
         (vtx[0] and vtx[1] respectively).
1277
1278
         A graph may be oriented or not. In the latter case, edges between
1279
         vertex i to vertex j are not distinguished during search operations.
1280
1281
     o   Two pointers to next edges for the starting and ending vertices, where
1282
         next[0] points to the next edge in the vtx[0] adjacency list and
1283
         next[1] points to the next edge in the vtx[1] adjacency list.
1284
*/
1285
#define CV_GRAPH_EDGE_FIELDS()      \
1286
    int flags;                      \
1287
    float weight;                   \
1288
    struct CvGraphEdge* next[2];    \
1289
    struct CvGraphVtx* vtx[2];
1290
1291
1292
#define CV_GRAPH_VERTEX_FIELDS()    \
1293
    int flags;                      \
1294
    struct CvGraphEdge* first;
1295
1296
1297
typedef struct CvGraphEdge
1298
{
1299
    CV_GRAPH_EDGE_FIELDS()
1300
}
1301
CvGraphEdge;
1302
1303
typedef struct CvGraphVtx
1304
{
1305
    CV_GRAPH_VERTEX_FIELDS()
1306
}
1307
CvGraphVtx;
1308
1309
typedef struct CvGraphVtx2D
1310
{
1311
    CV_GRAPH_VERTEX_FIELDS()
1312
    CvPoint2D32f* ptr;
1313
}
1314
CvGraphVtx2D;
1315
1316
/*
1317
   Graph is "derived" from the set (this is set a of vertices)
1318
   and includes another set (edges)
1319
*/
1320
#define  CV_GRAPH_FIELDS()   \
1321
    CV_SET_FIELDS()          \
1322
    CvSet* edges;
1323
1324
typedef struct CvGraph
1325
{
1326
    CV_GRAPH_FIELDS()
1327
}
1328
CvGraph;
1329
1330
#define CV_TYPE_NAME_GRAPH "opencv-graph"
1331
1332
/*********************************** Chain/Countour *************************************/
1333
1334
typedef struct CvChain
1335
{
1336
    CV_SEQUENCE_FIELDS()
1337
    CvPoint  origin;
1338
}
1339
CvChain;
1340
1341
#define CV_CONTOUR_FIELDS()  \
1342
    CV_SEQUENCE_FIELDS()     \
1343
    CvRect rect;             \
1344
    int color;               \
1345
    int reserved[3];
1346
1347
typedef struct CvContour
1348
{
1349
    CV_CONTOUR_FIELDS()
1350
}
1351
CvContour;
1352
1353
typedef CvContour CvPoint2DSeq;
1354
1355
/****************************************************************************************\
1356
*                                    Sequence types                                      *
1357
\****************************************************************************************/
1358
1359
#define CV_SEQ_MAGIC_VAL             0x42990000
1360
1361
#define CV_IS_SEQ(seq) \
1362
    ((seq) != NULL && (((CvSeq*)(seq))->flags & CV_MAGIC_MASK) == CV_SEQ_MAGIC_VAL)
1363
1364
#define CV_SET_MAGIC_VAL             0x42980000
1365
#define CV_IS_SET(set) \
1366
    ((set) != NULL && (((CvSeq*)(set))->flags & CV_MAGIC_MASK) == CV_SET_MAGIC_VAL)
1367
1368
#define CV_SEQ_ELTYPE_BITS           9
1369
#define CV_SEQ_ELTYPE_MASK           ((1 << CV_SEQ_ELTYPE_BITS) - 1)
1370
1371
#define CV_SEQ_ELTYPE_POINT          CV_32SC2  /* (x,y) */
1372
#define CV_SEQ_ELTYPE_CODE           CV_8UC1   /* freeman code: 0..7 */
1373
#define CV_SEQ_ELTYPE_GENERIC        0
1374
#define CV_SEQ_ELTYPE_PTR            CV_USRTYPE1
1375
#define CV_SEQ_ELTYPE_PPOINT         CV_SEQ_ELTYPE_PTR  /* &(x,y) */
1376
#define CV_SEQ_ELTYPE_INDEX          CV_32SC1  /* #(x,y) */
1377
#define CV_SEQ_ELTYPE_GRAPH_EDGE     0  /* &next_o, &next_d, &vtx_o, &vtx_d */
1378
#define CV_SEQ_ELTYPE_GRAPH_VERTEX   0  /* first_edge, &(x,y) */
1379
#define CV_SEQ_ELTYPE_TRIAN_ATR      0  /* vertex of the binary tree   */
1380
#define CV_SEQ_ELTYPE_CONNECTED_COMP 0  /* connected component  */
1381
#define CV_SEQ_ELTYPE_POINT3D        CV_32FC3  /* (x,y,z)  */
1382
1383
#define CV_SEQ_KIND_BITS        3
1384
#define CV_SEQ_KIND_MASK        (((1 << CV_SEQ_KIND_BITS) - 1)<<CV_SEQ_ELTYPE_BITS)
1385
1386
/* types of sequences */
1387
#define CV_SEQ_KIND_GENERIC     (0 << CV_SEQ_ELTYPE_BITS)
1388
#define CV_SEQ_KIND_CURVE       (1 << CV_SEQ_ELTYPE_BITS)
1389
#define CV_SEQ_KIND_BIN_TREE    (2 << CV_SEQ_ELTYPE_BITS)
1390
1391
/* types of sparse sequences (sets) */
1392
#define CV_SEQ_KIND_GRAPH       (3 << CV_SEQ_ELTYPE_BITS)
1393
#define CV_SEQ_KIND_SUBDIV2D    (4 << CV_SEQ_ELTYPE_BITS)
1394
1395
#define CV_SEQ_FLAG_SHIFT       (CV_SEQ_KIND_BITS + CV_SEQ_ELTYPE_BITS)
1396
1397
/* flags for curves */
1398
#define CV_SEQ_FLAG_CLOSED     (1 << CV_SEQ_FLAG_SHIFT)
1399
#define CV_SEQ_FLAG_SIMPLE     (2 << CV_SEQ_FLAG_SHIFT)
1400
#define CV_SEQ_FLAG_CONVEX     (4 << CV_SEQ_FLAG_SHIFT)
1401
#define CV_SEQ_FLAG_HOLE       (8 << CV_SEQ_FLAG_SHIFT)
1402
1403
/* flags for graphs */
1404
#define CV_GRAPH_FLAG_ORIENTED (1 << CV_SEQ_FLAG_SHIFT)
1405
1406
#define CV_GRAPH               CV_SEQ_KIND_GRAPH
1407
#define CV_ORIENTED_GRAPH      (CV_SEQ_KIND_GRAPH|CV_GRAPH_FLAG_ORIENTED)
1408
1409
/* point sets */
1410
#define CV_SEQ_POINT_SET       (CV_SEQ_KIND_GENERIC| CV_SEQ_ELTYPE_POINT)
1411
#define CV_SEQ_POINT3D_SET     (CV_SEQ_KIND_GENERIC| CV_SEQ_ELTYPE_POINT3D)
1412
#define CV_SEQ_POLYLINE        (CV_SEQ_KIND_CURVE  | CV_SEQ_ELTYPE_POINT)
1413
#define CV_SEQ_POLYGON         (CV_SEQ_FLAG_CLOSED | CV_SEQ_POLYLINE )
1414
#define CV_SEQ_CONTOUR         CV_SEQ_POLYGON
1415
#define CV_SEQ_SIMPLE_POLYGON  (CV_SEQ_FLAG_SIMPLE | CV_SEQ_POLYGON  )
1416
1417
/* chain-coded curves */
1418
#define CV_SEQ_CHAIN           (CV_SEQ_KIND_CURVE  | CV_SEQ_ELTYPE_CODE)
1419
#define CV_SEQ_CHAIN_CONTOUR   (CV_SEQ_FLAG_CLOSED | CV_SEQ_CHAIN)
1420
1421
/* binary tree for the contour */
1422
#define CV_SEQ_POLYGON_TREE    (CV_SEQ_KIND_BIN_TREE  | CV_SEQ_ELTYPE_TRIAN_ATR)
1423
1424
/* sequence of the connected components */
1425
#define CV_SEQ_CONNECTED_COMP  (CV_SEQ_KIND_GENERIC  | CV_SEQ_ELTYPE_CONNECTED_COMP)
1426
1427
/* sequence of the integer numbers */
1428
#define CV_SEQ_INDEX           (CV_SEQ_KIND_GENERIC  | CV_SEQ_ELTYPE_INDEX)
1429
1430
#define CV_SEQ_ELTYPE( seq )   ((seq)->flags & CV_SEQ_ELTYPE_MASK)
1431
#define CV_SEQ_KIND( seq )     ((seq)->flags & CV_SEQ_KIND_MASK )
1432
1433
/* flag checking */
1434
#define CV_IS_SEQ_INDEX( seq )      ((CV_SEQ_ELTYPE(seq) == CV_SEQ_ELTYPE_INDEX) && \
1435
                                     (CV_SEQ_KIND(seq) == CV_SEQ_KIND_GENERIC))
1436
1437
#define CV_IS_SEQ_CURVE( seq )      (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE)
1438
#define CV_IS_SEQ_CLOSED( seq )     (((seq)->flags & CV_SEQ_FLAG_CLOSED) != 0)
1439
#define CV_IS_SEQ_CONVEX( seq )     (((seq)->flags & CV_SEQ_FLAG_CONVEX) != 0)
1440
#define CV_IS_SEQ_HOLE( seq )       (((seq)->flags & CV_SEQ_FLAG_HOLE) != 0)
1441
#define CV_IS_SEQ_SIMPLE( seq )     ((((seq)->flags & CV_SEQ_FLAG_SIMPLE) != 0) || \
1442
                                    CV_IS_SEQ_CONVEX(seq))
1443
1444
/* type checking macros */
1445
#define CV_IS_SEQ_POINT_SET( seq ) \
1446
    ((CV_SEQ_ELTYPE(seq) == CV_32SC2 || CV_SEQ_ELTYPE(seq) == CV_32FC2))
1447
1448
#define CV_IS_SEQ_POINT_SUBSET( seq ) \
1449
    (CV_IS_SEQ_INDEX( seq ) || CV_SEQ_ELTYPE(seq) == CV_SEQ_ELTYPE_PPOINT)
1450
1451
#define CV_IS_SEQ_POLYLINE( seq )   \
1452
    (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE && CV_IS_SEQ_POINT_SET(seq))
1453
1454
#define CV_IS_SEQ_POLYGON( seq )   \
1455
    (CV_IS_SEQ_POLYLINE(seq) && CV_IS_SEQ_CLOSED(seq))
1456
1457
#define CV_IS_SEQ_CHAIN( seq )   \
1458
    (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE && (seq)->elem_size == 1)
1459
1460
#define CV_IS_SEQ_CONTOUR( seq )   \
1461
    (CV_IS_SEQ_CLOSED(seq) && (CV_IS_SEQ_POLYLINE(seq) || CV_IS_SEQ_CHAIN(seq)))
1462
1463
#define CV_IS_SEQ_CHAIN_CONTOUR( seq ) \
1464
    (CV_IS_SEQ_CHAIN( seq ) && CV_IS_SEQ_CLOSED( seq ))
1465
1466
#define CV_IS_SEQ_POLYGON_TREE( seq ) \
1467
    (CV_SEQ_ELTYPE (seq) ==  CV_SEQ_ELTYPE_TRIAN_ATR &&    \
1468
    CV_SEQ_KIND( seq ) ==  CV_SEQ_KIND_BIN_TREE )
1469
1470
#define CV_IS_GRAPH( seq )    \
1471
    (CV_IS_SET(seq) && CV_SEQ_KIND((CvSet*)(seq)) == CV_SEQ_KIND_GRAPH)
1472
1473
#define CV_IS_GRAPH_ORIENTED( seq )   \
1474
    (((seq)->flags & CV_GRAPH_FLAG_ORIENTED) != 0)
1475
1476
#define CV_IS_SUBDIV2D( seq )  \
1477
    (CV_IS_SET(seq) && CV_SEQ_KIND((CvSet*)(seq)) == CV_SEQ_KIND_SUBDIV2D)
1478
1479
/****************************************************************************************/
1480
/*                            Sequence writer & reader                                  */
1481
/****************************************************************************************/
1482
1483
#define CV_SEQ_WRITER_FIELDS()                                     \
1484
    int          header_size;                                      \
1485
    CvSeq*       seq;        /* the sequence written */            \
1486
    CvSeqBlock*  block;      /* current block */                   \
1487
    schar*       ptr;        /* pointer to free space */           \
1488
    schar*       block_min;  /* pointer to the beginning of block*/\
1489
    schar*       block_max;  /* pointer to the end of block */
1490
1491
typedef struct CvSeqWriter
1492
{
1493
    CV_SEQ_WRITER_FIELDS()
1494
}
1495
CvSeqWriter;
1496
1497
1498
#define CV_SEQ_READER_FIELDS()                                      \
1499
    int          header_size;                                       \
1500
    CvSeq*       seq;        /* sequence, beign read */             \
1501
    CvSeqBlock*  block;      /* current block */                    \
1502
    schar*       ptr;        /* pointer to element be read next */  \
1503
    schar*       block_min;  /* pointer to the beginning of block */\
1504
    schar*       block_max;  /* pointer to the end of block */      \
1505
    int          delta_index;/* = seq->first->start_index   */      \
1506
    schar*       prev_elem;  /* pointer to previous element */
1507
1508
1509
typedef struct CvSeqReader
1510
{
1511
    CV_SEQ_READER_FIELDS()
1512
}
1513
CvSeqReader;
1514
1515
/****************************************************************************************/
1516
/*                                Operations on sequences                               */
1517
/****************************************************************************************/
1518
1519
#define  CV_SEQ_ELEM( seq, elem_type, index )                    \
1520
/* assert gives some guarantee that <seq> parameter is valid */  \
1521
(   assert(sizeof((seq)->first[0]) == sizeof(CvSeqBlock) &&      \
1522
    (seq)->elem_size == sizeof(elem_type)),                      \
1523
    (elem_type*)((seq)->first && (unsigned)index <               \
1524
    (unsigned)((seq)->first->count) ?                            \
1525
    (seq)->first->data + (index) * sizeof(elem_type) :           \
1526
    cvGetSeqElem( (CvSeq*)(seq), (index) )))
1527
#define CV_GET_SEQ_ELEM( elem_type, seq, index ) CV_SEQ_ELEM( (seq), elem_type, (index) )
1528
1529
/* Add element to sequence: */
1530
#define CV_WRITE_SEQ_ELEM_VAR( elem_ptr, writer )     \
1531
{                                                     \
1532
    if( (writer).ptr >= (writer).block_max )          \
1533
    {                                                 \
1534
        cvCreateSeqBlock( &writer);                   \
1535
    }                                                 \
1536
    memcpy((writer).ptr, elem_ptr, (writer).seq->elem_size);\
1537
    (writer).ptr += (writer).seq->elem_size;          \
1538
}
1539
1540
#define CV_WRITE_SEQ_ELEM( elem, writer )             \
1541
{                                                     \
1542
    assert( (writer).seq->elem_size == sizeof(elem)); \
1543
    if( (writer).ptr >= (writer).block_max )          \
1544
    {                                                 \
1545
        cvCreateSeqBlock( &writer);                   \
1546
    }                                                 \
1547
    assert( (writer).ptr <= (writer).block_max - sizeof(elem));\
1548
    memcpy((writer).ptr, &(elem), sizeof(elem));      \
1549
    (writer).ptr += sizeof(elem);                     \
1550
}
1551
1552
1553
/* Move reader position forward: */
1554
#define CV_NEXT_SEQ_ELEM( elem_size, reader )                 \
1555
{                                                             \
1556
    if( ((reader).ptr += (elem_size)) >= (reader).block_max ) \
1557
    {                                                         \
1558
        cvChangeSeqBlock( &(reader), 1 );                     \
1559
    }                                                         \
1560
}
1561
1562
1563
/* Move reader position backward: */
1564
#define CV_PREV_SEQ_ELEM( elem_size, reader )                \
1565
{                                                            \
1566
    if( ((reader).ptr -= (elem_size)) < (reader).block_min ) \
1567
    {                                                        \
1568
        cvChangeSeqBlock( &(reader), -1 );                   \
1569
    }                                                        \
1570
}
1571
1572
/* Read element and move read position forward: */
1573
#define CV_READ_SEQ_ELEM( elem, reader )                       \
1574
{                                                              \
1575
    assert( (reader).seq->elem_size == sizeof(elem));          \
1576
    memcpy( &(elem), (reader).ptr, sizeof((elem)));            \
1577
    CV_NEXT_SEQ_ELEM( sizeof(elem), reader )                   \
1578
}
1579
1580
/* Read element and move read position backward: */
1581
#define CV_REV_READ_SEQ_ELEM( elem, reader )                     \
1582
{                                                                \
1583
    assert( (reader).seq->elem_size == sizeof(elem));            \
1584
    memcpy(&(elem), (reader).ptr, sizeof((elem)));               \
1585
    CV_PREV_SEQ_ELEM( sizeof(elem), reader )                     \
1586
}
1587
1588
1589
#define CV_READ_CHAIN_POINT( _pt, reader )                              \
1590
{                                                                       \
1591
    (_pt) = (reader).pt;                                                \
1592
    if( (reader).ptr )                                                  \
1593
    {                                                                   \
1594
        CV_READ_SEQ_ELEM( (reader).code, (reader));                     \
1595
        assert( ((reader).code & ~7) == 0 );                            \
1596
        (reader).pt.x += (reader).deltas[(int)(reader).code][0];        \
1597
        (reader).pt.y += (reader).deltas[(int)(reader).code][1];        \
1598
    }                                                                   \
1599
}
1600
1601
#define CV_CURRENT_POINT( reader )  (*((CvPoint*)((reader).ptr)))
1602
#define CV_PREV_POINT( reader )     (*((CvPoint*)((reader).prev_elem)))
1603
1604
#define CV_READ_EDGE( pt1, pt2, reader )               \
1605
{                                                      \
1606
    assert( sizeof(pt1) == sizeof(CvPoint) &&          \
1607
            sizeof(pt2) == sizeof(CvPoint) &&          \
1608
            reader.seq->elem_size == sizeof(CvPoint)); \
1609
    (pt1) = CV_PREV_POINT( reader );                   \
1610
    (pt2) = CV_CURRENT_POINT( reader );                \
1611
    (reader).prev_elem = (reader).ptr;                 \
1612
    CV_NEXT_SEQ_ELEM( sizeof(CvPoint), (reader));      \
1613
}
1614
1615
/************ Graph macros ************/
1616
1617
/* Return next graph edge for given vertex: */
1618
#define  CV_NEXT_GRAPH_EDGE( edge, vertex )                              \
1619
     (assert((edge)->vtx[0] == (vertex) || (edge)->vtx[1] == (vertex)),  \
1620
      (edge)->next[(edge)->vtx[1] == (vertex)])
1621
1622
1623
1624
/****************************************************************************************\
1625
*             Data structures for persistence (a.k.a serialization) functionality        *
1626
\****************************************************************************************/
1627
1628
/* "black box" file storage */
1629
typedef struct CvFileStorage CvFileStorage;
1630
1631
/* Storage flags: */
1632
#define CV_STORAGE_READ          0
1633
#define CV_STORAGE_WRITE         1
1634
#define CV_STORAGE_WRITE_TEXT    CV_STORAGE_WRITE
1635
#define CV_STORAGE_WRITE_BINARY  CV_STORAGE_WRITE
1636
#define CV_STORAGE_APPEND        2
1637
1638
/* List of attributes: */
1639
typedef struct CvAttrList
1640
{
1641
    const char** attr;         /* NULL-terminated array of (attribute_name,attribute_value) pairs. */
1642
    struct CvAttrList* next;   /* Pointer to next chunk of the attributes list.                    */
1643
}
1644
CvAttrList;
1645
1646
CV_INLINE CvAttrList cvAttrList( const char** attr CV_DEFAULT(NULL),
1647
                                 CvAttrList* next CV_DEFAULT(NULL) )
1648
{
1649
    CvAttrList l;
1650
    l.attr = attr;
1651
    l.next = next;
1652
1653
    return l;
1654
}
1655
1656
struct CvTypeInfo;
1657
1658
#define CV_NODE_NONE        0
1659
#define CV_NODE_INT         1
1660
#define CV_NODE_INTEGER     CV_NODE_INT
1661
#define CV_NODE_REAL        2
1662
#define CV_NODE_FLOAT       CV_NODE_REAL
1663
#define CV_NODE_STR         3
1664
#define CV_NODE_STRING      CV_NODE_STR
1665
#define CV_NODE_REF         4 /* not used */
1666
#define CV_NODE_SEQ         5
1667
#define CV_NODE_MAP         6
1668
#define CV_NODE_TYPE_MASK   7
1669
1670
#define CV_NODE_TYPE(flags)  ((flags) & CV_NODE_TYPE_MASK)
1671
1672
/* file node flags */
1673
#define CV_NODE_FLOW        8 /* Used only for writing structures in YAML format. */
1674
#define CV_NODE_USER        16
1675
#define CV_NODE_EMPTY       32
1676
#define CV_NODE_NAMED       64
1677
1678
#define CV_NODE_IS_INT(flags)        (CV_NODE_TYPE(flags) == CV_NODE_INT)
1679
#define CV_NODE_IS_REAL(flags)       (CV_NODE_TYPE(flags) == CV_NODE_REAL)
1680
#define CV_NODE_IS_STRING(flags)     (CV_NODE_TYPE(flags) == CV_NODE_STRING)
1681
#define CV_NODE_IS_SEQ(flags)        (CV_NODE_TYPE(flags) == CV_NODE_SEQ)
1682
#define CV_NODE_IS_MAP(flags)        (CV_NODE_TYPE(flags) == CV_NODE_MAP)
1683
#define CV_NODE_IS_COLLECTION(flags) (CV_NODE_TYPE(flags) >= CV_NODE_SEQ)
1684
#define CV_NODE_IS_FLOW(flags)       (((flags) & CV_NODE_FLOW) != 0)
1685
#define CV_NODE_IS_EMPTY(flags)      (((flags) & CV_NODE_EMPTY) != 0)
1686
#define CV_NODE_IS_USER(flags)       (((flags) & CV_NODE_USER) != 0)
1687
#define CV_NODE_HAS_NAME(flags)      (((flags) & CV_NODE_NAMED) != 0)
1688
1689
#define CV_NODE_SEQ_SIMPLE 256
1690
#define CV_NODE_SEQ_IS_SIMPLE(seq) (((seq)->flags & CV_NODE_SEQ_SIMPLE) != 0)
1691
1692
typedef struct CvString
1693
{
1694
    int len;
1695
    char* ptr;
1696
}
1697
CvString;
1698
1699
/* All the keys (names) of elements in the readed file storage
1700
   are stored in the hash to speed up the lookup operations: */
1701
typedef struct CvStringHashNode
1702
{
1703
    unsigned hashval;
1704
    CvString str;
1705
    struct CvStringHashNode* next;
1706
}
1707
CvStringHashNode;
1708
1709
typedef struct CvGenericHash CvFileNodeHash;
1710
1711
/* Basic element of the file storage - scalar or collection: */
1712
typedef struct CvFileNode
1713
{
1714
    int tag;
1715
    struct CvTypeInfo* info; /* type information
1716
            (only for user-defined object, for others it is 0) */
1717
    union
1718
    {
1719
        double f; /* scalar floating-point number */
1720
        int i;    /* scalar integer number */
1721
        CvString str; /* text string */
1722
        CvSeq* seq; /* sequence (ordered collection of file nodes) */
1723
        CvFileNodeHash* map; /* map (collection of named file nodes) */
1724
    } data;
1725
}
1726
CvFileNode;
1727
1728
#ifdef __cplusplus
1729
extern "C" {
1730
#endif
1731
typedef int (CV_CDECL *CvIsInstanceFunc)( const void* struct_ptr );
1732
typedef void (CV_CDECL *CvReleaseFunc)( void** struct_dblptr );
1733
typedef void* (CV_CDECL *CvReadFunc)( CvFileStorage* storage, CvFileNode* node );
1734
typedef void (CV_CDECL *CvWriteFunc)( CvFileStorage* storage, const char* name,
1735
                                      const void* struct_ptr, CvAttrList attributes );
1736
typedef void* (CV_CDECL *CvCloneFunc)( const void* struct_ptr );
1737
#ifdef __cplusplus
1738
}
1739
#endif
1740
1741
typedef struct CvTypeInfo
1742
{
1743
    int flags;
1744
    int header_size;
1745
    struct CvTypeInfo* prev;
1746
    struct CvTypeInfo* next;
1747
    const char* type_name;
1748
    CvIsInstanceFunc is_instance;
1749
    CvReleaseFunc release;
1750
    CvReadFunc read;
1751
    CvWriteFunc write;
1752
    CvCloneFunc clone;
1753
}
1754
CvTypeInfo;
1755
1756
1757
/**** System data types ******/
1758
1759
typedef struct CvPluginFuncInfo
1760
{
1761
    void** func_addr;
1762
    void* default_func_addr;
1763
    const char* func_names;
1764
    int search_modules;
1765
    int loaded_from;
1766
}
1767
CvPluginFuncInfo;
1768
1769
typedef struct CvModuleInfo
1770
{
1771
    struct CvModuleInfo* next;
1772
    const char* name;
1773
    const char* version;
1774
    CvPluginFuncInfo* func_tab;
1775
}
1776
CvModuleInfo;
1777
1778
#endif /*_CXCORE_TYPES_H_*/
1779
1780
/* End of file. */