]> git.saurik.com Git - wxWidgets.git/commitdiff
don't suppose that all 32bpp DIBs have alpha, this is not true, the extra byte may...
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 20 Jul 2004 23:45:28 +0000 (23:45 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 20 Jul 2004 23:45:28 +0000 (23:45 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28345 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/msw/dib.h
src/msw/dib.cpp

index 104955b89ec113d2eb0154dd8e3871d35fd90687..48f9382010f4d266e6b2077326ea8dd6d200161f 100644 (file)
@@ -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;
 
index 8da2f37757c6f6934244972b3d857f63b8e7d902..2e0eeddd7be137e2494788e2dddb346f74c15c24 100644 (file)
@@ -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