]> git.saurik.com Git - wxWidgets.git/commitdiff
added wxImage::ConvertAlphaToMask
authorVáclav Slavík <vslavik@fastmail.fm>
Mon, 16 Aug 2004 12:31:08 +0000 (12:31 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Mon, 16 Aug 2004 12:31:08 +0000 (12:31 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28810 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/image.tex
include/wx/image.h
src/common/image.cpp

index 0b0719ea469a95a92e41629049d0d465dbf34093..741ba4a38521a90f476da42a2d9f602851954d4e 100644 (file)
@@ -257,6 +257,22 @@ WX_DECLARE_EXPORTED_HASH_MAP(unsigned long, wxImageHistogramEntry,
 
 Returns number of colours in the histogram.
 
+\membersection{wxImage::ConvertAlphaToMask}\label{wximageconvertalphatomask}
+
+\func{bool}{ConvertAlphaToMask}{\param{unsigned char}{ threshold = 128}}
+
+If the image has alpha channel, this method converts it to mask. All pixels
+with alpha value less than \arg{threshold} are replaced with mask colour
+and the alpha channel is removed. Mask colour is chosen automatically using
+\helpref{FindFirstUnusedColour}{wximagefindfirstunusedcolour}.
+
+If the image image doesn't have alpha channel,
+ConvertAlphaToMask does nothing.
+
+\wxheading{Return value}
+
+\false if FindFirstUnusedColour returns \false, \true otherwise. 
+
 \membersection{wxImage::ConvertToBitmap}\label{wximageconverttobitmap}
 
 \constfunc{wxBitmap}{ConvertToBitmap}{\void}
index 1789d526c839e3db6b2538903b0e46fee9938de2..f39648b4d788f6442a094f85b9dfcd4afe0bb1bf 100644 (file)
@@ -185,7 +185,8 @@ public:
     void Replace( unsigned char r1, unsigned char g1, unsigned char b1,
                   unsigned char r2, unsigned char g2, unsigned char b2 );
 
-    // convert to monochrome image (<r,g,b> will be replaced by white, everything else by black)
+    // convert to monochrome image (<r,g,b> will be replaced by white,
+    // everything else by black)
     wxImage ConvertToMono( unsigned char r, unsigned char g, unsigned char b ) const;
 
     // these routines are slow but safe
@@ -206,6 +207,10 @@ public:
     bool SetMaskFromImage(const wxImage & mask,
                           unsigned char mr, unsigned char mg, unsigned char mb);
 
+    // converts image's alpha channel to mask, if it has any, does nothing
+    // otherwise:
+    bool ConvertAlphaToMask(unsigned threshold = 128);
+
     static bool CanRead( const wxString& name );
     static int GetImageCount( const wxString& name, long type = wxBITMAP_TYPE_ANY );
     virtual bool LoadFile( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 );
index 369bdf5fcdfacb267d31c8d3ac8ebad96ba23ac7..238b5195f88b5a0d366941b5bc69a14b20138421 100644 (file)
@@ -935,6 +935,44 @@ bool wxImage::SetMaskFromImage(const wxImage& mask,
 
     return true;
 }
+    
+bool wxImage::ConvertAlphaToMask(unsigned threshold)
+{
+    if (!HasAlpha())
+        return true;
+
+    unsigned char mr, mg, mb;
+    if (!FindFirstUnusedColour(&mr, &mg, &mb))
+    {
+        wxLogError( _("No unused colour in image being masked.") );
+        return false;
+    }
+    
+    SetMask(true);
+    SetMaskColour(mr, mg, mb);
+    
+    unsigned char *imgdata = GetData();
+    unsigned char *alphadata = GetAlpha();
+
+    size_t w = GetWidth();
+    size_t h = GetHeight();
+
+    for (size_t y = 0; y < h; y++)
+    {
+        for (size_t x = 0; x < w; x++, imgdata += 3, alphadata++)
+        {
+            if (*alphadata < threshold)
+            {
+                imgdata[0] = mr;
+                imgdata[1] = mg;
+                imgdata[2] = mb;
+            }
+        }
+    }
+
+    free(M_IMGDATA->m_alpha);
+    M_IMGDATA->m_alpha = NULL;
+}
 
 #if wxUSE_PALETTE