]> git.saurik.com Git - wxWidgets.git/blobdiff - interface/wx/image.h
Make wxDataObjectComposite::GetObject() public.
[wxWidgets.git] / interface / wx / image.h
index a45715b2c47312f580409979b6cbb8ec30f5f3e4..04772440941a910b95fd996ccf9d00390fa10004 100644 (file)
@@ -23,6 +23,29 @@ enum wxImageResolution
     wxIMAGE_RESOLUTION_CM = 2
 };
 
+/**
+    Image resize algorithm.
+
+    This is used with wxImage::Scale() and wxImage::Rescale().
+ */
+enum wxImageResizeQuality
+{
+    /// Simplest and fastest algorithm.
+    wxIMAGE_QUALITY_NEAREST,
+
+    /// Compromise between wxIMAGE_QUALITY_NEAREST and wxIMAGE_QUALITY_BICUBIC.
+    wxIMAGE_QUALITY_BILINEAR,
+
+    /// Highest quality but slowest execution time.
+    wxIMAGE_QUALITY_BICUBIC,
+
+    /// Default image resizing algorithm used by wxImage::Scale().
+    wxIMAGE_QUALITY_NORMAL,
+
+    /// Best image resizing algorithm, currently same as wxIMAGE_QUALITY_BICUBIC.
+    wxIMAGE_QUALITY_HIGH
+};
+
 /**
     Possible values for PNG image type option.
 
@@ -44,7 +67,7 @@ enum wxImagePNGType
 
     If you wish to extend the capabilities of wxImage, derive a class from
     wxImageHandler and add the handler using wxImage::AddHandler in your
-    application initialisation.
+    application initialization.
 
     Note that all wxImageHandlers provided by wxWidgets are part of
     the @ref page_libs_wxcore library.
@@ -63,7 +86,7 @@ enum wxImagePNGType
     ::wxNullImage
 
     @library{wxcore}
-    @category{misc}
+    @category{gdi}
 
     @see wxImage, wxInitAllImageHandlers()
 */
@@ -84,10 +107,41 @@ public:
     virtual ~wxImageHandler();
 
     /**
-        Gets the file extension associated with this handler.
+        Returns @true if this handler supports the image format contained in the
+        given stream.
+
+        This function doesn't modify the current stream position (because it
+        restores the original position before returning; this however requires the
+        stream to be seekable; see wxStreamBase::IsSeekable).
+    */
+    bool CanRead( wxInputStream& stream );
+
+    /**
+        Returns @true if this handler supports the image format contained in the
+        file with the given name.
+
+        This function doesn't modify the current stream position (because it
+        restores the original position before returning; this however requires the
+        stream to be seekable; see wxStreamBase::IsSeekable).
+    */
+    bool CanRead( const wxString& filename );
+
+    /**
+        Gets the preferred file extension associated with this handler.
+
+        @see GetAltExtensions()
     */
     const wxString& GetExtension() const;
 
+    /**
+        Returns the other file extensions associated with this handler.
+
+        The preferred extension for this handler is returned by GetExtension().
+
+        @since 2.9.0
+    */
+    const wxArrayString& GetAltExtensions() const;
+
     /**
         If the image file contains more than one image and the image handler is capable
         of retrieving these individually, this function will return the number of
@@ -95,10 +149,14 @@ public:
 
         @param stream
             Opened input stream for reading image data.
-            Currently, the stream must support seeking.
+            This function doesn't modify the current stream position (because it
+            restores the original position before returning; this however requires the
+            stream to be seekable; see wxStreamBase::IsSeekable).
 
         @return Number of available images. For most image handlers, this is 1
-                (exceptions are TIFF and ICO formats).
+                (exceptions are TIFF and ICO formats as well as animated GIFs
+                for which this function returns the number of frames in the
+                animation).
     */
     virtual int GetImageCount(wxInputStream& stream);
 
@@ -160,13 +218,27 @@ public:
                           bool verbose = true);
 
     /**
-        Sets the handler extension.
+        Sets the preferred file extension associated with this handler.
 
         @param extension
-            Handler extension.
+            File extension without leading dot.
+
+        @see SetAltExtensions()
     */
     void SetExtension(const wxString& extension);
 
+    /**
+        Sets the alternative file extensions associated with this handler.
+
+        @param extensions
+            Array of file extensions.
+
+        @see SetExtension()
+
+        @since 2.9.0
+    */
+    void SetAltExtensions(const wxArrayString& extensions);
+
     /**
         Sets the handler MIME type.
 
@@ -227,10 +299,10 @@ const unsigned char wxIMAGE_ALPHA_OPAQUE = 0xff;
     The constants ::wxIMAGE_ALPHA_TRANSPARENT and ::wxIMAGE_ALPHA_OPAQUE can be
     used to indicate those values in a more readable form.
 
-    Unlike RGB data, not all images have an alpha channel and before using
-    wxImage::GetAlpha you should check if this image contains an alpha channel
-    with wxImage::HasAlpha. Note that currently only the PNG format has full
-    alpha channel support so only the images loaded from PNG files can have
+    While all images have RGB data, not all images have an alpha channel. Before
+    using wxImage::GetAlpha you should check if this image contains an alpha
+    channel with wxImage::HasAlpha. Note that currently only the PNG format has
+    full alpha channel support so only the images loaded from PNG files can have
     alpha and, if you initialize the image alpha channel yourself using
     wxImage::SetAlpha, you should save it in PNG format to avoid losing it.
 
@@ -275,6 +347,10 @@ const unsigned char wxIMAGE_ALPHA_OPAQUE = 0xff;
 class wxImage : public wxObject
 {
 public:
+    /**
+        A simple class which stores red, green and blue values as 8 bit unsigned integers
+        in the range of 0-255.
+    */
     class RGBValue
     {
     public:
@@ -282,12 +358,15 @@ public:
             Constructor for RGBValue, an object that contains values for red, green
             and blue which represent the value of a color.
 
-            It is used by wxImage::HSVtoRGB and wxImage::RGBtoHSV, which converts
+            It is used by wxImage::HSVtoRGB and wxImage::RGBtoHSV, which convert
             between HSV color space and RGB color space.
         */
         RGBValue(unsigned char r=0, unsigned char g=0, unsigned char b=0);
     };
 
+    /**
+        A simple class which stores hue, saturation and value as doubles in the range 0.0-1.0.
+    */
     class HSVValue
     {
     public:
@@ -295,7 +374,7 @@ public:
             Constructor for HSVValue, an object that contains values for hue, saturation
             and value which represent the value of a color.
 
-            It is used by wxImage::HSVtoRGB() and wxImage::RGBtoHSV(), which converts
+            It is used by wxImage::HSVtoRGB() and wxImage::RGBtoHSV(), which convert
             between HSV color space and RGB color space.
         */
         HSVValue(double h=0.0, double s=0.0, double v=0.0);
@@ -320,6 +399,11 @@ public:
     */
     wxImage(int width, int height, bool clear = true);
 
+    /**
+        @overload
+    */
+    wxImage(const wxSize& sz, bool clear = true);
+
     /**
         Creates an image from data in memory. If @a static_data is @false
         then the wxImage will take ownership of the data and free it
@@ -335,7 +419,12 @@ public:
             Indicates if the data should be free'd after use
 
     */
-    wxImage(int width, int height, unsigned char* data,  bool static_data = false);
+    wxImage(int width, int height, unsigned char* data, bool static_data = false);
+
+    /**
+        @overload
+    */
+    wxImage(const wxSize& sz, unsigned char* data, bool static_data = false);
 
     /**
         Creates an image from data in memory. If @a static_data is @false
@@ -357,11 +446,21 @@ public:
     wxImage(int width, int height, unsigned char* data, unsigned char* alpha,
             bool static_data = false );
 
+    /**
+        @overload
+    */
+    wxImage(const wxSize& sz, unsigned char* data, unsigned char* data, unsigned char* alpha,
+            bool static_data = false);
+
     /**
         Creates an image from XPM data.
 
         @param xpmData
             A pointer to XPM image data.
+
+        @beginWxPerlOnly
+        Not supported by wxPerl.
+        @endWxPerlOnly
     */
     wxImage(const char* const* xpmData);
 
@@ -446,7 +545,6 @@ public:
     */
     wxImage(wxInputStream& stream, const wxString& mimetype, int index = -1);
 
-
     /**
         Destructor.
 
@@ -455,244 +553,399 @@ public:
     */
     virtual ~wxImage();
 
+
+
     /**
-        Register an image handler.
+        @name Image creation, initialization and deletion functions
     */
-    static void AddHandler(wxImageHandler* handler);
+    //@{
 
     /**
-        Blurs the image in both horizontal and vertical directions by the
-        specified pixel @a blurRadius. This should not be used when using
-        a single mask colour for transparency.
-
-        @see BlurHorizontal(), BlurVertical()
+        Returns an identical copy of this image.
     */
-    wxImage Blur(int blurRadius) const;
+    wxImage Copy() const;
 
     /**
-        Blurs the image in the horizontal direction only. This should not be used
-        when using a single mask colour for transparency.
+        Creates a fresh image.
+        See wxImage::wxImage(int,int,bool) for more info.
 
-        @see Blur(), BlurVertical()
+        @return @true if the call succeeded, @false otherwise.
     */
-    wxImage BlurHorizontal(int blurRadius) const;
+    bool Create(int width, int height, bool clear = true);
 
     /**
-        Blurs the image in the vertical direction only. This should not be used
-        when using a single mask colour for transparency.
-
-        @see Blur(), BlurHorizontal()
+        @overload
     */
-    wxImage BlurVertical(int blurRadius) const;
+    bool Create( const wxSize& sz, bool clear = true );
 
     /**
-        Returns @true if the current image handlers can read this file
+        Creates a fresh image.
+        See wxImage::wxImage(int,int,unsigned char*,bool) for more info.
+
+        @return @true if the call succeeded, @false otherwise.
     */
-    static bool CanRead(const wxString& filename);
+    bool Create( int width, int height, unsigned char* data, bool static_data = false );
 
     /**
-        Deletes all image handlers.
-        This function is called by wxWidgets on exit.
+        @overload
     */
-    static void CleanUpHandlers();
+    bool Create( const wxSize& sz, unsigned char* data, bool static_data = false );
 
     /**
-        Computes the histogram of the image. @a histogram is a reference to
-        wxImageHistogram object. wxImageHistogram is a specialization of
-        wxHashMap "template" and is defined as follows:
-
-        @code
-        class WXDLLEXPORT wxImageHistogramEntry
-        {
-        public:
-            wxImageHistogramEntry() : index(0), value(0) {}
-            unsigned long index;
-            unsigned long value;
-        };
-
-        WX_DECLARE_EXPORTED_HASH_MAP(unsigned long, wxImageHistogramEntry,
-                                    wxIntegerHash, wxIntegerEqual,
-                                    wxImageHistogram);
-        @endcode
+        Creates a fresh image.
+        See wxImage::wxImage(int,int,unsigned char*,unsigned char*,bool) for more info.
 
-        @return Returns number of colours in the histogram.
+        @return @true if the call succeeded, @false otherwise.
     */
-    unsigned long ComputeHistogram(wxImageHistogram& histogram) const;
+    bool Create( int width, int height, unsigned char* data, unsigned char* alpha, bool static_data = false );
 
-    //@{
     /**
-        If the image has alpha channel, this method converts it to mask.
-
-        If the image has an alpha channel, all pixels with alpha value less
-        than @a threshold are replaced with the mask colour and the alpha
-        channel is removed. Otherwise nothing is done.
-        
-        The mask colour is chosen automatically using
-        FindFirstUnusedColour() by this function, see the overload below if you
-        this is not appropriate.
-
-        @return @false if FindFirstUnusedColour returns @false, @true otherwise.
+        @overload
     */
-    bool ConvertAlphaToMask(unsigned char threshold = wxIMAGE_ALPHA_THRESHOLD);
+    bool Create( const wxSize& sz, unsigned char* data, unsigned char* alpha, bool static_data = false );
 
     /**
-        If the image has alpha channel, this method converts it to mask using
-        the specified colour as the mask colour.
-
-        If the image has an alpha channel, all pixels with alpha value less
-        than @a threshold are replaced with the mask colour and the alpha
-        channel is removed. Otherwise nothing is done.
+        Initialize the image data with zeroes (the default) or with the
+        byte value given as @a value.
 
         @since 2.9.0
-
-        @param mr
-            The red component of the mask colour.
-        @param mg
-            The green component of the mask colour.
-        @param mb
-            The blue component of the mask colour.
-        @param threshold
-            Pixels with alpha channel values below the given threshold are
-            considered to be transparent, i.e. the corresponding mask pixels
-            are set. Pixels with the alpha values above the threshold are
-            considered to be opaque.
-
-     */
-    void ConvertAlphaToMask(unsigned char mr, unsigned char mg, unsigned char mb, 
-                            unsigned char threshold = wxIMAGE_ALPHA_THRESHOLD);
-    //@}
+    */
+    void Clear(unsigned char value = 0);
 
     /**
-        Returns a greyscale version of the image.
-
-        The returned image uses the luminance component of the original to
-        calculate the greyscale. Defaults to using the standard ITU-T BT.601
-        when converting to YUV, where every pixel equals
-        (R * @a lr) + (G * @a lg) + (B * @a lb).
+        Destroys the image data.
     */
-    wxImage ConvertToGreyscale(double lr = 0.299, double lg = 0.587, double lb = 1.114) const;
+    void Destroy();
 
     /**
-        Returns monochromatic version of the image.
+        Initializes the image alpha channel data.
 
-        The returned image has white colour where the original has @e (r,g,b)
-        colour and black colour everywhere else.
+        It is an error to call it if the image already has alpha data.
+        If it doesn't, alpha data will be by default initialized to all pixels
+        being fully opaque. But if the image has a mask colour, all mask pixels
+        will be completely transparent.
     */
-    wxImage ConvertToMono(unsigned char r, unsigned char g, unsigned char b) const;
+    void InitAlpha();
+
+    //@}
+
 
     /**
-        Returns an identical copy of the image.
+        @name Image manipulation functions
     */
-    wxImage Copy() const;
+    //@{
 
     /**
-        Creates a fresh image.
+        Blurs the image in both horizontal and vertical directions by the
+        specified pixel @a blurRadius. This should not be used when using
+        a single mask colour for transparency.
 
-        If @a clear is @true, the new image will be initialized to black.
-        Otherwise, the image data will be uninitialized.
+        @see BlurHorizontal(), BlurVertical()
+    */
+    wxImage Blur(int blurRadius) const;
 
-        @param width
-            The width of the image in pixels.
-        @param height
-            The height of the image in pixels.
-        @param clear
-            If @true, initialize the image data with zeroes.
+    /**
+        Blurs the image in the horizontal direction only. This should not be used
+        when using a single mask colour for transparency.
 
-        @return @true if the call succeeded, @false otherwise.
+        @see Blur(), BlurVertical()
     */
-    bool Create(int width, int height, bool clear = true);
+    wxImage BlurHorizontal(int blurRadius) const;
 
     /**
-        Initialize the image data with zeroes (the default) or with the
-        byte value given as @a value.
+        Blurs the image in the vertical direction only. This should not be used
+        when using a single mask colour for transparency.
 
-        @since 2.9.0
+        @see Blur(), BlurHorizontal()
     */
-    void Clear(unsigned char value = 0);
+    wxImage BlurVertical(int blurRadius) const;
 
     /**
-        Destroys the image data.
+        Returns a mirrored copy of the image.
+        The parameter @a horizontally indicates the orientation.
     */
-    void Destroy();
+    wxImage Mirror(bool horizontally = true) const;
 
     /**
-        Finds the first colour that is never used in the image.
-        The search begins at given initial colour and continues by increasing
-        R, G and B components (in this order) by 1 until an unused colour is
-        found or the colour space exhausted.
+        Copy the data of the given @a image to the specified position in this image.
+    */
+    void Paste(const wxImage& image, int x, int y);
 
-        The parameters @a r, @a g, @a b are pointers to variables to save the colour.
+    /**
+        Replaces the colour specified by @e r1,g1,b1 by the colour @e r2,g2,b2.
+    */
+    void Replace(unsigned char r1, unsigned char g1,
+                 unsigned char b1, unsigned char r2,
+                 unsigned char g2, unsigned char b2);
 
-        The parameters @a startR, @a startG, @a startB define the initial values
-        of the colour.
-        The returned colour will have RGB values equal to or greater than these.
+    /**
+        Changes the size of the image in-place by scaling it: after a call to this
+        function,the image will have the given width and height.
 
-        @return Returns @false if there is no unused colour left, @true on success.
+        For a description of the @a quality parameter, see the Scale() function.
+        Returns the (modified) image itself.
 
-        @note
-            This method involves computing the histogram, which is a
-            computationally intensive operation.
+        @see Scale()
     */
-    bool FindFirstUnusedColour(unsigned char* r, unsigned char* g,
-                               unsigned char* b, unsigned char startR = 1,
-                               unsigned char startG = 0,
-                               unsigned char startB = 0) const;
+    wxImage& Rescale(int width, int height,
+                     wxImageResizeQuality quality = wxIMAGE_QUALITY_NORMAL);
 
     /**
-        Finds the handler with the given name.
+        Changes the size of the image in-place without scaling it by adding either a
+        border with the given colour or cropping as necessary.
 
-        @param name
-            The handler name.
+        The image is pasted into a new image with the given @a size and background
+        colour at the position @a pos relative to the upper left of the new image.
 
-        @return A pointer to the handler if found, @NULL otherwise.
+        If @a red = green = blue = -1 then use either the  current mask colour
+        if set or find, use, and set a suitable mask colour for any newly exposed
+        areas.
 
-        @see wxImageHandler
+        @return The (modified) image itself.
+
+        @see Size()
     */
-    static wxImageHandler* FindHandler(const wxString& name);
+    wxImage& Resize(const wxSize& size, const wxPoint& pos, int red = -1,
+                    int green = -1, int blue = -1);
 
     /**
-        Finds the handler associated with the given extension and type.
+        Rotates the image about the given point, by @a angle radians.
 
-        @param extension
-            The file extension, such as "bmp".
-        @param imageType
-            The image type; one of the ::wxBitmapType values.
+        Passing @true to @a interpolating results in better image quality, but is slower.
 
-        @return A pointer to the handler if found, @NULL otherwise.
+        If the image has a mask, then the mask colour is used for the uncovered
+        pixels in the rotated image background. Else, black (rgb 0, 0, 0) will be used.
 
-        @see wxImageHandler
+        Returns the rotated image, leaving this image intact.
     */
-    static wxImageHandler* FindHandler(const wxString& extension,
-                                       wxBitmapType imageType);
+    wxImage Rotate(double angle, const wxPoint& rotationCentre,
+                   bool interpolating = true,
+                   wxPoint* offsetAfterRotation = NULL) const;
 
     /**
-        Finds the handler associated with the given image type.
+        Returns a copy of the image rotated 90 degrees in the direction
+        indicated by @a clockwise.
+    */
+    wxImage Rotate90(bool clockwise = true) const;
 
-        @param imageType
-            The image type; one of the ::wxBitmapType values.
+    /**
+        Rotates the hue of each pixel in the image by @e angle, which is a double in
+        the range of -1.0 to +1.0, where -1.0 corresponds to -360 degrees and +1.0
+        corresponds to +360 degrees.
+    */
+    void RotateHue(double angle);
 
-        @return A pointer to the handler if found, @NULL otherwise.
+    /**
+        Returns a scaled version of the image.
 
-        @see wxImageHandler
+        This is also useful for scaling bitmaps in general as the only other way
+        to scale bitmaps is to blit a wxMemoryDC into another wxMemoryDC.
+
+        The parameter @a quality determines what method to use for resampling
+        the image, see wxImageResizeQuality documentation.
+
+        It should be noted that although using @c wxIMAGE_QUALITY_HIGH produces much nicer
+        looking results it is a slower method. Downsampling will use the box averaging
+        method which seems to operate very fast. If you are upsampling larger images using
+        this method you will most likely notice that it is a bit slower and in extreme
+        cases it will be quite substantially slower as the bicubic algorithm has to process a
+        lot of data.
+
+        It should also be noted that the high quality scaling may not work as expected
+        when using a single mask colour for transparency, as the scaling will blur the
+        image and will therefore remove the mask partially. Using the alpha channel
+        will work.
+
+        Example:
+        @code
+        // get the bitmap from somewhere
+        wxBitmap bmp = ...;
+
+        // rescale it to have size of 32*32
+        if ( bmp.GetWidth() != 32 || bmp.GetHeight() != 32 )
+        {
+            wxImage image = bmp.ConvertToImage();
+            bmp = wxBitmap(image.Scale(32, 32));
+
+            // another possibility:
+            image.Rescale(32, 32);
+            bmp = image;
+        }
+        @endcode
+
+        @see Rescale()
     */
-    static wxImageHandler* FindHandler(wxBitmapType imageType);
+    wxImage Scale(int width, int height,
+                   wxImageResizeQuality quality = wxIMAGE_QUALITY_NORMAL) const;
 
     /**
-        Finds the handler associated with the given MIME type.
+        Returns a resized version of this image without scaling it by adding either a
+        border with the given colour or cropping as necessary.
 
-        @param mimetype
-            MIME type.
+        The image is pasted into a new image with the given @a size and background
+        colour at the position @a pos relative to the upper left of the new image.
 
-        @return A pointer to the handler if found, @NULL otherwise.
+        If @a red = green = blue = -1 then the areas of the larger image not covered
+        by this image are made transparent by filling them with the image mask colour
+        (which will be allocated automatically if it isn't currently set).
 
-        @see wxImageHandler
+        Otherwise, the areas will be filled with the colour with the specified RGB components.
+
+        @see Resize()
     */
-    static wxImageHandler* FindHandlerMime(const wxString& mimetype);
+    wxImage Size(const wxSize& size, const wxPoint& pos, int red = -1,
+                 int green = -1, int blue = -1) const;
+
+    //@}
+
 
     /**
-        Return alpha value at given pixel location.
+        @name Conversion functions
     */
-    unsigned char GetAlpha(int x, int y) const;
+    //@{
+
+    /**
+        If the image has alpha channel, this method converts it to mask.
+
+        If the image has an alpha channel, all pixels with alpha value less
+        than @a threshold are replaced with the mask colour and the alpha
+        channel is removed. Otherwise nothing is done.
+
+        The mask colour is chosen automatically using
+        FindFirstUnusedColour() by this function, see the overload below if you
+        this is not appropriate.
+
+        @return @false if FindFirstUnusedColour returns @false, @true otherwise.
+    */
+    bool ConvertAlphaToMask(unsigned char threshold = wxIMAGE_ALPHA_THRESHOLD);
+
+    /**
+        If the image has alpha channel, this method converts it to mask using
+        the specified colour as the mask colour.
+
+        If the image has an alpha channel, all pixels with alpha value less
+        than @a threshold are replaced with the mask colour and the alpha
+        channel is removed. Otherwise nothing is done.
+
+        @since 2.9.0
+
+        @param mr
+            The red component of the mask colour.
+        @param mg
+            The green component of the mask colour.
+        @param mb
+            The blue component of the mask colour.
+        @param threshold
+            Pixels with alpha channel values below the given threshold are
+            considered to be transparent, i.e. the corresponding mask pixels
+            are set. Pixels with the alpha values above the threshold are
+            considered to be opaque.
+
+     */
+    void ConvertAlphaToMask(unsigned char mr, unsigned char mg, unsigned char mb,
+                            unsigned char threshold = wxIMAGE_ALPHA_THRESHOLD);
+
+    /**
+        Returns a greyscale version of the image.
+
+        The returned image uses the luminance component of the original to
+        calculate the greyscale. Defaults to using the standard ITU-T BT.601
+        when converting to YUV, where every pixel equals
+        (R * @a weight_r) + (G * @a weight_g) + (B * @a weight_b).
+    */
+    wxImage ConvertToGreyscale(double weight_r, double weight_g, double weight_b) const;
+
+    /**
+        Returns a greyscale version of the image.
+        @since 2.9.0
+    */
+    wxImage ConvertToGreyscale() const;
+
+    /**
+        Returns monochromatic version of the image.
+
+        The returned image has white colour where the original has @e (r,g,b)
+        colour and black colour everywhere else.
+    */
+    wxImage ConvertToMono(unsigned char r, unsigned char g, unsigned char b) const;
+
+    /**
+        Returns disabled (dimmed) version of the image.
+        @since 2.9.0
+    */
+    wxImage ConvertToDisabled(unsigned char brightness = 255) const;
+
+    //@}
+
+
+    /**
+        @name Miscellaneous functions
+    */
+    //@{
+
+    /**
+        Computes the histogram of the image. @a histogram is a reference to
+        wxImageHistogram object. wxImageHistogram is a specialization of
+        wxHashMap "template" and is defined as follows:
+
+        @code
+        class WXDLLEXPORT wxImageHistogramEntry
+        {
+        public:
+            wxImageHistogramEntry() : index(0), value(0) {}
+            unsigned long index;
+            unsigned long value;
+        };
+
+        WX_DECLARE_EXPORTED_HASH_MAP(unsigned long, wxImageHistogramEntry,
+                                    wxIntegerHash, wxIntegerEqual,
+                                    wxImageHistogram);
+        @endcode
+
+        @return Returns number of colours in the histogram.
+    */
+    unsigned long ComputeHistogram(wxImageHistogram& histogram) const;
+
+    /**
+        Finds the first colour that is never used in the image.
+        The search begins at given initial colour and continues by increasing
+        R, G and B components (in this order) by 1 until an unused colour is
+        found or the colour space exhausted.
+
+        The parameters @a r, @a g, @a b are pointers to variables to save the colour.
+
+        The parameters @a startR, @a startG, @a startB define the initial values
+        of the colour.
+        The returned colour will have RGB values equal to or greater than these.
+
+        @return Returns @false if there is no unused colour left, @true on success.
+
+        @note
+            This method involves computing the histogram, which is a
+            computationally intensive operation.
+    */
+    bool FindFirstUnusedColour(unsigned char* r, unsigned char* g,
+                               unsigned char* b, unsigned char startR = 1,
+                               unsigned char startG = 0,
+                               unsigned char startB = 0) const;
+
+    /**
+        Assignment operator, using @ref overview_refcount "reference counting".
+
+        @param image
+            Image to assign.
+
+        @return Returns 'this' object.
+    */
+    wxImage& operator=(const wxImage& image);
+
+    //@}
+
+
+    /**
+        @name Getters
+    */
+    //@{
 
     /**
         Returns pointer to the array storing the alpha values for this image.
@@ -703,11 +956,6 @@ public:
     */
     unsigned char* GetAlpha() const;
 
-    /**
-        Returns the blue intensity at the given coordinate.
-    */
-    unsigned char GetBlue(int x, int y) const;
-
     /**
         Returns the image data as an array.
 
@@ -723,76 +971,34 @@ public:
     unsigned char* GetData() const;
 
     /**
-        Returns the green intensity at the given coordinate.
+        Return alpha value at given pixel location.
     */
-    unsigned char GetGreen(int x, int y) const;
+    unsigned char GetAlpha(int x, int y) const;
 
     /**
-        Returns the static list of image format handlers.
-
-        @see wxImageHandler
+        Returns the red intensity at the given coordinate.
     */
-    static wxList& GetHandlers();
+    unsigned char GetRed(int x, int y) const;
 
     /**
-        Gets the height of the image in pixels.
-
-        @see GetWidth(), GetSize()
+        Returns the green intensity at the given coordinate.
     */
-    int GetHeight() const;
+    unsigned char GetGreen(int x, int y) const;
 
-    //@{
     /**
-        If the image file contains more than one image and the image handler is
-        capable of retrieving these individually, this function will return the
-        number of available images.
-
-        For the overload taking the parameter @a filename, that's the name
-        of the file to query.
-        For the overload taking the parameter @a stream, that's the ppened input
-        stream with image data. Currently, the stream must support seeking.
-
-        The parameter @a type may be one of the following values:
-        @li wxBITMAP_TYPE_BMP: Load a Windows bitmap file.
-        @li wxBITMAP_TYPE_GIF: Load a GIF bitmap file.
-        @li wxBITMAP_TYPE_JPEG: Load a JPEG bitmap file.
-        @li wxBITMAP_TYPE_PNG: Load a PNG bitmap file.
-        @li wxBITMAP_TYPE_PCX: Load a PCX bitmap file.
-        @li wxBITMAP_TYPE_PNM: Load a PNM bitmap file.
-        @li wxBITMAP_TYPE_TIF: Load a TIFF bitmap file.
-        @li wxBITMAP_TYPE_TGA: Load a TGA bitmap file.
-        @li wxBITMAP_TYPE_XPM: Load a XPM bitmap file.
-        @li wxBITMAP_TYPE_ICO: Load a Windows icon file (ICO).
-        @li wxBITMAP_TYPE_CUR: Load a Windows cursor file (CUR).
-        @li wxBITMAP_TYPE_ANI: Load a Windows animated cursor file (ANI).
-        @li wxBITMAP_TYPE_ANY: Will try to autodetect the format.
-
-        @return Number of available images. For most image handlers, this is 1
-                (exceptions are TIFF and ICO formats).
+        Returns the blue intensity at the given coordinate.
     */
-    static int GetImageCount(const wxString& filename,
-                             wxBitmapType type = wxBITMAP_TYPE_ANY);
-    static int GetImageCount(wxInputStream& stream,
-                             wxBitmapType type = wxBITMAP_TYPE_ANY);
-    //@}
+    unsigned char GetBlue(int x, int y) const;
 
     /**
-        Iterates all registered wxImageHandler objects, and returns a string containing
-        file extension masks suitable for passing to file open/save dialog boxes.
-
-        @return The format of the returned string is @c "(*.ext1;*.ext2)|*.ext1;*.ext2".
-                It is usually a good idea to prepend a description before passing
-                the result to the dialog.
-                Example:
-                @code
-                wxFileDialog FileDlg( this, "Choose Image", ::wxGetCwd(), "",
-                                      _("Image Files ") + wxImage::GetImageExtWildcard(),
-                                      wxFD_OPEN );
-                @endcode
+        Gets the red value of the mask colour.
+    */
+    unsigned char GetMaskRed() const;
 
-        @see wxImageHandler
+    /**
+        Gets the green value of the mask colour.
     */
-    static wxString GetImageExtWildcard();
+    unsigned char GetMaskGreen() const;
 
     /**
         Gets the blue value of the mask colour.
@@ -800,14 +1006,27 @@ public:
     unsigned char GetMaskBlue() const;
 
     /**
-        Gets the green value of the mask colour.
+        Gets the width of the image in pixels.
+
+        @see GetHeight(), GetSize()
     */
-    unsigned char GetMaskGreen() const;
+    int GetWidth() const;
 
     /**
-        Gets the red value of the mask colour.
+        Gets the height of the image in pixels.
+
+        @see GetWidth(), GetSize()
     */
-    unsigned char GetMaskRed() const;
+    int GetHeight() const;
+
+    /**
+        Returns the size of the image in pixels.
+
+        @since 2.9.0
+
+        @see GetHeight(), GetWidth()
+    */
+    wxSize GetSize() const;
 
     /**
         Gets a user-defined string-valued option.
@@ -917,26 +1136,12 @@ public:
     */
     const wxPalette& GetPalette() const;
 
-    /**
-        Returns the red intensity at the given coordinate.
-    */
-    unsigned char GetRed(int x, int y) const;
-
     /**
         Returns a sub image of the current one as long as the rect belongs entirely
         to the image.
     */
     wxImage GetSubImage(const wxRect& rect) const;
 
-    /**
-        Returns the size of the image in pixels.
-
-        @since 2.9.0
-
-        @see GetHeight(), GetWidth()
-    */
-    wxSize GetSize() const;
-
     /**
         Gets the type of image found by LoadFile() or specified with SaveFile().
 
@@ -944,18 +1149,6 @@ public:
     */
     wxBitmapType GetType() const;
 
-    /**
-        Gets the width of the image in pixels.
-
-        @see GetHeight(), GetSize()
-    */
-    int GetWidth() const;
-
-    /**
-        Converts a color in HSV color space to RGB color space.
-    */
-    static wxImage::RGBValue HSVtoRGB(const wxImage::HSVValue& hsv);
-
     /**
         Returns @true if this image has alpha channel, @false otherwise.
 
@@ -979,38 +1172,6 @@ public:
     */
     bool HasOption(const wxString& name) const;
 
-    /**
-        Initializes the image alpha channel data.
-
-        It is an error to call it if the image already has alpha data.
-        If it doesn't, alpha data will be by default initialized to all pixels
-        being fully opaque. But if the image has a mask colour, all mask pixels
-        will be completely transparent.
-    */
-    void InitAlpha();
-
-    /**
-        Internal use only. Adds standard image format handlers.
-        It only install wxBMPHandler for the time being, which is used by wxBitmap.
-
-        This function is called by wxWidgets on startup, and shouldn't be called by
-        the user.
-
-        @see wxImageHandler, wxInitAllImageHandlers(), wxQuantize
-    */
-    static void InitStandardHandlers();
-
-    /**
-        Adds a handler at the start of the static list of format handlers.
-
-        @param handler
-            A new image format handler object. There is usually only one instance
-            of a given handler class in an application session.
-
-        @see wxImageHandler
-    */
-    static void InsertHandler(wxImageHandler* handler);
-
     /**
         Returns @true if image data is present.
     */
@@ -1024,6 +1185,14 @@ public:
     bool IsTransparent(int x, int y,
                        unsigned char threshold = wxIMAGE_ALPHA_THRESHOLD) const;
 
+    //@}
+
+
+    /**
+        @name Loading and saving functions
+    */
+    //@{
+
     /**
         Loads an image from an input stream.
 
@@ -1096,118 +1265,24 @@ public:
         @param mimetype
             MIME type string (for example 'image/jpeg')
         @param index
-            See the description in the LoadFile(wxInputStream&, wxBitmapType, int) overload.
-    */
-    virtual bool LoadFile(const wxString& name, const wxString& mimetype,
-                          int index = -1);
-
-
-    /**
-        Loads an image from an input stream.
-
-        @param stream
-            Opened input stream from which to load the image.
-            Currently, the stream must support seeking.
-        @param mimetype
-            MIME type string (for example 'image/jpeg')
-        @param index
-            See the description in the LoadFile(wxInputStream&, wxBitmapType, int) overload.
-    */
-    virtual bool LoadFile(wxInputStream& stream, const wxString& mimetype,
-                          int index = -1);
-
-    /**
-        Returns a mirrored copy of the image.
-        The parameter @a horizontally indicates the orientation.
-    */
-    wxImage Mirror(bool horizontally = true) const;
-
-    /**
-        Copy the data of the given @a image to the specified position in this image.
-    */
-    void Paste(const wxImage& image, int x, int y);
-
-    /**
-        Converts a color in RGB color space to HSV color space.
-    */
-    static wxImage::HSVValue RGBtoHSV(const wxImage::RGBValue& rgb);
-
-    /**
-        Finds the handler with the given name, and removes it.
-        The handler is not deleted.
-
-        @param name
-            The handler name.
-
-        @return @true if the handler was found and removed, @false otherwise.
-
-        @see wxImageHandler
-    */
-    static bool RemoveHandler(const wxString& name);
-
-    /**
-        Replaces the colour specified by @e r1,g1,b1 by the colour @e r2,g2,b2.
-    */
-    void Replace(unsigned char r1, unsigned char g1,
-                 unsigned char b1, unsigned char r2,
-                 unsigned char g2, unsigned char b2);
-
-    /**
-        Changes the size of the image in-place by scaling it: after a call to this
-        function,the image will have the given width and height.
-
-        For a description of the @a quality parameter, see the Scale() function.
-        Returns the (modified) image itself.
-
-        @see Scale()
-    */
-    wxImage& Rescale(int width, int height,
-                    int quality = wxIMAGE_QUALITY_NORMAL);
-
-    /**
-        Changes the size of the image in-place without scaling it by adding either a
-        border with the given colour or cropping as necessary.
-
-        The image is pasted into a new image with the given @a size and background
-        colour at the position @a pos relative to the upper left of the new image.
-
-        If @a red = green = blue = -1 then use either the  current mask colour
-        if set or find, use, and set a suitable mask colour for any newly exposed
-        areas.
-
-        @return The (modified) image itself.
-
-        @see Size()
-    */
-    wxImage& Resize(const wxSize& size, const wxPoint& pos, int red = -1,
-                    int green = -1, int blue = -1);
-
-    /**
-        Rotates the image about the given point, by @a angle radians.
-
-        Passing @true to @a interpolating results in better image quality, but is slower.
-
-        If the image has a mask, then the mask colour is used for the uncovered
-        pixels in the rotated image background. Else, black (rgb 0, 0, 0) will be used.
-
-        Returns the rotated image, leaving this image intact.
-    */
-    wxImage Rotate(double angle, const wxPoint& rotationCentre,
-                   bool interpolating = true,
-                   wxPoint* offsetAfterRotation = NULL) const;
-
-    /**
-        Returns a copy of the image rotated 90 degrees in the direction
-        indicated by @a clockwise.
+            See the description in the LoadFile(wxInputStream&, wxBitmapType, int) overload.
     */
-    wxImage Rotate90(bool clockwise = true) const;
+    virtual bool LoadFile(const wxString& name, const wxString& mimetype,
+                          int index = -1);
 
     /**
-        Rotates the hue of each pixel in the image by @e angle, which is a double in
-        the range of -1.0 to +1.0, where -1.0 corresponds to -360 degrees and +1.0
-        corresponds to +360 degrees.
+        Loads an image from an input stream.
+
+        @param stream
+            Opened input stream from which to load the image.
+            Currently, the stream must support seeking.
+        @param mimetype
+            MIME type string (for example 'image/jpeg')
+        @param index
+            See the description in the LoadFile(wxInputStream&, wxBitmapType, int) overload.
     */
-    void RotateHue(double angle);
+    virtual bool LoadFile(wxInputStream& stream, const wxString& mimetype,
+                          int index = -1);
 
     /**
         Saves an image in the given stream.
@@ -1290,52 +1365,14 @@ public:
     */
     virtual bool SaveFile(wxOutputStream& stream, wxBitmapType type) const;
 
-    /**
-        Returns a scaled version of the image.
-
-        This is also useful for scaling bitmaps in general as the only other way
-        to scale bitmaps is to blit a wxMemoryDC into another wxMemoryDC.
-
-        The parameter @a quality determines what method to use for resampling the image.
-        Can be one of the following:
-        - wxIMAGE_QUALITY_NORMAL: Uses the normal default scaling method of pixel
-                                  replication
-        - wxIMAGE_QUALITY_HIGH: Uses bicubic and box averaging resampling methods
-                                for upsampling and downsampling respectively
-
-        It should be noted that although using @c wxIMAGE_QUALITY_HIGH produces much nicer
-        looking results it is a slower method. Downsampling will use the box averaging
-        method which seems to operate very fast. If you are upsampling larger images using
-        this method you will most likely notice that it is a bit slower and in extreme
-        cases it will be quite substantially slower as the bicubic algorithm has to process a
-        lot of data.
-
-        It should also be noted that the high quality scaling may not work as expected
-        when using a single mask colour for transparency, as the scaling will blur the
-        image and will therefore remove the mask partially. Using the alpha channel
-        will work.
-
-        Example:
-        @code
-        // get the bitmap from somewhere
-        wxBitmap bmp = ...;
+    //@}
 
-        // rescale it to have size of 32*32
-        if ( bmp.GetWidth() != 32 || bmp.GetHeight() != 32 )
-        {
-            wxImage image = bmp.ConvertToImage();
-            bmp = wxBitmap(image.Scale(32, 32));
 
-            // another possibility:
-            image.Rescale(32, 32);
-            bmp = image;
-        }
-        @endcode
 
-        @see Rescale()
+    /**
+        @name Setters
     */
-    wxImage Scale(int width, int height,
-                  int quality = wxIMAGE_QUALITY_NORMAL) const;
+    //@{
 
     /**
        This function is similar to SetData() and has similar restrictions.
@@ -1359,7 +1396,6 @@ public:
     */
     void SetAlpha(int x, int y, unsigned char alpha);
 
-    //@{
     /**
         Sets the image data without performing checks.
 
@@ -1370,14 +1406,17 @@ public:
         The data must have been allocated with @c malloc(), @b NOT with
         @c operator new.
 
-        After this call the pointer to the data is owned by the wxImage object,
-        that will be responsible for deleting it.
+        If @a static_data is @false, after this call the pointer to the data is
+        owned by the wxImage object, that will be responsible for deleting it.
         Do not pass to this function a pointer obtained through GetData().
     */
     void SetData(unsigned char* data, bool static_data = false);
+
+    /**
+        @overload
+    */
     void SetData(unsigned char* data, int new_width, int new_height,
                  bool static_data = false);
-    //@}
 
     /**
         Specifies whether there is a mask or not.
@@ -1418,7 +1457,6 @@ public:
                           unsigned char mg,
                           unsigned char mb);
 
-    //@{
     /**
         Sets a user-defined option. The function is case-insensitive to @a name.
 
@@ -1431,8 +1469,11 @@ public:
         @see GetOption(), GetOptionInt(), HasOption()
     */
     void SetOption(const wxString& name, const wxString& value);
+
+    /**
+        @overload
+    */
     void SetOption(const wxString& name, int value);
-    //@}
 
     /**
         Associates a palette with the image.
@@ -1472,33 +1513,205 @@ public:
     */
     void SetType(wxBitmapType type);
 
+    //@}
+
+
+
     /**
-        Returns a resized version of this image without scaling it by adding either a
-        border with the given colour or cropping as necessary.
+        @name Handler management functions
+    */
+    //@{
 
-        The image is pasted into a new image with the given @a size and background
-        colour at the position @a pos relative to the upper left of the new image.
+    /**
+        Register an image handler.
+        See @ref image_handlers for a list of the available handlers.
+    */
+    static void AddHandler(wxImageHandler* handler);
 
-        If @a red = green = blue = -1 then the areas of the larger image not covered
-        by this image are made transparent by filling them with the image mask colour
-        (which will be allocated automatically if it isn't currently set).
+    /**
+        Deletes all image handlers.
+        This function is called by wxWidgets on exit.
+    */
+    static void CleanUpHandlers();
 
-        Otherwise, the areas will be filled with the colour with the specified RGB components.
+    /**
+        Finds the handler with the given name.
 
-        @see Resize()
+        @param name
+            The handler name.
+
+        @return A pointer to the handler if found, @NULL otherwise.
+
+        @see wxImageHandler
     */
-    wxImage Size(const wxSize& size, const wxPoint& pos, int red = -1,
-                 int green = -1, int blue = -1) const;
+    static wxImageHandler* FindHandler(const wxString& name);
 
     /**
-        Assignment operator, using @ref overview_refcount "reference counting".
+        Finds the handler associated with the given extension and type.
 
-        @param image
-            Image to assign.
+        @param extension
+            The file extension, such as "bmp".
+        @param imageType
+            The image type; one of the ::wxBitmapType values.
 
-        @return Returns 'this' object.
+        @return A pointer to the handler if found, @NULL otherwise.
+
+        @see wxImageHandler
     */
-    wxImage& operator=(const wxImage& image);
+    static wxImageHandler* FindHandler(const wxString& extension,
+                                       wxBitmapType imageType);
+
+    /**
+        Finds the handler associated with the given image type.
+
+        @param imageType
+            The image type; one of the ::wxBitmapType values.
+
+        @return A pointer to the handler if found, @NULL otherwise.
+
+        @see wxImageHandler
+    */
+    static wxImageHandler* FindHandler(wxBitmapType imageType);
+
+    /**
+        Finds the handler associated with the given MIME type.
+
+        @param mimetype
+            MIME type.
+
+        @return A pointer to the handler if found, @NULL otherwise.
+
+        @see wxImageHandler
+    */
+    static wxImageHandler* FindHandlerMime(const wxString& mimetype);
+
+    /**
+        Returns the static list of image format handlers.
+
+        @see wxImageHandler
+    */
+    static wxList& GetHandlers();
+
+    /**
+        Internal use only. Adds standard image format handlers.
+        It only install wxBMPHandler for the time being, which is used by wxBitmap.
+
+        This function is called by wxWidgets on startup, and shouldn't be called by
+        the user.
+
+        @see wxImageHandler, wxInitAllImageHandlers(), wxQuantize
+    */
+    static void InitStandardHandlers();
+
+    /**
+        Adds a handler at the start of the static list of format handlers.
+
+        @param handler
+            A new image format handler object. There is usually only one instance
+            of a given handler class in an application session.
+
+        @see wxImageHandler
+    */
+    static void InsertHandler(wxImageHandler* handler);
+
+    /**
+        Finds the handler with the given name, and removes it.
+        The handler is not deleted.
+
+        @param name
+            The handler name.
+
+        @return @true if the handler was found and removed, @false otherwise.
+
+        @see wxImageHandler
+    */
+    static bool RemoveHandler(const wxString& name);
+
+    //@}
+
+
+    /**
+        Returns @true if at least one of the available image handlers can read
+        the file with the given name.
+
+        See wxImageHandler::CanRead for more info.
+    */
+    static bool CanRead(const wxString& filename);
+
+    /**
+        Returns @true if at least one of the available image handlers can read
+        the data in the given stream.
+
+        See wxImageHandler::CanRead for more info.
+    */
+    static bool CanRead(wxInputStream& stream);
+
+    //@{
+    /**
+        If the image file contains more than one image and the image handler is
+        capable of retrieving these individually, this function will return the
+        number of available images.
+
+        For the overload taking the parameter @a filename, that's the name
+        of the file to query.
+        For the overload taking the parameter @a stream, that's the opened input
+        stream with image data.
+
+        See wxImageHandler::GetImageCount() for more info.
+
+        The parameter @a type may be one of the following values:
+        @li wxBITMAP_TYPE_BMP: Load a Windows bitmap file.
+        @li wxBITMAP_TYPE_GIF: Load a GIF bitmap file.
+        @li wxBITMAP_TYPE_JPEG: Load a JPEG bitmap file.
+        @li wxBITMAP_TYPE_PNG: Load a PNG bitmap file.
+        @li wxBITMAP_TYPE_PCX: Load a PCX bitmap file.
+        @li wxBITMAP_TYPE_PNM: Load a PNM bitmap file.
+        @li wxBITMAP_TYPE_TIF: Load a TIFF bitmap file.
+        @li wxBITMAP_TYPE_TGA: Load a TGA bitmap file.
+        @li wxBITMAP_TYPE_XPM: Load a XPM bitmap file.
+        @li wxBITMAP_TYPE_ICO: Load a Windows icon file (ICO).
+        @li wxBITMAP_TYPE_CUR: Load a Windows cursor file (CUR).
+        @li wxBITMAP_TYPE_ANI: Load a Windows animated cursor file (ANI).
+        @li wxBITMAP_TYPE_ANY: Will try to autodetect the format.
+
+        @return Number of available images. For most image handlers, this is 1
+                (exceptions are TIFF and ICO formats as well as animated GIFs
+                for which this function returns the number of frames in the
+                animation).
+    */
+    static int GetImageCount(const wxString& filename,
+                             wxBitmapType type = wxBITMAP_TYPE_ANY);
+    static int GetImageCount(wxInputStream& stream,
+                             wxBitmapType type = wxBITMAP_TYPE_ANY);
+    //@}
+
+    /**
+        Iterates all registered wxImageHandler objects, and returns a string containing
+        file extension masks suitable for passing to file open/save dialog boxes.
+
+        @return The format of the returned string is @c "(*.ext1;*.ext2)|*.ext1;*.ext2".
+                It is usually a good idea to prepend a description before passing
+                the result to the dialog.
+                Example:
+                @code
+                wxFileDialog FileDlg( this, "Choose Image", ::wxGetCwd(), "",
+                                      _("Image Files ") + wxImage::GetImageExtWildcard(),
+                                      wxFD_OPEN );
+                @endcode
+
+        @see wxImageHandler
+    */
+    static wxString GetImageExtWildcard();
+
+    /**
+        Converts a color in RGB color space to HSV color space.
+    */
+    static wxImage::HSVValue RGBtoHSV(const wxImage::RGBValue& rgb);
+
+    /**
+        Converts a color in HSV color space to RGB color space.
+    */
+    static wxImage::RGBValue HSVtoRGB(const wxImage::HSVValue& hsv);
 };
 
 /**
@@ -1517,6 +1730,7 @@ wxImage wxNullImage;
 /**
     Initializes all available image handlers. For a list of available handlers,
     see wxImage.
+    If you don't need/want all image handlers loaded
 
     @see wxImage, wxImageHandler