X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a8beba7230ae19c06f7c0d4e0f785a0bf64bb984..3eae0c0b438f059635c8e26d6ddb5a8f2de42db3:/src/msw/dib.cpp diff --git a/src/msw/dib.cpp b/src/msw/dib.cpp index a3e9b49a45..ef71fc3f51 100644 --- a/src/msw/dib.cpp +++ b/src/msw/dib.cpp @@ -84,7 +84,7 @@ bool wxDIB::Create(int width, int height, int depth) static const int infosize = sizeof(BITMAPINFOHEADER); BITMAPINFO *info = (BITMAPINFO *)malloc(infosize); - wxCHECK_MSG( info, NULL, _T("malloc(BITMAPINFO) failed") ); + wxCHECK_MSG( info, false, _T("malloc(BITMAPINFO) failed") ); memset(info, 0, infosize); @@ -132,26 +132,48 @@ bool wxDIB::Create(const wxBitmap& bmp) { wxCHECK_MSG( bmp.Ok(), false, _T("wxDIB::Create(): invalid bitmap") ); - const int w = bmp.GetWidth(); - const int h = bmp.GetHeight(); - int d = bmp.GetDepth(); - if ( d == -1 ) - d = wxDisplayDepth(); + // this bitmap could already be a DIB section in which case we don't need + // to convert it to DIB + HBITMAP hbmp = GetHbitmapOf(bmp); - if ( !Create(w, h, d) ) - return false; + DIBSECTION ds; + if ( ::GetObject(hbmp, sizeof(ds), &ds) == sizeof(ds) ) + { + m_handle = hbmp; - // we could have used GetDIBits() too but GetBitmapBits() is simpler - if ( !::GetBitmapBits - ( - GetHbitmapOf(bmp), // the source DDB - GetLineSize(w, d)*h, // the number of bytes to copy - m_data // the pixels will be copied here - ) ) + // 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 { - wxLogLastError(wxT("GetDIBits()")); + const int w = bmp.GetWidth(); + const int h = bmp.GetHeight(); + int d = bmp.GetDepth(); + if ( d == -1 ) + d = wxDisplayDepth(); + + if ( !Create(w, h, d) ) + return false; + + // we could have used GetDIBits() too but GetBitmapBits() is simpler + if ( !::GetBitmapBits + ( + GetHbitmapOf(bmp), // the source DDB + GetLineSize(w, d)*h, // the number of bytes to copy + m_data // the pixels will be copied here + ) ) + { + wxLogLastError(wxT("GetDIBits()")); - return 0; + return 0; + } } return true;