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
This commit is contained in:
@@ -194,6 +194,11 @@ private:
|
|||||||
// the case
|
// the case
|
||||||
bool m_ownsHandle;
|
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
|
// DIBs can't be copied
|
||||||
wxDIB(const wxDIB&);
|
wxDIB(const wxDIB&);
|
||||||
@@ -209,6 +214,7 @@ void wxDIB::Init()
|
|||||||
{
|
{
|
||||||
m_handle = 0;
|
m_handle = 0;
|
||||||
m_ownsHandle = true;
|
m_ownsHandle = true;
|
||||||
|
m_hasAlpha = false;
|
||||||
|
|
||||||
m_data = NULL;
|
m_data = NULL;
|
||||||
|
|
||||||
|
@@ -182,6 +182,8 @@ bool wxDIB::Create(const wxBitmap& bmp)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_hasAlpha = bmp.HasAlpha();
|
||||||
|
|
||||||
return true;
|
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
|
// if we have alpha channel, we need to create a 32bpp RGBA DIB, otherwise
|
||||||
// a 24bpp RGB is sufficient
|
// a 24bpp RGB is sufficient
|
||||||
const bool hasAlpha = image.HasAlpha();
|
m_hasAlpha = image.HasAlpha();
|
||||||
const int bpp = hasAlpha ? 32 : 24;
|
const int bpp = m_hasAlpha ? 32 : 24;
|
||||||
|
|
||||||
if ( !Create(w, h, bpp) )
|
if ( !Create(w, h, bpp) )
|
||||||
return false;
|
return false;
|
||||||
@@ -645,7 +647,8 @@ bool wxDIB::Create(const wxImage& image)
|
|||||||
const int srcBytesPerLine = w * 3;
|
const int srcBytesPerLine = w * 3;
|
||||||
const int dstBytesPerLine = GetLineSize(w, bpp);
|
const int dstBytesPerLine = GetLineSize(w, bpp);
|
||||||
const unsigned char *src = image.GetData() + ((h - 1) * srcBytesPerLine);
|
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;
|
unsigned char *dstLineStart = (unsigned char *)m_data;
|
||||||
for ( int y = 0; y < h; y++ )
|
for ( int y = 0; y < h; y++ )
|
||||||
{
|
{
|
||||||
@@ -691,19 +694,20 @@ wxImage wxDIB::ConvertToImage() const
|
|||||||
return wxNullImage;
|
return wxNullImage;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int bpp = GetDepth();
|
if ( m_hasAlpha )
|
||||||
if ( bpp == 32 )
|
|
||||||
{
|
{
|
||||||
image.SetAlpha();
|
image.SetAlpha();
|
||||||
}
|
}
|
||||||
|
|
||||||
// this is the same loop as in Create() just above but with copy direction
|
// this is the same loop as in Create() just above but with copy direction
|
||||||
// reversed
|
// reversed
|
||||||
|
const int bpp = GetDepth();
|
||||||
const int dstBytesPerLine = w * 3;
|
const int dstBytesPerLine = w * 3;
|
||||||
const int srcBytesPerLine = GetLineSize(w, bpp);
|
const int srcBytesPerLine = GetLineSize(w, bpp);
|
||||||
unsigned char *dst = image.GetData() + ((h - 1) * dstBytesPerLine);
|
unsigned char *dst = image.GetData() + ((h - 1) * dstBytesPerLine);
|
||||||
unsigned char *alpha = image.HasAlpha() ? image.GetAlpha() + (h - 1)*w
|
unsigned char *alpha = image.HasAlpha() ? image.GetAlpha() + (h - 1)*w
|
||||||
: NULL;
|
: NULL;
|
||||||
|
const bool is32bit = bpp == 32;
|
||||||
const unsigned char *srcLineStart = (unsigned char *)GetData();
|
const unsigned char *srcLineStart = (unsigned char *)GetData();
|
||||||
for ( int y = 0; y < h; y++ )
|
for ( int y = 0; y < h; y++ )
|
||||||
{
|
{
|
||||||
@@ -717,8 +721,12 @@ wxImage wxDIB::ConvertToImage() const
|
|||||||
|
|
||||||
dst += 3;
|
dst += 3;
|
||||||
|
|
||||||
if ( alpha )
|
if ( is32bit )
|
||||||
*alpha++ = *src++;
|
{
|
||||||
|
if ( alpha )
|
||||||
|
*alpha++ = *src;
|
||||||
|
src++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// pass to the previous line in the image
|
// pass to the previous line in the image
|
||||||
|
Reference in New Issue
Block a user