return true;
 }
 
-GdkBitmap *wxMask::GetBitmap() const
+GdkPixmap* wxMask::GetBitmap() const
 {
     return m_bitmap;
 }
     int             m_height;
     int             m_bpp;
     bool m_alphaRequested;
+
+private:
+    // We don't provide a copy ctor as copying m_pixmap and m_pixbuf properly
+    // is expensive and we don't want to do it implicitly (and possibly
+    // accidentally). wxBitmap::CloneGDIRefData() which does need to do it does
+    // it explicitly itself.
+    wxDECLARE_NO_COPY_CLASS(wxBitmapRefData);
 };
 
 wxBitmapRefData::wxBitmapRefData(int width, int height, int depth)
     UnRef();
 
     wxCHECK_MSG( image.IsOk(), false, wxT("invalid image") );
-    wxCHECK_MSG( depth == -1 || depth == 1, false, wxT("invalid bitmap depth") );
 
     if (image.GetWidth() <= 0 || image.GetHeight() <= 0)
         return false;
 
-    // create pixbuf if image has alpha and requested depth is compatible
-    if (image.HasAlpha() && (depth == -1 || depth == 32))
+    if (depth == 32 || (depth == -1 && image.HasAlpha()))
         return CreateFromImageAsPixbuf(image);
 
     // otherwise create pixmap, if alpha is present it will be converted to mask
 
 bool wxBitmap::CreateFromImageAsPixbuf(const wxImage& image)
 {
-    wxASSERT(image.HasAlpha());
-
     int width = image.GetWidth();
     int height = image.GetHeight();
 
 
     for (int y = 0; y < height; y++, out += rowpad)
     {
-        for (int x = 0; x < width; x++, alpha++, out += 4, in += 3)
+        for (int x = 0; x < width; x++, out += 4, in += 3)
         {
             out[0] = in[0];
             out[1] = in[1];
             out[2] = in[2];
-            out[3] = *alpha;
+            if (alpha)
+                out[3] = *alpha++;
         }
     }
 
                 rect.y + h <= bmpData->m_height,
                 ret, wxT("invalid bitmap region"));
 
-    wxBitmapRefData* newRef = new wxBitmapRefData(*bmpData);
+    wxBitmapRefData * const newRef = new wxBitmapRefData(w, h, bmpData->m_bpp);
     ret.m_refData = newRef;
-    newRef->m_width = w;
-    newRef->m_height = h;
 
     if (bmpData->m_pixbuf)
     {
             newRef->m_pixmap, gc, bmpData->m_pixmap, rect.x, rect.y, 0, 0, w, h);
         g_object_unref(gc);
     }
-    newRef->m_mask = NULL;
     if (bmpData->m_mask && bmpData->m_mask->m_bitmap)
     {
         GdkPixmap* sub_mask = gdk_pixmap_new(bmpData->m_mask->m_bitmap, w, h, 1);
     else
 #endif
     {
+        wxUnusedVar(type); // The type is detected automatically by GDK.
+
         UnRef();
         GdkPixbuf* pixbuf = gdk_pixbuf_new_from_file(name.fn_str(), NULL);
         if (pixbuf)
 wxGDIRefData* wxBitmap::CloneGDIRefData(const wxGDIRefData* data) const
 {
     const wxBitmapRefData* oldRef = static_cast<const wxBitmapRefData*>(data);
-    wxBitmapRefData* newRef = new wxBitmapRefData(*oldRef);
+    wxBitmapRefData * const newRef = new wxBitmapRefData(oldRef->m_width,
+                                                         oldRef->m_height,
+                                                         oldRef->m_bpp);
     if (oldRef->m_pixmap != NULL)
     {
         newRef->m_pixmap = gdk_pixmap_new(