$NetBSD: patch-aa,v 1.8 2011/01/21 10:21:51 wiz Exp $ Fix build with png-1.5. --- src/pngcodec.c.orig 2010-11-03 16:52:54.000000000 +0000 +++ src/pngcodec.c @@ -116,10 +116,15 @@ gdip_load_png_properties (png_structp pn bitmap_data->dpi_horz = png_get_x_pixels_per_inch(png_ptr, info_ptr); bitmap_data->dpi_vert = png_get_y_pixels_per_inch(png_ptr, info_ptr); #elif defined(PNG_pHYs_SUPPORTED) - if ((info_ptr->valid & PNG_INFO_pHYs) && (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)) { - bitmap_data->image_flags |= ImageFlagsHasRealDPI; - bitmap_data->dpi_horz = info_ptr->x_pixels_per_unit * 0.0254; - bitmap_data->dpi_vert = info_ptr->y_pixels_per_unit * 0.0254; + if (png_get_valid (png_ptr, info_ptr, PNG_INFO_pHYs)) { + png_uint_32 res_x, res_y; + int unit_type; + png_get_pHYs (png_ptr, info_ptr, &res_x, &res_y, &unit_type); + if (unit_type == PNG_RESOLUTION_METER) { + bitmap_data->image_flags |= ImageFlagsHasRealDPI; + bitmap_data->dpi_horz = res_x * 0.0254; + bitmap_data->dpi_vert = res_y * 0.0254; + } } #endif /* default to screen resolution (if nothing was provided or available) */ @@ -130,7 +135,7 @@ gdip_load_png_properties (png_structp pn #if defined(PNG_iCCP_SUPPORTED) { png_charp name; - png_charp profile; + png_bytep profile; png_uint_32 proflen; int compression_type; @@ -292,6 +297,11 @@ gdip_load_png_image_from_file_or_stream ImageFlags colourspace_flag; int i; int j; + png_colorp png_palette; + int png_num_palette; + png_bytep trans_alpha; + int num_trans; + png_color_16p trans_color; width = png_get_image_width (png_ptr, info_ptr); height = png_get_image_height (png_ptr, info_ptr); @@ -309,6 +319,8 @@ gdip_load_png_image_from_file_or_stream } /* Copy palette. */ + png_get_PLTE (png_ptr, info_ptr, &png_palette, &png_num_palette); + num_colours = 1 << bit_depth; if (png_get_color_type (png_ptr, info_ptr) == PNG_COLOR_TYPE_GRAY) { @@ -321,8 +333,8 @@ gdip_load_png_image_from_file_or_stream colourspace_flag = ImageFlagsColorSpaceRGB; palette_entries = num_colours; - if (palette_entries > info_ptr->num_palette) { - palette_entries = info_ptr->num_palette; + if (palette_entries > png_num_palette) { + palette_entries = png_num_palette; } palette = GdipAlloc (sizeof(ColorPalette) + (num_colours - 1) * sizeof(ARGB)); @@ -331,29 +343,30 @@ gdip_load_png_image_from_file_or_stream for (i=0; i < palette_entries; i++) { set_pixel_bgra (&palette->Entries[i], 0, - info_ptr->palette[i].blue, - info_ptr->palette[i].green, - info_ptr->palette[i].red, + png_palette[i].blue, + png_palette[i].green, + png_palette[i].red, 0xFF); /* alpha */ } } + png_get_tRNS (png_ptr, info_ptr, &trans_alpha, &num_trans, &trans_color); /* Make sure transparency is respected. */ - if (info_ptr->num_trans > 0) { + if (num_trans > 0) { palette->Flags |= PaletteFlagsHasAlpha; colourspace_flag |= ImageFlagsHasAlpha; - if (info_ptr->num_trans > info_ptr->num_palette) { - info_ptr->num_trans = info_ptr->num_palette; + if (num_trans > png_num_palette) { + num_trans = png_num_palette; } - for (i=0; i < info_ptr->num_trans; i++) { + for (i=0; i < num_trans; i++) { set_pixel_bgra(&palette->Entries[i], 0, - info_ptr->palette[i].blue, - info_ptr->palette[i].green, - info_ptr->palette[i].red, + png_palette[i].blue, + png_palette[i].green, + png_palette[i].red, #if PNG_LIBPNG_VER > 10399 - info_ptr->trans_alpha [i]); /* alpha */ + trans_alpha [i]); /* alpha */ #else info_ptr->trans[i]); /* alpha */ #endif @@ -398,6 +411,8 @@ gdip_load_png_image_from_file_or_stream BYTE bit_depth; int stride; int interlace; + png_colorp png_palette; + int png_num_palette; png_bytep *row_pointers; BYTE *rawptr; int i, j; @@ -490,32 +505,33 @@ gdip_load_png_image_from_file_or_stream png_byte palette = 0; png_byte pix = *rowp++; + png_get_PLTE (png_ptr, info_ptr, &png_palette, &png_num_palette); palette = (pix >> 6) & 0x03; set_pixel_bgra (rawptr, 0, - info_ptr->palette[palette].blue, - info_ptr->palette[palette].green, - info_ptr->palette[palette].red, + png_palette[palette].blue, + png_palette[palette].green, + png_palette[palette].red, 0xFF); /* alpha */ palette = (pix >> 4) & 0x03; set_pixel_bgra (rawptr, 4, - info_ptr->palette[palette].blue, - info_ptr->palette[palette].green, - info_ptr->palette[palette].red, + png_palette[palette].blue, + png_palette[palette].green, + png_palette[palette].red, 0xFF); /* alpha */ palette = (pix >> 2) & 0x03; set_pixel_bgra (rawptr, 8, - info_ptr->palette[palette].blue, - info_ptr->palette[palette].green, - info_ptr->palette[palette].red, + png_palette[palette].blue, + png_palette[palette].green, + png_palette[palette].red, 0xFF); /* alpha */ palette = pix & 0x03; set_pixel_bgra (rawptr, 12, - info_ptr->palette[palette].blue, - info_ptr->palette[palette].green, - info_ptr->palette[palette].red, + png_palette[palette].blue, + png_palette[palette].green, + png_palette[palette].red, 0xFF); /* alpha */ rawptr += 16; }