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 //---------------------------------------------------------------------------
26 class wxImageHandler : public wxObject {
28 // wxImageHandler(); Abstract Base Class
30 wxString GetExtension();
32 wxString GetMimeType();
34 //bool LoadFile(wxImage* image, wxInputStream& stream);
35 //bool SaveFile(wxImage* image, wxOutputStream& stream);
36 //virtual int GetImageCount( wxInputStream& stream );
37 //bool CanRead( wxInputStream& stream );
39 bool CanRead( const wxString& name );
41 void SetName(const wxString& name);
42 void SetExtension(const wxString& extension);
43 void SetType(long type);
44 void SetMimeType(const wxString& mimetype);
48 //---------------------------------------------------------------------------
50 class wxImageHistogram /* : public wxImageHistogramBase */
55 DocStr(MakeKey, "Get the key in the histogram for the given RGB values", "");
56 static unsigned long MakeKey(unsigned char r,
61 bool, FindFirstUnusedColour(unsigned char *OUTPUT,
62 unsigned char *OUTPUT,
63 unsigned char *OUTPUT,
64 unsigned char startR = 1,
65 unsigned char startG = 0,
66 unsigned char startB = 0 ) const,
67 "FindFirstUnusedColour(int startR=1, int startG=0, int startB=0) -> (success, r, g, b)",
68 "Find first colour that is not used in the image and has higher RGB
69 values than startR, startG, startB. Returns a tuple consisting of a
70 success flag and rgb values.", "");
74 //---------------------------------------------------------------------------
77 class wxImage : public wxObject {
79 wxImage( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 );
82 // Alternate constructors
83 %name(ImageFromMime) wxImage(const wxString& name, const wxString& mimetype, int index = -1);
84 %name(ImageFromStream) wxImage(wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1);
85 %name(ImageFromStreamMime) wxImage(wxInputStream& stream, const wxString& mimetype, int index = -1 );
87 %name(EmptyImage) wxImage(int width=0, int height=0, bool clear = True) {
88 if (width > 0 && height > 0)
89 return new wxImage(width, height, clear);
94 MustHaveApp(wxImage(const wxBitmap &bitmap));
95 %name(ImageFromBitmap) wxImage(const wxBitmap &bitmap) {
96 return new wxImage(bitmap.ConvertToImage());
99 %name(ImageFromData) wxImage(int width, int height, unsigned char* data) {
100 // Copy the source data so the wxImage can clean it up later
101 unsigned char* copy = (unsigned char*)malloc(width*height*3);
106 memcpy(copy, data, width*height*3);
107 return new wxImage(width, height, copy, False);
111 void Create( int width, int height );
114 wxImage Scale( int width, int height );
115 wxImage ShrinkBy( int xFactor , int yFactor ) const ;
116 wxImage& Rescale(int width, int height);
118 void SetRGB( int x, int y, unsigned char r, unsigned char g, unsigned char b );
119 unsigned char GetRed( int x, int y );
120 unsigned char GetGreen( int x, int y );
121 unsigned char GetBlue( int x, int y );
123 void SetAlpha(int x, int y, unsigned char alpha);
124 unsigned char GetAlpha(int x, int y);
127 // find first colour that is not used in the image and has higher
128 // RGB values than <startR,startG,startB>
130 bool, FindFirstUnusedColour( byte *OUTPUT, byte *OUTPUT, byte *OUTPUT,
131 byte startR = 0, byte startG = 0, byte startB = 0 ) const,
132 "FindFirstUnusedColour(int startR=1, int startG=0, int startB=0) -> (success, r, g, b)",
133 "Find first colour that is not used in the image and has higher RGB
134 values than startR, startG, startB. Returns a tuple consisting of a
135 success flag and rgb values.", "");
139 bool , ConvertAlphaToMask(byte threshold = 128),
140 "If the image has alpha channel, this method converts it to mask. All pixels
141 with alpha value less than ``threshold`` are replaced with mask colour and the
142 alpha channel is removed. Mask colour is chosen automatically using
143 `FindFirstUnusedColour`.
145 If the image image doesn't have alpha channel, ConvertAlphaToMask does
150 // Set image's mask to the area of 'mask' that has <mr,mg,mb> colour
151 bool SetMaskFromImage(const wxImage & mask,
152 byte mr, byte mg, byte mb);
154 // void DoFloodFill (wxCoord x, wxCoord y,
155 // const wxBrush & fillBrush,
156 // const wxColour& testColour,
157 // int style = wxFLOOD_SURFACE,
158 // int LogicalFunction = wxCOPY /* currently unused */ ) ;
160 static bool CanRead( const wxString& name );
161 static int GetImageCount( const wxString& name, long type = wxBITMAP_TYPE_ANY );
163 bool LoadFile( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 );
164 %name(LoadMimeFile)bool LoadFile( const wxString& name, const wxString& mimetype, int index = -1 );
166 bool SaveFile( const wxString& name, int type );
167 %name(SaveMimeFile)bool SaveFile( const wxString& name, const wxString& mimetype );
169 %name(CanReadStream) static bool CanRead( wxInputStream& stream );
170 %name(LoadStream) bool LoadFile( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1 );
171 %name(LoadMimeStream) bool LoadFile( wxInputStream& stream, const wxString& mimetype, int index = -1 );
179 wxSize size(self->GetWidth(), self->GetHeight());
184 wxImage GetSubImage(const wxRect& rect);
186 void Paste( const wxImage &image, int x, int y );
188 //unsigned char *GetData();
189 //void SetData( unsigned char *data );
192 PyObject* GetData() {
193 unsigned char* data = self->GetData();
194 int len = self->GetWidth() * self->GetHeight() * 3;
196 wxPyBLOCK_THREADS( rv = PyString_FromStringAndSize((char*)data, len));
199 void SetData(PyObject* data) {
200 unsigned char* dataPtr;
202 if (! PyString_Check(data)) {
203 PyErr_SetString(PyExc_TypeError, "Expected string object");
207 size_t len = self->GetWidth() * self->GetHeight() * 3;
208 dataPtr = (unsigned char*) malloc(len);
209 wxPyBLOCK_THREADS( memcpy(dataPtr, PyString_AsString(data), len) );
210 self->SetData(dataPtr);
211 // wxImage takes ownership of dataPtr...
216 PyObject* GetDataBuffer() {
217 unsigned char* data = self->GetData();
218 int len = self->GetWidth() * self->GetHeight() * 3;
220 wxPyBLOCK_THREADS( rv = PyBuffer_FromReadWriteMemory(data, len) );
223 void SetDataBuffer(PyObject* data) {
224 unsigned char* buffer;
227 bool blocked = wxPyBeginBlockThreads();
228 if (!PyArg_Parse(data, "t#", &buffer, &size))
231 if (size != self->GetWidth() * self->GetHeight() * 3) {
232 PyErr_SetString(PyExc_TypeError, "Incorrect buffer size");
235 self->SetData(buffer);
237 wxPyEndBlockThreads(blocked);
242 PyObject* GetAlphaData() {
243 unsigned char* data = self->GetAlpha();
247 int len = self->GetWidth() * self->GetHeight();
249 wxPyBLOCK_THREADS( rv = PyString_FromStringAndSize((char*)data, len) );
253 void SetAlphaData(PyObject* data) {
254 unsigned char* dataPtr;
256 if (! PyString_Check(data)) {
257 PyErr_SetString(PyExc_TypeError, "Expected string object");
261 size_t len = self->GetWidth() * self->GetHeight();
262 dataPtr = (unsigned char*) malloc(len);
263 wxPyBLOCK_THREADS( memcpy(dataPtr, PyString_AsString(data), len) );
264 self->SetAlpha(dataPtr);
265 // wxImage takes ownership of dataPtr...
270 PyObject* GetAlphaBuffer() {
271 unsigned char* data = self->GetAlpha();
272 int len = self->GetWidth() * self->GetHeight();
274 wxPyBLOCK_THREADS( rv = PyBuffer_FromReadWriteMemory(data, len) );
277 void SetAlphaBuffer(PyObject* data) {
278 unsigned char* buffer;
281 bool blocked = wxPyBeginBlockThreads();
282 if (!PyArg_Parse(data, "t#", &buffer, &size))
285 if (size != self->GetWidth() * self->GetHeight()) {
286 PyErr_SetString(PyExc_TypeError, "Incorrect buffer size");
289 self->SetAlpha(buffer);
291 wxPyEndBlockThreads(blocked);
295 void SetMaskColour( unsigned char r, unsigned char g, unsigned char b );
296 unsigned char GetMaskRed();
297 unsigned char GetMaskGreen();
298 unsigned char GetMaskBlue();
299 void SetMask( bool mask = True );
302 wxImage Rotate(double angle, const wxPoint & centre_of_rotation,
303 bool interpolating = True, wxPoint * offset_after_rotation = NULL) const ;
304 wxImage Rotate90( bool clockwise = True ) ;
305 wxImage Mirror( bool horizontally = True ) ;
307 void Replace( unsigned char r1, unsigned char g1, unsigned char b1,
308 unsigned char r2, unsigned char g2, unsigned char b2 );
310 // convert to monochrome image (<r,g,b> will be replaced by white, everything else by black)
311 wxImage ConvertToMono( unsigned char r, unsigned char g, unsigned char b ) const;
313 void SetOption(const wxString& name, const wxString& value);
314 %name(SetOptionInt)void SetOption(const wxString& name, int value);
315 wxString GetOption(const wxString& name) const;
316 int GetOptionInt(const wxString& name) const;
317 bool HasOption(const wxString& name) const;
319 unsigned long CountColours( unsigned long stopafter = (unsigned long) -1 );
320 unsigned long ComputeHistogram( wxImageHistogram& h );
322 static void AddHandler( wxImageHandler *handler );
323 static void InsertHandler( wxImageHandler *handler );
324 static bool RemoveHandler( const wxString& name );
325 static wxString GetImageExtWildcard();
328 MustHaveApp(ConvertToBitmap);
329 MustHaveApp(ConvertToMonoBitmap);
332 wxBitmap ConvertToBitmap() {
333 wxBitmap bitmap(*self);
337 wxBitmap ConvertToMonoBitmap( unsigned char red,
339 unsigned char blue ) {
340 wxImage mono = self->ConvertToMono( red, green, blue );
341 wxBitmap bitmap( mono, 1 );
346 %pythoncode { def __nonzero__(self): return self.Ok() }
351 ///void wxInitAllImageHandlers();
354 def InitAllImageHandlers():
356 The former functionality of InitAllImageHanders is now done internal to
357 the _core_ extension module and so this function has become a simple NOP.
364 // See also wxPy_ReinitStockObjects in helpers.cpp
366 const wxImage wxNullImage;
369 //---------------------------------------------------------------------------
372 MAKE_CONST_WXSTRING(IMAGE_OPTION_BMP_FORMAT);
373 MAKE_CONST_WXSTRING(IMAGE_OPTION_CUR_HOTSPOT_X);
374 MAKE_CONST_WXSTRING(IMAGE_OPTION_CUR_HOTSPOT_Y);
375 MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTION);
376 MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTIONUNIT);
380 wxIMAGE_RESOLUTION_INCHES = 1,
381 wxIMAGE_RESOLUTION_CM = 2
387 wxBMP_24BPP = 24, // default, do not need to set
388 //wxBMP_16BPP = 16, // wxQuantize can only do 236 colors?
389 wxBMP_8BPP = 8, // 8bpp, quantized colors
390 wxBMP_8BPP_GREY = 9, // 8bpp, rgb averaged to greys
391 wxBMP_8BPP_GRAY = wxBMP_8BPP_GREY,
392 wxBMP_8BPP_RED = 10, // 8bpp, red used as greyscale
393 wxBMP_8BPP_PALETTE = 11, // 8bpp, use the wxImage's palette
394 wxBMP_4BPP = 4, // 4bpp, quantized colors
395 wxBMP_1BPP = 1, // 1bpp, quantized "colors"
396 wxBMP_1BPP_BW = 2 // 1bpp, black & white from red
400 class wxBMPHandler : public wxImageHandler {
405 class wxICOHandler : public wxBMPHandler {
410 class wxCURHandler : public wxICOHandler {
415 class wxANIHandler : public wxCURHandler {
421 //---------------------------------------------------------------------------
423 class wxPNGHandler : public wxImageHandler {
429 class wxGIFHandler : public wxImageHandler {
435 class wxPCXHandler : public wxImageHandler {
441 class wxJPEGHandler : public wxImageHandler {
447 class wxPNMHandler : public wxImageHandler {
452 class wxXPMHandler : public wxImageHandler {
457 class wxTIFFHandler : public wxImageHandler {
464 class wxIFFHandler : public wxImageHandler {
470 //---------------------------------------------------------------------------
473 #include <wx/quantize.h>
477 wxQUANTIZE_INCLUDE_WINDOWS_COLOURS,
478 // wxQUANTIZE_RETURN_8BIT_DATA,
479 wxQUANTIZE_FILL_DESTINATION_IMAGE
484 "Performs quantization, or colour reduction, on a wxImage.", "");
486 class wxQuantize /*: public wxObject */
493 "Reduce the colours in the source image and put the result into the
494 destination image, setting the palette in the destination if
495 needed. Both images may be the same, to overwrite the source image.", "
496 :todo: Create a version that returns the wx.Palette used.");
498 static bool Quantize(const wxImage& src, wxImage& dest, int desiredNoColours = 236,
499 int flags = wxQUANTIZE_INCLUDE_WINDOWS_COLOURS|wxQUANTIZE_FILL_DESTINATION_IMAGE)
501 return wxQuantize::Quantize(src, dest,
504 NULL, // eightBitData
511 //---------------------------------------------------------------------------