+ return CopyFromIconOrCursor(icon);
+}
+
+#ifndef NEVER_USE_DIB
+
+bool wxBitmap::CopyFromDIB(const wxDIB& dib)
+{
+ wxCHECK_MSG( dib.IsOk(), false, _T("invalid DIB in CopyFromDIB") );
+
+#ifdef SOMETIMES_USE_DIB
+ HBITMAP hbitmap = dib.CreateDDB();
+ if ( !hbitmap )
+ return false;
+#else // ALWAYS_USE_DIB
+ HBITMAP hbitmap = ((wxDIB &)dib).Detach(); // const_cast
+#endif // SOMETIMES_USE_DIB/ALWAYS_USE_DIB
+
+ UnRef();
+
+ wxBitmapRefData *refData = new wxBitmapRefData;
+ m_refData = refData;
+
+ refData->m_width = dib.GetWidth();
+ refData->m_height = dib.GetHeight();
+ refData->m_depth = dib.GetDepth();
+
+ refData->m_hBitmap = (WXHBITMAP)hbitmap;
+
+#if wxUSE_PALETTE
+ wxPalette *palette = dib.CreatePalette();
+ if ( palette )
+ {
+ refData->m_bitmapPalette = *palette;
+ }
+
+ delete palette;
+#endif // wxUSE_PALETTE
+
+ return true;
+}
+
+#endif // NEVER_USE_DIB
+
+wxBitmap::~wxBitmap()
+{
+}
+
+wxBitmap::wxBitmap(const char bits[], int width, int height, int depth)
+{
+ Init();
+
+#ifndef __WXMICROWIN__
+ wxBitmapRefData *refData = new wxBitmapRefData;
+ m_refData = refData;
+
+ refData->m_width = width;
+ refData->m_height = height;
+ refData->m_depth = depth;
+
+ char *data;
+ if ( depth == 1 )
+ {
+ // we assume that it is in XBM format which is not quite the same as
+ // the format CreateBitmap() wants because the order of bytes in the
+ // line is inversed!
+ const size_t bytesPerLine = (width + 7) / 8;
+ const size_t padding = bytesPerLine % 2;
+ const size_t len = height * ( padding + bytesPerLine );
+ data = (char *)malloc(len);
+ const char *src = bits;
+ char *dst = data;
+
+ for ( int rows = 0; rows < height; rows++ )
+ {
+ for ( size_t cols = 0; cols < bytesPerLine; cols++ )
+ {
+ unsigned char val = *src++;
+ unsigned char reversed = 0;
+
+ for ( int bits = 0; bits < 8; bits++)
+ {
+ reversed <<= 1;
+ reversed |= (unsigned char)(val & 0x01);
+ val >>= 1;
+ }
+ *dst++ = reversed;
+ }
+
+ if ( padding )
+ *dst++ = 0;
+ }
+ }
+ else
+ {
+ // bits should already be in Windows standard format
+ data = (char *)bits; // const_cast is harmless
+ }
+
+ HBITMAP hbmp = ::CreateBitmap(width, height, 1, depth, data);
+ if ( !hbmp )
+ {
+ wxLogLastError(wxT("CreateBitmap"));
+ }
+
+ if ( data != bits )
+ {
+ free(data);
+ }
+
+ SetHBITMAP((WXHBITMAP)hbmp);
+#endif
+}
+
+// Create from XPM data
+bool wxBitmap::CreateFromXpm(const char **data)
+{
+#if wxUSE_IMAGE && wxUSE_XPM
+ Init();
+
+ wxCHECK_MSG( data != NULL, false, wxT("invalid bitmap data") )
+
+ wxXPMDecoder decoder;
+ wxImage img = decoder.ReadData(data);
+ wxCHECK_MSG( img.Ok(), false, wxT("invalid bitmap data") )
+
+ *this = wxBitmap(img);
+ return true;
+#else
+ wxUnusedVar(data);
+ return false;
+#endif