X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3b5ccda1287eadff3ad34eafaf0cb213eefb06e1..5dacf03c57128529219145bafe9cee07d4348e85:/wxPython/src/image.i diff --git a/wxPython/src/image.i b/wxPython/src/image.i index 84d1c7c5f0..be25dd688d 100644 --- a/wxPython/src/image.i +++ b/wxPython/src/image.i @@ -30,6 +30,32 @@ %import gdi.i %import streams.i +//--------------------------------------------------------------------------- + +class wxImageHistogram /* : public wxImageHistogramBase */ +{ +public: + wxImageHistogram(); + + // 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; +}; + + //--------------------------------------------------------------------------- class wxImageHandler : public wxObject { @@ -120,6 +146,7 @@ public: void Destroy(); wxImage Scale( int width, int height ); + wxImage ShrinkBy( int xFactor , int yFactor ) const ; wxImage& Rescale(int width, int height); void SetRGB( int x, int y, unsigned char r, unsigned char g, unsigned char b ); @@ -127,7 +154,11 @@ public: unsigned char GetGreen( int x, int y ); unsigned char GetBlue( int x, int y ); - // find first colour that is not used in the image and has higher + void SetAlpha(int x, int y, unsigned char alpha); + unsigned char GetAlpha(int x, int y); + bool HasAlpha(); + + // 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; @@ -167,18 +198,11 @@ public: //void SetData( unsigned char *data ); %addmethods { - PyObject* GetDataBuffer() { - unsigned char* data = self->GetData(); - int len = self->GetWidth() * self->GetHeight() * 3; - return PyBuffer_FromReadWriteMemory(data, len); - } - PyObject* GetData() { unsigned char* data = self->GetData(); int len = self->GetWidth() * self->GetHeight() * 3; return PyString_FromStringAndSize((char*)data, len); } - void SetData(PyObject* data) { unsigned char* dataPtr; @@ -193,6 +217,74 @@ public: self->SetData(dataPtr); // wxImage takes ownership of dataPtr... } + + + + PyObject* GetDataBuffer() { + unsigned char* data = self->GetData(); + int len = self->GetWidth() * self->GetHeight() * 3; + return PyBuffer_FromReadWriteMemory(data, len); + } + void SetDataBuffer(PyObject* data) { + unsigned char* buffer; + int size; + + if (!PyArg_Parse(data, "w#", &buffer, &size)) + return; + + if (size != self->GetWidth() * self->GetHeight() * 3) { + PyErr_SetString(PyExc_TypeError, "Incorrect buffer size"); + return; + } + self->SetData(buffer); + } + + + + PyObject* GetAlphaData() { + unsigned char* data = self->GetAlpha(); + if (! data) { + RETURN_NONE(); + } else { + int len = self->GetWidth() * self->GetHeight(); + return PyString_FromStringAndSize((char*)data, len); + } + } + void SetAlphaData(PyObject* data) { + unsigned char* dataPtr; + + if (! PyString_Check(data)) { + PyErr_SetString(PyExc_TypeError, "Expected string object"); + return /* NULL */ ; + } + + size_t len = self->GetWidth() * self->GetHeight(); + dataPtr = (unsigned char*) malloc(len); + memcpy(dataPtr, PyString_AsString(data), len); + self->SetAlpha(dataPtr); + // wxImage takes ownership of dataPtr... + } + + + + PyObject* GetAlphaBuffer() { + unsigned char* data = self->GetAlpha(); + int len = self->GetWidth() * self->GetHeight(); + return PyBuffer_FromReadWriteMemory(data, len); + } + void SetAlphaBuffer(PyObject* data) { + unsigned char* buffer; + int size; + + if (!PyArg_Parse(data, "w#", &buffer, &size)) + return; + + if (size != self->GetWidth() * self->GetHeight()) { + PyErr_SetString(PyExc_TypeError, "Incorrect buffer size"); + return; + } + self->SetAlpha(buffer); + } } void SetMaskColour( unsigned char r, unsigned char g, unsigned char b ); @@ -220,11 +312,12 @@ public: bool HasOption(const wxString& name) const; unsigned long CountColours( unsigned long stopafter = (unsigned long) -1 ); - // TODO: unsigned long ComputeHistogram( wxHashTable &h ); + unsigned long ComputeHistogram( wxImageHistogram& h ); static void AddHandler( wxImageHandler *handler ); static void InsertHandler( wxImageHandler *handler ); static bool RemoveHandler( const wxString& name ); + static wxString GetImageExtWildcard(); %addmethods { @@ -241,11 +334,13 @@ public: return bitmap; } } + + %pragma(python) addtoclass = "def __nonzero__(self): return self.Ok()" }; // Alternate constructors -%new wxImage* wxEmptyImage(int width=0, int height=0); +%new wxImage* wxEmptyImage(int width=0, int height=0, bool clear = TRUE); %new wxImage* wxImageFromMime(const wxString& name, const wxString& mimetype, int index = -1); %new wxImage* wxImageFromBitmap(const wxBitmap &bitmap); %new wxImage* wxImageFromData(int width, int height, unsigned char* data); @@ -253,11 +348,11 @@ public: %new wxImage* wxImageFromStreamMime(wxInputStream& stream, const wxString& mimetype, int index = -1 ); %{ - wxImage* wxEmptyImage(int width=0, int height=0) { - if (width == 0 && height == 0) - return new wxImage; + wxImage* wxEmptyImage(int width=0, int height=0, bool clear = TRUE) { + if (width > 0 && height > 0) + return new wxImage(width, height, clear); else - return new wxImage(width, height); + return new wxImage; } @@ -305,6 +400,7 @@ void wxInitAllImageHandlers(); #if 0 %} +// See also wxPy_ReinitStockObjects in helpers.cpp extern wxImage wxNullImage; %readwrite