}
const int bpp = GetDepth();
+
+ // Remember if we have any "real" transparency, i.e. either any partially
+ // transparent pixels or not all pixels are fully opaque or fully
+ // transparent.
bool hasAlpha = false;
+ bool hasOpaque = false;
+ bool hasTransparent = false;
+
if ( bpp == 32 )
{
// 32 bit bitmaps may be either 0RGB or ARGB and we don't know in
// premultiplication done in Create() above
const unsigned char a = *src;
*alpha++ = a;
+
+ // Check what kind of alpha do we have.
+ switch ( a )
+ {
+ case 0:
+ hasTransparent = true;
+ break;
+
+ default:
+ // Anything in between means we have real transparency
+ // and must use alpha channel.
+ hasAlpha = true;
+ break;
+
+ case 255:
+ hasOpaque = true;
+ break;
+ }
+
if ( a > 0 )
{
dst[0] = (dst[0] * 255) / a;
dst[1] = (dst[1] * 255) / a;
dst[2] = (dst[2] * 255) / a;
-
- hasAlpha = true;
}
src++;
srcLineStart += srcBytesPerLine;
}
+ if ( hasOpaque && hasTransparent )
+ hasAlpha = true;
+
if ( !hasAlpha && image.HasAlpha() )
image.ClearAlpha();