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.
this broke matplotlib.
as you can see in the documentation of libpng15, it is no longer possible
to directly access png_infop.

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

------------------------------------------------------------------------------
vRanger cuts backup time in half-while increasing security.
With the market-leading solution for virtual backup and recovery, 
you get blazing-fast, flexible, and affordable data protection.
Download your free trial now. 
http://p.sf.net/sfu/quest-d2dcopy1
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

Reply via email to