]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/src/_image.i
Add ImageFromBuffer
[wxWidgets.git] / wxPython / src / _image.i
index cafe72b758fec04a788d5060d30066bea58d8563..d87eae375b8d9c7d88f82dda48bba19d10f7194c 100644 (file)
@@ -268,8 +268,8 @@ public:
         largest and most colourful one by the ICO handler.
 
 :see: `wx.ImageFromMime`, `wx.ImageFromStream`, `wx.ImageFromStreamMime`,
-      `wx.EmptyImage`, `wx.ImageFromBitmap`, `wx.ImageFromData`,
-      `wx.ImageFromDataWithAlpha`
+      `wx.EmptyImage`, `wx.ImageFromBitmap`, `wx.ImageFromBuffer`,
+      `wx.ImageFromData`, `wx.ImageFromDataWithAlpha`
 ");
     
     ~wxImage();
@@ -388,11 +388,42 @@ alpha data must be width*height bytes.", "
             
                 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 );
 
-    // Turn it back on again
+    // Turn the typemap back on again
     %typemap(out) wxImage* { $result = wxPyMake_wxObject($1, $owner); }
 
 
@@ -779,7 +810,7 @@ data must be width*height.", "");
 
 
         
-        DocStr(GetDataBuffer,
+        DocStr(GetAlphaBuffer,
                "Returns a writable Python buffer object that is pointing at the Alpha
 data buffer inside the wx.Image. You need to ensure that you do not
 use this buffer object after the image has been destroyed.", "");
@@ -793,7 +824,7 @@ use this buffer object after the image has been destroyed.", "");
         }
 
         
-        DocStr(SetDataBuffer,
+        DocStr(SetAlphaBuffer,
                "Sets the internal image alpha pointer to point at a Python buffer
 object.  This can save making an extra copy of the data but you must
 ensure that the buffer object lives as long as the wx.Image does.", "");
@@ -999,6 +1030,36 @@ range -1.0..1.0 where -1.0 is -360 degrees and 1.0 is 360 degrees", "");
 };
 
 
+%pythoncode {
+def ImageFromBuffer(width, height, dataBuffer, alphaBuffer=None):
+    """
+    Creates a `wx.Image` from the data in dataBuffer.  The dataBuffer
+    parameter must be a Python object that implements the buffer
+    interface, such as a string, array, etc.  The dataBuffer object is
+    expected to contain a series of RGB bytes and be width*height*3
+    bytes long.  A buffer object can optionally be supplied for the
+    image's alpha channel data, and it is expected to be width*height
+    bytes long.
+
+    A reference to the data and alpha buffer objects are kept with the
+    wx.Image, so that they won't get deleted until 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:
+        image = _ImageFromBufferWithAlpha(width, height, dataBuffer, alphaBuffer, None)
+    else:
+        image = _ImageFromBuffer(width, height, dataBuffer, None)
+    image._buffer = dataBuffer
+    image._alpha = alphaBuffer
+    return image
+}
+
 
 ///void wxInitAllImageHandlers();