build matplotlib1.0.1 with libpng1.5.2

hi list,

first, thanks for providing matplotlib, i am using it in several projects.

i had problems with several png files and decided to upgrade libpng.
as you can see in the documentation of libpng,
direct access to png_infop is no longer possible.

i have created the following patch:

--- matplotlib-1.0.1/src/_png.cpp 2010-10-12 16:14:42.000000000 +0000
+++ matplotlib-1.0.1X/src/_png.cpp 2011-05-25 19:23:36.261752651 +0000
@@ -350,18 +350,21 @@
     png_set_sig_bytes(png_ptr, 8);
     png_read_info(png_ptr, info_ptr);

- png_uint_32 width = info_ptr->width;
- png_uint_32 height = info_ptr->height;
+ png_uint_32 width = png_get_image_width(png_ptr, info_ptr);
+ png_uint_32 height = png_get_image_height(png_ptr, info_ptr);

- int bit_depth = info_ptr->bit_depth;
+ int bit_depth = png_get_bit_depth(png_ptr, info_ptr);

     // Unpack 1, 2, and 4-bit images
     if (bit_depth < 8)
         png_set_packing(png_ptr);

+ // this is needed several times, so safe it in a variable
+ png_byte color_type = png_get_color_type(png_ptr, info_ptr);

···

+
     // If sig bits are set, shift data
     png_color_8p sig_bit;
- if ((info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) &&
+ if ((color_type != PNG_COLOR_TYPE_PALETTE) &&
         png_get_sBIT(png_ptr, info_ptr, &sig_bit))
     {
         png_set_shift(png_ptr, sig_bit);
@@ -374,13 +377,13 @@
     }

     // Convert palletes to full RGB
- if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
+ if (color_type == PNG_COLOR_TYPE_PALETTE)
     {
         png_set_palette_to_rgb(png_ptr);
     }

     // If there's an alpha channel convert gray to RGB
- if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+ if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
     {
         png_set_gray_to_rgb(png_ptr);
     }
@@ -408,11 +411,11 @@
     npy_intp dimensions[3];
     dimensions[0] = height; //numrows
     dimensions[1] = width; //numcols
- if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
+ if (color_type & PNG_COLOR_MASK_ALPHA)
     {
         dimensions[2] = 4; //RGBA images
     }
- else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR)
+ else if (color_type & PNG_COLOR_MASK_COLOR)
     {
         dimensions[2] = 3; //RGB images
     }
@@ -421,7 +424,7 @@
         dimensions[2] = 1; //Greyscale images
     }
     //For gray, return an x by y array, not an x by y by 1
- int num_dims = (info_ptr->color_type & PNG_COLOR_MASK_COLOR) ? 3 : 2;
+ int num_dims = (color_type & PNG_COLOR_MASK_COLOR) ? 3 : 2;

     double max_value = (1 << ((bit_depth < 8) ? 8 : bit_depth)) - 1;
     PyArrayObject *A = (PyArrayObject *) PyArray_SimpleNew(

kind regards,
dieter