git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28345
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
// the case
bool m_ownsHandle;
// 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&);
// DIBs can't be copied
wxDIB(const wxDIB&);
{
m_handle = 0;
m_ownsHandle = true;
{
m_handle = 0;
m_ownsHandle = true;
+ m_hasAlpha = bmp.HasAlpha();
+
// if we have alpha channel, we need to create a 32bpp RGBA DIB, otherwise
// a 24bpp RGB is sufficient
// 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;
if ( !Create(w, h, bpp) )
return false;
const int srcBytesPerLine = w * 3;
const int dstBytesPerLine = GetLineSize(w, bpp);
const unsigned char *src = image.GetData() + ((h - 1) * srcBytesPerLine);
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++ )
{
unsigned char *dstLineStart = (unsigned char *)m_data;
for ( int y = 0; y < h; y++ )
{
- const int bpp = GetDepth();
- if ( bpp == 32 )
{
image.SetAlpha();
}
// this is the same loop as in Create() just above but with copy direction
// reversed
{
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 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++ )
{
const unsigned char *srcLineStart = (unsigned char *)GetData();
for ( int y = 0; y < h; y++ )
{
- if ( alpha )
- *alpha++ = *src++;
+ if ( is32bit )
+ {
+ if ( alpha )
+ *alpha++ = *src;
+ src++;
+ }
}
// pass to the previous line in the image
}
// pass to the previous line in the image