X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/be69f971c404a0260ab5e7c195182d267b893245..431a3edc641e379b8f5d6010220250017e99a3ff:/src/msw/dib.cpp diff --git a/src/msw/dib.cpp b/src/msw/dib.cpp index 8da2f37757..a7eebe54f2 100644 --- a/src/msw/dib.cpp +++ b/src/msw/dib.cpp @@ -151,10 +151,18 @@ bool wxDIB::Create(const wxBitmap& bmp) { wxCHECK_MSG( bmp.Ok(), false, _T("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 - HBITMAP hbmp = GetHbitmapOf(bmp); - DIBSECTION ds; if ( GetDIBSection(hbmp, &ds) ) { @@ -172,13 +180,20 @@ bool wxDIB::Create(const wxBitmap& bmp) } else // no, it's a DDB -- convert it to DIB { - const int w = bmp.GetWidth(); - const int h = bmp.GetHeight(); - int d = bmp.GetDepth(); + // 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(w, h, d) || !CopyFromDDB(hbmp) ) + if ( !Create(bm.bmWidth, bm.bmHeight, d) || !CopyFromDDB(hbmp) ) return false; } @@ -634,8 +649,8 @@ bool wxDIB::Create(const wxImage& image) // if we have alpha channel, we need to create a 32bpp RGBA DIB, otherwise // a 24bpp RGB is sufficient - const bool hasAlpha = image.HasAlpha(); - const int bpp = hasAlpha ? 32 : 24; + m_hasAlpha = image.HasAlpha(); + const int bpp = m_hasAlpha ? 32 : 24; if ( !Create(w, h, bpp) ) return false; @@ -645,7 +660,8 @@ bool wxDIB::Create(const wxImage& image) const int srcBytesPerLine = w * 3; const int dstBytesPerLine = GetLineSize(w, bpp); const unsigned char *src = image.GetData() + ((h - 1) * srcBytesPerLine); - const unsigned char *alpha = hasAlpha ? image.GetAlpha() + (h - 1)*w : NULL; + const unsigned char *alpha = m_hasAlpha ? image.GetAlpha() + (h - 1)*w + : NULL; unsigned char *dstLineStart = (unsigned char *)m_data; for ( int y = 0; y < h; y++ ) { @@ -691,19 +707,20 @@ wxImage wxDIB::ConvertToImage() const return wxNullImage; } - const int bpp = GetDepth(); - if ( bpp == 32 ) + if ( m_hasAlpha ) { image.SetAlpha(); } // this is the same loop as in Create() just above but with copy direction // reversed + const int bpp = GetDepth(); const int dstBytesPerLine = w * 3; const int srcBytesPerLine = GetLineSize(w, bpp); unsigned char *dst = image.GetData() + ((h - 1) * dstBytesPerLine); unsigned char *alpha = image.HasAlpha() ? image.GetAlpha() + (h - 1)*w : NULL; + const bool is32bit = bpp == 32; const unsigned char *srcLineStart = (unsigned char *)GetData(); for ( int y = 0; y < h; y++ ) { @@ -717,8 +734,12 @@ wxImage wxDIB::ConvertToImage() const dst += 3; - if ( alpha ) - *alpha++ = *src++; + if ( is32bit ) + { + if ( alpha ) + *alpha++ = *src; + src++; + } } // pass to the previous line in the image