1 /////////////////////////////////////////////////////////////////////////////
 
   3 // Purpose:     SWIG definitions for wxImage and such
 
   7 // Created:     25-Sept-2000
 
   9 // Copyright:   (c) 2003 by Total Control Software
 
  10 // Licence:     wxWindows license
 
  11 /////////////////////////////////////////////////////////////////////////////
 
  16 //---------------------------------------------------------------------------
 
  19 #include "wx/wxPython/pyistream.h"
 
  22 //---------------------------------------------------------------------------
 
  25     wxIMAGE_ALPHA_TRANSPARENT,
 
  26     wxIMAGE_ALPHA_THRESHOLD,
 
  31 // Constants for wxImage::Scale() for determining the level of quality
 
  34     wxIMAGE_QUALITY_NORMAL = 0,
 
  35     wxIMAGE_QUALITY_HIGH = 1
 
  38 //---------------------------------------------------------------------------
 
  41 DocStr(wxImageHandler,
 
  42 "This is the base class for implementing image file loading/saving, and
 
  43 image creation from data. It is used within `wx.Image` and is not
 
  44 normally seen by the application.", "");
 
  45 class wxImageHandler : public wxObject {
 
  47     // wxImageHandler();    Abstract Base Class
 
  49     wxString GetExtension();
 
  51     wxString GetMimeType();
 
  53     //bool LoadFile(wxImage* image, wxInputStream& stream);
 
  54     //bool SaveFile(wxImage* image, wxOutputStream& stream);
 
  55     //virtual int GetImageCount( wxInputStream& stream );
 
  57     bool CanRead( const wxString& name );
 
  58     %Rename(CanReadStream, bool, CanRead( wxInputStream& stream ));
 
  60     void SetName(const wxString& name);
 
  61     void SetExtension(const wxString& extension);
 
  62     void SetType(long type);
 
  63     void SetMimeType(const wxString& mimetype);
 
  65     %property(Extension, GetExtension, SetExtension, doc="See `GetExtension` and `SetExtension`");
 
  66     %property(MimeType, GetMimeType, SetMimeType, doc="See `GetMimeType` and `SetMimeType`");
 
  67     %property(Name, GetName, SetName, doc="See `GetName` and `SetName`");
 
  68     %property(Type, GetType, SetType, doc="See `GetType` and `SetType`");
 
  72 //---------------------------------------------------------------------------
 
  75 DocStr(wxPyImageHandler,
 
  76 "This is the base class for implementing image file loading/saving, and
 
  77 image creation from data, all written in Python.  To create a custom
 
  78 image handler derive a new class from wx.PyImageHandler and provide
 
  79 the following methods::
 
  81     def DoCanRead(self, stream) --> bool
 
  82         '''Check if this handler can read the image on the stream'''
 
  84     def LoadFile(self, image, stream, verbose, index) --> bool
 
  85         '''Load image data from the stream and load it into image.'''
 
  87     def SaveFile(self, image, stream, verbose) --> bool
 
  88         '''Save the iamge data in image to the stream using
 
  89            this handler's image file format.'''
 
  91     def GetImageCount(self, stream) --> int
 
  92         '''If this image format can hold more than one image,
 
  93            how many does the image on the stream have?'''
 
  95 To activate your handler create an instance of it and pass it to
 
  96 `wx.Image_AddHandler`.  Be sure to call `SetName`, `SetType`, and
 
  97 `SetExtension` from your constructor.
 
 100 class wxPyImageHandler: public wxImageHandler {
 
 102     %pythonAppend wxPyImageHandler() "self._SetSelf(self)"
 
 104     void _SetSelf(PyObject *self);
 
 108 //---------------------------------------------------------------------------
 
 111 class wxImageHistogram /* : public wxImageHistogramBase */
 
 116     DocStr(MakeKey, "Get the key in the histogram for the given RGB values", "");
 
 117     static unsigned long MakeKey(byte r,
 
 122         bool, FindFirstUnusedColour(byte *OUTPUT,
 
 127                                     byte startB = 0 ) const,
 
 128         "FindFirstUnusedColour(int startR=1, int startG=0, int startB=0) -> (success, r, g, b)",
 
 129         "Find first colour that is not used in the image and has higher RGB
 
 130 values than startR, startG, startB.  Returns a tuple consisting of a
 
 131 success flag and rgb values.", "");
 
 135                "Returns the pixel count for the given key.  Use `MakeKey` to create a
 
 136 key value from a RGB tripple.", "");
 
 137         unsigned long GetCount(unsigned long key) {
 
 138             wxImageHistogramEntry e = (*self)[key];
 
 143                "Returns the pixel count for the given RGB values.", "");
 
 144         unsigned long GetCountRGB(byte r,
 
 147             unsigned long key = wxImageHistogram::MakeKey(r, g, b);
 
 148             wxImageHistogramEntry e = (*self)[key];
 
 152         DocStr(GetCountColour,
 
 153                "Returns the pixel count for the given `wx.Colour` value.", "");
 
 154         unsigned long GetCountColour(const wxColour& colour) {
 
 155             unsigned long key = wxImageHistogram::MakeKey(colour.Red(),
 
 158             wxImageHistogramEntry e = (*self)[key];
 
 166 //---------------------------------------------------------------------------
 
 169 "A platform-independent image class.  An image can be created from
 
 170 data, or using `wx.Bitmap.ConvertToImage`, or loaded from a file in a
 
 171 variety of formats.  Functions are available to set and get image
 
 172 bits, so it can be used for basic image manipulation.
 
 174 A wx.Image cannot be drawn directly to a `wx.DC`.  Instead, a
 
 175 platform-specific `wx.Bitmap` object must be created from it using the
 
 176 `wx.BitmapFromImage` constructor. This bitmap can then be drawn in a
 
 177 device context, using `wx.DC.DrawBitmap`.
 
 179 One colour value of the image may be used as a mask colour which will
 
 180 lead to the automatic creation of a `wx.Mask` object associated to the
 
 183 wx.Image supports alpha channel data, that is in addition to a byte
 
 184 for the red, green and blue colour components for each pixel it also
 
 185 stores a byte representing the pixel opacity. An alpha value of 0
 
 186 corresponds to a transparent pixel (null opacity) while a value of 255
 
 187 means that the pixel is 100% opaque.
 
 189 Unlike RGB data, not all images have an alpha channel and before using
 
 190 `GetAlpha` you should check if this image contains an alpha channel
 
 191 with `HasAlpha`. Note that currently only images loaded from PNG files
 
 192 with transparency information will have an alpha channel.", "");
 
 196 // Pull the nested class out to the top level for SWIG's sake
 
 197 #define wxImage_RGBValue wxImage::RGBValue
 
 198 #define wxImage_HSVValue wxImage::HSVValue
 
 201 DocStr(wxImage_RGBValue,
 
 202 "An object that contains values for red, green and blue which represent
 
 203 the value of a color. It is used by `wx.Image.HSVtoRGB` and
 
 204 `wx.Image.RGBtoHSV`, which converts between HSV color space and RGB
 
 206 class wxImage_RGBValue
 
 210         wxImage_RGBValue(byte r=0, byte g=0, byte b=0),
 
 218 DocStr(wxImage_HSVValue,
 
 219 "An object that contains values for hue, saturation and value which
 
 220 represent the value of a color.  It is used by `wx.Image.HSVtoRGB` and
 
 221 `wx.Image.RGBtoHSV`, which +converts between HSV color space and RGB
 
 223 class wxImage_HSVValue
 
 227         wxImage_HSVValue(double h=0.0, double s=0.0, double v=0.0),
 
 236 class wxImage : public wxObject {
 
 238     %typemap(out) wxImage*;    // turn off this typemap
 
 241         wxImage( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 ),
 
 242         "Loads an image from a file.",
 
 244     :param name:  Name of the file from which to load the image.
 
 246     :param type: May be one of the following:
 
 248         ====================    =======================================
 
 249         wx.BITMAP_TYPE_BMP      Load a Windows bitmap file.
 
 250         wx.BITMAP_TYPE_GIF      Load a GIF bitmap file.
 
 251         wx.BITMAP_TYPE_JPEG     Load a JPEG bitmap file.
 
 252         wx.BITMAP_TYPE_PNG      Load a PNG bitmap file.
 
 253         wx.BITMAP_TYPE_PCX      Load a PCX bitmap file.
 
 254         wx.BITMAP_TYPE_PNM      Load a PNM bitmap file.
 
 255         wx.BITMAP_TYPE_TIF      Load a TIFF bitmap file.
 
 256         wx.BITMAP_TYPE_XPM      Load a XPM bitmap file.
 
 257         wx.BITMAP_TYPE_ICO      Load a Windows icon file (ICO).
 
 258         wx.BITMAP_TYPE_CUR      Load a Windows cursor file (CUR).
 
 259         wx.BITMAP_TYPE_ANI      Load a Windows animated cursor file (ANI).
 
 260         wx.BITMAP_TYPE_ANY      Will try to autodetect the format. 
 
 261         ====================    =======================================
 
 263     :param index: Index of the image to load in the case that the
 
 264         image file contains multiple images. This is only used by GIF,
 
 265         ICO and TIFF handlers. The default value (-1) means to choose
 
 266         the default image and is interpreted as the first image (the
 
 267         one with index=0) by the GIF and TIFF handler and as the
 
 268         largest and most colourful one by the ICO handler.
 
 270 :see: `wx.ImageFromMime`, `wx.ImageFromStream`, `wx.ImageFromStreamMime`,
 
 271       `wx.EmptyImage`, `wx.ImageFromBitmap`, `wx.ImageFromBuffer`,
 
 272       `wx.ImageFromData`, `wx.ImageFromDataWithAlpha`
 
 277     // Alternate constructors
 
 279         wxImage(const wxString& name, const wxString& mimetype, int index = -1),
 
 280         "Loads an image from a file, using a MIME type string (such as
 
 281 'image/jpeg') to specify image type.", "
 
 287         wxImage(wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1),
 
 288         "Loads an image from an input stream, or any readable Python file-like
 
 295         wxImage(wxInputStream& stream, const wxString& mimetype, int index = -1 ),
 
 296         "Loads an image from an input stream, or any readable Python file-like
 
 297 object, specifying the image format with a MIME type string.", "
 
 300         ImageFromStreamMime);
 
 305             "Construct an empty image of a given size, optionally setting all
 
 309             wxImage(int width=0, int height=0, bool clear = true))
 
 311                 if (width > 0 && height > 0)
 
 312                     return new wxImage(width, height, clear);
 
 318        MustHaveApp(wxImage(const wxBitmap &bitmap));
 
 322             "Construct an Image from a `wx.Bitmap`.", "
 
 325             wxImage(const wxBitmap &bitmap))
 
 327                 return new wxImage(bitmap.ConvertToImage());
 
 332             "Construct an Image from a buffer of RGB bytes.  Accepts either a
 
 333 string or a buffer object holding the data and the length of the data
 
 334 must be width*height*3.", "
 
 337             wxImage(int width, int height, buffer data, int DATASIZE))
 
 339                 if (DATASIZE != width*height*3) {
 
 340                     wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
 
 344                 // Copy the source data so the wxImage can clean it up later
 
 345                 buffer copy = (buffer)malloc(DATASIZE);
 
 347                     wxPyBLOCK_THREADS(PyErr_NoMemory());
 
 350                 memcpy(copy, data, DATASIZE);
 
 351                 return new wxImage(width, height, copy, false);
 
 356             ImageFromDataWithAlpha,
 
 357             "Construct an Image from a buffer of RGB bytes with an Alpha channel.
 
 358 Accepts either a string or a buffer object holding the data and the
 
 359 length of the data must be width*height*3 bytes, and the length of the
 
 360 alpha data must be width*height bytes.", "
 
 363             wxImage(int width, int height, buffer data, int DATASIZE, buffer alpha, int ALPHASIZE))
 
 365                 if (DATASIZE != width*height*3) {
 
 366                     wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
 
 369                 if (ALPHASIZE != width*height) {
 
 370                     wxPyErr_SetString(PyExc_ValueError, "Invalid alpha buffer size.");
 
 374                 // Copy the source data so the wxImage can clean it up later
 
 375                 buffer dcopy = (buffer)malloc(DATASIZE);
 
 377                     wxPyBLOCK_THREADS(PyErr_NoMemory());
 
 380                 memcpy(dcopy, data, DATASIZE);
 
 382                 buffer acopy = (buffer)malloc(ALPHASIZE);
 
 384                     wxPyBLOCK_THREADS(PyErr_NoMemory());
 
 387                 memcpy(acopy, alpha, ALPHASIZE);
 
 389                 return new wxImage(width, height, dcopy, acopy, false);
 
 393     // TODO: wxImage( char** xpmData );
 
 395     // Turn the typemap back on again
 
 396     %typemap(out) wxImage* { $result = wxPyMake_wxObject($1, $owner); }
 
 400         void , Create( int width, int height, bool clear=true ),
 
 401         "Creates a fresh image.  If clear is ``True``, the new image will be
 
 402 initialized to black. Otherwise, the image data will be uninitialized.", "");
 
 406         "Destroys the image data.", "");
 
 410         wxImage , Scale( int width, int height, int quality = wxIMAGE_QUALITY_NORMAL ),
 
 411         "Returns a scaled version of the image. This is also useful for scaling
 
 412 bitmaps in general as the only other way to scale bitmaps is to blit a
 
 413 `wx.MemoryDC` into another `wx.MemoryDC`.  The ``quality`` parameter
 
 414 specifies what method to use for resampling the image.  It can be
 
 415 either wx.IMAGE_QUALITY_NORMAL, which uses the normal default scaling
 
 416 method of pixel replication, or wx.IMAGE_QUALITY_HIGH which uses
 
 417 bicubic and box averaging resampling methods for upsampling and
 
 418 downsampling respectively.", "
 
 420 It should be noted that although using wx.IMAGE_QUALITY_HIGH produces
 
 421 much nicer looking results it is a slower method.  Downsampling will
 
 422 use the box averaging method which seems to operate very fast.  If you
 
 423 are upsampling larger images using this method you will most likely
 
 424 notice that it is a bit slower and in extreme cases it will be quite
 
 425 substantially slower as the bicubic algorithm has to process a lot of
 
 428 It should also be noted that the high quality scaling may not work as
 
 429 expected when using a single mask colour for transparency, as the
 
 430 scaling will blur the image and will therefore remove the mask
 
 431 partially. Using the alpha channel will work.
 
 436     wxImage ResampleBox(int width, int height) const;
 
 437     wxImage ResampleBicubic(int width, int height) const;
 
 440         wxImage , Blur(int radius),
 
 441         "Blurs the image in both horizontal and vertical directions by the
 
 442 specified pixel ``radius``. This should not be used when using a
 
 443 single mask colour for transparency.", "");
 
 446         wxImage , BlurHorizontal(int radius),
 
 447         "Blurs the image in the horizontal direction only. This should not be
 
 448 used when using a single mask colour for transparency.
 
 452         wxImage , BlurVertical(int radius),
 
 453         "Blurs the image in the vertical direction only. This should not be
 
 454 used when using a single mask colour for transparency.", "");
 
 459         wxImage , ShrinkBy( int xFactor , int yFactor ) const ,
 
 460         "Return a version of the image scaled smaller by the given factors.", "");
 
 463         wxImage& , Rescale(int width, int height, int quality = wxIMAGE_QUALITY_NORMAL),
 
 464         "Changes the size of the image in-place by scaling it: after a call to
 
 465 this function, the image will have the given width and height.
 
 467 Returns the (modified) image itself.", "
 
 472     // resizes the image in place
 
 474         wxImage& , Resize( const wxSize& size, const wxPoint& pos, 
 
 475                            int r = -1, int g = -1, int b = -1 ),
 
 476         "Changes the size of the image in-place without scaling it, by adding
 
 477 either a border with the given colour or cropping as necessary. The
 
 478 image is pasted into a new image with the given size and background
 
 479 colour at the position pos relative to the upper left of the new
 
 480 image. If red = green = blue = -1 then use either the current mask
 
 481 colour if set or find, use, and set a suitable mask colour for any
 
 484 Returns the (modified) image itself.", "
 
 490         void , SetRGB( int x, int y, byte r, byte g, byte b ),
 
 491         "Sets the pixel at the given coordinate. This routine performs
 
 492 bounds-checks for the coordinate so it can be considered a safe way to
 
 493 manipulate the data, but in some cases this might be too slow so that
 
 494 the data will have to be set directly. In that case you will have to
 
 495 get access to the image data using the `GetData` method.", "");
 
 499             void, SetRGB( const wxRect& rect,
 
 500                           byte r, byte g, byte b ),
 
 501             "Sets the colour of the pixels within the given rectangle. This routine
 
 502 performs bounds-checks for the rectangle so it can be considered a
 
 503 safe way to manipulate the data.", "",
 
 507         byte , GetRed( int x, int y ),
 
 508         "Returns the red intensity at the given coordinate.", "");
 
 511         byte , GetGreen( int x, int y ),
 
 512         "Returns the green intensity at the given coordinate.", "");
 
 515         byte , GetBlue( int x, int y ),
 
 516         "Returns the blue intensity at the given coordinate.", "");
 
 520         void , SetAlpha(int x, int y, byte alpha),
 
 521         "Sets the alpha value for the given pixel. This function should only be
 
 522 called if the image has alpha channel data, use `HasAlpha` to check
 
 526         byte , GetAlpha(int x, int y),
 
 527         "Returns the alpha value for the given pixel. This function may only be
 
 528 called for the images with alpha channel, use `HasAlpha` to check for
 
 531 The returned value is the *opacity* of the image, i.e. the value of 0
 
 532 corresponds to the fully transparent pixels while the value of 255 to
 
 533 the fully opaque pixels.", "");
 
 537         "Returns true if this image has alpha channel, false otherwise.", "
 
 539 :see: `GetAlpha`, `SetAlpha`");
 
 544         "Initializes the image alpha channel data. It is an error to call it if
 
 545 the image already has alpha data. If it doesn't, alpha data will be by
 
 546 default initialized to all pixels being fully opaque. But if the image
 
 547 has a a mask colour, all mask pixels will be completely transparent.", "");
 
 551         bool , IsTransparent(int x, int y,
 
 552                              byte threshold = wxIMAGE_ALPHA_THRESHOLD) const,
 
 553         "Returns ``True`` if this pixel is masked or has an alpha value less
 
 554 than the spcified threshold.", "");
 
 557     // find first colour that is not used in the image and has higher
 
 558     // RGB values than <startR,startG,startB>
 
 560         bool, FindFirstUnusedColour( byte *OUTPUT, byte *OUTPUT, byte *OUTPUT,
 
 561                                      byte startR = 0, byte startG = 0, byte startB = 0 ) const,
 
 562         "FindFirstUnusedColour(int startR=1, int startG=0, int startB=0) -> (success, r, g, b)",
 
 563         "Find first colour that is not used in the image and has higher RGB
 
 564 values than startR, startG, startB.  Returns a tuple consisting of a
 
 565 success flag and rgb values.", "");
 
 569         bool , ConvertAlphaToMask(byte threshold = wxIMAGE_ALPHA_THRESHOLD),
 
 570         "If the image has alpha channel, this method converts it to mask. All
 
 571 pixels with alpha value less than ``threshold`` are replaced with the
 
 572 mask colour and the alpha channel is removed. The mask colour is
 
 573 chosen automatically using `FindFirstUnusedColour`.
 
 575 If the image image doesn't have alpha channel, ConvertAlphaToMask does
 
 580         bool , ConvertColourToAlpha( byte r, byte g, byte b ),
 
 581         "This method converts an image where the original alpha information is
 
 582 only available as a shades of a colour (actually shades of grey)
 
 583 typically when you draw anti-aliased text into a bitmap. The DC
 
 584 drawing routines draw grey values on the black background although
 
 585 they actually mean to draw white with differnt alpha values.  This
 
 586 method reverses it, assuming a black (!) background and white text.
 
 587 The method will then fill up the whole image with the colour given.", "");
 
 592         bool , SetMaskFromImage(const wxImage & mask,
 
 593                                 byte mr, byte mg, byte mb),
 
 594         "Sets the image's mask so that the pixels that have RGB value of
 
 595 ``(mr,mg,mb)`` in ``mask`` will be masked in this image. This is done
 
 596 by first finding an unused colour in the image, setting this colour as
 
 597 the mask colour and then using this colour to draw all pixels in the
 
 598 image who corresponding pixel in mask has given RGB value.
 
 600 Returns ``False`` if ``mask`` does not have same dimensions as the
 
 601 image or if there is no unused colour left. Returns ``True`` if the
 
 602 mask was successfully applied.
 
 604 Note that this method involves computing the histogram, which is
 
 605 computationally intensive operation.", "");
 
 608 //      void DoFloodFill (wxCoord x, wxCoord y,
 
 609 //          const wxBrush & fillBrush,
 
 610 //          const wxColour& testColour,
 
 611 //          int style = wxFLOOD_SURFACE,
 
 612 //          int LogicalFunction = wxCOPY /* currently unused */ ) ;
 
 615         static bool , CanRead( const wxString& filename ),
 
 616         "Returns True if the image handlers can read this file.", "");
 
 619         static int , GetImageCount( const wxString& filename, long type = wxBITMAP_TYPE_ANY ),
 
 620         "If the image file contains more than one image and the image handler
 
 621 is capable of retrieving these individually, this function will return
 
 622 the number of available images.", "");
 
 626         bool , LoadFile( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 ),
 
 627         "Loads an image from a file. If no handler type is provided, the
 
 628 library will try to autodetect the format.", "");
 
 631         bool , LoadFile( const wxString& name, const wxString& mimetype, int index = -1 ),
 
 632         "Loads an image from a file, specifying the image type with a MIME type
 
 638         bool , SaveFile( const wxString& name, int type ),
 
 639         "Saves an image in the named file.", "");
 
 643         bool , SaveFile( const wxString& name, const wxString& mimetype ),
 
 644         "Saves an image in the named file.", "",
 
 649         static bool , CanRead( wxInputStream& stream ),
 
 650         "Returns True if the image handlers can read an image file from the
 
 651 data currently on the input stream, or a readable Python file-like
 
 657         bool , LoadFile( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1 ),
 
 658         "Loads an image from an input stream or a readable Python file-like
 
 659 object. If no handler type is provided, the library will try to
 
 660 autodetect the format.", "",
 
 665         bool , LoadFile( wxInputStream& stream, const wxString& mimetype, int index = -1 ),
 
 666         "Loads an image from an input stream or a readable Python file-like
 
 667 object, using a MIME type string to specify the image file format.", "",
 
 673         "Returns true if image data is present.", "");
 
 674     %pythoncode { Ok = IsOk }
 
 678         "Gets the width of the image in pixels.", "");
 
 682         "Gets the height of the image in pixels.", "");
 
 687                "Returns the size of the image in pixels.", "");
 
 689             wxSize size(self->GetWidth(), self->GetHeight());
 
 696         wxImage , GetSubImage(const wxRect& rect),
 
 697         "Returns a sub image of the current one as long as the rect belongs
 
 698 entirely to the image.", "");
 
 702         wxImage , Size( const wxSize& size, const wxPoint& pos, 
 
 703                         int r = -1, int g = -1, int b = -1 ) const,
 
 704         "Returns a resized version of this image without scaling it by adding
 
 705 either a border with the given colour or cropping as necessary. The
 
 706 image is pasted into a new image with the given size and background
 
 707 colour at the position ``pos`` relative to the upper left of the new
 
 708 image. If red = green = blue = -1 then use either the current mask
 
 709 colour if set or find, use, and set a suitable mask colour for any
 
 710 newly exposed areas.", "
 
 717         "Returns an identical copy of the image.", "");
 
 720         void , Paste( const wxImage &image, int x, int y ),
 
 721         "Pastes ``image`` into this instance and takes care of the mask colour
 
 722 and any out of bounds problems.", "");
 
 725     //unsigned char *GetData();
 
 726     //void SetData( unsigned char *data );
 
 730                "Returns a string containing a copy of the RGB bytes of the image.", "");
 
 733             buffer data = self->GetData();
 
 734             int len = self->GetWidth() * self->GetHeight() * 3;
 
 736             wxPyBLOCK_THREADS( rv = PyString_FromStringAndSize((char*)data, len));
 
 740                "Resets the Image's RGB data from a buffer of RGB bytes.  Accepts
 
 741 either a string or a buffer object holding the data and the length of
 
 742 the data must be width*height*3.", "");
 
 743         void SetData(buffer data, int DATASIZE)
 
 745             if (DATASIZE != self->GetWidth() * self->GetHeight() * 3) {
 
 746                 wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
 
 749             buffer copy = (buffer)malloc(DATASIZE);
 
 751                 wxPyBLOCK_THREADS(PyErr_NoMemory());
 
 754             memcpy(copy, data, DATASIZE);
 
 755             self->SetData(copy, false);
 
 756             // wxImage takes ownership of copy...
 
 760         DocStr(GetDataBuffer,
 
 761                "Returns a writable Python buffer object that is pointing at the RGB
 
 762 image data buffer inside the wx.Image. You need to ensure that you do
 
 763 not use this buffer object after the image has been destroyed.", "");
 
 764         PyObject* GetDataBuffer()
 
 766             buffer data = self->GetData();
 
 767             int len = self->GetWidth() * self->GetHeight() * 3;
 
 769             wxPyBLOCK_THREADS( rv = PyBuffer_FromReadWriteMemory(data, len) );
 
 773         DocStr(SetDataBuffer,
 
 774                "Sets the internal image data pointer to point at a Python buffer
 
 775 object.  This can save making an extra copy of the data but you must
 
 776 ensure that the buffer object lives longer than the wx.Image does.", "");
 
 777         void SetDataBuffer(buffer data, int DATASIZE)
 
 779             if (DATASIZE != self->GetWidth() * self->GetHeight() * 3) {
 
 780                 wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
 
 783             self->SetData(data, true);
 
 789                "Returns a string containing a copy of the alpha bytes of the image.", "");
 
 790         PyObject* GetAlphaData() {
 
 791             buffer data = self->GetAlpha();
 
 795                 int len = self->GetWidth() * self->GetHeight();
 
 797                 wxPyBLOCK_THREADS( rv = PyString_FromStringAndSize((char*)data, len) );
 
 803                "Resets the Image's alpha data from a buffer of bytes.  Accepts either
 
 804 a string or a buffer object holding the data and the length of the
 
 805 data must be width*height.", ""); 
 
 806         void SetAlphaData(buffer alpha, int ALPHASIZE)
 
 808             if (ALPHASIZE != self->GetWidth() * self->GetHeight()) {
 
 809                 wxPyErr_SetString(PyExc_ValueError, "Invalid alpha buffer size.");
 
 812             buffer acopy = (buffer)malloc(ALPHASIZE);
 
 814                 wxPyBLOCK_THREADS(PyErr_NoMemory());
 
 817             memcpy(acopy, alpha, ALPHASIZE);
 
 818             self->SetAlpha(acopy, false);
 
 819             // wxImage takes ownership of acopy...
 
 824         DocStr(GetAlphaBuffer,
 
 825                "Returns a writable Python buffer object that is pointing at the Alpha
 
 826 data buffer inside the wx.Image. You need to ensure that you do not
 
 827 use this buffer object after the image has been destroyed.", "");
 
 828         PyObject* GetAlphaBuffer()
 
 830             buffer data = self->GetAlpha();
 
 831             int len = self->GetWidth() * self->GetHeight();
 
 833             wxPyBLOCK_THREADS( rv = PyBuffer_FromReadWriteMemory(data, len) );
 
 838         DocStr(SetAlphaBuffer,
 
 839                "Sets the internal image alpha pointer to point at a Python buffer
 
 840 object.  This can save making an extra copy of the data but you must
 
 841 ensure that the buffer object lives as long as the wx.Image does.", "");
 
 842         void SetAlphaBuffer(buffer alpha, int ALPHASIZE)
 
 844             if (ALPHASIZE != self->GetWidth() * self->GetHeight()) {
 
 845                 wxPyErr_SetString(PyExc_ValueError, "Invalid alpha buffer size.");
 
 848             self->SetAlpha(alpha, true);
 
 855         void , SetMaskColour( byte r, byte g, byte b ),
 
 856         "Sets the mask colour for this image (and tells the image to use the
 
 861         /*bool*/ void , GetOrFindMaskColour( byte *OUTPUT,
 
 863                                              byte *OUTPUT ) const,
 
 864         "GetOrFindMaskColour() -> (r,g,b)",
 
 865         "Get the current mask colour or find a suitable colour.", "");
 
 870         "Gets the red component of the mask colour.", "");
 
 873         byte , GetMaskGreen(),
 
 874         "Gets the green component of the mask colour.", "");
 
 877         byte , GetMaskBlue(),
 
 878         "Gets the blue component of the mask colour.", "");
 
 881         void , SetMask( bool mask = true ),
 
 882         "Specifies whether there is a mask or not. The area of the mask is
 
 883 determined by the current mask colour.", "");
 
 887         "Returns ``True`` if there is a mask active, ``False`` otherwise.", "");
 
 891         wxImage , Rotate(double angle, const wxPoint & centre_of_rotation,
 
 892                          bool interpolating = true, wxPoint * offset_after_rotation = NULL) const ,
 
 893         "Rotates the image about the given point, by ``angle`` radians. Passing
 
 894 ``True`` to ``interpolating`` results in better image quality, but is
 
 895 slower. If the image has a mask, then the mask colour is used for the
 
 896 uncovered pixels in the rotated image background. Otherwise, black
 
 897 will be used as the fill colour.
 
 899 Returns the rotated image, leaving this image intact.", "");
 
 902         wxImage , Rotate90( bool clockwise = true ) ,
 
 903         "Returns a copy of the image rotated 90 degrees in the direction
 
 904 indicated by ``clockwise``.", "");
 
 907         wxImage , Mirror( bool horizontally = true ) ,
 
 908         "Returns a mirrored copy of the image. The parameter ``horizontally``
 
 909 indicates the orientation.", "");
 
 913         void , Replace( byte r1, byte g1, byte b1,
 
 914                         byte r2, byte g2, byte b2 ),
 
 915         "Replaces the colour specified by ``(r1,g1,b1)`` by the colour
 
 916 ``(r2,g2,b2)``.", "");
 
 919         wxImage , ConvertToGreyscale( double lr = 0.299,
 
 921                                       double lb = 0.114 ) const,
 
 922         "Convert to greyscale image. Uses the luminance component (Y) of the
 
 923 image.  The luma value (YUV) is calculated using (R * lr) + (G * lg) + (B * lb),
 
 924 defaults to ITU-T BT.601", "");
 
 928         wxImage , ConvertToMono( byte r, byte g, byte b ) const,
 
 929         "Returns monochromatic version of the image. The returned image has
 
 930 white colour where the original has ``(r,g,b)`` colour and black
 
 931 colour everywhere else.", "");
 
 935         void , SetOption(const wxString& name, const wxString& value),
 
 936         "Sets an image handler defined option.  For example, when saving as a
 
 937 JPEG file, the option ``wx.IMAGE_OPTION_QUALITY`` is used, which is a
 
 938 number between 0 and 100 (0 is terrible, 100 is very good).", "
 
 940     ================================= ===
 
 941     wx.IMAGE_OPTION_BMP_FORMAT
 
 942     wx.IMAGE_OPTION_CUR_HOTSPOT_X
 
 943     wx.IMAGE_OPTION_CUR_HOTSPOT_Y
 
 944     wx.IMAGE_OPTION_RESOLUTION
 
 945     wx.IMAGE_OPTION_RESOLUTIONX
 
 946     wx.IMAGE_OPTION_RESOLUTIONY
 
 947     wx.IMAGE_OPTION_RESOLUTIONUNIT
 
 948     wx.IMAGE_OPTION_QUALITY
 
 949     wx.IMAGE_OPTION_BITSPERSAMPLE
 
 950     wx.IMAGE_OPTION_SAMPLESPERPIXEL
 
 951     wx.IMAGE_OPTION_COMPRESSION
 
 952     wx.IMAGE_OPTION_IMAGEDESCRIPTOR
 
 953     wx.IMAGE_OPTION_PNG_FORMAT
 
 954     wx.IMAGE_OPTION_PNG_BITDEPTH
 
 955     ================================= ===
 
 957 :see: `HasOption`, `GetOption`, `GetOptionInt`, `SetOptionInt`");
 
 960         void,  SetOption(const wxString& name, int value),
 
 961         "Sets an image option as an integer.", "
 
 963 :see: `HasOption`, `GetOption`, `GetOptionInt`, `SetOption`",
 
 967         wxString , GetOption(const wxString& name) const,
 
 968         "Gets the value of an image handler option.", "
 
 970 :see: `HasOption`, `GetOptionInt`, `SetOption`, `SetOptionInt`");
 
 973         int , GetOptionInt(const wxString& name) const,
 
 974         "Gets the value of an image handler option as an integer.  If the given
 
 975 option is not present, the function returns 0.", "
 
 977 :see: `HasOption`, `GetOption`, `SetOptionInt`, `SetOption`");
 
 980         bool , HasOption(const wxString& name) const,
 
 981         "Returns true if the given option is present.", "
 
 983 :see: `GetOption`, `GetOptionInt`, `SetOption`, `SetOptionInt`");
 
 986     unsigned long CountColours( unsigned long stopafter = (unsigned long) -1 );
 
 987     unsigned long ComputeHistogram( wxImageHistogram& h );
 
 989     static void AddHandler( wxImageHandler *handler );
 
 990     static void InsertHandler( wxImageHandler *handler );
 
 991     static bool RemoveHandler( const wxString& name );
 
 993         static PyObject* GetHandlers() {
 
 994             wxList& list = wxImage::GetHandlers();
 
 995             return wxPy_ConvertList(&list);
 
1000         static wxString , GetImageExtWildcard(),
 
1001         "Iterates all registered wxImageHandler objects, and returns a string
 
1002 containing file extension masks suitable for passing to file open/save
 
1003 dialog boxes.", "");
 
1007 MustHaveApp(ConvertToBitmap);
 
1008 MustHaveApp(ConvertToMonoBitmap);
 
1011         wxBitmap ConvertToBitmap(int depth=-1) {
 
1012             wxBitmap bitmap(*self, depth);
 
1016         wxBitmap ConvertToMonoBitmap( byte red,
 
1019             wxImage mono = self->ConvertToMono( red, green, blue );
 
1020             wxBitmap bitmap( mono, 1 );
 
1027         void , RotateHue(double angle),
 
1028         "Rotates the hue of each pixel of the image. Hue is a double in the
 
1029 range -1.0..1.0 where -1.0 is -360 degrees and 1.0 is 360 degrees", "");
 
1032         static wxImage_HSVValue , RGBtoHSV(wxImage_RGBValue rgb),
 
1033         "Converts a color in RGB color space to HSV color space.", "");
 
1036         static wxImage_RGBValue , HSVtoRGB(wxImage_HSVValue hsv),
 
1037         "Converts a color in HSV color space to RGB color space.", "");
 
1040     %pythoncode { def __nonzero__(self): return self.IsOk() }
 
1042     %property(AlphaBuffer, GetAlphaBuffer, SetAlphaBuffer, doc="See `GetAlphaBuffer` and `SetAlphaBuffer`");
 
1043     %property(AlphaData, GetAlphaData, SetAlphaData, doc="See `GetAlphaData` and `SetAlphaData`");
 
1044     %property(Data, GetData, SetData, doc="See `GetData` and `SetData`");
 
1045     %property(DataBuffer, GetDataBuffer, SetDataBuffer, doc="See `GetDataBuffer` and `SetDataBuffer`");
 
1046     %property(Height, GetHeight, doc="See `GetHeight`");
 
1047     %property(MaskBlue, GetMaskBlue, doc="See `GetMaskBlue`");
 
1048     %property(MaskGreen, GetMaskGreen, doc="See `GetMaskGreen`");
 
1049     %property(MaskRed, GetMaskRed, doc="See `GetMaskRed`");
 
1050     %property(Width, GetWidth, doc="See `GetWidth`");
 
1056 // Make an image from buffer objects.  Not that this is here instead of in the
 
1057 // wxImage class (as a constructor) because there is already another one with
 
1058 // the exact same signature, so there woudl be ambiguities in the generated
 
1059 // C++.  Doing it as an independent factory function like this accomplishes
 
1060 // the same thing however.
 
1061 %newobject _ImageFromBuffer;
 
1063     wxImage* _ImageFromBuffer(int width, int height,
 
1064                               buffer data, int DATASIZE,
 
1065                               buffer alpha=NULL, int ALPHASIZE=0)
 
1067         if (DATASIZE != width*height*3) {
 
1068             wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
 
1071         if (alpha != NULL) {
 
1072             if (ALPHASIZE != width*height) {
 
1073                 wxPyErr_SetString(PyExc_ValueError, "Invalid alpha buffer size.");
 
1076             return new wxImage(width, height, data, alpha, true);
 
1078         return new wxImage(width, height, data, true);
 
1083 def ImageFromBuffer(width, height, dataBuffer, alphaBuffer=None):
 
1085     Creates a `wx.Image` from the data in dataBuffer.  The dataBuffer
 
1086     parameter must be a Python object that implements the buffer interface,
 
1087     such as a string, array, etc.  The dataBuffer object is expected to
 
1088     contain a series of RGB bytes and be width*height*3 bytes long.  A buffer
 
1089     object can optionally be supplied for the image's alpha channel data, and
 
1090     it is expected to be width*height bytes long.
 
1092     The wx.Image will be created with its data and alpha pointers initialized
 
1093     to the memory address pointed to by the buffer objects, thus saving the
 
1094     time needed to copy the image data from the buffer object to the wx.Image.
 
1095     While this has advantages, it also has the shoot-yourself-in-the-foot
 
1096     risks associated with sharing a C pointer between two objects.
 
1098     To help alleviate the risk a reference to the data and alpha buffer
 
1099     objects are kept with the wx.Image, so that they won't get deleted until
 
1100     after the wx.Image is deleted.  However please be aware that it is not
 
1101     guaranteed that an object won't move its memory buffer to a new location
 
1102     when it needs to resize its contents.  If that happens then the wx.Image
 
1103     will end up referring to an invalid memory location and could cause the
 
1104     application to crash.  Therefore care should be taken to not manipulate
 
1105     the objects used for the data and alpha buffers in a way that would cause
 
1106     them to change size.
 
1108     image = _core_._ImageFromBuffer(width, height, dataBuffer, alphaBuffer)
 
1109     image._buffer = dataBuffer
 
1110     image._alpha = alphaBuffer
 
1115 ///void wxInitAllImageHandlers();
 
1118     def InitAllImageHandlers():
 
1120         The former functionality of InitAllImageHanders is now done internal to
 
1121         the _core_ extension module and so this function has become a simple NOP.
 
1129 const wxImage    wxNullImage;
 
1132 //---------------------------------------------------------------------------
 
1134 MAKE_CONST_WXSTRING(IMAGE_OPTION_FILENAME);
 
1135 MAKE_CONST_WXSTRING(IMAGE_OPTION_BMP_FORMAT);
 
1136 MAKE_CONST_WXSTRING(IMAGE_OPTION_CUR_HOTSPOT_X);
 
1137 MAKE_CONST_WXSTRING(IMAGE_OPTION_CUR_HOTSPOT_Y);
 
1138 MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTION);
 
1139 MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTIONX);
 
1140 MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTIONY);
 
1141 MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTIONUNIT);
 
1142 MAKE_CONST_WXSTRING(IMAGE_OPTION_QUALITY);
 
1146     wxIMAGE_RESOLUTION_INCHES = 1,
 
1147     wxIMAGE_RESOLUTION_CM = 2
 
1151 MAKE_CONST_WXSTRING(IMAGE_OPTION_BITSPERSAMPLE);
 
1152 MAKE_CONST_WXSTRING(IMAGE_OPTION_SAMPLESPERPIXEL); 
 
1153 MAKE_CONST_WXSTRING(IMAGE_OPTION_COMPRESSION);
 
1154 MAKE_CONST_WXSTRING(IMAGE_OPTION_IMAGEDESCRIPTOR);
 
1156 MAKE_CONST_WXSTRING(IMAGE_OPTION_PNG_FORMAT);
 
1157 MAKE_CONST_WXSTRING(IMAGE_OPTION_PNG_BITDEPTH);
 
1161     wxPNG_TYPE_COLOUR = 0,
 
1162     wxPNG_TYPE_GREY = 2,
 
1163     wxPNG_TYPE_GREY_RED = 3
 
1168     wxBMP_24BPP        = 24, // default, do not need to set
 
1169     //wxBMP_16BPP      = 16, // wxQuantize can only do 236 colors?
 
1170     wxBMP_8BPP         =  8, // 8bpp, quantized colors
 
1171     wxBMP_8BPP_GREY    =  9, // 8bpp, rgb averaged to greys
 
1172     wxBMP_8BPP_GRAY    =  wxBMP_8BPP_GREY,
 
1173     wxBMP_8BPP_RED     = 10, // 8bpp, red used as greyscale
 
1174     wxBMP_8BPP_PALETTE = 11, // 8bpp, use the wxImage's palette
 
1175     wxBMP_4BPP         =  4, // 4bpp, quantized colors
 
1176     wxBMP_1BPP         =  1, // 1bpp, quantized "colors"
 
1177     wxBMP_1BPP_BW      =  2  // 1bpp, black & white from red
 
1181 DocStr(wxBMPHandler,
 
1182 "A `wx.ImageHandler` for \*.bmp bitmap files.", "");
 
1183 class wxBMPHandler : public wxImageHandler {
 
1188 DocStr(wxICOHandler,
 
1189 "A `wx.ImageHandler` for \*.ico icon files.", "");
 
1190 class wxICOHandler : public wxBMPHandler {
 
1195 DocStr(wxCURHandler,
 
1196 "A `wx.ImageHandler` for \*.cur cursor files.", "");
 
1197 class wxCURHandler : public wxICOHandler {
 
1202 DocStr(wxANIHandler,
 
1203 "A `wx.ImageHandler` for \*.ani animated cursor files.", "");
 
1204 class wxANIHandler : public wxCURHandler {
 
1210 //---------------------------------------------------------------------------
 
1212 DocStr(wxPNGHandler,
 
1213 "A `wx.ImageHandler` for PNG image files.", "");
 
1214 class wxPNGHandler : public wxImageHandler {
 
1220 DocStr(wxGIFHandler,
 
1221 "A `wx.ImageHandler` for GIF image files.", "");
 
1222 class wxGIFHandler : public wxImageHandler {
 
1228 DocStr(wxPCXHandler,
 
1229 "A `wx.ImageHandler` for PCX imager files.", "");
 
1230 class wxPCXHandler : public wxImageHandler {
 
1236 DocStr(wxJPEGHandler,
 
1237 "A `wx.ImageHandler` for JPEG/JPG image files.", "");
 
1238 class wxJPEGHandler : public wxImageHandler {
 
1244 DocStr(wxPNMHandler,
 
1245 "A `wx.ImageHandler` for PNM image files.", "");
 
1246 class wxPNMHandler : public wxImageHandler {
 
1251 DocStr(wxXPMHandler,
 
1252 "A `wx.ImageHandler` for XPM image.", "");
 
1253 class wxXPMHandler : public wxImageHandler {
 
1258 DocStr(wxTIFFHandler,
 
1259 "A `wx.ImageHandler` for TIFF image files.", "");
 
1260 class wxTIFFHandler : public wxImageHandler {
 
1267 DocStr(wxIFFHandler,
 
1268 "A `wx.ImageHandler` for IFF image files.", "");
 
1269 class wxIFFHandler : public wxImageHandler {
 
1275 //---------------------------------------------------------------------------
 
1278 #include <wx/quantize.h>
 
1282     wxQUANTIZE_INCLUDE_WINDOWS_COLOURS,
 
1283 //    wxQUANTIZE_RETURN_8BIT_DATA,
 
1284     wxQUANTIZE_FILL_DESTINATION_IMAGE
 
1289        "Performs quantization, or colour reduction, on a wxImage.", "");
 
1291 class wxQuantize /*: public wxObject */
 
1298             "Reduce the colours in the source image and put the result into the
 
1299 destination image, setting the palette in the destination if
 
1300 needed. Both images may be the same, to overwrite the source image.", "
 
1301 :todo: Create a version that returns the wx.Palette used.");
 
1303         static bool Quantize(const wxImage& src, wxImage& dest, int desiredNoColours = 236,
 
1304                              int flags = wxQUANTIZE_INCLUDE_WINDOWS_COLOURS|wxQUANTIZE_FILL_DESTINATION_IMAGE)
 
1306                 return wxQuantize::Quantize(src, dest, 
 
1309                                             NULL, // eightBitData
 
1316 //---------------------------------------------------------------------------