Convert wxImage with mask to wxBitmap with alpha channel
Since we always convert wxImage to 32 bpp wxBitmap, there is no reason to keep a separate mask for wxBitmap because alpha channel can be used directly.
This commit is contained in:
@@ -1202,23 +1202,30 @@ wxBitmap::wxBitmap(const wxImage& image, int depth, double scale)
|
|||||||
|
|
||||||
bool hasAlpha = false ;
|
bool hasAlpha = false ;
|
||||||
|
|
||||||
|
wxImage img;
|
||||||
if ( image.HasMask() )
|
if ( image.HasMask() )
|
||||||
{
|
{
|
||||||
// takes precedence, don't mix with alpha info
|
// takes precedence
|
||||||
|
// Since we already use 32 bpp bitmap here, we can use alpha channel
|
||||||
|
// directly and there is no reason to keep a separate mask.
|
||||||
|
img = image.Copy();
|
||||||
|
img.InitAlpha();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hasAlpha = image.HasAlpha() ;
|
img = image;
|
||||||
}
|
}
|
||||||
|
wxASSERT( !img.HasMask() );
|
||||||
|
hasAlpha = img.HasAlpha() ;
|
||||||
|
|
||||||
if ( hasAlpha )
|
if ( hasAlpha )
|
||||||
UseAlpha() ;
|
UseAlpha() ;
|
||||||
|
|
||||||
unsigned char* destinationstart = (unsigned char*) GetBitmapData()->BeginRawAccess() ;
|
unsigned char* destinationstart = (unsigned char*) GetBitmapData()->BeginRawAccess() ;
|
||||||
unsigned char* data = image.GetData();
|
const unsigned char* data = img.GetData();
|
||||||
if ( destinationstart != NULL && data != NULL )
|
if ( destinationstart != NULL && data != NULL )
|
||||||
{
|
{
|
||||||
const unsigned char *alpha = hasAlpha ? image.GetAlpha() : NULL ;
|
const unsigned char *alpha = hasAlpha ? img.GetAlpha() : NULL ;
|
||||||
for (int y = 0; y < height; destinationstart += GetBitmapData()->GetBytesPerRow(), y++)
|
for (int y = 0; y < height; destinationstart += GetBitmapData()->GetBytesPerRow(), y++)
|
||||||
{
|
{
|
||||||
unsigned char * destination = destinationstart;
|
unsigned char * destination = destinationstart;
|
||||||
@@ -1251,8 +1258,6 @@ wxBitmap::wxBitmap(const wxImage& image, int depth, double scale)
|
|||||||
|
|
||||||
GetBitmapData()->EndRawAccess() ;
|
GetBitmapData()->EndRawAccess() ;
|
||||||
}
|
}
|
||||||
if ( image.HasMask() )
|
|
||||||
SetMask( new wxMask( *this , wxColour( image.GetMaskRed() , image.GetMaskGreen() , image.GetMaskBlue() ) ) ) ;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user