X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dd9f7fea29e3f8bb61861f52984b7943512346ac..db679b8c836e69c111cdc31e62cf92cebe4f938f:/wxPython/src/drawlist.cpp?ds=inline diff --git a/wxPython/src/drawlist.cpp b/wxPython/src/drawlist.cpp index d2e926204d..c89342ac84 100644 --- a/wxPython/src/drawlist.cpp +++ b/wxPython/src/drawlist.cpp @@ -17,18 +17,21 @@ #include "wx/wxPython/pydrawxxx.h" -//---------------------------------------------------------------------- +//--------------------------------------------------------------------------- +// Called from _gdiinit so we can do the API import while the GIL is held +void wxPyDrawList_SetAPIPtr() +{ + wxPyCoreAPI_IMPORT(); +} -PyObject* wxPyDrawXXXList(wxDC& dc, wxPyDrawListOp_t doDraw, - PyObject* pyCoords, PyObject* pyPens, PyObject* pyBrushes) { - wxPyBeginBlockThreads(); +PyObject* wxPyDrawXXXList(wxDC& dc, wxPyDrawListOp_t doDraw, + PyObject* pyCoords, PyObject* pyPens, PyObject* pyBrushes) +{ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); - if ( !wxPyCoreAPIPtr) - wxPyCoreAPI_IMPORT(); - bool isFastSeq = PyList_Check(pyCoords) || PyTuple_Check(pyCoords); bool isFastPens = PyList_Check(pyPens) || PyTuple_Check(pyPens); bool isFastBrushes = PyList_Check(pyBrushes) || PyTuple_Check(pyBrushes); @@ -135,81 +138,85 @@ PyObject* wxPyDrawXXXList(wxDC& dc, wxPyDrawListOp_t doDraw, exit: - wxPyEndBlockThreads(); + wxPyEndBlockThreads(blocked); return retval; } -bool wxPyDrawXXXPoint(wxDC& dc, PyObject* coords) { +bool wxPyDrawXXXPoint(wxDC& dc, PyObject* coords) +{ int x, y; if (! wxPy2int_seq_helper(coords, &x, &y)) { PyErr_SetString(PyExc_TypeError, "Expected a sequence of (x,y) sequences."); - return False; + return false; } dc.DrawPoint(x, y); - return True; + return true; } -bool wxPyDrawXXXLine(wxDC& dc, PyObject* coords) { +bool wxPyDrawXXXLine(wxDC& dc, PyObject* coords) +{ int x1, y1, x2, y2; if (! wxPy4int_seq_helper(coords, &x1, &y1, &x2, &y2)) { PyErr_SetString(PyExc_TypeError, "Expected a sequence of (x1,y1, x1,y2) sequences."); - return False; + return false; } dc.DrawLine(x1,y1, x2,y2); - return True; + return true; } -bool wxPyDrawXXXRectangle(wxDC& dc, PyObject* coords) { +bool wxPyDrawXXXRectangle(wxDC& dc, PyObject* coords) +{ int x, y, w, h; if (! wxPy4int_seq_helper(coords, &x, &y, &w, &h)) { PyErr_SetString(PyExc_TypeError, "Expected a sequence of (x,y, w,h) sequences."); - return False; + return false; } dc.DrawRectangle(x, y, w, h); - return True; + return true; } -bool wxPyDrawXXXEllipse(wxDC& dc, PyObject* coords) { +bool wxPyDrawXXXEllipse(wxDC& dc, PyObject* coords) +{ int x, y, w, h; if (! wxPy4int_seq_helper(coords, &x, &y, &w, &h)) { PyErr_SetString(PyExc_TypeError, "Expected a sequence of (x,y, w,h) sequences."); - return False; + return false; } dc.DrawEllipse(x, y, w, h); - return True; + return true; } -bool wxPyDrawXXXPolygon(wxDC& dc, PyObject* coords) { +bool wxPyDrawXXXPolygon(wxDC& dc, PyObject* coords) +{ wxPoint* points; int numPoints; points = wxPoint_LIST_helper(coords, &numPoints); if (! points) { PyErr_SetString(PyExc_TypeError, "Expected a sequence of sequences of (x,y) sequences."); - return False; + return false; } dc.DrawPolygon(numPoints, points); - return True; + delete [] points; + return true; } -//---------------------------------------------------------------------- +//--------------------------------------------------------------------------- -PyObject* wxPyDrawTextList(wxDC& dc, PyObject* textList, PyObject* pyPoints, PyObject* foregroundList, PyObject* backgroundList) { - wxPyBeginBlockThreads(); +PyObject* wxPyDrawTextList(wxDC& dc, PyObject* textList, PyObject* pyPoints, PyObject* foregroundList, PyObject* backgroundList) +{ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); - if ( !wxPyCoreAPIPtr) - wxPyCoreAPI_IMPORT(); - bool isFastSeq = PyList_Check(pyPoints) || PyTuple_Check(pyPoints); bool isFastText = PyList_Check(textList) || PyTuple_Check(textList); bool isFastForeground = PyList_Check(foregroundList) || PyTuple_Check(foregroundList); @@ -251,7 +258,7 @@ PyObject* wxPyDrawTextList(wxDC& dc, PyObject* textList, PyObject* pyPoints, PyO else { obj = PySequence_GetItem(textList, i); } - if (! PyString_Check(obj) ) { + if (! PyString_Check(obj) && !PyUnicode_Check(obj) ) { Py_DECREF(obj); goto err1; } @@ -268,7 +275,7 @@ PyObject* wxPyDrawTextList(wxDC& dc, PyObject* textList, PyObject* pyPoints, PyO else { obj = PySequence_GetItem(foregroundList, i); } - if (! wxPyConvertSwigPtr(obj, (void **) &color, wxT("wxColour_p"))) { + if (! wxPyConvertSwigPtr(obj, (void **) &color, wxT("wxColour"))) { if (!isFastForeground) Py_DECREF(obj); goto err2; @@ -347,10 +354,10 @@ PyObject* wxPyDrawTextList(wxDC& dc, PyObject* textList, PyObject* pyPoints, PyO goto exit; exit: - wxPyEndBlockThreads(); + wxPyEndBlockThreads(blocked); return retval; } -//---------------------------------------------------------------------- +//---------------------------------------------------------------------------