From e76a8a537dbf8c47024f5863f9f18ed55ad686d3 Mon Sep 17 00:00:00 2001 From: michal-n Date: Sat, 17 Dec 2011 15:24:12 +0100 Subject: [PATCH] There was no need to panic... The patch from Paul contained errant reference to 'png_color16'. The correct form is 'png_color_16'. So, patch reapplied. --- gutils/gimagewritepng.c | 100 +++++++++++++++++++++++----------------------- 1 files changed, 50 insertions(+), 50 deletions(-) diff --git a/gutils/gimagewritepng.c b/gutils/gimagewritepng.c index 43fa097..a88ec63 100644 --- a/gutils/gimagewritepng.c +++ b/gutils/gimagewritepng.c @@ -236,6 +236,7 @@ return(false); } } else { if ( base->trans!=-1 ) { + trans_color = galloc(sizeof(png_color_16)); trans_color->red = COLOR_RED(base->trans); trans_color->green = COLOR_GREEN(base->trans); trans_color->blue = COLOR_BLUE(base->trans); @@ -258,6 +259,7 @@ return(false); _png_write_end(png_ptr, info_ptr); if ( trans_alpha!=NULL ) gfree(trans_alpha); + if ( trans_color!=NULL ) gfree(trans_color); if ( palette!=NULL ) gfree(palette); _png_destroy_write_struct(&png_ptr, &info_ptr); gfree(rows); @@ -296,7 +298,7 @@ static void user_error_fn(png_structp png_ptr, png_const_charp error_msg) { #if (PNG_LIBPNG_VER < 10500) longjmp(png_ptr->jmpbuf,1); #else - _png_longjmp (png_ptr, 1); + png_longjmp (png_ptr, 1); #endif } @@ -310,6 +312,12 @@ int GImageWrite_Png(GImage *gi, FILE *fp, int progressive) { png_infop info_ptr; png_byte **rows; int i; + int bit_depth; + int color_type; + int num_palette; + png_bytep trans_alpha = NULL; + png_color_16p trans_color = NULL; + png_colorp palette = NULL; png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, (void *)NULL, user_error_fn, user_warning_fn); @@ -336,65 +344,60 @@ return(false); png_init_io(png_ptr, fp); - info_ptr->width = base->width; - info_ptr->height = base->height; - info_ptr->bit_depth = 8; - info_ptr->valid = 0; - info_ptr->interlace_type = progressive; - if ( base->trans!=-1 ) { - info_ptr->num_trans = 1; - info_ptr->valid |= PNG_INFO_tRNS; + bit_depth = 8; + num_palette = base->clut==NULL?2:base->clut->clut_len; + if ( base->image_type==it_index || base->image_type==it_bitmap ) { + color_type = PNG_COLOR_TYPE_PALETTE; + if ( num_palette<=2 ) + bit_depth=1; + else if ( num_palette<=4 ) + bit_depth=2; + else if ( num_palette<=16 ) + bit_depth=4; + } else { + color_type = PNG_COLOR_TYPE_RGB; + if ( base->image_type == it_rgba ) + color_type = PNG_COLOR_TYPE_RGB_ALPHA; } + + png_set_IHDR(png_ptr, info_ptr, base->width, base->height, + bit_depth, color_type, progressive, + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); if ( base->image_type==it_index || base->image_type==it_bitmap ) { - info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; - info_ptr->valid |= PNG_INFO_PLTE; - info_ptr->num_palette = base->clut==NULL?2:base->clut->clut_len; - info_ptr->palette = (png_color *) galloc(info_ptr->num_palette*sizeof(png_color)); + palette = (png_color *) galloc(num_palette*sizeof(png_color)); if ( base->clut==NULL ) { - info_ptr->palette[0].red = info_ptr->palette[0].green = info_ptr->palette[0].blue = 0; - info_ptr->palette[1].red = info_ptr->palette[1].green = info_ptr->palette[1].blue = 0xff; + palette[0].red = palette[0].green = palette[0].blue = 0; + palette[1].red = palette[1].green = palette[1].blue = 0xff; } else { - for ( i=0; inum_palette; ++i ) { + for ( i=0; iclut->clut[i]; - info_ptr->palette[i].red = COLOR_RED(col); - info_ptr->palette[i].green = COLOR_GREEN(col); - info_ptr->palette[i].blue = COLOR_BLUE(col); + palette[i].red = COLOR_RED(col); + palette[i].green = COLOR_GREEN(col); + palette[i].blue = COLOR_BLUE(col); } } - if ( info_ptr->num_palette<=2 ) - info_ptr->bit_depth=1; - else if ( info_ptr->num_palette<=4 ) - info_ptr->bit_depth=2; - else if ( info_ptr->num_palette<=16 ) - info_ptr->bit_depth=4; - if ( info_ptr->num_palette<=16 ) + png_set_PLTE(png_ptr, info_ptr, palette, num_palette); + if ( num_palette<=16 ) png_set_packing(png_ptr); + if ( base->trans!=-1 ) { -#if ( PNG_LIBPNG_VER_MAJOR > 1 || PNG_LIBPNG_VER_MINOR > 2 ) - info_ptr->trans_alpha = galloc(1); - info_ptr->trans_alpha[0] = base->trans; -#else - info_ptr->trans = galloc(1); - info_ptr->trans[0] = base->trans; -#endif + trans_alpha = galloc(1); + trans_alpha[0] = base->trans; } } else { - info_ptr->color_type = PNG_COLOR_TYPE_RGB; if ( base->trans!=-1 ) { -#if ( PNG_LIBPNG_VER_MAJOR > 1 || PNG_LIBPNG_VER_MINOR > 2 ) - info_ptr->trans_color.red = COLOR_RED(base->trans); - info_ptr->trans_color.green = COLOR_GREEN(base->trans); - info_ptr->trans_color.blue = COLOR_BLUE(base->trans); -#else - info_ptr->trans_values.red = COLOR_RED(base->trans); - info_ptr->trans_values.green = COLOR_GREEN(base->trans); - info_ptr->trans_values.blue = COLOR_BLUE(base->trans); -#endif + trans_color = galloc(sizeof(png_color_16)); + trans_color->red = COLOR_RED(base->trans); + trans_color->green = COLOR_GREEN(base->trans); + trans_color->blue = COLOR_BLUE(base->trans); } } + if ( base->trans!=-1 ) { + png_set_tRNS(png_ptr, info_ptr, trans_alpha, 1, trans_color); + } png_write_info(png_ptr, info_ptr); - if (info_ptr->color_type == PNG_COLOR_TYPE_RGB) + if (color_type == PNG_COLOR_TYPE_RGB) png_set_filler(png_ptr, '\0', PNG_FILLER_BEFORE); rows = galloc(base->height*sizeof(png_byte *)); @@ -405,12 +408,9 @@ return(false); png_write_end(png_ptr, info_ptr); -#if ( PNG_LIBPNG_VER_MAJOR > 1 || PNG_LIBPNG_VER_MINOR > 2 ) - if ( info_ptr->trans_alpha!=NULL ) gfree(info_ptr->trans_alpha); -#else - if ( info_ptr->trans!=NULL ) gfree(info_ptr->trans); -#endif - if ( info_ptr->palette!=NULL ) gfree(info_ptr->palette); + if ( trans_alpha!=NULL ) gfree(trans_alpha); + if ( trans_color!=NULL ) gfree(trans_color); + if ( palette!=NULL ) gfree(palette); png_destroy_write_struct(&png_ptr, &info_ptr); gfree(rows); return( 1 ); -- 1.7.4.1