X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/20af6fd5d30a69ce61a527d1c0a57be7165e4321..a2abe5f08113b25ce20c1710c7361d27a5cb12eb:/src/msw/dib.cpp diff --git a/src/msw/dib.cpp b/src/msw/dib.cpp index d6d127a340..da8b42d1fc 100644 --- a/src/msw/dib.cpp +++ b/src/msw/dib.cpp @@ -137,18 +137,10 @@ bool wxDIB::Create(int width, int height, int depth) return true; } -bool wxDIB::Create(const wxBitmap& bmp) -{ - wxCHECK_MSG( bmp.Ok(), false, wxT("wxDIB::Create(): invalid bitmap") ); - - if ( !Create(GetHbitmapOf(bmp)) ) - return false; - - return true; -} - bool wxDIB::Create(HBITMAP hbmp) { + wxCHECK_MSG( hbmp, false, wxT("wxDIB::Create(): invalid bitmap") ); + // this bitmap could already be a DIB section in which case we don't need // to convert it to DIB DIBSECTION ds; @@ -666,7 +658,7 @@ wxPalette *wxDIB::CreatePalette() const #if wxUSE_IMAGE -bool wxDIB::Create(const wxImage& image) +bool wxDIB::Create(const wxImage& image, PixelFormat pf) { wxCHECK_MSG( image.Ok(), false, wxT("invalid wxImage in wxDIB ctor") ); @@ -691,27 +683,48 @@ bool wxDIB::Create(const wxImage& image) unsigned char *dstLineStart = (unsigned char *)m_data; for ( int y = 0; y < h; y++ ) { - // copy one DIB line + // Copy one DIB line. Note that RGB components order is reversed in + // Windows bitmaps compared to wxImage and is actually BGR. unsigned char *dst = dstLineStart; if ( alpha ) { - for ( int x = 0; x < w; x++ ) + int x; + + switch ( pf ) { - // RGB order is reversed, and we need to premultiply - // all channels by alpha value for use with ::AlphaBlend. - const unsigned char a = *alpha++; - *dst++ = (unsigned char)((src[2] * a + 127) / 255); - *dst++ = (unsigned char)((src[1] * a + 127) / 255); - *dst++ = (unsigned char)((src[0] * a + 127) / 255); - *dst++ = a; - src += 3; + case PixelFormat_PreMultiplied: + // Pre-multiply pixel values so that the DIB could be used + // with ::AlphaBlend(). + for ( x = 0; x < w; x++ ) + { + const unsigned char a = *alpha++; + *dst++ = (unsigned char)((src[2] * a + 127) / 255); + *dst++ = (unsigned char)((src[1] * a + 127) / 255); + *dst++ = (unsigned char)((src[0] * a + 127) / 255); + *dst++ = a; + src += 3; + } + break; + + case PixelFormat_NotPreMultiplied: + // Just copy pixel data without changing it. + for ( x = 0; x < w; x++ ) + { + *dst++ = src[2]; + *dst++ = src[1]; + *dst++ = src[0]; + + *dst++ = *alpha++; + src += 3; + } + break; } + } else // no alpha channel { for ( int x = 0; x < w; x++ ) { - // RGB order is reversed. *dst++ = src[2]; *dst++ = src[1]; *dst++ = src[0];