From: glennrp Date: Sun, 30 May 2010 01:56:35 +0000 (+0000) Subject: Sometimes the png encoder would write an empty tRNS chunk. X-Git-Tag: 7.0.1-0~9352 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e9c26dc68fb7cff87adcf2677968737acc9d3d2c;p=imagemagick Sometimes the png encoder would write an empty tRNS chunk. --- diff --git a/ChangeLog b/ChangeLog index 086055a10..d6d3abad9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2010-05-28 6.6.2.1 Glenn Randers-Pehrson + * Prevent coders/png.c from attempting to write an empty tRNS chunk. + 2010-05-25 6.6.2.1 Anthony Thyssen * Finish for Square Array Rotates (off center origin rotate) * Added HitAndMiss kernel Ridges2 to find 2 pixel thick ridges diff --git a/coders/png.c b/coders/png.c index 0eefea8d6..48dac7645 100644 --- a/coders/png.c +++ b/coders/png.c @@ -2752,7 +2752,8 @@ static Image *ReadOnePNGImage(MngInfo *mng_info, { for (x=0; x < ping_num_trans; x++) { - image->colormap[x].opacity = ScaleCharToQuantum((unsigned char)(255-ping_trans_alpha[x])); + image->colormap[x].opacity = + ScaleCharToQuantum((unsigned char)(255-ping_trans_alpha[x])); } } else if (ping_color_type == PNG_COLOR_TYPE_GRAY) @@ -6344,8 +6345,8 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, num_passes, pass; - png_bytep - ping_trans_alpha; + png_byte + ping_trans_alpha[256]; png_colorp palette; @@ -6431,8 +6432,6 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, ping_trans_color.blue=0; ping_trans_color.gray=0; - ping_trans_alpha = NULL; - quantum_info = (QuantumInfo *) NULL; image_colors=image->colors; image_depth=image->depth; @@ -7217,11 +7216,6 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, ping_num_trans=0; if (ping_num_trans != 0) { - ping_trans_alpha=(unsigned char *) AcquireQuantumMemory( - number_colors,sizeof(*ping_trans_alpha)); - if (ping_trans_alpha == (unsigned char *) NULL) - ThrowWriterException(ResourceLimitError, - "MemoryAllocationFailed"); for (i=0; i < (ssize_t) number_colors; i++) ping_trans_alpha[i]=(png_byte) trans[i]; } @@ -7513,6 +7507,22 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, " Added an opaque matte channel"); } + if (image->matte == MagickTrue && ping_color_type < 4) + { + if (ping_color_type == 3 && ping_num_trans == 0) + { + png_set_invalid(ping,ping_info,PNG_INFO_tRNS); + if (logging != MagickFalse) + (void) LogMagickEvent(CoderEvent,GetMagickModule(), + " Ignoring request to write tRNS chunk with num_trans==0"); + } + else + (void) png_set_tRNS(ping, ping_info, + ping_trans_alpha, + ping_num_trans, + &ping_trans_color); + } + if (logging != MagickFalse) (void) LogMagickEvent(CoderEvent,GetMagickModule(), " Writing PNG header chunks"); @@ -7772,7 +7782,7 @@ static MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, } for (y=0; y < (ssize_t) image->rows; y++) { - if (logging) + if (logging && y == 0) (void) LogMagickEvent(CoderEvent,GetMagickModule(), " pass %d, Image Is RGB, 16-bit GRAY, or GRAY_ALPHA",pass); p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);