+ wxCHECK_MSG( bmp.Ok(), false, wxT("wxDIB::Create(): invalid bitmap") );
+
+ if ( !Create(GetHbitmapOf(bmp)) )
+ return false;
+
+ m_hasAlpha = bmp.HasAlpha();
+
+ return true;
+}
+
+bool wxDIB::Create(HBITMAP hbmp)
+{
+ // this bitmap could already be a DIB section in which case we don't need
+ // to convert it to DIB
+ 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
+ {
+ // prepare all the info we need
+ BITMAP bm;
+ if ( !::GetObject(hbmp, sizeof(bm), &bm) )
+ {
+ wxLogLastError(wxT("GetObject(bitmap)"));
+
+ return false;
+ }
+
+ int d = bm.bmBitsPixel;
+ if ( d <= 0 )
+ d = wxDisplayDepth();
+
+ if ( !Create(bm.bmWidth, bm.bmHeight, 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(wxT("BitBlt(DDB -> DIB)"));
+
+ return false;
+ }