]> git.saurik.com Git - wxWidgets.git/commitdiff
added InitAlpha() (replaces patch 991168)
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 19 Feb 2005 21:51:37 +0000 (21:51 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 19 Feb 2005 21:51:37 +0000 (21:51 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32213 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

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

index 8710399209a807b114d1133760e1b8bc01e7c03f..134bbf566cd5e9c3a73751d25b5842df43d88a38 100644 (file)
@@ -53,6 +53,7 @@ All:
 - "Alt" key (VK_MENU) now results in WXK_ALT keyboard event, not WXK_MENU
 - wxFFile::ReadAll() now takes an optional wxMBConv parameter
 - wxCommandProcessor::MarkAsSaved() and IsDirty() added (Angela Wrobel)
 - "Alt" key (VK_MENU) now results in WXK_ALT keyboard event, not WXK_MENU
 - wxFFile::ReadAll() now takes an optional wxMBConv parameter
 - wxCommandProcessor::MarkAsSaved() and IsDirty() added (Angela Wrobel)
+- added wxStackWalker and related classes (Win32 and some Unix versions only)
 
 
 All (GUI):
 
 
 All (GUI):
@@ -74,6 +75,7 @@ All (GUI):
   of the progress (with new "Skip" button in dialog)
 - wxGenericListCtrl::SetItemState(-1) now changes the state of all items as
   in wxMSW version (Gunnar Roth)
   of the progress (with new "Skip" button in dialog)
 - wxGenericListCtrl::SetItemState(-1) now changes the state of all items as
   in wxMSW version (Gunnar Roth)
+- added wxImage::InitAlpha()
 
 Unix:
 
 
 Unix:
 
index 18c099fb71e3f635cbfa09ee22683795b2a83dd4..498e1f510da75c875642e7119bbf6ba09f73367c 100644 (file)
@@ -639,6 +639,16 @@ Returns true if the given option is present. The function is case-insensitive to
 \helpref{wxImage::GetOptionInt}{wximagegetoptionint}
 
 
 \helpref{wxImage::GetOptionInt}{wximagegetoptionint}
 
 
+\membersection{wxImage::InitAlpha}\label{wximageinitalpha}
+
+\func{void}{InitAlpha}{\void}
+
+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
+a mask colour, all mask pixels will be completely transparent.
+
+
 \membersection{wxImage::InitStandardHandlers}\label{wximageinitstandardhandlers}
 
 \func{static void}{InitStandardHandlers}{\void}
 \membersection{wxImage::InitStandardHandlers}\label{wximageinitstandardhandlers}
 
 \func{static void}{InitStandardHandlers}{\void}
index 7a9e084fb276ef9be0ca13752c480562748cd7f4..eea421031fdd2c95bdedc5c46c1c8e9a15aeda37 100644 (file)
@@ -272,6 +272,7 @@ public:
     unsigned char *GetAlpha() const;    // may return NULL!
     bool HasAlpha() const { return GetAlpha() != NULL; }
     void SetAlpha(unsigned char *alpha = NULL);
     unsigned char *GetAlpha() const;    // may return NULL!
     bool HasAlpha() const { return GetAlpha() != NULL; }
     void SetAlpha(unsigned char *alpha = NULL);
+    void InitAlpha();
 
     // Mask functions
     void SetMaskColour( unsigned char r, unsigned char g, unsigned char b );
 
     // Mask functions
     void SetMaskColour( unsigned char r, unsigned char g, unsigned char b );
index 6270bb18901c7c08b73fbc05d4df668c16e5cb49..204c4b665740e2ed47e4ea436eff91a85d85fdbb 100644 (file)
@@ -912,6 +912,44 @@ unsigned char *wxImage::GetAlpha() const
     return M_IMGDATA->m_alpha;
 }
 
     return M_IMGDATA->m_alpha;
 }
 
+void wxImage::InitAlpha()
+{
+    wxCHECK_RET( !HasAlpha(), wxT("image already has an alpha channel") );
+
+    // initialize memory for alpha channel
+    SetAlpha();
+
+    unsigned char *alpha = M_IMGDATA->m_alpha;
+    const size_t lenAlpha = M_IMGDATA->m_width * M_IMGDATA->m_height;
+
+    static const unsigned char ALPHA_TRANSPARENT = 0;
+    static const unsigned char ALPHA_OPAQUE = 0xff;
+    if ( HasMask() )
+    {
+        // use the mask to initialize the alpha channel.
+        const unsigned char * const alphaEnd = alpha + lenAlpha;
+
+        const unsigned char mr = M_IMGDATA->m_maskRed;
+        const unsigned char mg = M_IMGDATA->m_maskGreen;
+        const unsigned char mb = M_IMGDATA->m_maskBlue;
+        for ( unsigned char *src = M_IMGDATA->m_data;
+              alpha < alphaEnd;
+              src += 3, alpha++ )
+        {
+            *alpha = (src[0] == mr && src[1] == mg && src[2] == mb)
+                            ? ALPHA_TRANSPARENT
+                            : ALPHA_OPAQUE;
+        }
+
+        M_IMGDATA->m_hasMask = false;
+    }
+    else // no mask
+    {
+        // make the image fully opaque
+        memset(alpha, ALPHA_OPAQUE, lenAlpha);
+    }
+}
+
 // ----------------------------------------------------------------------------
 // mask support
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // mask support
 // ----------------------------------------------------------------------------