X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d14a1e28567de23c586bc80017073d0c39f8d18f..260c9c7df3a2968f93a4c474024c60b425fdea12:/wxPython/src/_image.i diff --git a/wxPython/src/_image.i b/wxPython/src/_image.i index 5340ba73e9..4309d556b6 100644 --- a/wxPython/src/_image.i +++ b/wxPython/src/_image.i @@ -52,22 +52,22 @@ class wxImageHistogram /* : public wxImageHistogramBase */ public: wxImageHistogram(); - // get the key in the histogram for the given RGB values + DocStr(MakeKey, "Get the key in the histogram for the given RGB values", ""); static unsigned long MakeKey(unsigned char r, unsigned char g, unsigned char b); - // find first colour that is not used in the image and has higher - // RGB values than RGB(startR, startG, startB) - // - // returns true and puts this colour in r, g, b (each of which may be NULL) - // on success or returns false if there are no more free colours - bool FindFirstUnusedColour(unsigned char *OUTPUT, - unsigned char *OUTPUT, - unsigned char *OUTPUT, - unsigned char startR = 1, - unsigned char startG = 0, - unsigned char startB = 0 ) const; + DocDeclAStr( + bool, FindFirstUnusedColour(unsigned char *OUTPUT, + unsigned char *OUTPUT, + unsigned char *OUTPUT, + unsigned char startR = 1, + unsigned char startG = 0, + unsigned char startB = 0 ) const, + "FindFirstUnusedColour(int startR=1, int startG=0, int startB=0) -> (success, r, g, b)", + "Find first colour that is not used in the image and has higher RGB +values than startR, startG, startB. Returns a tuple consisting of a +success flag and rgb values.", ""); }; @@ -76,26 +76,48 @@ public: class wxImage : public wxObject { public: - wxImage( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 ); + DocCtorStr( + wxImage( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 ), + "", ""); + ~wxImage(); // Alternate constructors - %name(ImageFromMime) wxImage(const wxString& name, const wxString& mimetype, int index = -1); - %name(ImageFromStream) wxImage(wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1); - %name(ImageFromStreamMime) wxImage(wxInputStream& stream, const wxString& mimetype, int index = -1 ); + DocCtorStrName( + wxImage(const wxString& name, const wxString& mimetype, int index = -1), + "", "", + ImageFromMime); + + DocCtorStrName( + wxImage(wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1), + "", "", + ImageFromStream); + + DocCtorStrName( + wxImage(wxInputStream& stream, const wxString& mimetype, int index = -1 ), + "", "", + ImageFromStreamMime); + %extend { - %name(EmptyImage) wxImage(int width=0, int height=0, bool clear = TRUE) { + %rename(EmptyImage) wxImage(int width=0, int height=0, bool clear = true); + wxImage(int width=0, int height=0, bool clear = true) + { if (width > 0 && height > 0) return new wxImage(width, height, clear); else return new wxImage; - } - - %name(ImageFromBitmap) wxImage(const wxBitmap &bitmap) { + } + + MustHaveApp(wxImage(const wxBitmap &bitmap)); + %rename(ImageFromBitmap) wxImage(const wxBitmap &bitmap); + wxImage(const wxBitmap &bitmap) + { return new wxImage(bitmap.ConvertToImage()); } - - %name(ImageFromData) wxImage(int width, int height, unsigned char* data) { + + %rename(ImageFromData) wxImage(int width, int height, unsigned char* data); + wxImage(int width, int height, unsigned char* data) + { // Copy the source data so the wxImage can clean it up later unsigned char* copy = (unsigned char*)malloc(width*height*3); if (copy == NULL) { @@ -103,10 +125,31 @@ public: return NULL; } memcpy(copy, data, width*height*3); - return new wxImage(width, height, copy, FALSE); + return new wxImage(width, height, copy, false); + } + + + %rename(ImageFromDataWithAlpha) wxImage(int width, int height, unsigned char* data, unsigned char* alpha); + wxImage(int width, int height, unsigned char* data, unsigned char* alpha) + { + // Copy the source data so the wxImage can clean it up later + unsigned char* dcopy = (unsigned char*)malloc(width*height*3); + if (dcopy == NULL) { + PyErr_NoMemory(); + return NULL; + } + memcpy(dcopy, data, width*height*3); + unsigned char* acopy = (unsigned char*)malloc(width*height); + if (acopy == NULL) { + PyErr_NoMemory(); + return NULL; + } + memcpy(acopy, alpha, width*height); + + return new wxImage(width, height, dcopy, acopy, false); } } - + void Create( int width, int height ); void Destroy(); @@ -125,9 +168,38 @@ public: // find first colour that is not used in the image and has higher // RGB values than - bool FindFirstUnusedColour( byte *OUTPUT, byte *OUTPUT, byte *OUTPUT, - byte startR = 0, byte startG = 0, byte startB = 0 ) const; + DocDeclAStr( + bool, FindFirstUnusedColour( byte *OUTPUT, byte *OUTPUT, byte *OUTPUT, + byte startR = 0, byte startG = 0, byte startB = 0 ) const, + "FindFirstUnusedColour(int startR=1, int startG=0, int startB=0) -> (success, r, g, b)", + "Find first colour that is not used in the image and has higher RGB +values than startR, startG, startB. Returns a tuple consisting of a +success flag and rgb values.", ""); + + DocDeclStr( + bool , ConvertAlphaToMask(byte threshold = 128), + "If the image has alpha channel, this method converts it to mask. All pixels +with alpha value less than ``threshold`` are replaced with mask colour and the +alpha channel is removed. Mask colour is chosen automatically using +`FindFirstUnusedColour`. + +If the image image doesn't have alpha channel, ConvertAlphaToMask does +nothing.", ""); + + + DocDeclStr( + bool , ConvertColourToAlpha( unsigned char r, unsigned char g, unsigned char b ), + "This method converts an image where the original alpha information is +only available as a shades of a colour (actually shades of grey) +typically when you draw anti-aliased text into a bitmap. The DC +drawing routines draw grey values on the black background although +they actually mean to draw white with differnt alpha values. This +method reverses it, assuming a black (!) background and white text. +The method will then fill up the whole image with the colour given.", ""); + + + // Set image's mask to the area of 'mask' that has colour bool SetMaskFromImage(const wxImage & mask, byte mr, byte mg, byte mb); @@ -142,19 +214,26 @@ public: static int GetImageCount( const wxString& name, long type = wxBITMAP_TYPE_ANY ); bool LoadFile( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 ); - %name(LoadMimeFile)bool LoadFile( const wxString& name, const wxString& mimetype, int index = -1 ); + %Rename(LoadMimeFile, bool, LoadFile( const wxString& name, const wxString& mimetype, int index = -1 )); bool SaveFile( const wxString& name, int type ); - %name(SaveMimeFile)bool SaveFile( const wxString& name, const wxString& mimetype ); + %Rename(SaveMimeFile, bool, SaveFile( const wxString& name, const wxString& mimetype )); - %name(CanReadStream) static bool CanRead( wxInputStream& stream ); - %name(LoadStream) bool LoadFile( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1 ); - %name(LoadMimeStream) bool LoadFile( wxInputStream& stream, const wxString& mimetype, int index = -1 ); + %Rename(CanReadStream, static bool, CanRead( wxInputStream& stream )); + %Rename(LoadStream, bool, LoadFile( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1 )); + %Rename(LoadMimeStream, bool, LoadFile( wxInputStream& stream, const wxString& mimetype, int index = -1 )); bool Ok(); int GetWidth(); int GetHeight(); + %extend { + wxSize GetSize() { + wxSize size(self->GetWidth(), self->GetHeight()); + return size; + } + } + wxImage GetSubImage(const wxRect& rect); wxImage Copy(); void Paste( const wxImage &image, int x, int y ); @@ -174,7 +253,8 @@ public: unsigned char* dataPtr; if (! PyString_Check(data)) { - PyErr_SetString(PyExc_TypeError, "Expected string object"); + wxPyBLOCK_THREADS(PyErr_SetString(PyExc_TypeError, + "Expected string object")); return /* NULL */ ; } @@ -198,7 +278,7 @@ public: unsigned char* buffer; int size; - wxPyBeginBlockThreads(); + bool blocked = wxPyBeginBlockThreads(); if (!PyArg_Parse(data, "t#", &buffer, &size)) goto done; @@ -208,7 +288,7 @@ public: } self->SetData(buffer); done: - wxPyEndBlockThreads(); + wxPyEndBlockThreads(blocked); } @@ -252,7 +332,7 @@ public: unsigned char* buffer; int size; - wxPyBeginBlockThreads(); + bool blocked = wxPyBeginBlockThreads(); if (!PyArg_Parse(data, "t#", &buffer, &size)) goto done; @@ -262,7 +342,7 @@ public: } self->SetAlpha(buffer); done: - wxPyEndBlockThreads(); + wxPyEndBlockThreads(blocked); } } @@ -270,13 +350,13 @@ public: unsigned char GetMaskRed(); unsigned char GetMaskGreen(); unsigned char GetMaskBlue(); - void SetMask( bool mask = TRUE ); + void SetMask( bool mask = true ); bool HasMask(); wxImage Rotate(double angle, const wxPoint & centre_of_rotation, - bool interpolating = TRUE, wxPoint * offset_after_rotation = NULL) const ; - wxImage Rotate90( bool clockwise = TRUE ) ; - wxImage Mirror( bool horizontally = TRUE ) ; + bool interpolating = true, wxPoint * offset_after_rotation = NULL) const ; + wxImage Rotate90( bool clockwise = true ) ; + wxImage Mirror( bool horizontally = true ) ; void Replace( unsigned char r1, unsigned char g1, unsigned char b1, unsigned char r2, unsigned char g2, unsigned char b2 ); @@ -285,7 +365,7 @@ public: wxImage ConvertToMono( unsigned char r, unsigned char g, unsigned char b ) const; void SetOption(const wxString& name, const wxString& value); - %name(SetOptionInt)void SetOption(const wxString& name, int value); + %Rename(SetOptionInt, void, SetOption(const wxString& name, int value)); wxString GetOption(const wxString& name) const; int GetOptionInt(const wxString& name) const; bool HasOption(const wxString& name) const; @@ -299,9 +379,12 @@ public: static wxString GetImageExtWildcard(); +MustHaveApp(ConvertToBitmap); +MustHaveApp(ConvertToMonoBitmap); + %extend { - wxBitmap ConvertToBitmap() { - wxBitmap bitmap(*self); + wxBitmap ConvertToBitmap(int depth=-1) { + wxBitmap bitmap(*self, depth); return bitmap; } @@ -319,7 +402,17 @@ public: -void wxInitAllImageHandlers(); +///void wxInitAllImageHandlers(); + +%pythoncode { + def InitAllImageHandlers(): + """ + The former functionality of InitAllImageHanders is now done internal to + the _core_ extension module and so this function has become a simple NOP. + """ + pass +} + // See also wxPy_ReinitStockObjects in helpers.cpp @@ -334,7 +427,7 @@ MAKE_CONST_WXSTRING(IMAGE_OPTION_BMP_FORMAT); MAKE_CONST_WXSTRING(IMAGE_OPTION_CUR_HOTSPOT_X); MAKE_CONST_WXSTRING(IMAGE_OPTION_CUR_HOTSPOT_Y); MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTION); -MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTIONUNIT); +MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTIONUNIT); enum { @@ -428,4 +521,45 @@ public: }; #endif +//--------------------------------------------------------------------------- + +%{ +#include +%} + +enum { + wxQUANTIZE_INCLUDE_WINDOWS_COLOURS, +// wxQUANTIZE_RETURN_8BIT_DATA, + wxQUANTIZE_FILL_DESTINATION_IMAGE +}; + + +DocStr(wxQuantize, + "Performs quantization, or colour reduction, on a wxImage.", ""); + +class wxQuantize /*: public wxObject */ +{ +public: + + %extend { + DocStr( + Quantize, + "Reduce the colours in the source image and put the result into the +destination image, setting the palette in the destination if +needed. Both images may be the same, to overwrite the source image.", " +:todo: Create a version that returns the wx.Palette used."); + + static bool Quantize(const wxImage& src, wxImage& dest, int desiredNoColours = 236, + int flags = wxQUANTIZE_INCLUDE_WINDOWS_COLOURS|wxQUANTIZE_FILL_DESTINATION_IMAGE) + { + return wxQuantize::Quantize(src, dest, + //NULL, // palette + desiredNoColours, + NULL, // eightBitData + flags); + } + } +}; + + //---------------------------------------------------------------------------