-wxBitmap wxBitmap::GetMaskBitmap() const
-{
- wxBitmap bitmap;
- wxBitmapRefData* bmpData = M_BMPDATA;
-#ifdef __WXGTK3__
- cairo_surface_t* mask = NULL;
- if (bmpData && bmpData->m_mask)
- mask = bmpData->m_mask->GetBitmap();
- if (mask)
- {
- const int w = cairo_image_surface_get_width(mask);
- const int h = cairo_image_surface_get_height(mask);
- GdkPixbuf* pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, false, 8, w, h);
- const guchar* src = cairo_image_surface_get_data(mask);
- guchar* dst = gdk_pixbuf_get_pixels(pixbuf);
- const int stride_src = cairo_image_surface_get_stride(mask);
- const int stride_dst = gdk_pixbuf_get_rowstride(pixbuf);
- for (int j = 0; j < h; j++, src += stride_src, dst += stride_dst)
- {
- guchar* d = dst;
- for (int i = 0; i < w; i++, d += 3)
- {
- d[0] = src[i];
- d[1] = src[i];
- d[2] = src[i];
- }
- }
- bitmap = wxBitmap(pixbuf);
- }
-#else
- GdkPixmap* mask = NULL;
- if (bmpData && bmpData->m_mask)
- mask = bmpData->m_mask->GetBitmap();
- if (mask)
- {
- int w, h;
- gdk_drawable_get_size(mask, &w, &h);
- GdkPixbuf* pixbuf = gdk_pixbuf_get_from_drawable(
- NULL, mask, NULL, 0, 0, 0, 0, w, h);
- bitmap = wxBitmap(pixbuf);
- }
-#endif
- return bitmap;
-}
-