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:
@@ -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
|
||||||
|
Reference in New Issue
Block a user