1. VectorLinux Core
  2. vabs

Source

vabs / var / vabs / libgdiplus / src / patches / libgdiplus-libpng15.patch

$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;
 						}