+#ifdef __WXMSW__
+ // if there is a mask, set the alpha bytes in the target buffer to
+ // fully transparent or fully opaque
+ if (bmpSource.GetMask())
+ {
+ wxBitmap bmpMask = bmpSource.GetMaskBitmap();
+ bufferFormat = CAIRO_FORMAT_ARGB32;
+ data = (wxUint32*)m_buffer;
+ wxNativePixelData pixData(bmpMask, wxPoint(0,0), wxSize(bw, bh));
+ wxCHECK_RET( pixData, wxT("Failed to gain raw access to mask bitmap data."));
+
+ wxNativePixelData::Iterator p(pixData);
+ for (int y=0; y<bh; y++)
+ {
+ wxNativePixelData::Iterator rowStart = p;
+ for (int x=0; x<bw; x++)
+ {
+ if (p.Red()+p.Green()+p.Blue() == 0)
+ *data = 0;
+ else
+ *data = (wxALPHA_OPAQUE << 24) | (*data & 0x00FFFFFF);
+ ++data;
+ ++p;
+ }
+ p = rowStart;
+ p.OffsetY(pixData, 1);
+ }
+ }
+#endif
+
+ m_surface = cairo_image_surface_create_for_data(
+ m_buffer, bufferFormat, bw, bh, bw*4);