+ wxBitmapRefData* bmpData = M_BMPDATA;
+ if (bmpData->m_pixmap)
+ return bmpData->m_pixmap;
+
+ if (bmpData->m_pixbuf)
+ {
+ GdkPixmap** mask_pixmap = NULL;
+ if (gdk_pixbuf_get_has_alpha(bmpData->m_pixbuf))
+ {
+ // make new mask from alpha
+ delete bmpData->m_mask;
+ bmpData->m_mask = new wxMask;
+ mask_pixmap = &bmpData->m_mask->m_bitmap;
+ }
+ gdk_pixbuf_render_pixmap_and_mask(
+ bmpData->m_pixbuf, &bmpData->m_pixmap, mask_pixmap, 128);
+ }
+ else
+ {
+ bmpData->m_pixmap = gdk_pixmap_new(wxGetRootWindow()->window,
+ bmpData->m_width, bmpData->m_height, bmpData->m_bpp == 1 ? 1 : -1);
+ }
+ return bmpData->m_pixmap;
+}
+
+bool wxBitmap::HasPixmap() const
+{
+ wxCHECK_MSG( IsOk(), false, wxT("invalid bitmap") );
+
+ return M_BMPDATA->m_pixmap != NULL;
+}
+
+GdkPixbuf *wxBitmap::GetPixbuf() const
+{
+ wxCHECK_MSG( IsOk(), NULL, wxT("invalid bitmap") );
+
+ wxBitmapRefData* bmpData = M_BMPDATA;
+ if (bmpData->m_pixbuf)
+ return bmpData->m_pixbuf;
+
+ const int w = bmpData->m_width;
+ const int h = bmpData->m_height;
+ GdkPixmap* mask = NULL;
+ if (bmpData->m_mask)
+ mask = bmpData->m_mask->m_bitmap;
+ const bool useAlpha = bmpData->m_alphaRequested || mask;
+ bmpData->m_pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, useAlpha, 8, w, h);
+ if (bmpData->m_pixmap)
+ PixmapToPixbuf(bmpData->m_pixmap, bmpData->m_pixbuf, w, h);
+ if (mask)
+ MaskToAlpha(mask, bmpData->m_pixbuf, w, h);
+ return bmpData->m_pixbuf;
+}
+
+bool wxBitmap::HasPixbuf() const
+{
+ wxCHECK_MSG( IsOk(), false, wxT("invalid bitmap") );
+
+ return M_BMPDATA->m_pixbuf != NULL;
+}
+
+void wxBitmap::SetPixbuf(GdkPixbuf* pixbuf)
+{
+ UnRef();
+
+ if (!pixbuf)
+ return;
+
+ int depth = -1;
+ if (gdk_pixbuf_get_has_alpha(pixbuf))
+ depth = 32;
+ m_refData = new wxBitmapRefData(
+ gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf), depth);
+
+ M_BMPDATA->m_pixbuf = pixbuf;
+}
+
+void wxBitmap::PurgeOtherRepresentations(wxBitmap::Representation keep)
+{
+ if (keep == Pixmap && HasPixbuf())
+ {
+ g_object_unref (M_BMPDATA->m_pixbuf);
+ M_BMPDATA->m_pixbuf = NULL;
+ }
+ if (keep == Pixbuf && HasPixmap())
+ {
+ g_object_unref (M_BMPDATA->m_pixmap);
+ M_BMPDATA->m_pixmap = NULL;
+ }
+}
+
+#ifdef wxHAS_RAW_BITMAP
+void *wxBitmap::GetRawData(wxPixelDataBase& data, int bpp)
+{
+ void* bits = NULL;
+ GdkPixbuf *pixbuf = GetPixbuf();
+ const bool hasAlpha = HasAlpha();
+
+ // allow access if bpp is valid and matches existence of alpha
+ if ( pixbuf && ((bpp == 24 && !hasAlpha) || (bpp == 32 && hasAlpha)) )
+ {
+ data.m_height = gdk_pixbuf_get_height( pixbuf );
+ data.m_width = gdk_pixbuf_get_width( pixbuf );
+ data.m_stride = gdk_pixbuf_get_rowstride( pixbuf );
+ bits = gdk_pixbuf_get_pixels(pixbuf);
+ }
+ return bits;