Improve image alpha handling in PDF and PS plotters
Fixes: lp:1825276 * https://bugs.launchpad.net/kicad/+bug/1825276
This commit is contained in:
parent
eb4aded5d6
commit
4adf89b40b
|
@ -390,6 +390,21 @@ void PDF_PLOTTER::PlotImage( const wxImage & aImage, const wxPoint& aPos,
|
||||||
unsigned char r = aImage.GetRed( x, y ) & 0xFF;
|
unsigned char r = aImage.GetRed( x, y ) & 0xFF;
|
||||||
unsigned char g = aImage.GetGreen( x, y ) & 0xFF;
|
unsigned char g = aImage.GetGreen( x, y ) & 0xFF;
|
||||||
unsigned char b = aImage.GetBlue( x, y ) & 0xFF;
|
unsigned char b = aImage.GetBlue( x, y ) & 0xFF;
|
||||||
|
|
||||||
|
// PDF inline images don't support alpha, so premultiply against white background
|
||||||
|
if( aImage.HasAlpha() )
|
||||||
|
{
|
||||||
|
unsigned char alpha = aImage.GetAlpha( x, y ) & 0xFF;
|
||||||
|
|
||||||
|
if( alpha < 0xFF )
|
||||||
|
{
|
||||||
|
float a = 1.0 - ( (float) alpha / 255.0 );
|
||||||
|
r = ( int )( r + ( a * 0xFF ) ) & 0xFF;
|
||||||
|
g = ( int )( g + ( a * 0xFF ) ) & 0xFF;
|
||||||
|
b = ( int )( b + ( a * 0xFF ) ) & 0xFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// As usual these days, stdio buffering has to suffeeeeerrrr
|
// As usual these days, stdio buffering has to suffeeeeerrrr
|
||||||
if( colorMode )
|
if( colorMode )
|
||||||
{
|
{
|
||||||
|
|
|
@ -711,6 +711,20 @@ void PS_PLOTTER::PlotImage( const wxImage & aImage, const wxPoint& aPos,
|
||||||
green = aImage.GetGreen( xx, yy) & 0xFF;
|
green = aImage.GetGreen( xx, yy) & 0xFF;
|
||||||
blue = aImage.GetBlue( xx, yy) & 0xFF;
|
blue = aImage.GetBlue( xx, yy) & 0xFF;
|
||||||
|
|
||||||
|
// PS doesn't support alpha, so premultiply against white background
|
||||||
|
if( aImage.HasAlpha() )
|
||||||
|
{
|
||||||
|
unsigned char alpha = aImage.GetAlpha( xx, yy ) & 0xFF;
|
||||||
|
|
||||||
|
if( alpha < 0xFF )
|
||||||
|
{
|
||||||
|
float a = 1.0 - ( (float) alpha / 255.0 );
|
||||||
|
red = ( int )( red + ( a * 0xFF ) ) & 0xFF;
|
||||||
|
green = ( int )( green + ( a * 0xFF ) ) & 0xFF;
|
||||||
|
blue = ( int )( blue + ( a * 0xFF ) ) & 0xFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( colorMode )
|
if( colorMode )
|
||||||
fprintf( outputFile, "%2.2X%2.2X%2.2X", red, green, blue );
|
fprintf( outputFile, "%2.2X%2.2X%2.2X", red, green, blue );
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue