X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1e4a197e4c60e461b8068b0619692ea083e30b8b..db679b8c836e69c111cdc31e62cf92cebe4f938f:/wxPython/src/drawlist.cpp diff --git a/wxPython/src/drawlist.cpp b/wxPython/src/drawlist.cpp index cba7952b24..c89342ac84 100644 --- a/wxPython/src/drawlist.cpp +++ b/wxPython/src/drawlist.cpp @@ -2,7 +2,7 @@ // Name: drawlist.cpp // Purpose: Helper functions for optimized list drawing on a wxDC // -// Author: Robin Dunn Chris Barker +// Author: Robin Dunn, Chris Barker // // Created: // RCS-ID: $Id$ @@ -13,17 +13,24 @@ #undef DEBUG #include -#include "helpers.h" +#include "wx/wxPython/wxPython.h" +#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(); // _DrawXXXList +PyObject* wxPyDrawXXXList(wxDC& dc, wxPyDrawListOp_t doDraw, + PyObject* pyCoords, PyObject* pyPens, PyObject* pyBrushes) +{ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); bool isFastSeq = PyList_Check(pyCoords) || PyTuple_Check(pyCoords); bool isFastPens = PyList_Check(pyPens) || PyTuple_Check(pyPens); @@ -35,7 +42,6 @@ PyObject* wxPyDrawXXXList(wxDC& dc, wxPyDrawListOp_t doDraw, wxBrush* brush; PyObject* obj; PyObject* coords; - int x1, x2, x3, x4; int i = 0; PyObject* retval; @@ -60,7 +66,7 @@ PyObject* wxPyDrawXXXList(wxDC& dc, wxPyDrawListOp_t doDraw, else { obj = PySequence_GetItem(pyPens, i); } - if (SWIG_GetPtrObj(obj, (void **) &pen, "_wxPen_p")) { + if (! wxPyConvertSwigPtr(obj, (void **) &pen, wxT("wxPen"))) { if (!isFastPens) Py_DECREF(obj); goto err1; @@ -78,7 +84,7 @@ PyObject* wxPyDrawXXXList(wxDC& dc, wxPyDrawListOp_t doDraw, else { obj = PySequence_GetItem(pyBrushes, i); } - if (SWIG_GetPtrObj(obj, (void **) &brush, "_wxBrush_p")) { + if (!wxPyConvertSwigPtr(obj, (void **) &brush, wxT("wxBrush"))) { if (!isFastBrushes) Py_DECREF(obj); goto err2; @@ -132,77 +138,84 @@ 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(); bool isFastSeq = PyList_Check(pyPoints) || PyTuple_Check(pyPoints); bool isFastText = PyList_Check(textList) || PyTuple_Check(textList); @@ -245,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; } @@ -262,7 +275,7 @@ PyObject* wxPyDrawTextList(wxDC& dc, PyObject* textList, PyObject* pyPoints, PyO else { obj = PySequence_GetItem(foregroundList, i); } - if (SWIG_GetPtrObj(obj, (void **) &color, "_wxColour_p")) { + if (! wxPyConvertSwigPtr(obj, (void **) &color, wxT("wxColour"))) { if (!isFastForeground) Py_DECREF(obj); goto err2; @@ -280,7 +293,7 @@ PyObject* wxPyDrawTextList(wxDC& dc, PyObject* textList, PyObject* pyPoints, PyO else { obj = PySequence_GetItem(backgroundList, i); } - if (SWIG_GetPtrObj(obj, (void **) &color, "_wxColour_p")) { + if (! wxPyConvertSwigPtr(obj, (void **) &color, wxT("wxColour"))) { if (!isFastBackground) Py_DECREF(obj); goto err3; @@ -341,10 +354,10 @@ PyObject* wxPyDrawTextList(wxDC& dc, PyObject* textList, PyObject* pyPoints, PyO goto exit; exit: - wxPyEndBlockThreads(); + wxPyEndBlockThreads(blocked); return retval; } -//---------------------------------------------------------------------- +//---------------------------------------------------------------------------