$NetBSD: patch-af,v 1.3 2011/02/07 21:28:56 wiz Exp $ Fix build with png-1.5. --- rw/readPNG.c.orig 1996-08-29 05:24:48.000000000 +0000 +++ rw/readPNG.c @@ -28,7 +28,7 @@ int TestPNG(char *file) /* gets called a LOT on the first image: brushes? */ { - char header[8]; + unsigned char header[8]; FILE *fp = fopen(file, "rb"); /* libpng requires ANSI; so do we */ if (!fp) @@ -46,11 +46,13 @@ Image * ReadPNG(char *file) { FILE *fp; - png_structp png_ptr; - png_infop info_ptr; + png_structp png_ptr = NULL; + png_infop info_ptr = NULL; int i, hasAlpha=FALSE; int width, height, level, bit_depth, npasses; Image *image = NULL; + png_colorp palette; + int num_palette; Trace((stderr, "\nGRR ReadPNG: reading file %s\n", file)); @@ -59,14 +61,15 @@ ReadPNG(char *file) return NULL; } - png_ptr = (png_structp)malloc(sizeof(png_struct)); + png_ptr = (png_structp)png_create_read_struct(PNG_LIBPNG_VER_STRING, + NULL, NULL, NULL); if (!png_ptr) { RWSetMsg("Error allocating PNG png_ptr memory"); fclose(fp); return NULL; } - info_ptr = (png_infop)malloc(sizeof(png_info)); + info_ptr = (png_infop)png_create_info_struct(png_ptr); if (!info_ptr) { RWSetMsg("Error allocating PNG info_ptr memory"); free(png_ptr); @@ -74,38 +77,36 @@ ReadPNG(char *file) return NULL; } - if (setjmp(png_ptr->jmpbuf)) { + if (setjmp(png_jmpbuf(png_ptr))) { RWSetMsg("Error setting longjmp error handler"); - png_read_destroy(png_ptr, info_ptr, (png_info *)0); - free(png_ptr); - free(info_ptr); + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); fclose(fp); return NULL; } - png_info_init(info_ptr); - png_read_init(png_ptr); png_init_io(png_ptr, fp); png_read_info(png_ptr, info_ptr); - width = info_ptr->width; - height = info_ptr->height; + width = png_get_image_width(png_ptr, info_ptr); + height = png_get_image_height(png_ptr, info_ptr); Trace((stderr, "GRR ReadPNG: width = %d, height = %d\n", width, height)); - switch (info_ptr->color_type) { + + png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette); + switch (png_get_color_type(png_ptr, info_ptr)) { case PNG_COLOR_TYPE_PALETTE: Trace((stderr, "GRR ReadPNG: PNG_COLOR_TYPE_PALETTE\n")); - image = ImageNewCmap(width, height, info_ptr->num_palette); - for (i = 0; i < info_ptr->num_palette; ++i) - ImageSetCmap(image, i, info_ptr->palette[i].red, - info_ptr->palette[i].green, info_ptr->palette[i].blue); + image = ImageNewCmap(width, height, num_palette); + for (i = 0; i < num_palette; ++i) + ImageSetCmap(image, i, palette[i].red, + palette[i].green, palette[i].blue); /* GRR: still need to get image data into `image' */ break; case PNG_COLOR_TYPE_RGB: Trace((stderr, "GRR ReadPNG: PNG_COLOR_TYPE_RGB\n")); - if (info_ptr->bit_depth == 16) { + if (png_get_bit_depth(png_ptr, info_ptr) == 16) { RWSetMsg("Stripping 48-bit RGB image to 24 bits"); fprintf(stderr, "ReadPNG: stripping 48-bit RGB image to 24 bits\n"); @@ -117,8 +118,8 @@ ReadPNG(char *file) case PNG_COLOR_TYPE_GRAY: /* treat grayscale as special colormap */ Trace((stderr, "GRR ReadPNG: PNG_COLOR_TYPE_GRAY\n")); - bit_depth = info_ptr->bit_depth; - if (info_ptr->bit_depth == 16) { + bit_depth = png_get_bit_depth(png_ptr, info_ptr); + if (bit_depth == 16) { RWSetMsg("Stripping 16-bit grayscale image to 8 bits"); fprintf(stderr, "ReadPNG: stripping 16-bit grayscale image to 8 bits\n"); @@ -157,7 +158,7 @@ ReadPNG(char *file) case PNG_COLOR_TYPE_RGB_ALPHA: Trace((stderr, "GRR ReadPNG: PNG_COLOR_TYPE_RGB_ALPHA\n")); - if (info_ptr->bit_depth == 16) { + if (png_get_bit_depth(png_ptr, info_ptr) == 16) { RWSetMsg("Stripping 64-bit RGBA image to 32 bits"); png_set_strip_16(png_ptr); } @@ -169,7 +170,7 @@ ReadPNG(char *file) case PNG_COLOR_TYPE_GRAY_ALPHA: Trace((stderr, "GRR ReadPNG: PNG_COLOR_TYPE_GRAY_ALPHA\n")); - if (info_ptr->bit_depth == 16) { + if (png_get_bit_depth(png_ptr, info_ptr) == 16) { RWSetMsg("Stripping 32-bit gray+alpha image to 16 bits"); png_set_strip_16(png_ptr); } @@ -180,20 +181,20 @@ ReadPNG(char *file) default: fprintf(stderr, "ReadPNG: unknown image type (%d)\n", - info_ptr->color_type); + png_get_color_type(png_ptr, info_ptr)); fflush(stderr); RWSetMsg("Unknown PNG image type"); - png_read_destroy(png_ptr, info_ptr, (png_infop)NULL); + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); free(png_ptr); free(info_ptr); fclose(fp); return image; /* NULL */ } - if (info_ptr->bit_depth < 8) + if (png_get_bit_depth(png_ptr, info_ptr) < 8) png_set_packing(png_ptr); - if (info_ptr->interlace_type) + if (png_get_interlace_type(png_ptr, info_ptr)) npasses = png_set_interlace_handling(png_ptr); png_read_update_info(png_ptr, info_ptr); @@ -211,13 +212,13 @@ ReadPNG(char *file) * no easy way around it: libpng returns the image and alpha channel * interspersed, and interlaced alpha images just make matters worse */ - png_data = (png_bytep)malloc(height*info_ptr->rowbytes); + png_data = (png_bytep)malloc(height*png_get_rowbytes(png_ptr, info_ptr)); if (!png_data) { RWSetMsg("Unable to allocate temporary storage for alpha image"); fprintf(stderr, "ReadPNG error: unable to malloc png_data\n"); fflush(stderr); ImageDelete(image); - png_read_destroy(png_ptr, info_ptr, (png_infop)NULL); + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); free(png_ptr); free(info_ptr); fclose(fp); @@ -226,11 +227,11 @@ ReadPNG(char *file) /* only bit depths of 8 and 16 support alpha channels */ for (i = 0; i < height; ++i) - row_pointers[i] = (png_bytep)png_data + i*info_ptr->rowbytes; + row_pointers[i] = (png_bytep)png_data + i*png_get_rowbytes(png_ptr, info_ptr); png_read_image(png_ptr, row_pointers); - if (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) { + if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_RGB_ALPHA) { png_bytep png=png_data, rgb=image->data, alpha=image->maskData; for (i = 0; i < height*width; ++i) { @@ -258,7 +259,7 @@ ReadPNG(char *file) return NULL; } for (i = 0; i < height; ++i) - row_pointers[i] = (png_bytep)image->data + i*info_ptr->rowbytes; + row_pointers[i] = (png_bytep)image->data + i*png_get_rowbytes(png_ptr, info_ptr); png_read_image(png_ptr, row_pointers); @@ -271,7 +272,7 @@ ReadPNG(char *file) */ png_read_end(png_ptr, info_ptr); - png_read_destroy(png_ptr, info_ptr, (png_infop)NULL); + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); free(png_ptr); free(info_ptr); fclose(fp);