]> git.saurik.com Git - wxWidgets.git/blame_incremental - wxPython/src/_image.i
wxCheckListBox doesn't require wxUSE_OWNER_DRAWN when using WXUNIVERSAL
[wxWidgets.git] / wxPython / src / _image.i
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: _image.i
3// Purpose: SWIG definitions for wxImage and such
4//
5// Author: Robin Dunn
6//
7// Created: 25-Sept-2000
8// RCS-ID: $Id$
9// Copyright: (c) 2003 by Total Control Software
10// Licence: wxWindows license
11/////////////////////////////////////////////////////////////////////////////
12
13// Not a %module
14
15
16//---------------------------------------------------------------------------
17
18%{
19#include "wx/wxPython/pyistream.h"
20%}
21
22//---------------------------------------------------------------------------
23
24enum {
25 wxIMAGE_ALPHA_TRANSPARENT,
26 wxIMAGE_ALPHA_THRESHOLD,
27 wxIMAGE_ALPHA_OPAQUE
28};
29
30
31//---------------------------------------------------------------------------
32%newgroup
33
34DocStr(wxImageHandler,
35"This is the base class for implementing image file loading/saving, and
36image creation from data. It is used within `wx.Image` and is not
37normally seen by the application.", "");
38class wxImageHandler : public wxObject {
39public:
40 // wxImageHandler(); Abstract Base Class
41 wxString GetName();
42 wxString GetExtension();
43 long GetType();
44 wxString GetMimeType();
45
46 //bool LoadFile(wxImage* image, wxInputStream& stream);
47 //bool SaveFile(wxImage* image, wxOutputStream& stream);
48 //virtual int GetImageCount( wxInputStream& stream );
49 //bool CanRead( wxInputStream& stream );
50
51 bool CanRead( const wxString& name );
52
53 void SetName(const wxString& name);
54 void SetExtension(const wxString& extension);
55 void SetType(long type);
56 void SetMimeType(const wxString& mimetype);
57};
58
59
60//---------------------------------------------------------------------------
61
62class wxImageHistogram /* : public wxImageHistogramBase */
63{
64public:
65 wxImageHistogram();
66
67 DocStr(MakeKey, "Get the key in the histogram for the given RGB values", "");
68 static unsigned long MakeKey(byte r,
69 byte g,
70 byte b);
71
72 DocDeclAStr(
73 bool, FindFirstUnusedColour(byte *OUTPUT,
74 byte *OUTPUT,
75 byte *OUTPUT,
76 byte startR = 1,
77 byte startG = 0,
78 byte startB = 0 ) const,
79 "FindFirstUnusedColour(int startR=1, int startG=0, int startB=0) -> (success, r, g, b)",
80 "Find first colour that is not used in the image and has higher RGB
81values than startR, startG, startB. Returns a tuple consisting of a
82success flag and rgb values.", "");
83
84 %extend {
85 DocStr(GetCount,
86 "Returns the pixel count for the given key. Use `MakeKey` to create a
87key value from a RGB tripple.", "");
88 unsigned long GetCount(unsigned long key) {
89 wxImageHistogramEntry e = (*self)[key];
90 return e.value;
91 }
92
93 DocStr(GetCountRGB,
94 "Returns the pixel count for the given RGB values.", "");
95 unsigned long GetCountRGB(byte r,
96 byte g,
97 byte b) {
98 unsigned long key = wxImageHistogram::MakeKey(r, g, b);
99 wxImageHistogramEntry e = (*self)[key];
100 return e.value;
101 }
102
103 DocStr(GetCountColour,
104 "Returns the pixel count for the given `wx.Colour` value.", "");
105 unsigned long GetCountColour(const wxColour& colour) {
106 unsigned long key = wxImageHistogram::MakeKey(colour.Red(),
107 colour.Green(),
108 colour.Blue());
109 wxImageHistogramEntry e = (*self)[key];
110 return e.value;
111 }
112 }
113
114};
115
116
117//---------------------------------------------------------------------------
118
119%{
120 typedef unsigned char* buffer;
121%}
122
123%typemap(in) (buffer data, int DATASIZE)
124 { if (!PyArg_Parse($input, "t#", &$1, &$2)) SWIG_fail; }
125
126%typemap(in) (buffer alpha, int ALPHASIZE)
127 { if (!PyArg_Parse($input, "t#", &$1, &$2)) SWIG_fail; }
128
129//---------------------------------------------------------------------------
130
131
132DocStr(wxImage,
133"A platform-independent image class. An image can be created from
134data, or using `wx.Bitmap.ConvertToImage`, or loaded from a file in a
135variety of formats. Functions are available to set and get image
136bits, so it can be used for basic image manipulation.
137
138A wx.Image cannot be drawn directly to a `wx.DC`. Instead, a
139platform-specific `wx.Bitmap` object must be created from it using the
140`wx.BitmapFromImage` constructor. This bitmap can then be drawn in a
141device context, using `wx.DC.DrawBitmap`.
142
143One colour value of the image may be used as a mask colour which will
144lead to the automatic creation of a `wx.Mask` object associated to the
145bitmap object.
146
147wx.Image supports alpha channel data, that is in addition to a byte
148for the red, green and blue colour components for each pixel it also
149stores a byte representing the pixel opacity. An alpha value of 0
150corresponds to a transparent pixel (null opacity) while a value of 255
151means that the pixel is 100% opaque.
152
153Unlike RGB data, not all images have an alpha channel and before using
154`GetAlpha` you should check if this image contains an alpha channel
155with `HasAlpha`. Note that currently only images loaded from PNG files
156with transparency information will have an alpha channel.", "");
157
158class wxImage : public wxObject {
159public:
160 %typemap(out) wxImage*; // turn off this typemap
161
162 DocCtorStr(
163 wxImage( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 ),
164 "Loads an image from a file.",
165 "
166 :param name: Name of the file from which to load the image.
167
168 :param type: May be one of the following:
169
170 ==================== =======================================
171 wx.BITMAP_TYPE_BMP Load a Windows bitmap file.
172 wx.BITMAP_TYPE_GIF Load a GIF bitmap file.
173 wx.BITMAP_TYPE_JPEG Load a JPEG bitmap file.
174 wx.BITMAP_TYPE_PNG Load a PNG bitmap file.
175 wx.BITMAP_TYPE_PCX Load a PCX bitmap file.
176 wx.BITMAP_TYPE_PNM Load a PNM bitmap file.
177 wx.BITMAP_TYPE_TIF Load a TIFF bitmap file.
178 wx.BITMAP_TYPE_XPM Load a XPM bitmap file.
179 wx.BITMAP_TYPE_ICO Load a Windows icon file (ICO).
180 wx.BITMAP_TYPE_CUR Load a Windows cursor file (CUR).
181 wx.BITMAP_TYPE_ANI Load a Windows animated cursor file (ANI).
182 wx.BITMAP_TYPE_ANY Will try to autodetect the format.
183 ==================== =======================================
184
185 :param index: Index of the image to load in the case that the
186 image file contains multiple images. This is only used by GIF,
187 ICO and TIFF handlers. The default value (-1) means to choose
188 the default image and is interpreted as the first image (the
189 one with index=0) by the GIF and TIFF handler and as the
190 largest and most colourful one by the ICO handler.
191
192:see: `wx.ImageFromMime`, `wx.ImageFromStream`, `wx.ImageFromStreamMime`,
193 `wx.EmptyImage`, `wx.ImageFromBitmap`, `wx.ImageFromData`,
194 `wx.ImageFromDataWithAlpha`
195");
196
197 ~wxImage();
198
199 // Alternate constructors
200 DocCtorStrName(
201 wxImage(const wxString& name, const wxString& mimetype, int index = -1),
202 "Loads an image from a file, using a MIME type string (such as
203'image/jpeg') to specify image type.", "
204
205:see: `wx.Image`",
206 ImageFromMime);
207
208 DocCtorStrName(
209 wxImage(wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1),
210 "Loads an image from an input stream, or any readable Python file-like
211object.", "
212
213:see: `wx.Image`",
214 ImageFromStream);
215
216 DocCtorStrName(
217 wxImage(wxInputStream& stream, const wxString& mimetype, int index = -1 ),
218 "Loads an image from an input stream, or any readable Python file-like
219object, specifying the image format with a MIME type string.", "
220
221:see: `wx.Image`",
222 ImageFromStreamMime);
223
224 %extend {
225 %RenameDocCtor(
226 EmptyImage,
227 "Construct an empty image of a given size, optionally setting all
228pixels to black.", "
229
230:see: `wx.Image`",
231 wxImage(int width=0, int height=0, bool clear = true))
232 {
233 if (width > 0 && height > 0)
234 return new wxImage(width, height, clear);
235 else
236 return new wxImage;
237 }
238
239
240 MustHaveApp(wxImage(const wxBitmap &bitmap));
241
242 %RenameDocCtor(
243 ImageFromBitmap,
244 "Construct an Image from a `wx.Bitmap`.", "
245
246:see: `wx.Image`",
247 wxImage(const wxBitmap &bitmap))
248 {
249 return new wxImage(bitmap.ConvertToImage());
250 }
251
252 %RenameDocCtor(
253 ImageFromData,
254 "Construct an Image from a buffer of RGB bytes. Accepts either a
255string or a buffer object holding the data and the length of the data
256must be width*height*3.", "
257
258:see: `wx.Image`",
259 wxImage(int width, int height, buffer data, int DATASIZE))
260 {
261 if (DATASIZE != width*height*3) {
262 wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
263 return NULL;
264 }
265
266 // Copy the source data so the wxImage can clean it up later
267 buffer copy = (buffer)malloc(DATASIZE);
268 if (copy == NULL) {
269 wxPyBLOCK_THREADS(PyErr_NoMemory());
270 return NULL;
271 }
272 memcpy(copy, data, DATASIZE);
273 return new wxImage(width, height, copy, false);
274 }
275
276
277 %RenameDocCtor(
278 ImageFromDataWithAlpha,
279 "Construct an Image from a buffer of RGB bytes with an Alpha channel.
280Accepts either a string or a buffer object holding the data and the
281length of the data must be width*height*3 bytes, and the length of the
282alpha data must be width*height bytes.", "
283
284:see: `wx.Image`",
285 wxImage(int width, int height, buffer data, int DATASIZE, buffer alpha, int ALPHASIZE))
286 {
287 if (DATASIZE != width*height*3) {
288 wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
289 return NULL;
290 }
291 if (ALPHASIZE != width*height) {
292 wxPyErr_SetString(PyExc_ValueError, "Invalid alpha buffer size.");
293 return NULL;
294 }
295
296 // Copy the source data so the wxImage can clean it up later
297 buffer dcopy = (buffer)malloc(DATASIZE);
298 if (dcopy == NULL) {
299 wxPyBLOCK_THREADS(PyErr_NoMemory());
300 return NULL;
301 }
302 memcpy(dcopy, data, DATASIZE);
303
304 buffer acopy = (buffer)malloc(ALPHASIZE);
305 if (acopy == NULL) {
306 wxPyBLOCK_THREADS(PyErr_NoMemory());
307 return NULL;
308 }
309 memcpy(acopy, alpha, ALPHASIZE);
310
311 return new wxImage(width, height, dcopy, acopy, false);
312 }
313 }
314
315 // TODO: wxImage( char** xpmData );
316
317 // Turn it back on again
318 %typemap(out) wxImage* { $result = wxPyMake_wxObject($1, $owner); }
319
320
321 DocDeclStr(
322 void , Create( int width, int height, bool clear=true ),
323 "Creates a fresh image. If clear is ``True``, the new image will be
324initialized to black. Otherwise, the image data will be uninitialized.", "");
325
326 DocDeclStr(
327 void , Destroy(),
328 "Destroys the image data.", "");
329
330
331 DocDeclStr(
332 wxImage , Scale( int width, int height ),
333 "Returns a scaled version of the image. This is also useful for scaling
334bitmaps in general as the only other way to scale bitmaps is to blit a
335`wx.MemoryDC` into another `wx.MemoryDC`.", "
336
337:see: `Rescale`");
338
339 DocDeclStr(
340 wxImage , ShrinkBy( int xFactor , int yFactor ) const ,
341 "Return a version of the image scaled smaller by the given factors.", "");
342
343 DocDeclStr(
344 wxImage& , Rescale(int width, int height),
345 "Changes the size of the image in-place by scaling it: after a call to
346this function, the image will have the given width and height.
347
348Returns the (modified) image itself.", "
349
350:see: `Scale`");
351
352
353 // resizes the image in place
354 DocDeclStr(
355 wxImage& , Resize( const wxSize& size, const wxPoint& pos,
356 int r = -1, int g = -1, int b = -1 ),
357 "Changes the size of the image in-place without scaling it, by adding
358either a border with the given colour or cropping as necessary. The
359image is pasted into a new image with the given size and background
360colour at the position pos relative to the upper left of the new
361image. If red = green = blue = -1 then use either the current mask
362colour if set or find, use, and set a suitable mask colour for any
363newly exposed areas.
364
365Returns the (modified) image itself.", "
366
367:see: `Size`");
368
369
370 DocDeclStr(
371 void , SetRGB( int x, int y, byte r, byte g, byte b ),
372 "Sets the pixel at the given coordinate. This routine performs
373bounds-checks for the coordinate so it can be considered a safe way to
374manipulate the data, but in some cases this might be too slow so that
375the data will have to be set directly. In that case you will have to
376get access to the image data using the `GetData` method.", "");
377
378
379 DocDeclStrName(
380 void, SetRGB( const wxRect& rect,
381 byte r, byte g, byte b ),
382 "Sets the colour of the pixels within the given rectangle. This routine
383performs bounds-checks for the rectangle so it can be considered a
384safe way to manipulate the data.", "",
385 SetRGBRect);
386
387 DocDeclStr(
388 byte , GetRed( int x, int y ),
389 "Returns the red intensity at the given coordinate.", "");
390
391 DocDeclStr(
392 byte , GetGreen( int x, int y ),
393 "Returns the green intensity at the given coordinate.", "");
394
395 DocDeclStr(
396 byte , GetBlue( int x, int y ),
397 "Returns the blue intensity at the given coordinate.", "");
398
399
400 DocDeclStr(
401 void , SetAlpha(int x, int y, byte alpha),
402 "Sets the alpha value for the given pixel. This function should only be
403called if the image has alpha channel data, use `HasAlpha` to check
404for this.", "");
405
406 DocDeclStr(
407 byte , GetAlpha(int x, int y),
408 "Returns the alpha value for the given pixel. This function may only be
409called for the images with alpha channel, use `HasAlpha` to check for
410this.
411
412The returned value is the *opacity* of the image, i.e. the value of 0
413corresponds to the fully transparent pixels while the value of 255 to
414the fully opaque pixels.", "");
415
416 DocDeclStr(
417 bool , HasAlpha(),
418 "Returns true if this image has alpha channel, false otherwise.", "
419
420:see: `GetAlpha`, `SetAlpha`");
421
422
423 DocDeclStr(
424 void , InitAlpha(),
425 "Initializes the image alpha channel data. It is an error to call it if
426the image already has alpha data. If it doesn't, alpha data will be by
427default initialized to all pixels being fully opaque. But if the image
428has a a mask colour, all mask pixels will be completely transparent.", "");
429
430
431 DocDeclStr(
432 bool , IsTransparent(int x, int y,
433 byte threshold = wxIMAGE_ALPHA_THRESHOLD) const,
434 "Returns ``True`` if this pixel is masked or has an alpha value less
435than the spcified threshold.", "");
436
437
438 // find first colour that is not used in the image and has higher
439 // RGB values than <startR,startG,startB>
440 DocDeclAStr(
441 bool, FindFirstUnusedColour( byte *OUTPUT, byte *OUTPUT, byte *OUTPUT,
442 byte startR = 0, byte startG = 0, byte startB = 0 ) const,
443 "FindFirstUnusedColour(int startR=1, int startG=0, int startB=0) -> (success, r, g, b)",
444 "Find first colour that is not used in the image and has higher RGB
445values than startR, startG, startB. Returns a tuple consisting of a
446success flag and rgb values.", "");
447
448
449 DocDeclStr(
450 bool , ConvertAlphaToMask(byte threshold = wxIMAGE_ALPHA_THRESHOLD),
451 "If the image has alpha channel, this method converts it to mask. All
452pixels with alpha value less than ``threshold`` are replaced with the
453mask colour and the alpha channel is removed. The mask colour is
454chosen automatically using `FindFirstUnusedColour`.
455
456If the image image doesn't have alpha channel, ConvertAlphaToMask does
457nothing.", "");
458
459
460 DocDeclStr(
461 bool , ConvertColourToAlpha( byte r, byte g, byte b ),
462 "This method converts an image where the original alpha information is
463only available as a shades of a colour (actually shades of grey)
464typically when you draw anti-aliased text into a bitmap. The DC
465drawing routines draw grey values on the black background although
466they actually mean to draw white with differnt alpha values. This
467method reverses it, assuming a black (!) background and white text.
468The method will then fill up the whole image with the colour given.", "");
469
470
471
472 DocDeclStr(
473 bool , SetMaskFromImage(const wxImage & mask,
474 byte mr, byte mg, byte mb),
475 "Sets the image's mask so that the pixels that have RGB value of
476``(mr,mg,mb)`` in ``mask`` will be masked in this image. This is done
477by first finding an unused colour in the image, setting this colour as
478the mask colour and then using this colour to draw all pixels in the
479image who corresponding pixel in mask has given RGB value.
480
481Returns ``False`` if ``mask`` does not have same dimensions as the
482image or if there is no unused colour left. Returns ``True`` if the
483mask was successfully applied.
484
485Note that this method involves computing the histogram, which is
486computationally intensive operation.", "");
487
488
489// void DoFloodFill (wxCoord x, wxCoord y,
490// const wxBrush & fillBrush,
491// const wxColour& testColour,
492// int style = wxFLOOD_SURFACE,
493// int LogicalFunction = wxCOPY /* currently unused */ ) ;
494
495 DocDeclStr(
496 static bool , CanRead( const wxString& filename ),
497 "Returns True if the image handlers can read this file.", "");
498
499 DocDeclStr(
500 static int , GetImageCount( const wxString& filename, long type = wxBITMAP_TYPE_ANY ),
501 "If the image file contains more than one image and the image handler
502is capable of retrieving these individually, this function will return
503the number of available images.", "");
504
505
506 DocDeclStr(
507 bool , LoadFile( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 ),
508 "Loads an image from a file. If no handler type is provided, the
509library will try to autodetect the format.", "");
510
511 DocDeclStrName(
512 bool , LoadFile( const wxString& name, const wxString& mimetype, int index = -1 ),
513 "Loads an image from a file, specifying the image type with a MIME type
514string.", "",
515 LoadMimeFile);
516
517
518 DocDeclStr(
519 bool , SaveFile( const wxString& name, int type ),
520 "Saves an image in the named file.", "");
521
522
523 DocDeclStrName(
524 bool , SaveFile( const wxString& name, const wxString& mimetype ),
525 "Saves an image in the named file.", "",
526 SaveMimeFile);
527
528
529 DocDeclStrName(
530 static bool , CanRead( wxInputStream& stream ),
531 "Returns True if the image handlers can read an image file from the
532data currently on the input stream, or a readable Python file-like
533object.", "",
534 CanReadStream);
535
536
537 DocDeclStrName(
538 bool , LoadFile( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1 ),
539 "Loads an image from an input stream or a readable Python file-like
540object. If no handler type is provided, the library will try to
541autodetect the format.", "",
542 LoadStream);
543
544
545 DocDeclStrName(
546 bool , LoadFile( wxInputStream& stream, const wxString& mimetype, int index = -1 ),
547 "Loads an image from an input stream or a readable Python file-like
548object, using a MIME type string to specify the image file format.", "",
549 LoadMimeStream);
550
551
552 DocDeclStr(
553 bool , Ok(),
554 "Returns true if image data is present.", "");
555
556 DocDeclStr(
557 int , GetWidth(),
558 "Gets the width of the image in pixels.", "");
559
560 DocDeclStr(
561 int , GetHeight(),
562 "Gets the height of the image in pixels.", "");
563
564
565 %extend {
566 DocStr(GetSize,
567 "Returns the size of the image in pixels.", "");
568 wxSize GetSize() {
569 wxSize size(self->GetWidth(), self->GetHeight());
570 return size;
571 }
572 }
573
574
575 DocDeclStr(
576 wxImage , GetSubImage(const wxRect& rect),
577 "Returns a sub image of the current one as long as the rect belongs
578entirely to the image.", "");
579
580
581 DocDeclStr(
582 wxImage , Size( const wxSize& size, const wxPoint& pos,
583 int r = -1, int g = -1, int b = -1 ) const,
584 "Returns a resized version of this image without scaling it by adding
585either a border with the given colour or cropping as necessary. The
586image is pasted into a new image with the given size and background
587colour at the position ``pos`` relative to the upper left of the new
588image. If red = green = blue = -1 then use either the current mask
589colour if set or find, use, and set a suitable mask colour for any
590newly exposed areas.", "
591
592:see: `Resize`");
593
594
595 DocDeclStr(
596 wxImage , Copy(),
597 "Returns an identical copy of the image.", "");
598
599 DocDeclStr(
600 void , Paste( const wxImage &image, int x, int y ),
601 "Pastes ``image`` into this instance and takes care of the mask colour
602and any out of bounds problems.", "");
603
604
605 //unsigned char *GetData();
606 //void SetData( unsigned char *data );
607
608 %extend {
609 DocStr(GetData,
610 "Returns a string containing a copy of the RGB bytes of the image.", "");
611 PyObject* GetData()
612 {
613 buffer data = self->GetData();
614 int len = self->GetWidth() * self->GetHeight() * 3;
615 PyObject* rv;
616 wxPyBLOCK_THREADS( rv = PyString_FromStringAndSize((char*)data, len));
617 return rv;
618 }
619 DocStr(SetData,
620 "Resets the Image's RGB data from a buffer of RGB bytes. Accepts
621either a string or a buffer object holding the data and the length of
622the data must be width*height*3.", "");
623 void SetData(buffer data, int DATASIZE)
624 {
625 if (DATASIZE != self->GetWidth() * self->GetHeight() * 3) {
626 wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
627 return;
628 }
629 buffer copy = (buffer)malloc(DATASIZE);
630 if (copy == NULL) {
631 wxPyBLOCK_THREADS(PyErr_NoMemory());
632 return;
633 }
634 memcpy(copy, data, DATASIZE);
635 self->SetData(copy, false);
636 // wxImage takes ownership of copy...
637 }
638
639
640 DocStr(GetDataBuffer,
641 "Returns a writable Python buffer object that is pointing at the RGB
642image data buffer inside the wx.Image. You need to ensure that you do
643not use this buffer object after the image has been destroyed.", "");
644 PyObject* GetDataBuffer()
645 {
646 buffer data = self->GetData();
647 int len = self->GetWidth() * self->GetHeight() * 3;
648 PyObject* rv;
649 wxPyBLOCK_THREADS( rv = PyBuffer_FromReadWriteMemory(data, len) );
650 return rv;
651 }
652
653 DocStr(SetDataBuffer,
654 "Sets the internal image data pointer to point at a Python buffer
655object. This can save making an extra copy of the data but you must
656ensure that the buffer object lives longer than the wx.Image does.", "");
657 void SetDataBuffer(buffer data, int DATASIZE)
658 {
659 if (DATASIZE != self->GetWidth() * self->GetHeight() * 3) {
660 wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
661 return;
662 }
663 self->SetData(data, true);
664 }
665
666
667
668 DocStr(GetAlphaData,
669 "Returns a string containing a copy of the alpha bytes of the image.", "");
670 PyObject* GetAlphaData() {
671 buffer data = self->GetAlpha();
672 if (! data) {
673 RETURN_NONE();
674 } else {
675 int len = self->GetWidth() * self->GetHeight();
676 PyObject* rv;
677 wxPyBLOCK_THREADS( rv = PyString_FromStringAndSize((char*)data, len) );
678 return rv;
679 }
680 }
681
682 DocStr(SetAlphaData,
683 "Resets the Image's alpha data from a buffer of bytes. Accepts either
684a string or a buffer object holding the data and the length of the
685data must be width*height.", "");
686 void SetAlphaData(buffer alpha, int ALPHASIZE)
687 {
688 if (ALPHASIZE != self->GetWidth() * self->GetHeight()) {
689 wxPyErr_SetString(PyExc_ValueError, "Invalid alpha buffer size.");
690 return;
691 }
692 buffer acopy = (buffer)malloc(ALPHASIZE);
693 if (acopy == NULL) {
694 wxPyBLOCK_THREADS(PyErr_NoMemory());
695 return;
696 }
697 memcpy(acopy, alpha, ALPHASIZE);
698 self->SetAlpha(acopy, false);
699 // wxImage takes ownership of acopy...
700 }
701
702
703
704 DocStr(GetDataBuffer,
705 "Returns a writable Python buffer object that is pointing at the Alpha
706data buffer inside the wx.Image. You need to ensure that you do not
707use this buffer object after the image has been destroyed.", "");
708 PyObject* GetAlphaBuffer()
709 {
710 buffer data = self->GetAlpha();
711 int len = self->GetWidth() * self->GetHeight();
712 PyObject* rv;
713 wxPyBLOCK_THREADS( rv = PyBuffer_FromReadWriteMemory(data, len) );
714 return rv;
715 }
716
717
718 DocStr(SetDataBuffer,
719 "Sets the internal image alpha pointer to point at a Python buffer
720object. This can save making an extra copy of the data but you must
721ensure that the buffer object lives as long as the wx.Image does.", "");
722 void SetAlphaBuffer(buffer alpha, int ALPHASIZE)
723 {
724 if (ALPHASIZE != self->GetWidth() * self->GetHeight()) {
725 wxPyErr_SetString(PyExc_ValueError, "Invalid alpha buffer size.");
726 return;
727 }
728 self->SetAlpha(alpha, true);
729 }
730 }
731
732
733
734 DocDeclStr(
735 void , SetMaskColour( byte r, byte g, byte b ),
736 "Sets the mask colour for this image (and tells the image to use the
737mask).", "");
738
739
740 DocDeclAStr(
741 /*bool*/ void , GetOrFindMaskColour( byte *OUTPUT,
742 byte *OUTPUT,
743 byte *OUTPUT ) const,
744 "GetOrFindMaskColour() -> (r,g,b)",
745 "Get the current mask colour or find a suitable colour.", "");
746
747
748 DocDeclStr(
749 byte , GetMaskRed(),
750 "Gets the red component of the mask colour.", "");
751
752 DocDeclStr(
753 byte , GetMaskGreen(),
754 "Gets the green component of the mask colour.", "");
755
756 DocDeclStr(
757 byte , GetMaskBlue(),
758 "Gets the blue component of the mask colour.", "");
759
760 DocDeclStr(
761 void , SetMask( bool mask = true ),
762 "Specifies whether there is a mask or not. The area of the mask is
763determined by the current mask colour.", "");
764
765 DocDeclStr(
766 bool , HasMask(),
767 "Returns ``True`` if there is a mask active, ``False`` otherwise.", "");
768
769
770 DocDeclStr(
771 wxImage , Rotate(double angle, const wxPoint & centre_of_rotation,
772 bool interpolating = true, wxPoint * offset_after_rotation = NULL) const ,
773 "Rotates the image about the given point, by ``angle`` radians. Passing
774``True`` to ``interpolating`` results in better image quality, but is
775slower. If the image has a mask, then the mask colour is used for the
776uncovered pixels in the rotated image background. Otherwise, black
777will be used as the fill colour.
778
779Returns the rotated image, leaving this image intact.", "");
780
781 DocDeclStr(
782 wxImage , Rotate90( bool clockwise = true ) ,
783 "Returns a copy of the image rotated 90 degrees in the direction
784indicated by ``clockwise``.", "");
785
786 DocDeclStr(
787 wxImage , Mirror( bool horizontally = true ) ,
788 "Returns a mirrored copy of the image. The parameter ``horizontally``
789indicates the orientation.", "");
790
791
792 DocDeclStr(
793 void , Replace( byte r1, byte g1, byte b1,
794 byte r2, byte g2, byte b2 ),
795 "Replaces the colour specified by ``(r1,g1,b1)`` by the colour
796``(r2,g2,b2)``.", "");
797
798
799 DocDeclStr(
800 wxImage , ConvertToMono( byte r, byte g, byte b ) const,
801 "Returns monochromatic version of the image. The returned image has
802white colour where the original has ``(r,g,b)`` colour and black
803colour everywhere else.", "");
804
805
806 DocDeclStr(
807 void , SetOption(const wxString& name, const wxString& value),
808 "Sets an image handler defined option. For example, when saving as a
809JPEG file, the option ``wx.IMAGE_OPTION_QUALITY`` is used, which is a
810number between 0 and 100 (0 is terrible, 100 is very good).", "
811
812 ================================= ===
813 wx.IMAGE_OPTION_BMP_FORMAT
814 wx.IMAGE_OPTION_CUR_HOTSPOT_X
815 wx.IMAGE_OPTION_CUR_HOTSPOT_Y
816 wx.IMAGE_OPTION_RESOLUTION
817 wx.IMAGE_OPTION_RESOLUTIONX
818 wx.IMAGE_OPTION_RESOLUTIONY
819 wx.IMAGE_OPTION_RESOLUTIONUNIT
820 wx.IMAGE_OPTION_QUALITY
821 wx.IMAGE_OPTION_BITSPERSAMPLE
822 wx.IMAGE_OPTION_SAMPLESPERPIXEL
823 wx.IMAGE_OPTION_COMPRESSION
824 wx.IMAGE_OPTION_IMAGEDESCRIPTOR
825 wx.IMAGE_OPTION_PNG_FORMAT
826 wx.IMAGE_OPTION_PNG_BITDEPTH
827 ================================= ===
828
829:see: `HasOption`, `GetOption`, `GetOptionInt`, `SetOptionInt`");
830
831 DocDeclStrName(
832 void, SetOption(const wxString& name, int value),
833 "Sets an image option as an integer.", "
834
835:see: `HasOption`, `GetOption`, `GetOptionInt`, `SetOption`",
836 SetOptionInt);
837
838 DocDeclStr(
839 wxString , GetOption(const wxString& name) const,
840 "Gets the value of an image handler option.", "
841
842:see: `HasOption`, `GetOptionInt`, `SetOption`, `SetOptionInt`");
843
844 DocDeclStr(
845 int , GetOptionInt(const wxString& name) const,
846 "Gets the value of an image handler option as an integer. If the given
847option is not present, the function returns 0.", "
848
849:see: `HasOption`, `GetOption`, `SetOptionInt`, `SetOption`");
850
851 DocDeclStr(
852 bool , HasOption(const wxString& name) const,
853 "Returns true if the given option is present.", "
854
855:see: `GetOption`, `GetOptionInt`, `SetOption`, `SetOptionInt`");
856
857
858 unsigned long CountColours( unsigned long stopafter = (unsigned long) -1 );
859 unsigned long ComputeHistogram( wxImageHistogram& h );
860
861 static void AddHandler( wxImageHandler *handler );
862 static void InsertHandler( wxImageHandler *handler );
863 static bool RemoveHandler( const wxString& name );
864
865 DocDeclStr(
866 static wxString , GetImageExtWildcard(),
867 "Iterates all registered wxImageHandler objects, and returns a string
868containing file extension masks suitable for passing to file open/save
869dialog boxes.", "");
870
871
872
873MustHaveApp(ConvertToBitmap);
874MustHaveApp(ConvertToMonoBitmap);
875
876 %extend {
877 wxBitmap ConvertToBitmap(int depth=-1) {
878 wxBitmap bitmap(*self, depth);
879 return bitmap;
880 }
881
882 wxBitmap ConvertToMonoBitmap( byte red,
883 byte green,
884 byte blue ) {
885 wxImage mono = self->ConvertToMono( red, green, blue );
886 wxBitmap bitmap( mono, 1 );
887 return bitmap;
888 }
889 }
890
891 %pythoncode { def __nonzero__(self): return self.Ok() }
892};
893
894
895
896///void wxInitAllImageHandlers();
897
898%pythoncode {
899 def InitAllImageHandlers():
900 """
901 The former functionality of InitAllImageHanders is now done internal to
902 the _core_ extension module and so this function has become a simple NOP.
903 """
904 pass
905}
906
907
908
909// See also wxPy_ReinitStockObjects in helpers.cpp
910%immutable;
911const wxImage wxNullImage;
912%mutable;
913
914//---------------------------------------------------------------------------
915
916MAKE_CONST_WXSTRING(IMAGE_OPTION_FILENAME);
917MAKE_CONST_WXSTRING(IMAGE_OPTION_BMP_FORMAT);
918MAKE_CONST_WXSTRING(IMAGE_OPTION_CUR_HOTSPOT_X);
919MAKE_CONST_WXSTRING(IMAGE_OPTION_CUR_HOTSPOT_Y);
920MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTION);
921MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTIONX);
922MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTIONY);
923MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTIONUNIT);
924MAKE_CONST_WXSTRING(IMAGE_OPTION_QUALITY);
925
926enum
927{
928 wxIMAGE_RESOLUTION_INCHES = 1,
929 wxIMAGE_RESOLUTION_CM = 2
930};
931
932
933MAKE_CONST_WXSTRING(IMAGE_OPTION_BITSPERSAMPLE);
934MAKE_CONST_WXSTRING(IMAGE_OPTION_SAMPLESPERPIXEL);
935MAKE_CONST_WXSTRING(IMAGE_OPTION_COMPRESSION);
936MAKE_CONST_WXSTRING(IMAGE_OPTION_IMAGEDESCRIPTOR);
937
938MAKE_CONST_WXSTRING(IMAGE_OPTION_PNG_FORMAT);
939MAKE_CONST_WXSTRING(IMAGE_OPTION_PNG_BITDEPTH);
940
941enum
942{
943 wxPNG_TYPE_COLOUR = 0,
944 wxPNG_TYPE_GREY = 2,
945 wxPNG_TYPE_GREY_RED = 3
946};
947
948enum
949{
950 wxBMP_24BPP = 24, // default, do not need to set
951 //wxBMP_16BPP = 16, // wxQuantize can only do 236 colors?
952 wxBMP_8BPP = 8, // 8bpp, quantized colors
953 wxBMP_8BPP_GREY = 9, // 8bpp, rgb averaged to greys
954 wxBMP_8BPP_GRAY = wxBMP_8BPP_GREY,
955 wxBMP_8BPP_RED = 10, // 8bpp, red used as greyscale
956 wxBMP_8BPP_PALETTE = 11, // 8bpp, use the wxImage's palette
957 wxBMP_4BPP = 4, // 4bpp, quantized colors
958 wxBMP_1BPP = 1, // 1bpp, quantized "colors"
959 wxBMP_1BPP_BW = 2 // 1bpp, black & white from red
960};
961
962
963DocStr(wxBMPHandler,
964"A `wx.ImageHandler` for \*.bmp bitmap files.", "");
965class wxBMPHandler : public wxImageHandler {
966public:
967 wxBMPHandler();
968};
969
970DocStr(wxICOHandler,
971"A `wx.ImageHandler` for \*.ico icon files.", "");
972class wxICOHandler : public wxBMPHandler {
973public:
974 wxICOHandler();
975};
976
977DocStr(wxCURHandler,
978"A `wx.ImageHandler` for \*.cur cursor files.", "");
979class wxCURHandler : public wxICOHandler {
980public:
981 wxCURHandler();
982};
983
984DocStr(wxANIHandler,
985"A `wx.ImageHandler` for \*.ani animated cursor files.", "");
986class wxANIHandler : public wxCURHandler {
987public:
988 wxANIHandler();
989};
990
991
992//---------------------------------------------------------------------------
993
994DocStr(wxPNGHandler,
995"A `wx.ImageHandler` for PNG image files.", "");
996class wxPNGHandler : public wxImageHandler {
997public:
998 wxPNGHandler();
999};
1000
1001
1002DocStr(wxGIFHandler,
1003"A `wx.ImageHandler` for GIF image files.", "");
1004class wxGIFHandler : public wxImageHandler {
1005public:
1006 wxGIFHandler();
1007};
1008
1009
1010DocStr(wxPCXHandler,
1011"A `wx.ImageHandler` for PCX imager files.", "");
1012class wxPCXHandler : public wxImageHandler {
1013public:
1014 wxPCXHandler();
1015};
1016
1017
1018DocStr(wxJPEGHandler,
1019"A `wx.ImageHandler` for JPEG/JPG image files.", "");
1020class wxJPEGHandler : public wxImageHandler {
1021public:
1022 wxJPEGHandler();
1023};
1024
1025
1026DocStr(wxPNMHandler,
1027"A `wx.ImageHandler` for PNM image files.", "");
1028class wxPNMHandler : public wxImageHandler {
1029public:
1030 wxPNMHandler();
1031};
1032
1033DocStr(wxXPMHandler,
1034"A `wx.ImageHandler` for XPM image.", "");
1035class wxXPMHandler : public wxImageHandler {
1036public:
1037 wxXPMHandler();
1038};
1039
1040DocStr(wxTIFFHandler,
1041"A `wx.ImageHandler` for TIFF image files.", "");
1042class wxTIFFHandler : public wxImageHandler {
1043public:
1044 wxTIFFHandler();
1045};
1046
1047
1048#if wxUSE_IFF
1049DocStr(wxIFFHandler,
1050"A `wx.ImageHandler` for IFF image files.", "");
1051class wxIFFHandler : public wxImageHandler {
1052public:
1053 wxIFFHandler();
1054};
1055#endif
1056
1057//---------------------------------------------------------------------------
1058
1059%{
1060#include <wx/quantize.h>
1061%}
1062
1063enum {
1064 wxQUANTIZE_INCLUDE_WINDOWS_COLOURS,
1065// wxQUANTIZE_RETURN_8BIT_DATA,
1066 wxQUANTIZE_FILL_DESTINATION_IMAGE
1067};
1068
1069
1070DocStr(wxQuantize,
1071 "Performs quantization, or colour reduction, on a wxImage.", "");
1072
1073class wxQuantize /*: public wxObject */
1074{
1075public:
1076
1077 %extend {
1078 DocStr(
1079 Quantize,
1080 "Reduce the colours in the source image and put the result into the
1081destination image, setting the palette in the destination if
1082needed. Both images may be the same, to overwrite the source image.", "
1083:todo: Create a version that returns the wx.Palette used.");
1084
1085 static bool Quantize(const wxImage& src, wxImage& dest, int desiredNoColours = 236,
1086 int flags = wxQUANTIZE_INCLUDE_WINDOWS_COLOURS|wxQUANTIZE_FILL_DESTINATION_IMAGE)
1087 {
1088 return wxQuantize::Quantize(src, dest,
1089 //NULL, // palette
1090 desiredNoColours,
1091 NULL, // eightBitData
1092 flags);
1093 }
1094 }
1095};
1096
1097
1098//---------------------------------------------------------------------------