$OpenBSD: patch-gutils_gimagewritepng_c,v 1.1 2011/07/08 19:04:05 kili Exp $ Fix build with png-1.5. --- gutils/gimagewritepng.c.orig Fri Feb 18 12:37:45 2011 +++ gutils/gimagewritepng.c Fri Jul 8 12:30:37 2011 @@ -30,8 +30,10 @@ #ifdef _NO_LIBPNG static int a_file_must_define_something=0; /* ANSI says so */ -#elif !defined(_STATIC_LIBPNG) && !defined(NODYNAMIC) /* I don't know how to deal with dynamic libs on mac OS/X, hence this */ -#include +#else +# if !defined(_STATIC_LIBPNG) && !defined(NODYNAMIC) /* I don't know how to deal with dynamic libs on mac OS/X, hence this */ +# include +# endif # include #define int32 _int32 @@ -43,6 +45,7 @@ static int a_file_must_define_something=0; /* ANSI say #include "gimage.h" +# if !defined(_STATIC_LIBPNG) && !defined(NODYNAMIC) static DL_CONST void *libpng=NULL; static png_structp (*_png_create_write_struct)(char *, png_voidp, png_error_ptr, png_error_ptr); static png_infop (*_png_create_info_struct)(png_structp); @@ -138,7 +141,26 @@ return( 1 ); fprintf(stderr,"%s", dlerror()); return( 0 ); } +#else +# define _png_create_write_struct png_create_write_struct +# define _png_create_info_struct png_create_info_struct +# define _png_destroy_write_struct png_destroy_write_struct +# define _png_init_io png_init_io +# define _png_write_info png_write_info +# define _png_set_packing png_set_packing +# define _png_set_filler png_set_filler +# define _png_write_image png_write_image +# define _png_write_end png_write_end +# define _png_longjmp png_longjmp +# define _png_set_longjmp_fn png_set_longjmp_fn +# define _png_set_IHDR png_set_IHDR +# define _png_set_PLTE png_set_PLTE +# define _png_set_tRNS png_set_tRNS +static void *libpng=(void *) 1; +static int loadpng() { return true; } +#endif + static void user_error_fn(png_structp png_ptr, png_const_charp error_msg) { fprintf(stderr,"%s", error_msg ); #if (PNG_LIBPNG_VER < 10500) @@ -274,155 +296,6 @@ return( false ); } fp = fopen(filename, "wb"); if (!fp) -return(false); - ret = GImageWrite_Png(gi,fp,progressive); - fclose(fp); -return( ret ); -} -#else -#include - -#define int32 _int32 -#define uint32 _uint32 -#define int16 _int16 -#define uint16 _uint16 -#define int8 _int8 -#define uint8 _uint8 - -#include "gimage.h" - -static void user_error_fn(png_structp png_ptr, png_const_charp error_msg) { - fprintf(stderr, "%s\n", error_msg ); -#if (PNG_LIBPNG_VER < 10500) - longjmp(png_ptr->jmpbuf,1); -#else - _png_longjmp (png_ptr, 1); -#endif -} - -static void user_warning_fn(png_structp png_ptr, png_const_charp warning_msg) { - fprintf(stderr,"%s\n", warning_msg); -} - -int GImageWrite_Png(GImage *gi, FILE *fp, int progressive) { - struct _GImage *base = gi->list_len==0?gi->u.image:gi->u.images[0]; - png_structp png_ptr; - png_infop info_ptr; - png_byte **rows; - int i; - - png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, - (void *)NULL, user_error_fn, user_warning_fn); - - if (!png_ptr) { -return(false); - } - - info_ptr = png_create_info_struct(png_ptr); - if (!info_ptr) { - png_destroy_write_struct(&png_ptr, (png_infopp)NULL); -return(false); - } - -#if (PNG_LIBPNG_VER < 10500) - if (setjmp(png_ptr->jmpbuf)) -#else - if (setjmp(*png_set_longjmp_fn(png_ptr, longjmp, sizeof (jmp_buf)))) -#endif - { - png_destroy_write_struct(&png_ptr, (png_infopp)NULL); -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; - } - 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)); - 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; - } else { - for ( i=0; inum_palette; ++i ) { - long col = base->clut->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); - } - } - 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_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 - } - } 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 - } - } - png_write_info(png_ptr, info_ptr); - - if (info_ptr->color_type == PNG_COLOR_TYPE_RGB) - png_set_filler(png_ptr, '\0', PNG_FILLER_BEFORE); - - rows = galloc(base->height*sizeof(png_byte *)); - for ( i=0; iheight; ++i ) - rows[i] = (png_byte *) (base->data + i*base->bytes_per_line); - - png_write_image(png_ptr,rows); - - 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); - png_destroy_write_struct(&png_ptr, &info_ptr); - gfree(rows); -return( 1 ); -} - -int GImageWritePng(GImage *gi, char *filename, int progressive) { - FILE *fp; - int ret; - - /* open the file */ - fp = fopen(filename, "wb"); - if (!fp) return(false); ret = GImageWrite_Png(gi,fp,progressive); fclose(fp);