- wxCHECK_MSG( Ok(), NULL, wxT("invalid bitmap") );
-
- if (HasPixmap() && !HasPixbuf())
- {
- int width = GetWidth();
- int height = GetHeight();
-
- GdkPixbuf *pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB,
- GetMask() != NULL,
- 8, width, height);
- M_BMPDATA->m_pixbuf =
- gdk_pixbuf_get_from_drawable(pixbuf, M_BMPDATA->m_pixmap, NULL,
- 0, 0, 0, 0, width, height);
-
- // apply the mask to created pixbuf:
- if (M_BMPDATA->m_pixbuf && M_BMPDATA->m_mask)
- {
- GdkPixbuf *pmask =
- gdk_pixbuf_get_from_drawable(NULL,
- M_BMPDATA->m_mask->GetBitmap(),
- NULL,
- 0, 0, 0, 0, width, height);
- if (pmask)
- {
- guchar *bmp = gdk_pixbuf_get_pixels(pixbuf);
- guchar *mask = gdk_pixbuf_get_pixels(pmask);
- int bmprowinc = gdk_pixbuf_get_rowstride(pixbuf) - 4 * width;
- int maskrowinc = gdk_pixbuf_get_rowstride(pmask) - 3 * width;
-
- for (int y = 0; y < height;
- y++, bmp += bmprowinc, mask += maskrowinc)
- {
- for (int x = 0; x < width; x++, bmp += 4, mask += 3)
- {
- if (mask[0] == 0 /*black pixel*/)
- bmp[3] = 0;
- }
- }
-
- gdk_pixbuf_unref(pmask);
- }
- }
- }
-
- return M_BMPDATA->m_pixbuf;
-}
-
-bool wxBitmap::HasPixbuf() const
-{
- wxCHECK_MSG( Ok(), false, wxT("invalid bitmap") );
-
- return M_BMPDATA->m_pixbuf != NULL;
-}
-
-void wxBitmap::SetPixbuf( GdkPixbuf *pixbuf )
-{
- if (!m_refData)
- m_refData = new wxBitmapRefData();
-
- M_BMPDATA->m_pixbuf = pixbuf;
- PurgeOtherRepresentations(Pixbuf);
-}
-
-void wxBitmap::PurgeOtherRepresentations(wxBitmap::Representation keep)
-{
- if (keep == Pixmap && HasPixbuf())
- {
- gdk_pixbuf_unref( M_BMPDATA->m_pixbuf );
- M_BMPDATA->m_pixbuf = NULL;
- }
- if (keep == Pixbuf && HasPixmap())
- {
- gdk_pixmap_unref( M_BMPDATA->m_pixmap );
- M_BMPDATA->m_pixmap = NULL;
- }
-}
-
-#endif // __WXGTK20__
-
-void *wxBitmap::GetRawData(wxPixelDataBase& data, int bpp)
-{
-#ifdef __WXGTK20__
- if (bpp != 32)
- return NULL;
-
- GdkPixbuf *pixbuf = GetPixbuf();
- if (!pixbuf)
- return NULL;
-
-#if 0
- if (gdk_pixbuf_get_has_alpha( pixbuf ))
- wxPrintf( wxT("Has alpha\n") );
- else
- wxPrintf( wxT("No alpha.\n") );
-#endif
-
- data.m_height = gdk_pixbuf_get_height( pixbuf );
- data.m_width = gdk_pixbuf_get_width( pixbuf );
- data.m_stride = gdk_pixbuf_get_rowstride( pixbuf );
-
- return gdk_pixbuf_get_pixels( pixbuf );
-#else