@@ -27,13 +27,48 @@ rb_class()
2727 return rb_klass;
2828}
2929
30+ int
31+ eltype2class (int eltype, VALUE* ret) {
32+ int found = 1 ;
33+
34+ switch (eltype) {
35+ case CV_SEQ_ELTYPE_POINT:
36+ *ret = cCvPoint::rb_class ();
37+ break ;
38+ case CV_32FC2:
39+ *ret = cCvPoint2D32f::rb_class ();
40+ break ;
41+ case CV_SEQ_ELTYPE_POINT3D:
42+ *ret = cCvPoint3D32f::rb_class ();
43+ break ;
44+ case CV_SEQ_ELTYPE_CODE:
45+ case CV_SEQ_ELTYPE_INDEX:
46+ *ret = rb_cFixnum;
47+ break ;
48+ case CV_SEQ_ELTYPE_PPOINT: // or CV_SEQ_ELTYPE_PTR:
49+ // Not supported
50+ rb_raise (rb_eArgError, " seq_flags %d is not supported." , eltype);
51+ break ;
52+ default :
53+ found = 0 ;
54+ *ret = cCvPoint::rb_class ();
55+ break ;
56+ }
57+
58+ return found;
59+ }
60+
3061VALUE
3162seqblock_class (void *ptr)
3263{
33- VALUE klass;
34- if (! st_lookup (seqblock_klass_table, (st_data_t )ptr, (st_data_t *)&klass)) {
35- rb_raise (rb_eTypeError, " Invalid sequence error. " ) ;
64+ VALUE klass = Qnil ;
65+ if (st_lookup (seqblock_klass_table, (st_data_t )ptr, (st_data_t *)&klass)) {
66+ return klass ;
3667 }
68+
69+ int eltype = CV_SEQ_ELTYPE ((CvSeq*)ptr);
70+ eltype2class (eltype, &klass);
71+
3772 return klass;
3873}
3974
@@ -66,28 +101,8 @@ create_seq(int seq_flags, size_t header_size, VALUE storage_value)
66101 int eltype = seq_flags & CV_SEQ_ELTYPE_MASK;
67102 storage_value = CHECK_CVMEMSTORAGE (storage_value);
68103
69- switch (eltype) {
70- case CV_SEQ_ELTYPE_POINT:
71- klass = cCvPoint::rb_class ();
72- break ;
73- case CV_32FC2:
74- klass = cCvPoint2D32f::rb_class ();
75- break ;
76- case CV_SEQ_ELTYPE_POINT3D:
77- klass = cCvPoint3D32f::rb_class ();
78- break ;
79- case CV_SEQ_ELTYPE_CODE:
80- case CV_SEQ_ELTYPE_INDEX:
81- klass = rb_cFixnum;
82- break ;
83- case CV_SEQ_ELTYPE_PPOINT: // or CV_SEQ_ELTYPE_PTR:
84- // Not supported
85- rb_raise (rb_eArgError, " seq_flags %d is not supported." , eltype);
86- break ;
87- default :
104+ if (!eltype2class (eltype, &klass)) {
88105 seq_flags = CV_SEQ_ELTYPE_POINT | CV_SEQ_KIND_GENERIC;
89- klass = cCvPoint::rb_class ();
90- break ;
91106 }
92107
93108 int mat_type = CV_MAT_TYPE (seq_flags);
0 commit comments