don't create a png alpha image if we don't have to
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32303 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -664,9 +664,11 @@ bool wxPNGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbos
|
|||||||
// explanation why this line is mandatory
|
// explanation why this line is mandatory
|
||||||
png_set_write_fn( png_ptr, &wxinfo, wx_PNG_stream_writer, NULL);
|
png_set_write_fn( png_ptr, &wxinfo, wx_PNG_stream_writer, NULL);
|
||||||
|
|
||||||
|
const bool usesAlpha = (image->HasAlpha() || image->HasMask() );
|
||||||
|
const int bytesPerPixel = usesAlpha ? 4 : 3;
|
||||||
png_set_IHDR( png_ptr, info_ptr, image->GetWidth(), image->GetHeight(), 8,
|
png_set_IHDR( png_ptr, info_ptr, image->GetWidth(), image->GetHeight(), 8,
|
||||||
PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE,
|
usesAlpha ? PNG_COLOR_TYPE_RGB_ALPHA : PNG_COLOR_TYPE_RGB,
|
||||||
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
|
PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
|
||||||
|
|
||||||
png_color_8 sig_bit;
|
png_color_8 sig_bit;
|
||||||
sig_bit.red = 8;
|
sig_bit.red = 8;
|
||||||
@@ -678,7 +680,7 @@ bool wxPNGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbos
|
|||||||
png_set_shift( png_ptr, &sig_bit );
|
png_set_shift( png_ptr, &sig_bit );
|
||||||
png_set_packing( png_ptr );
|
png_set_packing( png_ptr );
|
||||||
|
|
||||||
unsigned char *data = (unsigned char *)malloc( image->GetWidth()*4 );
|
unsigned char *data = (unsigned char *)malloc( image->GetWidth()*bytesPerPixel );
|
||||||
if (!data)
|
if (!data)
|
||||||
{
|
{
|
||||||
png_destroy_write_struct( &png_ptr, (png_infopp)NULL );
|
png_destroy_write_struct( &png_ptr, (png_infopp)NULL );
|
||||||
@@ -690,23 +692,27 @@ bool wxPNGHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbos
|
|||||||
unsigned char *ptr = image->GetData() + (y * image->GetWidth() * 3);
|
unsigned char *ptr = image->GetData() + (y * image->GetWidth() * 3);
|
||||||
for (int x = 0; x < image->GetWidth(); x++)
|
for (int x = 0; x < image->GetWidth(); x++)
|
||||||
{
|
{
|
||||||
data[(x << 2) + 0] = *ptr++;
|
register const int index = x * bytesPerPixel;
|
||||||
data[(x << 2) + 1] = *ptr++;
|
data[index + 0] = *ptr++;
|
||||||
data[(x << 2) + 2] = *ptr++;
|
data[index + 1] = *ptr++;
|
||||||
if ( image->HasAlpha() )
|
data[index + 2] = *ptr++;
|
||||||
|
|
||||||
|
if (usesAlpha)
|
||||||
{
|
{
|
||||||
data[(x << 2) + 3] = image->GetAlpha(x, y);
|
if ( image->HasAlpha() )
|
||||||
}
|
{
|
||||||
else if (( !image->HasMask() ) || \
|
data[index + 3] = image->GetAlpha(x, y);
|
||||||
(data[(x << 2) + 0] != image->GetMaskRed()) || \
|
}
|
||||||
(data[(x << 2) + 1] != image->GetMaskGreen()) || \
|
else if ( (data[index + 0] != image->GetMaskRed())
|
||||||
(data[(x << 2) + 2] != image->GetMaskBlue()))
|
|| (data[index + 1] != image->GetMaskGreen())
|
||||||
{
|
|| (data[index + 2] != image->GetMaskBlue()) )
|
||||||
data[(x << 2) + 3] = 255;
|
{
|
||||||
}
|
data[index + 3] = 255;
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
data[(x << 2) + 3] = 0;
|
{
|
||||||
|
data[index + 3] = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
png_bytep row_ptr = data;
|
png_bytep row_ptr = data;
|
||||||
|
Reference in New Issue
Block a user