diff --git a/etg/dc.py b/etg/dc.py index 3f367b4b..ccdc3b10 100644 --- a/etg/dc.py +++ b/etg/dc.py @@ -310,9 +310,9 @@ def run(): '(PyObject* textList, PyObject* pyPoints, PyObject* foregroundList, PyObject* backgroundList)', body="return wxPyDrawTextList(*self, textList, pyPoints, foregroundList, backgroundList);") - c.addCppMethod('PyObject*', '_DrawLinesBuffer', + c.addCppMethod('PyObject*', '_DrawLinesFromBuffer', '(PyObject* pyBuff)', - body="return wxPyDrawLinesBuffer(*self, pyBuff);") + body="return wxPyDrawLinesFromBuffer(*self, pyBuff);") c.addPyMethod('DrawPointList', '(self, points, pens=None)', doc="""\ @@ -478,7 +478,7 @@ def run(): """) - c.addPyMethod('DrawLinesBuffer', '(self, pyBuff)', + c.addPyMethod('DrawLinesFromBuffer', '(self, pyBuff)', doc="""\ Implementation of DrawLines that can use numpy arrays, or anything else that uses the python buffer protocol, directly. @@ -486,7 +486,7 @@ def run(): :param pyBuff: A python buffer containing integer pairs """, body="""\ - return self._DrawLinesBuffer(pyBuff) + return self._DrawLinesFromBuffer(pyBuff) """) diff --git a/src/dc_ex.cpp b/src/dc_ex.cpp index e9ad1de7..24e13a33 100644 --- a/src/dc_ex.cpp +++ b/src/dc_ex.cpp @@ -467,7 +467,7 @@ error0: } -PyObject* wxPyDrawLinesBuffer(wxDC& dc, PyObject* pyBuff) +PyObject* wxPyDrawLinesFromBuffer(wxDC& dc, PyObject* pyBuff) { wxPyBlock_t blocked = wxPyBeginBlockThreads(); Py_buffer view; @@ -482,6 +482,10 @@ PyObject* wxPyDrawLinesBuffer(wxDC& dc, PyObject* pyBuff) goto err1; } + if (view.itemsize * 2 != sizeof(wxPoint)) { + goto err2; + } + dc.DrawLines(view.len / view.itemsize / 2, (wxPoint *)view.buf); PyBuffer_Release(&view); @@ -496,11 +500,15 @@ PyObject* wxPyDrawLinesBuffer(wxDC& dc, PyObject* pyBuff) retval = NULL; goto exit; - err1: + err1: + // PyObject_GetBuffer raises exception already retval = NULL; goto exit; - + err2: + PyErr_SetString(PyExc_TypeError, "Item size does not match wxPoint size"); + retval = NULL; + goto exit; exit: wxPyEndBlockThreads(blocked);