+ m_bitmapMask = NULL;
+}
+
+// ----------------------------------------------------------------------------
+// wxBitmap creation
+// ----------------------------------------------------------------------------
+
+wxGDIImageRefData *wxBitmap::CreateData() const
+{
+ return new wxBitmapRefData;
+}
+
+wxObjectRefData *wxBitmap::CloneRefData(const wxObjectRefData *dataOrig) const
+{
+ const wxBitmapRefData *
+ data = wx_static_cast(const wxBitmapRefData *, dataOrig);
+ if ( !data )
+ return NULL;
+
+ wxBitmap *self = wx_const_cast(wxBitmap *, this);
+
+#if wxUSE_WXDIB
+ // copy the other bitmap
+ if ( data->m_hBitmap )
+ {
+ wxDIB dib((HBITMAP)(data->m_hBitmap));
+ self->CopyFromDIB(dib);
+ }
+ else
+#endif // wxUSE_WXDIB
+ {
+ // don't copy the bitmap data, but do copy the size, depth, ...
+ self->m_refData = new wxBitmapRefData(*data);
+ }
+
+ return m_refData;
+}
+
+#ifdef __WIN32__
+
+bool wxBitmap::CopyFromIconOrCursor(const wxGDIImage& icon)
+{
+#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
+ // it may be either HICON or HCURSOR
+ HICON hicon = (HICON)icon.GetHandle();
+
+ ICONINFO iconInfo;
+ if ( !::GetIconInfo(hicon, &iconInfo) )
+ {
+ wxLogLastError(wxT("GetIconInfo"));
+
+ return false;
+ }
+
+ wxBitmapRefData *refData = new wxBitmapRefData;
+ m_refData = refData;
+
+ int w = icon.GetWidth(),
+ h = icon.GetHeight();
+
+ refData->m_width = w;
+ refData->m_height = h;
+ refData->m_depth = wxDisplayDepth();
+
+ refData->m_hBitmap = (WXHBITMAP)iconInfo.hbmColor;
+
+#if wxUSE_WXDIB
+ // If the icon is 32 bits per pixel then it may have alpha channel data,
+ // although there are some icons that are 32 bpp but have no alpha... So
+ // convert to a DIB and manually check the 4th byte for each pixel.
+ BITMAP bm;
+ if ( ::GetObject(iconInfo.hbmColor, sizeof(BITMAP), (LPVOID)&bm)
+ && bm.bmBitsPixel == 32)
+ {
+ wxDIB dib(iconInfo.hbmColor);
+ if (dib.IsOk())
+ {
+ unsigned char* pixels = dib.GetData();
+ for (int idx=0; idx<w*h*4; idx+=4)
+ {
+ if (pixels[idx+3] != 0)
+ {
+ // If there is an alpha byte that is non-zero then set the
+ // alpha flag and bail out of the loop.
+ refData->m_hasAlpha = true;
+ break;
+ }
+ }
+ }
+ }
+#endif
+ if ( !refData->m_hasAlpha )
+ {
+ // the mask returned by GetIconInfo() is inverted compared to the usual
+ // wxWin convention
+ refData->SetMask(wxInvertMask(iconInfo.hbmMask, w, h));
+ }
+
+ // delete the old one now as we don't need it any more
+ ::DeleteObject(iconInfo.hbmMask);
+
+ return true;
+#else
+ wxUnusedVar(icon);
+ return false;
+#endif