42 #ifndef _CXCORE_TYPES_H_
43 #define _CXCORE_TYPES_H_
45 #if !defined _CRT_SECURE_NO_DEPRECATE && _MSC_VER > 1300
46 #define _CRT_SECURE_NO_DEPRECATE
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>
74 #if defined __BORLANDC__
76 #elif defined WIN64 && !defined EM64T && defined CV_ICC
84 #if defined WIN32 || defined WIN64
90 #elif defined __IPL_H__
93 #endif // SKIP_INCLUDES
95 #if defined WIN32 || defined WIN64
96 #define CV_CDECL __cdecl
97 #define CV_STDCALL __stdcall
105 #define CV_EXTERN_C extern "C"
106 #define CV_DEFAULT(val) = val
109 #define CV_DEFAULT(val)
113 #ifndef CV_EXTERN_C_FUNCPTR
115 #define CV_EXTERN_C_FUNCPTR(x) extern "C" { typedef x; }
117 #define CV_EXTERN_C_FUNCPTR(x) typedef x
122 #if defined __cplusplus
123 #define CV_INLINE inline
124 #elif (defined WIN32 || defined WIN64) && !defined __GNUC__
125 #define CV_INLINE __inline
127 #define CV_INLINE static
131 #if (defined WIN32 || defined WIN64) && defined CVAPI_EXPORTS
132 #define CV_EXPORTS __declspec(dllexport)
138 #define CVAPI(rettype) CV_EXTERN_C CV_EXPORTS rettype CV_CDECL
141 #if defined _MSC_VER || defined __BORLANDC__
142 typedef __int64
int64;
143 typedef unsigned __int64
uint64;
183 #define CV_PI 3.1415926535897932384626433832795
184 #define CV_LOG2 0.69314718055994530941723212145818
186 #define CV_SWAP(a,b,t) ((t) = (a), (a) = (b), (b) = (t))
189 #define MIN(a,b) ((a) > (b) ? (b) : (a))
193 #define MAX(a,b) ((a) < (b) ? (b) : (a))
197 #define CV_IMIN(a, b) ((a) ^ (((a)^(b)) & (((a) < (b)) - 1)))
199 #define CV_IMAX(a, b) ((a) ^ (((a)^(b)) & (((a) > (b)) - 1)))
203 #define CV_IABS(a) (((a) ^ ((a) < 0 ? -1 : 0)) - ((a) < 0 ? -1 : 0))
205 #define CV_IABS(a) abs(a)
207 #define CV_CMP(a,b) (((a) > (b)) - ((a) < (b)))
208 #define CV_SIGN(a) CV_CMP((a),0)
213 __m128d t = _mm_load_sd( &value );
214 return _mm_cvtsd_si32(t);
215 #elif defined WIN32 && !defined WIN64 && defined _MSC_VER
223 #elif (defined HAVE_LRINT) || (defined WIN64 && !defined EM64T && defined CV_ICC)
224 return (
int)lrint(value);
231 temp.
f = value + 6755399441055744.0;
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)));
246 diff.
f = (
float)(value - temp);
247 return temp - (diff.
i < 0);
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));
261 diff.
f = (
float)(temp - value);
262 return temp + (diff.
i < 0);
266 #define cvInvSqrt(value) ((float)(1./sqrt(value)))
267 #define cvSqrt(value) ((float)sqrt(value))
278 return ((
unsigned)(ieee754.
u >> 32) & 0x7fffffff) +
293 return ((
unsigned)(ieee754.
u >> 32) & 0x7fffffff) == 0x7ff00000 &&
313 temp = (
uint64)(
unsigned)temp*1554115554 + (temp >> 32);
315 return (
unsigned)
temp;
321 return cvRandInt(rng)*2.3283064365386962890625e-10 ;
335 #define IPL_DEPTH_SIGN 0x80000000
337 #define IPL_DEPTH_1U 1
338 #define IPL_DEPTH_8U 8
339 #define IPL_DEPTH_16U 16
340 #define IPL_DEPTH_32F 32
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)
346 #define IPL_DATA_ORDER_PIXEL 0
347 #define IPL_DATA_ORDER_PLANE 1
349 #define IPL_ORIGIN_TL 0
350 #define IPL_ORIGIN_BL 1
352 #define IPL_ALIGN_4BYTES 4
353 #define IPL_ALIGN_8BYTES 8
354 #define IPL_ALIGN_16BYTES 16
355 #define IPL_ALIGN_32BYTES 32
357 #define IPL_ALIGN_DWORD IPL_ALIGN_4BYTES
358 #define IPL_ALIGN_QWORD IPL_ALIGN_8BYTES
360 #define IPL_BORDER_CONSTANT 0
361 #define IPL_BORDER_REPLICATE 1
362 #define IPL_BORDER_REFLECT 2
363 #define IPL_BORDER_WRAP 3
433 #define IPL_IMAGE_HEADER 1
434 #define IPL_IMAGE_DATA 2
435 #define IPL_IMAGE_ROI 4
440 #define IPL_BORDER_REFLECT_101 4
442 #define IPL_IMAGE_MAGIC_VAL ((int)sizeof(IplImage))
443 #define CV_TYPE_NAME_IMAGE "opencv-image"
445 #define CV_IS_IMAGE_HDR(img) \
446 ((img) != NULL && ((const IplImage*)(img))->nSize == sizeof(IplImage))
448 #define CV_IS_IMAGE(img) \
449 (CV_IS_IMAGE_HDR(img) && ((IplImage*)img)->imageData != NULL)
453 #define IPL_DEPTH_64F 64
457 #define CV_IMAGE_ELEM( image, elemtype, row, col ) \
458 (((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)])
465 #define CV_CN_SHIFT 3
466 #define CV_DEPTH_MAX (1 << CV_CN_SHIFT)
475 #define CV_USRTYPE1 7
477 #define CV_MAKETYPE(depth,cn) ((depth) + (((cn)-1) << CV_CN_SHIFT))
478 #define CV_MAKE_TYPE CV_MAKETYPE
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))
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))
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))
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))
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))
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))
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))
522 #define CV_AUTO_STEP 0x7fffffff
523 #define CV_WHOLE_ARR cvSlice( 0, 0x3fffffff )
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)
539 #define CV_MAGIC_MASK 0xFFFF0000
540 #define CV_MAT_MAGIC_VAL 0x42420000
541 #define CV_TYPE_NAME_MAT "opencv-matrix"
582 #define CV_IS_MAT_HDR(mat) \
584 (((const CvMat*)(mat))->type & CV_MAGIC_MASK) == CV_MAT_MAGIC_VAL && \
585 ((const CvMat*)(mat))->cols > 0 && ((const CvMat*)(mat))->rows > 0)
587 #define CV_IS_MAT(mat) \
588 (CV_IS_MAT_HDR(mat) && ((const CvMat*)(mat))->data.ptr != NULL)
590 #define CV_IS_MASK_ARR(mat) \
591 (((mat)->type & (CV_MAT_TYPE_MASK & ~CV_8SC1)) == 0)
593 #define CV_ARE_TYPES_EQ(mat1, mat2) \
594 ((((mat1)->type ^ (mat2)->type) & CV_MAT_TYPE_MASK) == 0)
596 #define CV_ARE_CNS_EQ(mat1, mat2) \
597 ((((mat1)->type ^ (mat2)->type) & CV_MAT_CN_MASK) == 0)
599 #define CV_ARE_DEPTHS_EQ(mat1, mat2) \
600 ((((mat1)->type ^ (mat2)->type) & CV_MAT_DEPTH_MASK) == 0)
602 #define CV_ARE_SIZES_EQ(mat1, mat2) \
603 ((mat1)->rows == (mat2)->rows && (mat1)->cols == (mat2)->cols)
605 #define CV_IS_MAT_CONST(mat) \
606 (((mat)->rows|(mat)->cols) == 1)
610 #define CV_ELEM_SIZE1(type) \
611 ((((sizeof(size_t)<<28)|0x8442211) >> CV_MAT_DEPTH(type)*4) & 15)
614 #define CV_ELEM_SIZE(type) \
615 (CV_MAT_CN(type) << ((((sizeof(size_t)/4+1)*16384|0x3a50) >> CV_MAT_DEPTH(type)*2) & 3))
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))
644 #define CV_MAT_ELEM_PTR( mat, row, col ) \
645 CV_MAT_ELEM_PTR_FAST( mat, row, col, CV_ELEM_SIZE((mat).type) )
647 #define CV_MAT_ELEM( mat, elemtype, row, col ) \
648 (*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype)))
656 assert( (
unsigned)row < (
unsigned)mat->
rows &&
657 (
unsigned)col < (
unsigned)mat->
cols );
660 return ((
float*)(mat->
data.
ptr + (
size_t)mat->
step*row))[col];
664 return ((
double*)(mat->
data.
ptr + (
size_t)mat->
step*row))[col];
673 assert( (
unsigned)row < (
unsigned)mat->
rows &&
674 (
unsigned)col < (
unsigned)mat->
cols );
698 #define CV_MATND_MAGIC_VAL 0x42430000
699 #define CV_TYPE_NAME_MATND "opencv-nd-matrix"
701 #define CV_MAX_DIM 32
702 #define CV_MAX_DIM_HEAP (1 << 16)
730 #define CV_IS_MATND_HDR(mat) \
731 ((mat) != NULL && (((const CvMatND*)(mat))->type & CV_MAGIC_MASK) == CV_MATND_MAGIC_VAL)
733 #define CV_IS_MATND(mat) \
734 (CV_IS_MATND_HDR(mat) && ((const CvMatND*)(mat))->data.ptr != NULL)
741 #define CV_SPARSE_MAT_MAGIC_VAL 0x42440000
742 #define CV_TYPE_NAME_SPARSE_MAT "opencv-sparse-matrix"
762 #define CV_IS_SPARSE_MAT_HDR(mat) \
764 (((const CvSparseMat*)(mat))->type & CV_MAGIC_MASK) == CV_SPARSE_MAT_MAGIC_VAL)
766 #define CV_IS_SPARSE_MAT(mat) \
767 CV_IS_SPARSE_MAT_HDR(mat)
786 #define CV_NODE_VAL(mat,node) ((void*)((uchar*)(node) + (mat)->valoffset))
787 #define CV_NODE_IDX(mat,node) ((int*)((uchar*)(node) + (mat)->idxoffset))
795 #define CV_HIST_MAGIC_VAL 0x42450000
796 #define CV_HIST_UNIFORM_FLAG (1 << 10)
799 #define CV_HIST_RANGES_FLAG (1 << 11)
801 #define CV_HIST_ARRAY 0
802 #define CV_HIST_SPARSE 1
803 #define CV_HIST_TREE CV_HIST_SPARSE
807 #define CV_HIST_UNIFORM 1
819 #define CV_IS_HIST( hist ) \
821 (((CvHistogram*)(hist))->type & CV_MAGIC_MASK) == CV_HIST_MAGIC_VAL && \
822 (hist)->bins != NULL)
824 #define CV_IS_UNIFORM_HIST( hist ) \
825 (((hist)->type & CV_HIST_UNIFORM_FLAG) != 0)
827 #define CV_IS_SPARSE_HIST( hist ) \
828 CV_IS_SPARSE_MAT((hist)->bins)
830 #define CV_HIST_HAS_RANGES( hist ) \
831 (((hist)->type & CV_HIST_RANGES_FLAG) != 0)
881 #define CV_TERMCRIT_ITER 1
882 #define CV_TERMCRIT_NUMBER CV_TERMCRIT_ITER
883 #define CV_TERMCRIT_EPS 2
1105 #define CV_WHOLE_SEQ_END_INDEX 0x3fffffff
1106 #define CV_WHOLE_SEQ cvSlice(0, CV_WHOLE_SEQ_END_INDEX)
1121 scalar.
val[0] = val0; scalar.
val[1] = val1;
1122 scalar.
val[2] = val2; scalar.
val[3] = val3;
1130 scalar.
val[0] = val0;
1131 scalar.
val[1] = scalar.
val[2] = scalar.
val[3] = 0;
1138 scalar.
val[0] = val0123;
1139 scalar.
val[1] = val0123;
1140 scalar.
val[2] = val0123;
1141 scalar.
val[3] = val0123;
1158 #define CV_STORAGE_MAGIC_VAL 0x42890000
1171 #define CV_IS_STORAGE(storage) \
1172 ((storage) != NULL && \
1173 (((CvMemStorage*)(storage))->signature & CV_MAGIC_MASK) == CV_STORAGE_MAGIC_VAL)
1198 #define CV_TREE_NODE_FIELDS(node_type) \
1201 struct node_type* h_prev; \
1202 struct node_type* h_next; \
1203 struct node_type* v_prev; \
1204 struct node_type* v_next
1210 #define CV_SEQUENCE_FIELDS() \
1211 CV_TREE_NODE_FIELDS(CvSeq); \
1217 CvMemStorage* storage; \
1218 CvSeqBlock* free_blocks; \
1227 #define CV_TYPE_NAME_SEQ "opencv-sequence"
1228 #define CV_TYPE_NAME_SEQ_TREE "opencv-sequence-tree"
1237 #define CV_SET_ELEM_FIELDS(elem_type) \
1239 struct elem_type* next_free;
1247 #define CV_SET_FIELDS() \
1248 CV_SEQUENCE_FIELDS() \
1249 CvSetElem* free_elems; \
1259 #define CV_SET_ELEM_IDX_MASK ((1 << 26) - 1)
1260 #define CV_SET_ELEM_FREE_FLAG (1 << (sizeof(int)*8-1))
1263 #define CV_IS_SET_ELEM( ptr ) (((CvSetElem*)(ptr))->flags >= 0)
1285 #define CV_GRAPH_EDGE_FIELDS() \
1288 struct CvGraphEdge* next[2]; \
1289 struct CvGraphVtx* vtx[2];
1292 #define CV_GRAPH_VERTEX_FIELDS() \
1294 struct CvGraphEdge* first;
1320 #define CV_GRAPH_FIELDS() \
1330 #define CV_TYPE_NAME_GRAPH "opencv-graph"
1341 #define CV_CONTOUR_FIELDS() \
1342 CV_SEQUENCE_FIELDS() \
1359 #define CV_SEQ_MAGIC_VAL 0x42990000
1361 #define CV_IS_SEQ(seq) \
1362 ((seq) != NULL && (((CvSeq*)(seq))->flags & CV_MAGIC_MASK) == CV_SEQ_MAGIC_VAL)
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)
1368 #define CV_SEQ_ELTYPE_BITS 9
1369 #define CV_SEQ_ELTYPE_MASK ((1 << CV_SEQ_ELTYPE_BITS) - 1)
1371 #define CV_SEQ_ELTYPE_POINT CV_32SC2
1372 #define CV_SEQ_ELTYPE_CODE CV_8UC1
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
1376 #define CV_SEQ_ELTYPE_INDEX CV_32SC1
1377 #define CV_SEQ_ELTYPE_GRAPH_EDGE 0
1378 #define CV_SEQ_ELTYPE_GRAPH_VERTEX 0
1379 #define CV_SEQ_ELTYPE_TRIAN_ATR 0
1380 #define CV_SEQ_ELTYPE_CONNECTED_COMP 0
1381 #define CV_SEQ_ELTYPE_POINT3D CV_32FC3
1383 #define CV_SEQ_KIND_BITS 3
1384 #define CV_SEQ_KIND_MASK (((1 << CV_SEQ_KIND_BITS) - 1)<<CV_SEQ_ELTYPE_BITS)
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)
1392 #define CV_SEQ_KIND_GRAPH (3 << CV_SEQ_ELTYPE_BITS)
1393 #define CV_SEQ_KIND_SUBDIV2D (4 << CV_SEQ_ELTYPE_BITS)
1395 #define CV_SEQ_FLAG_SHIFT (CV_SEQ_KIND_BITS + CV_SEQ_ELTYPE_BITS)
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)
1404 #define CV_GRAPH_FLAG_ORIENTED (1 << CV_SEQ_FLAG_SHIFT)
1406 #define CV_GRAPH CV_SEQ_KIND_GRAPH
1407 #define CV_ORIENTED_GRAPH (CV_SEQ_KIND_GRAPH|CV_GRAPH_FLAG_ORIENTED)
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 )
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)
1422 #define CV_SEQ_POLYGON_TREE (CV_SEQ_KIND_BIN_TREE | CV_SEQ_ELTYPE_TRIAN_ATR)
1425 #define CV_SEQ_CONNECTED_COMP (CV_SEQ_KIND_GENERIC | CV_SEQ_ELTYPE_CONNECTED_COMP)
1428 #define CV_SEQ_INDEX (CV_SEQ_KIND_GENERIC | CV_SEQ_ELTYPE_INDEX)
1430 #define CV_SEQ_ELTYPE( seq ) ((seq)->flags & CV_SEQ_ELTYPE_MASK)
1431 #define CV_SEQ_KIND( seq ) ((seq)->flags & CV_SEQ_KIND_MASK )
1434 #define CV_IS_SEQ_INDEX( seq ) ((CV_SEQ_ELTYPE(seq) == CV_SEQ_ELTYPE_INDEX) && \
1435 (CV_SEQ_KIND(seq) == CV_SEQ_KIND_GENERIC))
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))
1445 #define CV_IS_SEQ_POINT_SET( seq ) \
1446 ((CV_SEQ_ELTYPE(seq) == CV_32SC2 || CV_SEQ_ELTYPE(seq) == CV_32FC2))
1448 #define CV_IS_SEQ_POINT_SUBSET( seq ) \
1449 (CV_IS_SEQ_INDEX( seq ) || CV_SEQ_ELTYPE(seq) == CV_SEQ_ELTYPE_PPOINT)
1451 #define CV_IS_SEQ_POLYLINE( seq ) \
1452 (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE && CV_IS_SEQ_POINT_SET(seq))
1454 #define CV_IS_SEQ_POLYGON( seq ) \
1455 (CV_IS_SEQ_POLYLINE(seq) && CV_IS_SEQ_CLOSED(seq))
1457 #define CV_IS_SEQ_CHAIN( seq ) \
1458 (CV_SEQ_KIND(seq) == CV_SEQ_KIND_CURVE && (seq)->elem_size == 1)
1460 #define CV_IS_SEQ_CONTOUR( seq ) \
1461 (CV_IS_SEQ_CLOSED(seq) && (CV_IS_SEQ_POLYLINE(seq) || CV_IS_SEQ_CHAIN(seq)))
1463 #define CV_IS_SEQ_CHAIN_CONTOUR( seq ) \
1464 (CV_IS_SEQ_CHAIN( seq ) && CV_IS_SEQ_CLOSED( seq ))
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 )
1470 #define CV_IS_GRAPH( seq ) \
1471 (CV_IS_SET(seq) && CV_SEQ_KIND((CvSet*)(seq)) == CV_SEQ_KIND_GRAPH)
1473 #define CV_IS_GRAPH_ORIENTED( seq ) \
1474 (((seq)->flags & CV_GRAPH_FLAG_ORIENTED) != 0)
1476 #define CV_IS_SUBDIV2D( seq ) \
1477 (CV_IS_SET(seq) && CV_SEQ_KIND((CvSet*)(seq)) == CV_SEQ_KIND_SUBDIV2D)
1483 #define CV_SEQ_WRITER_FIELDS() \
1486 CvSeqBlock* block; \
1498 #define CV_SEQ_READER_FIELDS() \
1501 CvSeqBlock* block; \
1519 #define CV_SEQ_ELEM( seq, elem_type, index ) \
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) )
1530 #define CV_WRITE_SEQ_ELEM_VAR( elem_ptr, writer ) \
1532 if( (writer).ptr >= (writer).block_max ) \
1534 cvCreateSeqBlock( &writer); \
1536 memcpy((writer).ptr, elem_ptr, (writer).seq->elem_size);\
1537 (writer).ptr += (writer).seq->elem_size; \
1540 #define CV_WRITE_SEQ_ELEM( elem, writer ) \
1542 assert( (writer).seq->elem_size == sizeof(elem)); \
1543 if( (writer).ptr >= (writer).block_max ) \
1545 cvCreateSeqBlock( &writer); \
1547 assert( (writer).ptr <= (writer).block_max - sizeof(elem));\
1548 memcpy((writer).ptr, &(elem), sizeof(elem)); \
1549 (writer).ptr += sizeof(elem); \
1554 #define CV_NEXT_SEQ_ELEM( elem_size, reader ) \
1556 if( ((reader).ptr += (elem_size)) >= (reader).block_max ) \
1558 cvChangeSeqBlock( &(reader), 1 ); \
1564 #define CV_PREV_SEQ_ELEM( elem_size, reader ) \
1566 if( ((reader).ptr -= (elem_size)) < (reader).block_min ) \
1568 cvChangeSeqBlock( &(reader), -1 ); \
1573 #define CV_READ_SEQ_ELEM( elem, reader ) \
1575 assert( (reader).seq->elem_size == sizeof(elem)); \
1576 memcpy( &(elem), (reader).ptr, sizeof((elem))); \
1577 CV_NEXT_SEQ_ELEM( sizeof(elem), reader ) \
1581 #define CV_REV_READ_SEQ_ELEM( elem, reader ) \
1583 assert( (reader).seq->elem_size == sizeof(elem)); \
1584 memcpy(&(elem), (reader).ptr, sizeof((elem))); \
1585 CV_PREV_SEQ_ELEM( sizeof(elem), reader ) \
1589 #define CV_READ_CHAIN_POINT( _pt, reader ) \
1591 (_pt) = (reader).pt; \
1592 if( (reader).ptr ) \
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]; \
1601 #define CV_CURRENT_POINT( reader ) (*((CvPoint*)((reader).ptr)))
1602 #define CV_PREV_POINT( reader ) (*((CvPoint*)((reader).prev_elem)))
1604 #define CV_READ_EDGE( pt1, pt2, reader ) \
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)); \
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)])
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
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
1666 #define CV_NODE_SEQ 5
1667 #define CV_NODE_MAP 6
1668 #define CV_NODE_TYPE_MASK 7
1670 #define CV_NODE_TYPE(flags) ((flags) & CV_NODE_TYPE_MASK)
1673 #define CV_NODE_FLOW 8
1674 #define CV_NODE_USER 16
1675 #define CV_NODE_EMPTY 32
1676 #define CV_NODE_NAMED 64
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)
1689 #define CV_NODE_SEQ_SIMPLE 256
1690 #define CV_NODE_SEQ_IS_SIMPLE(seq) (((seq)->flags & CV_NODE_SEQ_SIMPLE) != 0)