Commit d1b5f437 authored by Vadim Pisarevsky's avatar Vadim Pisarevsky

adjust the header parser to support "public virtual" construction and make a…

adjust the header parser to support "public virtual" construction and make a tweak for multiple inheritance, fix potential memory problem with Python's IplImage.tostring() method (ticket #1486)
parent c86c6a02
......@@ -238,47 +238,18 @@ static PyObject *iplimage_repr(PyObject *self)
static PyObject *iplimage_tostring(PyObject *self, PyObject *args)
{
iplimage_t *pc = (iplimage_t*)self;
IplImage *i;
IplImage *i=0;
if (!convert_to_IplImage(self, &i, "self"))
return NULL;
if (i == NULL)
return NULL;
int bps;
switch (i->depth) {
case IPL_DEPTH_8U:
case IPL_DEPTH_8S:
bps = 1;
break;
case IPL_DEPTH_16U:
case IPL_DEPTH_16S:
bps = 2;
break;
case IPL_DEPTH_32S:
case IPL_DEPTH_32F:
bps = 4;
break;
case IPL_DEPTH_64F:
bps = 8;
break;
default:
return failmsg("Unrecognised depth %d", i->depth), (PyObject*)0;
}
int bpl = i->width * i->nChannels * bps;
if (PyString_Check(pc->data) && bpl == i->widthStep && pc->offset == 0 && ((bpl * i->height) == what_size(pc->data))) {
Py_INCREF(pc->data);
return pc->data;
} else {
int l = bpl * i->height;
char *s = new char[l];
int y;
for (y = 0; y < i->height; y++) {
memcpy(s + y * bpl, i->imageData + y * i->widthStep, bpl);
}
PyObject *r = PyString_FromStringAndSize(s, l);
delete[] s;
return r;
}
cv::Mat img(i);
size_t esz = img.elemSize();
int nrows = img.rows, ncols = img.cols;
if( !img.isContinuous() )
img = img.clone();
return PyString_FromStringAndSize((char*)img.data, (Py_ssize_t)(esz*nrows*ncols));
}
static struct PyMethodDef iplimage_methods[] =
......
......@@ -215,9 +215,11 @@ class ClassInfo(object):
if decl:
self.bases = decl[1].split()[1:]
if len(self.bases) > 1:
print "Error: class %s has more than 1 base class (not supported by Python C extensions)" % (self.name,)
print "Warning: class %s has more than 1 base class (not supported by Python C extensions)" % (self.name,)
print "Bases: ", self.bases
return sys.exit(-1)
print "Only the first base class will be used"
self.bases = self.bases[:1]
#return sys.exit(-1)
for m in decl[2]:
if m.startswith("="):
self.wname = m[1:]
......
......@@ -235,7 +235,7 @@ class CppHeaderParser(object):
modlist.append("=" + macro_arg)
l = l[:npos] + l[npos3+1:]
l = self.batch_replace(l, [("CV_EXPORTS_W", ""), ("CV_EXPORTS", ""), ("public ", " "), ("::", ".")]).strip()
l = self.batch_replace(l, [("CV_EXPORTS_W", ""), ("CV_EXPORTS", ""), ("public virtual ", " "), ("public ", " "), ("::", ".")]).strip()
ll = re.split(r'\s*[,:]?\s*', l)
ll = [le for le in ll if le]
classname = ll[1]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment