$NetBSD: patch-ak,v 1.5 2011/01/15 14:08:10 wiz Exp $ Fix build with png-1.5. From John Bowler. --- base/gdevpng.c.orig 2008-07-17 02:34:01.000000000 +0000 +++ base/gdevpng.c @@ -36,12 +36,14 @@ #include "gdevpccm.h" #include "gscdefs.h" -#define PNG_INTERNAL /* * libpng versions 1.0.3 and later allow disabling access to the stdxxx * files while retaining support for FILE * I/O. + * + * This is a misunderstanding - this is a build time option for libpng, + * it has no effect on a user of libpng. */ -#define PNG_NO_CONSOLE_IO +/*#define PNG_NO_CONSOLE_IO*/ /* * Earlier libpng versions require disabling FILE * I/O altogether. * This produces a compiler warning about no prototype for png_init_io. @@ -280,7 +282,7 @@ png_print_page(gx_device_printer * pdev, goto done; } /* set error handling */ - if (setjmp(png_ptr->jmpbuf)) { + if (setjmp(png_jmpbuf(png_ptr))) { /* If we get here, we had a problem reading the file */ code = gs_note_error(gs_error_VMerror); goto done; @@ -290,19 +292,12 @@ png_print_page(gx_device_printer * pdev, png_init_io(png_ptr, file); /* set the file information here */ - info_ptr->width = pdev->width; - info_ptr->height = pdev->height; - /* resolution is in pixels per meter vs. dpi */ - info_ptr->x_pixels_per_unit = - (png_uint_32) (pdev->HWResolution[0] * (100.0 / 2.54)); - info_ptr->y_pixels_per_unit = - (png_uint_32) (pdev->HWResolution[1] * (100.0 / 2.54)); - info_ptr->phys_unit_type = PNG_RESOLUTION_METER; - info_ptr->valid |= PNG_INFO_pHYs; switch (depth) { case 32: - info_ptr->bit_depth = 8; - info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA; + png_set_IHDR(png_ptr, info_ptr, pdev->width, pdev->height, + 8, PNG_COLOR_TYPE_RGB_ALPHA, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); png_set_invert_alpha(png_ptr); { gx_device_pngalpha *ppdev = (gx_device_pngalpha *)pdev; png_color_16 background; @@ -315,57 +310,69 @@ png_print_page(gx_device_printer * pdev, } break; case 48: - info_ptr->bit_depth = 16; - info_ptr->color_type = PNG_COLOR_TYPE_RGB; + png_set_IHDR(png_ptr, info_ptr, pdev->width, pdev->height, + 16, PNG_COLOR_TYPE_RGB, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); #if defined(ARCH_IS_BIG_ENDIAN) && (!ARCH_IS_BIG_ENDIAN) png_set_swap(png_ptr); #endif break; case 24: - info_ptr->bit_depth = 8; - info_ptr->color_type = PNG_COLOR_TYPE_RGB; + png_set_IHDR(png_ptr, info_ptr, pdev->width, pdev->height, + 8, PNG_COLOR_TYPE_RGB, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); break; case 8: - info_ptr->bit_depth = 8; - if (gx_device_has_color(pdev)) - info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; - else - info_ptr->color_type = PNG_COLOR_TYPE_GRAY; + png_set_IHDR(png_ptr, info_ptr, pdev->width, pdev->height, + 8, gx_device_has_color(pdev) ? + PNG_COLOR_TYPE_PALETTE : PNG_COLOR_TYPE_GRAY, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); break; case 4: - info_ptr->bit_depth = 4; - info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; + png_set_IHDR(png_ptr, info_ptr, pdev->width, pdev->height, + 4, PNG_COLOR_TYPE_PALETTE, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); break; case 1: - info_ptr->bit_depth = 1; - info_ptr->color_type = PNG_COLOR_TYPE_GRAY; + png_set_IHDR(png_ptr, info_ptr, pdev->width, pdev->height, + 1, PNG_COLOR_TYPE_GRAY, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); /* invert monocrome pixels */ png_set_invert_mono(png_ptr); break; + default: + png_error(png_ptr, "invalid bit depth"); } + /* resolution is in pixels per meter vs. dpi */ + png_set_pHYs(png_ptr, info_ptr, + (png_uint_32) (pdev->HWResolution[0] * (100.0 / 2.54)), + (png_uint_32) (pdev->HWResolution[1] * (100.0 / 2.54)), + PNG_RESOLUTION_METER); + /* set the palette if there is one */ - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { + if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_PALETTE) { int i; int num_colors = 1 << depth; gx_color_value rgb[3]; + png_color palette[256]; + + if (num_colors > 256) + num_colors = 256; - info_ptr->palette = - (void *)gs_alloc_bytes(mem, 256 * sizeof(png_color), - "png palette"); - if (info_ptr->palette == 0) { - code = gs_note_error(gs_error_VMerror); - goto done; - } - info_ptr->num_palette = num_colors; - info_ptr->valid |= PNG_INFO_PLTE; for (i = 0; i < num_colors; i++) { (*dev_proc(pdev, map_color_rgb)) ((gx_device *) pdev, (gx_color_index) i, rgb); - info_ptr->palette[i].red = gx_color_value_to_byte(rgb[0]); - info_ptr->palette[i].green = gx_color_value_to_byte(rgb[1]); - info_ptr->palette[i].blue = gx_color_value_to_byte(rgb[2]); + palette[i].red = gx_color_value_to_byte(rgb[0]); + palette[i].green = gx_color_value_to_byte(rgb[1]); + palette[i].blue = gx_color_value_to_byte(rgb[2]); } + png_set_PLTE(png_ptr, info_ptr, palette, num_colors); } /* add comment */ strncpy(software_key, "Software", sizeof(software_key)); @@ -375,15 +382,14 @@ png_print_page(gx_device_printer * pdev, text_png.key = software_key; text_png.text = software_text; text_png.text_length = strlen(software_text); - info_ptr->text = &text_png; - info_ptr->num_text = 1; + png_set_text(png_ptr, info_ptr, &text_png, 1); /* write the file information */ png_write_info(png_ptr, info_ptr); /* don't write the comments twice */ - info_ptr->num_text = 0; - info_ptr->text = NULL; + /*info_ptr->num_text = 0;*/ + /*info_ptr->text = NULL;*/ /* Write the contents of the image. */ for (y = 0; y < height; y++) { @@ -395,7 +401,7 @@ png_print_page(gx_device_printer * pdev, png_write_end(png_ptr, info_ptr); /* if you alloced the palette, free it here */ - gs_free_object(mem, info_ptr->palette, "png palette"); + /*gs_free_object(mem, info_ptr->palette, "png palette");*/ done: /* free the structures */ @@ -405,6 +411,7 @@ png_print_page(gx_device_printer * pdev, return code; } +#if 0 /* not required in 1.5 */ /* * Patch around a static reference to a never-used procedure. * This could be avoided if we were willing to edit pngconf.h to @@ -422,6 +429,7 @@ png_push_fill_buffer(png_structp png_ptr { } #endif +#endif static int pngalpha_open(gx_device * pdev)