From 45515b668552a3ba0b5bfafddf7689213622da95 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 20 Jul 2004 23:45:28 +0000 Subject: [PATCH] don't suppose that all 32bpp DIBs have alpha, this is not true, the extra byte may be just padding git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28345 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/dib.h | 6 ++++++ src/msw/dib.cpp | 22 +++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/include/wx/msw/dib.h b/include/wx/msw/dib.h index 104955b89e..48f9382010 100644 --- a/include/wx/msw/dib.h +++ b/include/wx/msw/dib.h @@ -194,6 +194,11 @@ private: // the case bool m_ownsHandle; + // if true, we have alpha, if false we don't (note that we can still have + // m_depth == 32 but the last component is then simply padding and not + // alpha) + bool m_hasAlpha; + // DIBs can't be copied wxDIB(const wxDIB&); @@ -209,6 +214,7 @@ void wxDIB::Init() { m_handle = 0; m_ownsHandle = true; + m_hasAlpha = false; m_data = NULL; diff --git a/src/msw/dib.cpp b/src/msw/dib.cpp index 8da2f37757..2e0eeddd7b 100644 --- a/src/msw/dib.cpp +++ b/src/msw/dib.cpp @@ -182,6 +182,8 @@ bool wxDIB::Create(const wxBitmap& bmp) return false; } + m_hasAlpha = bmp.HasAlpha(); + return true; } @@ -634,8 +636,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 +647,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 +694,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 +721,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 -- 2.47.2