- int bits;
- BITMAPINFOHEADER *lpbi;
- BITMAPCOREHEADER *lpbc;
- lpbi = ((BITMAPINFOHEADER*) pv);
- lpbc = ((BITMAPCOREHEADER*) pv);
-
- // With the BITMAPINFO format headers, the size of the palette
- // is in biClrUsed, whereas in the BITMAPCORE - style headers, it
- // is dependent on the bits per pixel ( = 2 raised to the power of
- // bits/pixel).
-
- if (lpbi->biSize != sizeof(BITMAPCOREHEADER)) {
- if (lpbi->biClrUsed != 0)
- return (WORD) lpbi->biClrUsed;
- bits = lpbi->biBitCount;
- }
- else
- bits = lpbc->bcBitCount;
-
- switch (bits) {
- case 1:
- return 2;
- case 4:
- return 16;
- case 8:
- return 256;
- default:
- // A 24 bitcount DIB has no color table
- return 0;
- }
+ // we don't support formats using palettes right now so we only create
+ // either 24bpp (RGB) or 32bpp (RGBA) bitmaps
+ wxASSERT_MSG( depth, _T("invalid image depth in wxDIB::Create()") );
+ if ( depth < 24 )
+ depth = 24;
+
+ // allocate memory for bitmap structures
+ static const int sizeHeader = sizeof(BITMAPINFOHEADER);
+
+ BITMAPINFO *info = (BITMAPINFO *)malloc(sizeHeader);
+ wxCHECK_MSG( info, false, _T("malloc(BITMAPINFO) failed") );
+
+ memset(info, 0, sizeHeader);
+
+ info->bmiHeader.biSize = sizeHeader;
+ info->bmiHeader.biWidth = width;
+
+ // we use positive height here which corresponds to a DIB with normal, i.e.
+ // bottom to top, order -- normally using negative height (which means
+ // reversed for MS and hence natural for all the normal people top to
+ // bottom line scan order) could be used to avoid the need for the image
+ // reversal in Create(image) but this doesn't work under NT, only Win9x!
+ info->bmiHeader.biHeight = height;
+
+ info->bmiHeader.biPlanes = 1;
+ info->bmiHeader.biBitCount = depth;
+ info->bmiHeader.biSizeImage = GetLineSize(width, depth)*height;
+
+ m_handle = ::CreateDIBSection
+ (
+ 0, // hdc (unused with DIB_RGB_COLORS)
+ info, // bitmap description
+ DIB_RGB_COLORS, // use RGB, not palette
+ &m_data, // [out] DIB bits
+ NULL, // don't use file mapping
+ 0 // file mapping offset (not used here)
+ );
+
+ free(info);
+
+ if ( !m_handle )
+ {
+ wxLogLastError(wxT("CreateDIBSection"));
+
+ return false;
+ }
+
+ m_width = width;
+ m_height = height;
+ m_depth = depth;
+
+ return true;