Refactored wx.ImageFromBuffer

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40747 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2006-08-22 17:23:54 +00:00
parent 8d361e8353
commit bf7df69ef6

View File

@@ -153,19 +153,6 @@ key value from a RGB tripple.", "");
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
%{
typedef unsigned char* buffer;
%}
%typemap(in) (buffer data, int DATASIZE)
{ if (!PyArg_Parse($input, "t#", &$1, &$2)) SWIG_fail; }
%typemap(in) (buffer alpha, int ALPHASIZE)
{ if (!PyArg_Parse($input, "t#", &$1, &$2)) SWIG_fail; }
//---------------------------------------------------------------------------
DocStr(wxImage, DocStr(wxImage,
"A platform-independent image class. An image can be created from "A platform-independent image class. An image can be created from
data, or using `wx.Bitmap.ConvertToImage`, or loaded from a file in a data, or using `wx.Bitmap.ConvertToImage`, or loaded from a file in a
@@ -388,37 +375,6 @@ alpha data must be width*height bytes.", "
return new wxImage(width, height, dcopy, acopy, false); return new wxImage(width, height, dcopy, acopy, false);
} }
// NOTE: We need the junk parameter so the compiler will be able
// differentiate from the two functions above. It isn't used for
// anything else.
%RenameDocCtor(
_ImageFromBuffer, ":see: `wx.ImageFromBuffer`", "",
wxImage(int width, int height, buffer data, int DATASIZE, PyObject* junk))
{
wxUnusedVar(junk);
if (DATASIZE != width*height*3) {
wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
return NULL;
}
return new wxImage(width, height, data, true);
}
%RenameDocCtor(
_ImageFromBufferWithAlpha, ":see: `wx.ImageFromBuffer`", "",
wxImage(int width, int height, buffer data, int DATASIZE, buffer alpha, int ALPHASIZE, PyObject* junk))
{
wxUnusedVar(junk);
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;
}
return new wxImage(width, height, data, alpha, true);
}
} }
// TODO: wxImage( char** xpmData ); // TODO: wxImage( char** xpmData );
@@ -1030,31 +986,65 @@ range -1.0..1.0 where -1.0 is -360 degrees and 1.0 is 360 degrees", "");
}; };
// Make an image from buffer objects. Not that this is here instead of in the
// wxImage class (as a constructor) because there is already another one with
// the exact same signature, so there woudl be ambiguities in the generated
// C++. Doing it as an independent factory function like this accomplishes
// the same thing however.
%newobject _ImageFromBuffer;
%inline %{
wxImage* _ImageFromBuffer(int width, int height,
buffer data, int DATASIZE,
buffer alpha=NULL, int ALPHASIZE=0)
{
if (DATASIZE != width*height*3) {
wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
return NULL;
}
if (alpha != NULL) {
if (ALPHASIZE != width*height) {
wxPyErr_SetString(PyExc_ValueError, "Invalid alpha buffer size.");
return NULL;
}
return new wxImage(width, height, data, alpha, true);
}
return new wxImage(width, height, data, true);
}
%}
%pythoncode { %pythoncode {
def ImageFromBuffer(width, height, dataBuffer, alphaBuffer=None): def ImageFromBuffer(width, height, dataBuffer, alphaBuffer=None):
""" """
Creates a `wx.Image` from the data in dataBuffer. The dataBuffer Creates a `wx.Image` from the data in dataBuffer. The dataBuffer
parameter must be a Python object that implements the buffer parameter must be a Python object that implements the buffer interface, or
interface, such as a string, array, etc. The dataBuffer object is is convertable to a buffer object, such as a string, array, etc. The
expected to contain a series of RGB bytes and be width*height*3 dataBuffer object is expected to contain a series of RGB bytes and be
bytes long. A buffer object can optionally be supplied for the width*height*3 bytes long. A buffer object can optionally be supplied for
image's alpha channel data, and it is expected to be width*height the image's alpha channel data, and it is expected to be width*height
bytes long. bytes long.
A reference to the data and alpha buffer objects are kept with the The wx.Image will be created with its data and alpha pointers initialized
wx.Image, so that they won't get deleted until after the wx.Image to the memory address pointed to by the buffer objects, thus saving the
is deleted. However please be aware that it is not guaranteed that time needed to copy the image data from the buffer object to the wx.Image.
an object won't move its memory buffer to a new location when it While this has advantages, it also has the shoot-yourself-in-the-foot
needs to resize its contents. If that happens then the wx.Image risks associated with sharing a C pointer between two objects.
will end up referring to an invalid memory location and could cause
the application to crash. Therefore care should be taken to not To help alleviate the risk a reference to the data and alpha buffer
manipulate the objects used for the data and alpha buffers in a objects are kept with the wx.Image, so that they won't get deleted until
way that would cause them to change size. after the wx.Image is deleted. However please be aware that it is not
guaranteed that an object won't move its memory buffer to a new location
when it needs to resize its contents. If that happens then the wx.Image
will end up referring to an invalid memory location and could cause the
application to crash. Therefore care should be taken to not manipulate
the objects used for the data and alpha buffers in a way that would cause
them to change size.
""" """
if alphaBuffer is not None: if not isinstance(dataBuffer, buffer):
image = _ImageFromBufferWithAlpha(width, height, dataBuffer, alphaBuffer, None) dataBuffer = buffer(dataBuffer)
else: if alphaBuffer is not None and not isinstance(alphaBuffer, buffer):
image = _ImageFromBuffer(width, height, dataBuffer, None) alphaBuffer = buffer(alphaBuffer)
image = _core_._ImageFromBuffer(width, height, dataBuffer, alphaBuffer)
image._buffer = dataBuffer image._buffer = dataBuffer
image._alpha = alphaBuffer image._alpha = alphaBuffer
return image return image