From 238ba802f1a9f79cde6e3ebd44e5c4ab78af2055 Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Tue, 22 Aug 2006 17:27:42 +0000 Subject: [PATCH] Added wx.BitmapFromBuffer and wx.BitmapFromBufferRGBA factory functions. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40748 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- wxPython/docs/CHANGES.txt | 5 + wxPython/include/wx/wxPython/wxPython_int.h | 4 +- wxPython/src/_bitmap.i | 237 +++++++++++++++++--- wxPython/src/my_typemaps.i | 15 ++ 4 files changed, 233 insertions(+), 28 deletions(-) diff --git a/wxPython/docs/CHANGES.txt b/wxPython/docs/CHANGES.txt index 991c9a76b8..3704a9283a 100644 --- a/wxPython/docs/CHANGES.txt +++ b/wxPython/docs/CHANGES.txt @@ -190,6 +190,11 @@ IDs. Added wx.lib.combotreebox from Frank Niessink +Added wx.ImageFromBuffer, wx.BitmapFromBuffer and +wx.BitmapFromBufferRGBA factory functions. They enable loading of am +image or bitmap directly from a Python object that implements the +buffer interface, such as strings, arrays, etc. + diff --git a/wxPython/include/wx/wxPython/wxPython_int.h b/wxPython/include/wx/wxPython/wxPython_int.h index 4ca0e75196..4af26ea1fc 100644 --- a/wxPython/include/wx/wxPython/wxPython_int.h +++ b/wxPython/include/wx/wxPython/wxPython_int.h @@ -103,7 +103,9 @@ public: #endif //--------------------------------------------------------------------------- -typedef unsigned char byte; +typedef unsigned char byte; +typedef unsigned char* buffer; + typedef wxPoint2DDouble wxPoint2D; #ifndef SWIG_TYPE_TABLE diff --git a/wxPython/src/_bitmap.i b/wxPython/src/_bitmap.i index 93fa2a2b93..8aa329e133 100644 --- a/wxPython/src/_bitmap.i +++ b/wxPython/src/_bitmap.i @@ -12,6 +12,9 @@ // Not a %module +%{ +#include +%} //--------------------------------------------------------------------------- @@ -62,6 +65,10 @@ converted to a wx.Bitmap, so any image file format supported by :todo: Find a way to do very efficient PIL Image <--> wx.Bitmap converstions. + +:see: `wx.EmptyBitmap`, `wx.BitmapFromIcon`, `wx.BitmapFromImage`, + `wx.BitmapFromXPMData`, `wx.BitmapFromBits`, `wx.BitmapFromBuffer`, + `wx.BitmapFromBufferRGBA`, `wx.Image` "); @@ -126,35 +133,36 @@ that a colour reduction may have to take place.", "", %extend { - DocStr(wxBitmap(PyObject* listOfStrings), - "Construct a Bitmap from a list of strings formatted as XPM data.", ""); - - %RenameCtor(BitmapFromXPMData, wxBitmap(PyObject* listOfStrings)) - { - char** cArray = NULL; - wxBitmap* bmp; - - cArray = ConvertListOfStrings(listOfStrings); - if (! cArray) - return NULL; - bmp = new wxBitmap(cArray); - delete [] cArray; - return bmp; - } - - DocStr(wxBitmap(PyObject* bits, int width, int height, int depth=1 ), - "Creates a bitmap from an array of bits. You should only use this + %RenameDocCtor( + BitmapFromXPMData, + "Construct a Bitmap from a list of strings formatted as XPM data.", "", + wxBitmap(PyObject* listOfStrings)) + { + char** cArray = NULL; + wxBitmap* bmp; + + cArray = ConvertListOfStrings(listOfStrings); + if (! cArray) + return NULL; + bmp = new wxBitmap(cArray); + delete [] cArray; + return bmp; + } + + + %RenameDocCtor( + BitmapFromBits, + "Creates a bitmap from an array of bits. You should only use this function for monochrome bitmaps (depth 1) in portable programs: in this case the bits parameter should contain an XBM image. For other -bit depths, the behaviour is platform dependent.", ""); - - %RenameCtor(BitmapFromBits, wxBitmap(PyObject* bits, int width, int height, int depth=1 )) - { - char* buf; - Py_ssize_t length; - PyString_AsStringAndSize(bits, &buf, &length); - return new wxBitmap(buf, width, height, depth); - } +bit depths, the behaviour is platform dependent.", "", + wxBitmap(PyObject* bits, int width, int height, int depth=1 )) + { + char* buf; + Py_ssize_t length; + PyString_AsStringAndSize(bits, &buf, &length); + return new wxBitmap(buf, width, height, depth); + } } @@ -304,6 +312,181 @@ the ``type`` parameter.", ""); }; +//--------------------------------------------------------------------------- +// Factory functions for creating wxBitmaps from Python buffer objects. They +// use the Abstract Pixel API to be able to set RGB and A bytes directly into +// the wxBitmap's pixel buffer. + +%newobject _BitmapFromBufferAlpha; +%newobject _BitmapFromBuffer; +%inline %{ + wxBitmap* _BitmapFromBufferAlpha(int width, int height, + buffer data, int DATASIZE, + buffer alpha, int ALPHASIZE) + { + if (DATASIZE != width*height*3) { + wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size."); + return NULL; + } + + if (ALPHASIZE != width*height) { + wxPyErr_SetString(PyExc_ValueError, "Invalid alpha buffer size."); + return NULL; + } + + wxBitmap* bmp = new wxBitmap(width, height, 32); + wxAlphaPixelData pixels(*bmp, wxPoint(0,0), wxSize(width,height)); + if (! pixels) { + // raise an exception... + wxPyErr_SetString(PyExc_RuntimeError, + "Failed to gain raw access to bitmap data."); + return NULL; + } + + pixels.UseAlpha(); + wxAlphaPixelData::Iterator p(pixels); + for (int y=0; y