+// ----------------------------------------------------------------------------
+// alpha channel support
+// ----------------------------------------------------------------------------
+
+void wxImage::SetAlpha(int x, int y, unsigned char alpha)
+{
+ wxCHECK_RET( HasAlpha(), wxT("no alpha channel") );
+
+ long pos = XYToIndex(x, y);
+ wxCHECK_RET( pos != -1, wxT("invalid image coordinates") );
+
+ M_IMGDATA->m_alpha[pos] = alpha;
+}
+
+unsigned char wxImage::GetAlpha(int x, int y) const
+{
+ wxCHECK_MSG( HasAlpha(), 0, wxT("no alpha channel") );
+
+ long pos = XYToIndex(x, y);
+ wxCHECK_MSG( pos != -1, 0, wxT("invalid image coordinates") );
+
+ return M_IMGDATA->m_alpha[pos];
+}
+
+bool
+wxImage::ConvertColourToAlpha(unsigned char r, unsigned char g, unsigned char b)
+{
+ SetAlpha(NULL);
+
+ const int w = M_IMGDATA->m_width;
+ const int h = M_IMGDATA->m_height;
+
+ unsigned char *alpha = GetAlpha();
+ unsigned char *data = GetData();
+
+ for ( int y = 0; y < h; y++ )
+ {
+ for ( int x = 0; x < w; x++ )
+ {
+ *alpha++ = *data;
+ *data++ = r;
+ *data++ = g;
+ *data++ = b;
+ }
+ }
+
+ return true;
+}
+
+void wxImage::SetAlpha( unsigned char *alpha, bool static_data )
+{
+ wxCHECK_RET( Ok(), wxT("invalid image") );
+
+ if ( !alpha )
+ {
+ alpha = (unsigned char *)malloc(M_IMGDATA->m_width*M_IMGDATA->m_height);
+ }
+
+ free(M_IMGDATA->m_alpha);
+ M_IMGDATA->m_alpha = alpha;
+ M_IMGDATA->m_staticAlpha = static_data;
+}
+
+unsigned char *wxImage::GetAlpha() const
+{
+ wxCHECK_MSG( Ok(), (unsigned char *)NULL, wxT("invalid image") );
+
+ 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;
+
+ 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)
+ ? wxIMAGE_ALPHA_TRANSPARENT
+ : wxIMAGE_ALPHA_OPAQUE;
+ }
+
+ M_IMGDATA->m_hasMask = false;
+ }
+ else // no mask
+ {
+ // make the image fully opaque
+ memset(alpha, wxIMAGE_ALPHA_OPAQUE, lenAlpha);
+ }
+}
+
+// ----------------------------------------------------------------------------
+// mask support
+// ----------------------------------------------------------------------------
+