+ // this bitmap could already be a DIB section in which case we don't need
+ // to convert it to DIB
+ HBITMAP hbmp = GetHbitmapOf(bmp);
+
+ DIBSECTION ds;
+ if ( GetDIBSection(hbmp, &ds) )
+ {
+ m_handle = hbmp;
+
+ // wxBitmap will free it, not we
+ m_ownsHandle = false;
+
+ // copy all the bitmap parameters too as we have them now anyhow
+ m_width = ds.dsBm.bmWidth;
+ m_height = ds.dsBm.bmHeight;
+ m_depth = ds.dsBm.bmBitsPixel;
+
+ m_data = ds.dsBm.bmBits;
+ }
+ else // no, it's a DDB -- convert it to DIB
+ {
+ const int w = bmp.GetWidth();
+ const int h = bmp.GetHeight();
+ int d = bmp.GetDepth();
+ if ( d <= 0 )
+ d = wxDisplayDepth();
+
+ if ( !Create(w, h, d) || !CopyFromDDB(hbmp) )
+ return false;
+ }
+
+ return true;
+}
+
+// Windows CE doesn't have GetDIBits() so use an alternative implementation
+// for it
+//
+// in fact I'm not sure if GetDIBits() is really much better than using
+// BitBlt() like this -- it should be faster but I didn't do any tests, if
+// anybody has time to do them and by chance finds that GetDIBits() is not
+// much faster than BitBlt(), we could always use the Win CE version here
+#ifdef __WXWINCE__
+
+bool wxDIB::CopyFromDDB(HBITMAP hbmp)
+{
+ MemoryHDC hdcSrc;
+ if ( !hdcSrc )
+ return false;
+
+ SelectInHDC selectSrc(hdcSrc, hbmp);
+ if ( !selectSrc )
+ return false;
+
+ MemoryHDC hdcDst;
+ if ( !hdcDst )
+ return false;
+
+ SelectInHDC selectDst(hdcDst, m_handle);
+ if ( !selectDst )
+ return false;
+
+
+ if ( !::BitBlt(
+ hdcDst,
+ 0, 0, m_width, m_height,
+ hdcSrc,
+ 0, 0,
+ SRCCOPY
+ ) )
+ {
+ wxLogLastError(_T("BitBlt(DDB -> DIB)"));