view src/graphicsmagick-2-libpng1.5.patch @ 1713:318f6b6153bd

merge
author Volker Grabsch <vog@notjusthosting.com>
date Sun, 27 Mar 2011 23:36:16 +0200
parents 9dccc329bc7e
children
line wrap: on
line source

This file is part of mingw-cross-env.
See doc/index.html for further information.

This patch has been taken from:
http://cvs.graphicsmagick.org/cgi-bin/cvsweb.cgi/GraphicsMagick/coders/png.c.diff?r1=1.457;r2=1.410.2.4

--- GraphicsMagick/coders/png.c	2010/03/07 21:23:50	1.410.2.4
+++ GraphicsMagick/coders/png.c	2010/09/19 23:35:45	1.457
@@ -88,26 +88,7 @@
 #include "zlib.h"
 
 
-/*
- * TO DO: rewrite using png_get_tRNS() instead of direct access to the
- * ping and ping_info structs.
- */
-#if PNG_LIBPNG_VER < 10400
-#    define trans_color  trans_values   /* Changed at libpng-1.4.0beta35 */
-#    define trans_alpha  trans          /* Changed at libpng-1.4.0beta74 */
-#else
-   /* We could parse PNG_LIBPNG_VER_STRING here but it's too much bother..
-    * Just don't use libpng-1.4.0beta32-34 or beta67-73
-    */
-#  ifndef  PNG_USER_CHUNK_CACHE_MAX     /* Added at libpng-1.4.0beta32 */
-#    define trans_color  trans_values   /* Changed at libpng-1.4.0beta35 */
-#  endif
-#  ifndef  PNG_TRANSFORM_GRAY_TO_RGB    /* Added at libpng-1.4.0beta67 */
-#    define trans_alpha  trans          /* Changed at libpng-1.4.0beta74 */
-#  endif
-#endif
-
-#if PNG_LIBPNG_VER > 95
+#if PNG_LIBPNG_VER > 10011
 /*
   Optional declarations. Define or undefine them as you like.
 */
@@ -164,10 +145,6 @@ static SemaphoreInfo
   PNG_MNG_FEATURES_SUPPORTED is disabled by default in libpng-1.0.9 and
   will be enabled by default in libpng-1.2.0.
 */
-#if (PNG_LIBPNG_VER == 10009)  /* work around libpng-1.0.9 bug */
-#  undef PNG_READ_EMPTY_PLTE_SUPPORTED
-#  undef PNG_WRITE_EMPTY_PLTE_SUPPORTED
-#endif
 #ifdef PNG_MNG_FEATURES_SUPPORTED
 #  ifndef PNG_READ_EMPTY_PLTE_SUPPORTED
 #    define PNG_READ_EMPTY_PLTE_SUPPORTED
@@ -244,6 +221,16 @@ static png_byte FARDATA mng_tIME[5]={116
 static png_byte FARDATA mng_zTXt[5]={122,  84,  88, 116, '\0'};
 */
 
+typedef struct _UShortPixelPacket
+{
+  unsigned short
+    red,
+    green,
+    blue,
+    opacity,
+    index;
+} UShortPixelPacket;
+
 typedef struct _MngBox
 {
   long
@@ -492,7 +479,6 @@ static const char* PngColorTypeToString(
   return result;
 }
 
-#if PNG_LIBPNG_VER > 95
 #if defined(PNG_SORT_PALETTE)
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -785,7 +771,6 @@ static MagickPassFail CompressColormapTr
   return(MagickPass);
 }
 #endif
-#endif /* PNG_LIBPNG_VER > 95 */
 #endif /* HasPNG */
 
 /*
@@ -907,7 +892,7 @@ static MagickPassFail IsPNG(const unsign
 extern "C" {
 #endif
 
-#if (PNG_LIBPNG_VER > 95)
+#if (PNG_LIBPNG_VER > 10011)
 static size_t WriteBlobMSBULong(Image *image,const unsigned long value)
 {
   unsigned char
@@ -956,13 +941,13 @@ static void LogPNGChunk(int logging, png
         "  Writing %c%c%c%c chunk, length: %lu",
         type[0],type[1],type[2],type[3],length);
 }
-#endif /* PNG_LIBPNG_VER > 95 */
+#endif /* PNG_LIBPNG_VER > 10011 */
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }
 #endif
 
-#if PNG_LIBPNG_VER > 95
+#if PNG_LIBPNG_VER > 10011
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %                                                                             %
@@ -1351,7 +1336,11 @@ static void PNGErrorHandler(png_struct *
                         "  libpng-%.1024s error: %.1024s",
                         PNG_LIBPNG_VER_STRING, message);
   (void) ThrowException2(&image->exception,CoderError,message,image->filename);
+#if (PNG_LIBPNG_VER < 10500)
   longjmp(ping->jmpbuf,1);
+#else
+  png_longjmp(ping,1);
+#endif
 }
 
 static void PNGWarningHandler(png_struct *ping,png_const_charp message)
@@ -1372,19 +1361,8 @@ static void PNGWarningHandler(png_struct
 #ifdef PNG_USER_MEM_SUPPORTED
 static png_voidp png_IM_malloc(png_structp png_ptr,png_uint_32 size)
 {
-#if (PNG_LIBPNG_VER < 10011)
-  png_voidp
-    ret;
-  
-  png_ptr=png_ptr;
-  ret=MagickAllocateMemory(png_voidp,(size_t) size);
-  if (ret == NULL)
-    png_error("Insufficient memory.");
-  return (ret);
-#else
   png_ptr=png_ptr;
   return MagickAllocateMemory(png_voidp,(size_t) size);
-#endif
 }
 
 /*
@@ -1560,11 +1538,24 @@ static Image *ReadOnePNGImage(MngInfo *m
     logging,
     num_text,
     num_passes,
-    pass;
+    pass,
+    ping_bit_depth,
+    ping_colortype,
+    ping_interlace_method,
+    ping_compression_method,
+    ping_filter_method,
+    ping_num_trans;
 
-  PixelPacket
+  UShortPixelPacket
     transparent_color;
 
+  png_bytep
+     ping_trans_alpha;
+
+  png_color_16p
+     ping_background,
+     ping_trans_color;
+
   png_info
     *end_info,
     *ping_info;
@@ -1572,6 +1563,11 @@ static Image *ReadOnePNGImage(MngInfo *m
   png_struct
     *ping;
 
+  png_uint_32
+    ping_rowbytes,
+    ping_width,
+    ping_height;
+
   png_textp
     text;
 
@@ -1619,23 +1615,12 @@ static Image *ReadOnePNGImage(MngInfo *m
   LockSemaphoreInfo(png_semaphore);
 #endif
 
-#if (PNG_LIBPNG_VER < 10007)
+#if (PNG_LIBPNG_VER < 10012)
   if (image_info->verbose)
     printf("Your PNG library (libpng-%s) is rather old.\n",
            PNG_LIBPNG_VER_STRING);
 #endif
 
-#if (PNG_LIBPNG_VER >= 10400)
-#  ifndef  PNG_TRANSFORM_GRAY_TO_RGB    /* Added at libpng-1.4.0beta67 */
-  if (image_info->verbose)
-    {
-      printf("Your PNG library (libpng-%s) is an old beta version.\n",
-           PNG_LIBPNG_VER_STRING);
-      printf("Please update it.\n");
-    }
-#  endif
-#endif
-
   image=mng_info->image;
 
   /*
@@ -1665,7 +1650,7 @@ static Image *ReadOnePNGImage(MngInfo *m
       ThrowReaderException(ResourceLimitError,MemoryAllocationFailed,image);
     }
   png_pixels=(unsigned char *) NULL;
-  if (setjmp(ping->jmpbuf))
+  if (setjmp(png_jmpbuf(ping)))
     {
       /*
         PNG image is corrupt.
@@ -1740,18 +1725,32 @@ static Image *ReadOnePNGImage(MngInfo *m
 
   png_read_info(ping,ping_info);
 
+  (void) png_get_IHDR(ping,ping_info,
+                      &ping_width,
+                      &ping_height,
+                      &ping_bit_depth,
+                      &ping_colortype,
+                      &ping_interlace_method,
+                      &ping_compression_method,
+                      &ping_filter_method);
+
+  (void) png_get_tRNS(ping, ping_info, &ping_trans_alpha, &ping_num_trans,
+                      &ping_trans_color);
+
+  (void) png_get_bKGD(ping, ping_info, &ping_background);
+
 #if (QuantumDepth == 8)
   image->depth=8;
 #else
-  if (ping_info->bit_depth > 8)
+  if (ping_bit_depth > 8)
     image->depth=16;
   else
     image->depth=8;
 #endif
 
-  if (ping_info->bit_depth < 8)
+  if (ping_bit_depth < 8)
     {
-      if ((ping_info->color_type == PNG_COLOR_TYPE_PALETTE))
+      if (ping_colortype == PNG_COLOR_TYPE_PALETTE)
         {
           png_set_packing(ping);
           image->depth=8;
@@ -1761,21 +1760,22 @@ static Image *ReadOnePNGImage(MngInfo *m
     {
       (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                             "    PNG width: %lu, height: %lu",
-                            (unsigned long)ping_info->width,
-                            (unsigned long)ping_info->height);
+                            (unsigned long)ping_width,
+                            (unsigned long)ping_height);
       (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                             "    PNG color_type: %d, bit_depth: %d",
-                            ping_info->color_type, ping_info->bit_depth);
+                            ping_colortype, ping_bit_depth);
       (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                             "    PNG compression_method: %d",
-                            ping_info->compression_type);
+                            ping_compression_method);
       (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                             "    PNG interlace_method: %d, filter_method: %d",
-                            ping_info->interlace_type,ping_info->filter_type);
+                            ping_interlace_method,
+                            ping_filter_method);
     }
 
-#if (PNG_LIBPNG_VER > 10008) && defined(PNG_READ_iCCP_SUPPORTED)
-  if (ping_info->valid & PNG_INFO_iCCP)
+#if defined(PNG_READ_iCCP_SUPPORTED)
+    if (png_get_valid(ping, ping_info, PNG_INFO_iCCP))
     {
       int
         compression;
@@ -1803,15 +1803,19 @@ static Image *ReadOnePNGImage(MngInfo *m
             }
         }
     }
-#endif /* #if (PNG_LIBPNG_VER > 10008) && defined(PNG_READ_iCCP_SUPPORTED) */
+#endif /* #if defined(PNG_READ_iCCP_SUPPORTED) */
 #if defined(PNG_READ_sRGB_SUPPORTED)
   {
     int
       intent;
 
-    if (mng_info->have_global_srgb)
-      image->rendering_intent=(RenderingIntent)
-        (mng_info->global_srgb_intent+1);
+    if (!png_get_sRGB(ping,ping_info,&intent))
+      {
+        if (mng_info->have_global_srgb)
+          {
+            png_set_sRGB(ping,ping_info,(mng_info->global_srgb_intent+1));
+          }
+      }
     if (png_get_sRGB(ping,ping_info,&intent))
       {
         image->rendering_intent=(RenderingIntent) (intent+1);
@@ -1827,8 +1831,11 @@ static Image *ReadOnePNGImage(MngInfo *m
     double
       file_gamma;
 
-    if (mng_info->have_global_gama)
-      image->gamma=mng_info->global_gamma;
+    if (!png_get_gAMA(ping,ping_info,&file_gamma))
+      {
+        if (mng_info->have_global_gama)
+          png_set_gAMA(ping,ping_info,mng_info->global_gamma);
+      }
     if (png_get_gAMA(ping,ping_info,&file_gamma))
       {
         image->gamma=(float) file_gamma;
@@ -1838,9 +1845,20 @@ static Image *ReadOnePNGImage(MngInfo *m
                                 file_gamma);
       }
   }
-  if (mng_info->have_global_chrm)
-    image->chromaticity=mng_info->global_chrm;
-  if (ping_info->valid & PNG_INFO_cHRM)
+  if (!png_get_valid(ping, ping_info, PNG_INFO_cHRM))
+    {
+      if (mng_info->have_global_chrm)
+        (void) png_set_cHRM(ping,ping_info,
+                     mng_info->global_chrm.white_point.x,
+                     mng_info->global_chrm.white_point.y,
+                     mng_info->global_chrm.red_primary.x,
+                     mng_info->global_chrm.red_primary.y,
+                     mng_info->global_chrm.green_primary.x,
+                     mng_info->global_chrm.green_primary.y,
+                     mng_info->global_chrm.blue_primary.x,
+                     mng_info->global_chrm.blue_primary.y);
+    }
+  if (png_get_valid(ping, ping_info, PNG_INFO_cHRM))
     {
       (void) png_get_cHRM(ping,ping_info,
                           &image->chromaticity.white_point.x,
@@ -1867,12 +1885,9 @@ static Image *ReadOnePNGImage(MngInfo *m
       image->chromaticity.white_point.x=0.3127f;
       image->chromaticity.white_point.y=0.3290f;
     }
-  if (mng_info->have_global_gama || image->rendering_intent)
-    ping_info->valid|=PNG_INFO_gAMA;
-  if (mng_info->have_global_chrm || image->rendering_intent)
-    ping_info->valid|=PNG_INFO_cHRM;
 #if defined(PNG_oFFs_SUPPORTED)
-  if (mng_info->mng_type == 0 && (ping_info->valid & PNG_INFO_oFFs))
+  if (mng_info->mng_type == 0 && (png_get_valid(ping, ping_info,
+                                                PNG_INFO_oFFs)))
     {
       image->page.x=png_get_x_offset_pixels(ping, ping_info);
       image->page.y=png_get_y_offset_pixels(ping, ping_info);
@@ -1885,7 +1900,17 @@ static Image *ReadOnePNGImage(MngInfo *m
     }
 #endif
 #if defined(PNG_pHYs_SUPPORTED)
-  if (ping_info->valid & PNG_INFO_pHYs)
+  if (!png_get_valid(ping, ping_info, PNG_INFO_pHYs))
+    {
+      if (mng_info->have_global_phys)
+        {
+          png_set_pHYs(ping,ping_info,
+                       mng_info->global_x_pixels_per_unit,
+                       mng_info->global_y_pixels_per_unit,
+                       mng_info->global_phys_unit_type);
+        }
+    }
+  if (png_get_valid(ping, ping_info, PNG_INFO_pHYs))
     {
       int
         unit_type;
@@ -1915,25 +1940,8 @@ static Image *ReadOnePNGImage(MngInfo *m
                               (unsigned long)y_resolution,
                               unit_type);
     }
-  else
-    {
-      if (mng_info->have_global_phys)
-        {
-          image->x_resolution=(float) mng_info->global_x_pixels_per_unit;
-          image->y_resolution=(float) mng_info->global_y_pixels_per_unit;
-          if (mng_info->global_phys_unit_type == PNG_RESOLUTION_METER)
-            {
-              image->units=PixelsPerCentimeterResolution;
-              image->x_resolution=(double)
-                mng_info->global_x_pixels_per_unit/100.0;
-              image->y_resolution=(double)
-                mng_info->global_y_pixels_per_unit/100.0;
-            }
-          ping_info->valid|=PNG_INFO_pHYs;
-        }
-    }
 #endif
-  if (ping_info->valid & PNG_INFO_PLTE)
+  if (png_get_valid(ping, ping_info, PNG_INFO_PLTE))
     {
       int
         number_colors;
@@ -1942,14 +1950,14 @@ static Image *ReadOnePNGImage(MngInfo *m
         palette;
 
       (void) png_get_PLTE(ping,ping_info,&palette,&number_colors);
-      if (number_colors == 0 && ping_info->color_type ==
+      if (number_colors == 0 && ping_colortype ==
           PNG_COLOR_TYPE_PALETTE)
         {
           if (mng_info->global_plte_length)
             {
               png_set_PLTE(ping,ping_info,mng_info->global_plte,
                            (int) mng_info->global_plte_length);
-              if (!(ping_info->valid & PNG_INFO_tRNS))
+              if (!(png_get_valid(ping, ping_info, PNG_INFO_tRNS)))
                 if (mng_info->global_trns_length)
                   {
                     if (mng_info->global_trns_length >
@@ -1966,7 +1974,7 @@ static Image *ReadOnePNGImage(MngInfo *m
 #ifndef PNG_READ_EMPTY_PLTE_SUPPORTED
                   mng_info->have_saved_bkgd_index ||
 #endif
-                  ping_info->valid & PNG_INFO_bKGD)
+                  png_get_valid(ping, ping_info, PNG_INFO_bKGD))
                 {
                   png_color_16
                     background;
@@ -1974,9 +1982,9 @@ static Image *ReadOnePNGImage(MngInfo *m
 #ifndef PNG_READ_EMPTY_PLTE_SUPPORTED
                   if (mng_info->have_saved_bkgd_index)
                     background.index=mng_info->saved_bkgd_index;
-                  else
 #endif
-                    background.index=ping_info->background.index;
+                  if (png_get_valid(ping, ping_info, PNG_INFO_bKGD))
+                    background.index=ping_background->index;
                   background.red=(png_uint_16)
                     mng_info->global_plte[background.index].red;
                   background.green=(png_uint_16)
@@ -1995,34 +2003,76 @@ static Image *ReadOnePNGImage(MngInfo *m
     }
 
 #if defined(PNG_READ_bKGD_SUPPORTED)
-  if (mng_info->have_global_bkgd && !(ping_info->valid & PNG_INFO_bKGD))
+  if (mng_info->have_global_bkgd && 
+              !(png_get_valid(ping,ping_info, PNG_INFO_bKGD)))
     image->background_color=mng_info->mng_global_bkgd;
-  if (ping_info->valid & PNG_INFO_bKGD)
+  if (png_get_valid(ping, ping_info, PNG_INFO_bKGD))
     {
       /*
         Set image background color.
       */
+
       if (logging)
         (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                               "    Reading PNG bKGD chunk.");
-      if (ping_info->bit_depth <= QuantumDepth)
+
+      if (ping_bit_depth == QuantumDepth)
         {
-          image->background_color.red=ping_info->background.red;
-          image->background_color.green=ping_info->background.green;
-          image->background_color.blue=ping_info->background.blue;
+          image->background_color.red  = ping_background->red;
+          image->background_color.green= ping_background->green;
+          image->background_color.blue = ping_background->blue;
         }
-      else
+      else /* Scale background components to 16-bit */
         {
+          unsigned int
+            bkgd_scale;
+
+          if (logging != MagickFalse)
+            (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+              "    raw ping_background=(%d,%d,%d).",ping_background->red,
+              ping_background->green,ping_background->blue);
+
+          bkgd_scale = 1;
+          if (ping_bit_depth == 1)
+             bkgd_scale = 255;
+          else if (ping_bit_depth == 2)
+             bkgd_scale = 85;
+          else if (ping_bit_depth == 4)
+             bkgd_scale = 17;
+          if (ping_bit_depth <= 8)
+             bkgd_scale *= 257;
+
+          ping_background->red *= bkgd_scale;
+          ping_background->green *= bkgd_scale;
+          ping_background->blue *= bkgd_scale;
+
+          if (logging != MagickFalse)
+            {
+            (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+              "    bkgd_scale=%d.",bkgd_scale);
+            (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+              "    ping_background=(%d,%d,%d).",ping_background->red,
+              ping_background->green,ping_background->blue);
+            }
+
           image->background_color.red=
-            ScaleShortToQuantum(ping_info->background.red);
+            ScaleShortToQuantum(ping_background->red);
           image->background_color.green=
-            ScaleShortToQuantum(ping_info->background.green);
+            ScaleShortToQuantum(ping_background->green);
           image->background_color.blue=
-            ScaleShortToQuantum(ping_info->background.blue);
+            ScaleShortToQuantum(ping_background->blue);
+          image->background_color.opacity=OpaqueOpacity;
+
+          if (logging != MagickFalse)
+            (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+              "    image->background_color=(%d,%d,%d).",
+              image->background_color.red,
+              image->background_color.green,image->background_color.blue);
         }
     }
 #endif
-  if (ping_info->valid & PNG_INFO_tRNS)
+
+  if (png_get_valid(ping, ping_info, PNG_INFO_tRNS))
     {
       int
         bit_mask;
@@ -2031,49 +2081,70 @@ static Image *ReadOnePNGImage(MngInfo *m
         (void) LogMagickEvent(CoderEvent,GetMagickModule(),
           "    Reading PNG tRNS chunk.");
 
-      bit_mask = (1 << ping_info->bit_depth) - 1;
+      bit_mask = (1 << ping_bit_depth) - 1;
 
       /*
         Image has a transparent background.
       */
+
       transparent_color.red=
-        (Quantum)(ping_info->trans_color.red & bit_mask);
+        (unsigned short)(ping_trans_color->red & bit_mask);
       transparent_color.green=
-        (Quantum) (ping_info->trans_color.green & bit_mask);
+        (unsigned short) (ping_trans_color->green & bit_mask);
       transparent_color.blue=
-        (Quantum) (ping_info->trans_color.blue & bit_mask);
+        (unsigned short) (ping_trans_color->blue & bit_mask);
       transparent_color.opacity=
-        (Quantum) (ping_info->trans_color.gray & bit_mask);
-      if (ping_info->color_type == PNG_COLOR_TYPE_GRAY)
+        (unsigned short) (ping_trans_color->gray & bit_mask);
+
+      if (ping_colortype == PNG_COLOR_TYPE_GRAY)
         {
+#if (Quantum_depth == 8)
+          if (ping_bit_depth < Quantum_depth)
+#endif
+            transparent_color.opacity=(unsigned short) (
+                ping_trans_color->gray *
+                (65535L/((1UL << ping_bit_depth)-1)));
+
+#if (Quantum_depth == 8)
+          else
+            transparent_color.opacity=(unsigned short) (
+                (ping_trans_color->gray * 65535L)/
+                ((1UL << ping_bit_depth)-1));
+#endif
+          if (logging != MagickFalse)
+            {
+              (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+                   "    Raw tRNS graylevel is %d.",ping_trans_color->gray);
+              (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+                   "    scaled graylevel is %d.",transparent_color.opacity);
+            }
           transparent_color.red=transparent_color.opacity;
           transparent_color.green=transparent_color.opacity;
           transparent_color.blue=transparent_color.opacity;
         }
     }
 #if defined(PNG_READ_sBIT_SUPPORTED)
-  if (mng_info->have_global_sbit)
-    {
-      int
-        not_valid;
-      not_valid=!ping_info->valid;
-      if (not_valid & PNG_INFO_sBIT)
+  if (!png_get_valid(ping, ping_info, PNG_INFO_sBIT))
+    if (mng_info->have_global_sbit)
         png_set_sBIT(ping,ping_info,&mng_info->global_sbit);
-    }
 #endif
   num_passes=png_set_interlace_handling(ping);
+
   png_read_update_info(ping,ping_info);
+
+  ping_rowbytes=png_get_rowbytes(ping,ping_info);
+
   /*
     Initialize image structure.
   */
   mng_info->image_box.left=0;
-  mng_info->image_box.right=(long) ping_info->width;
+  mng_info->image_box.right=(long) ping_width;
   mng_info->image_box.top=0;
-  mng_info->image_box.bottom=(long) ping_info->height;
+  mng_info->image_box.bottom=(long) ping_height;
   if (mng_info->mng_type == 0)
     {
-      mng_info->mng_width=ping_info->width;
-      mng_info->mng_height=ping_info->height;
+      mng_info->mng_width=ping_width;
+      mng_info->mng_height=ping_height;
       mng_info->frame=mng_info->image_box;
       mng_info->clip=mng_info->image_box;
     }
@@ -2082,14 +2153,14 @@ static Image *ReadOnePNGImage(MngInfo *m
       image->page.y=mng_info->y_off[mng_info->object_id];
     }
   image->compression=ZipCompression;
-  image->columns=ping_info->width;
-  image->rows=ping_info->height;
-  if ((ping_info->color_type == PNG_COLOR_TYPE_PALETTE) ||
-      (ping_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) ||
-      (ping_info->color_type == PNG_COLOR_TYPE_GRAY))
+  image->columns=ping_width;
+  image->rows=ping_height;
+  if ((ping_colortype == PNG_COLOR_TYPE_PALETTE) ||
+      (ping_colortype == PNG_COLOR_TYPE_GRAY_ALPHA) ||
+      (ping_colortype == PNG_COLOR_TYPE_GRAY))
     {
       image->storage_class=PseudoClass;
-      image->colors=1 << ping_info->bit_depth;
+      image->colors=1 << ping_bit_depth;
 #if (QuantumDepth == 8)
       if (image->colors > 256)
         image->colors=256;
@@ -2097,7 +2168,7 @@ static Image *ReadOnePNGImage(MngInfo *m
       if (image->colors > 65536L)
         image->colors=65536L;
 #endif
-      if (ping_info->color_type == PNG_COLOR_TYPE_PALETTE)
+      if (ping_colortype == PNG_COLOR_TYPE_PALETTE)
         {
           int
             number_colors;
@@ -2121,7 +2192,7 @@ static Image *ReadOnePNGImage(MngInfo *m
       */
       if (!AllocateImageColormap(image,image->colors))
         ThrowReaderException(ResourceLimitError,MemoryAllocationFailed,image);
-      if (ping_info->color_type == PNG_COLOR_TYPE_PALETTE)
+      if (ping_colortype == PNG_COLOR_TYPE_PALETTE)
         {
           int
             number_colors;
@@ -2142,7 +2213,7 @@ static Image *ReadOnePNGImage(MngInfo *m
           unsigned long
             scale;
 
-          scale=(MaxRGB/((1 << ping_info->bit_depth)-1));
+          scale=(MaxRGB/((1 << ping_bit_depth)-1));
           if (scale < 1)
             scale=1;
           for (i=0; i < (long) image->colors; i++)
@@ -2182,10 +2253,9 @@ static Image *ReadOnePNGImage(MngInfo *m
                           "    Reading PNG IDAT chunk(s)");
   if (num_passes > 1)
     png_pixels=MagickAllocateMemory(unsigned char *,
-                                    ping_info->rowbytes*image->rows);
+                                    ping_rowbytes*image->rows);
   else
-    png_pixels=MagickAllocateMemory(unsigned char *,
-                                    ping_info->rowbytes);
+    png_pixels=MagickAllocateMemory(unsigned char *, ping_rowbytes);
   if (png_pixels == (unsigned char *) NULL)
     ThrowReaderException(ResourceLimitError,MemoryAllocationFailed,image);
 
@@ -2205,20 +2275,20 @@ static Image *ReadOnePNGImage(MngInfo *m
         int
           depth;
 
-        depth=(long) ping_info->bit_depth;
+        depth=(long) ping_bit_depth;
 #endif
-        image->matte=((ping_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) ||
-                      (ping_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) ||
-                      (ping_info->valid & PNG_INFO_tRNS));
+        image->matte=((ping_colortype == PNG_COLOR_TYPE_RGB_ALPHA) ||
+                      (ping_colortype == PNG_COLOR_TYPE_GRAY_ALPHA) ||
+                      (png_get_valid(ping, ping_info, PNG_INFO_tRNS)));
 
         for (y=0; y < (long) image->rows; y++)
           {
             if (num_passes > 1)
-              row_offset=ping_info->rowbytes*y;
+              row_offset=ping_rowbytes*y;
             else
               row_offset=0;
             png_read_row(ping,png_pixels+row_offset,NULL);
-	    if (!SetImagePixels(image,0,y,image->columns,1))  /* Was GetImagePixels() */
+	    if (!SetImagePixels(image,0,y,image->columns,1))
               break;
 #if (QuantumDepth == 8)
             if (depth == 16)
@@ -2229,13 +2299,13 @@ static Image *ReadOnePNGImage(MngInfo *m
 
                 r=png_pixels+row_offset;
                 p=r;
-                if (ping_info->color_type == PNG_COLOR_TYPE_GRAY)
+                if (ping_colortype == PNG_COLOR_TYPE_GRAY)
                   {
                     for (x=(long) image->columns; x > 0; x--)
                       {
                         *r++=*p++;
                         p++;
-                        if ((ping_info->valid & PNG_INFO_tRNS) &&
+                        if ((png_get_valid(ping, ping_info, PNG_INFO_tRNS)) &&
                             (((*(p-2) << 8)|*(p-1))
                             == transparent_color.opacity))
                           {
@@ -2246,9 +2316,9 @@ static Image *ReadOnePNGImage(MngInfo *m
                           *r++=OpaqueOpacity;
                       }
                   }
-                else if (ping_info->color_type == PNG_COLOR_TYPE_RGB)
+                else if (ping_colortype == PNG_COLOR_TYPE_RGB)
                   {
-                    if (ping_info->valid & PNG_INFO_tRNS)
+                    if (png_get_valid(ping, ping_info, PNG_INFO_tRNS))
                       for (x=(long) image->columns; x > 0; x--)
                         {
                           *r++=*p++;
@@ -2282,25 +2352,25 @@ static Image *ReadOnePNGImage(MngInfo *m
                           *r++=OpaqueOpacity;
                         }
                   }
-                else if (ping_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
+                else if (ping_colortype == PNG_COLOR_TYPE_RGB_ALPHA)
                   for (x=(long) (4*image->columns); x > 0; x--)
                     {
                       *r++=*p++;
                       p++;
                     }
-                else if (ping_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+                else if (ping_colortype == PNG_COLOR_TYPE_GRAY_ALPHA)
                   for (x=(long) (2*image->columns); x > 0; x--)
                     {
                       *r++=*p++;
                       p++;
                     }
               }
-            if (depth == 8 && ping_info->color_type == PNG_COLOR_TYPE_GRAY)
+            if (depth == 8 && ping_colortype == PNG_COLOR_TYPE_GRAY)
               (void) ImportImagePixelArea(image,(QuantumType) GrayQuantum,
                                           image->depth,png_pixels+
                                           row_offset,0,0);
-            if (ping_info->color_type == PNG_COLOR_TYPE_GRAY ||
-                ping_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+            if (ping_colortype == PNG_COLOR_TYPE_GRAY ||
+                ping_colortype == PNG_COLOR_TYPE_GRAY_ALPHA)
               {
                 image->depth=8;
                 (void) ImportImagePixelArea(image,
@@ -2309,12 +2379,12 @@ static Image *ReadOnePNGImage(MngInfo *m
                                             row_offset,0,0);
                 image->depth=depth;
               }
-            else if (depth == 8 && ping_info->color_type == PNG_COLOR_TYPE_RGB)
+            else if (depth == 8 && ping_colortype == PNG_COLOR_TYPE_RGB)
               (void) ImportImagePixelArea(image,(QuantumType) RGBQuantum,
                                           image->depth,png_pixels+
                                           row_offset,0,0);
-            else if (ping_info->color_type == PNG_COLOR_TYPE_RGB ||
-                     ping_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
+            else if (ping_colortype == PNG_COLOR_TYPE_RGB ||
+                     ping_colortype == PNG_COLOR_TYPE_RGB_ALPHA)
               {
                 image->depth=8;
                 (void) ImportImagePixelArea(image,(QuantumType) RGBAQuantum,
@@ -2322,28 +2392,28 @@ static Image *ReadOnePNGImage(MngInfo *m
                                             row_offset,0,0);
                 image->depth=depth;
               }
-            else if (ping_info->color_type == PNG_COLOR_TYPE_PALETTE)
+            else if (ping_colortype == PNG_COLOR_TYPE_PALETTE)
               (void) ImportImagePixelArea(image,(QuantumType) IndexQuantum,
-                                          ping_info->bit_depth,png_pixels+
+                                          ping_bit_depth,png_pixels+
                                           row_offset,0,0);
                                           /* FIXME, sample size ??? */
 #else /* (QuantumDepth != 8) */
 
-            if (ping_info->color_type == PNG_COLOR_TYPE_GRAY)
+            if (ping_colortype == PNG_COLOR_TYPE_GRAY)
               (void) ImportImagePixelArea(image,(QuantumType) GrayQuantum,
                                           image->depth,png_pixels+
                                           row_offset,0,0);
-            else if (ping_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+            else if (ping_colortype == PNG_COLOR_TYPE_GRAY_ALPHA)
               (void) ImportImagePixelArea(image,(QuantumType) GrayAlphaQuantum,
                                           image->depth,png_pixels+
                                           row_offset,0,0);
-            else if (ping_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
+            else if (ping_colortype == PNG_COLOR_TYPE_RGB_ALPHA)
               (void) ImportImagePixelArea(image,(QuantumType) RGBAQuantum,
                                           image->depth,png_pixels+
                                           row_offset,0,0);
-            else if (ping_info->color_type == PNG_COLOR_TYPE_PALETTE)
+            else if (ping_colortype == PNG_COLOR_TYPE_PALETTE)
               (void) ImportImagePixelArea(image,(QuantumType) IndexQuantum,
-                                          ping_info->bit_depth,png_pixels+
+                                          ping_bit_depth,png_pixels+
                                           row_offset,0,0);
                                           /* FIXME, sample size ??? */
             else
@@ -2372,7 +2442,7 @@ static Image *ReadOnePNGImage(MngInfo *m
         /*
           Convert grayscale image to PseudoClass pixel packets.
         */
-        image->matte=ping_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA;
+        image->matte=ping_colortype == PNG_COLOR_TYPE_GRAY_ALPHA;
         quantum_scanline=MagickAllocateMemory(Quantum *,
                                               (image->matte ?  2 : 1) *
                                               image->columns*sizeof(Quantum));
@@ -2385,7 +2455,7 @@ static Image *ReadOnePNGImage(MngInfo *m
               *p;
 
             if (num_passes > 1)
-              row_offset=ping_info->rowbytes*y;
+              row_offset=ping_rowbytes*y;
             else
               row_offset=0;
             png_read_row(ping,png_pixels+row_offset,NULL);
@@ -2395,7 +2465,7 @@ static Image *ReadOnePNGImage(MngInfo *m
             indexes=AccessMutableIndexes(image);
             p=png_pixels+row_offset;
             r=quantum_scanline;
-            switch (ping_info->bit_depth)
+            switch (ping_bit_depth)
               {
               case 1:
                 {
@@ -2445,7 +2515,7 @@ static Image *ReadOnePNGImage(MngInfo *m
                 }
               case 8:
                 {
-                  if (ping_info->color_type == 4)
+                  if (ping_colortype == 4)
                     for (x=(long) image->columns; x > 0; x--)
                       {
                         *r++=*p++;
@@ -2473,7 +2543,7 @@ static Image *ReadOnePNGImage(MngInfo *m
                         *r=0;
                       *r|=(*p++);
                       r++;
-                      if (ping_info->color_type == 4)
+                      if (ping_colortype == 4)
                         {
                           q->opacity=((*p++) << 8);
                           q->opacity|=(*p++);
@@ -2488,7 +2558,7 @@ static Image *ReadOnePNGImage(MngInfo *m
                         *r=0;
                       *r|=(*p++);
                       r++;
-                      if (ping_info->color_type == 4)
+                      if (ping_colortype == 4)
                         {
                           q->opacity=((*p++) << 8);
                           q->opacity|=(*p++);
@@ -2499,7 +2569,7 @@ static Image *ReadOnePNGImage(MngInfo *m
 #else /* QuantumDepth == 8 */
                       *r++=(*p++);
                       p++; /* strip low byte */
-                      if (ping_info->color_type == 4)
+                      if (ping_colortype == 4)
                         {
                           q->opacity=(Quantum) (MaxRGB-(*p++));
                           p++;
@@ -2549,7 +2619,7 @@ static Image *ReadOnePNGImage(MngInfo *m
                               "  exit ReadOnePNGImage().");
       return (image);
     }
-  if (ping_info->valid & PNG_INFO_tRNS)
+  if (png_get_valid(ping, ping_info, PNG_INFO_tRNS))
     {
       ClassType
         storage_class;
@@ -2572,25 +2642,26 @@ static Image *ReadOnePNGImage(MngInfo *m
               IndexPacket
                 index;
 
-              if (ping_info->color_type == PNG_COLOR_TYPE_PALETTE)
+              if (ping_colortype == PNG_COLOR_TYPE_PALETTE)
                 for (x=0; x < (long) image->columns; x++)
                   {
                     index=indexes[x];
-                    if (index < ping_info->num_trans)
+                    if (index < ping_num_trans)
                       q->opacity=
-                        ScaleCharToQuantum(255-ping_info->trans_alpha[index]);
+                        ScaleCharToQuantum(255-ping_trans_alpha[index]);
 		    else
 		      q->opacity=OpaqueOpacity;
                     q++;
                   }
-              else if (ping_info->color_type == PNG_COLOR_TYPE_GRAY)
+              else if (ping_colortype == PNG_COLOR_TYPE_GRAY)
                 for (x=0; x < (long) image->columns; x++)
                   {
                     index=indexes[x];
                     q->red=image->colormap[index].red;
                     q->green=image->colormap[index].green;
                     q->blue=image->colormap[index].blue;
-                    if (q->red == transparent_color.opacity)
+                    if (ScaleQuantumToShort(q->red) ==
+                        transparent_color.opacity)
                       q->opacity=TransparentOpacity;
 		    else
 		      q->opacity=OpaqueOpacity;
@@ -2600,9 +2671,9 @@ static Image *ReadOnePNGImage(MngInfo *m
           else
             for (x=(long) image->columns; x > 0; x--)
               {
-                if (q->red == transparent_color.red &&
-                    q->green == transparent_color.green &&
-                    q->blue == transparent_color.blue)
+                if (ScaleQuantumToShort(q->red) == transparent_color.red &&
+                    ScaleQuantumToShort(q->green) == transparent_color.green &&
+                    ScaleQuantumToShort(q->blue) == transparent_color.blue)
                   q->opacity=TransparentOpacity;
 		else
 		  q->opacity=OpaqueOpacity;
@@ -2714,7 +2785,7 @@ static Image *ReadOnePNGImage(MngInfo *m
           mng_info->ob[object_id]->interlace_method=interlace_method;
           mng_info->ob[object_id]->compression_method=compression_method;
           mng_info->ob[object_id]->filter_method=filter_method;
-          if (ping_info->valid & PNG_INFO_PLTE)
+          if (png_get_valid(ping, ping_info, PNG_INFO_PLTE))
             {
               int
                 number_colors;
@@ -5734,7 +5805,7 @@ static Image *ReadMNGImage(const ImageIn
     (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadMNGImage()");
   return(image);
 }
-#else /* PNG_LIBPNG_VER > 95 */
+#else /* PNG_LIBPNG_VER > 10011 */
 static Image *ReadPNGImage(const ImageInfo *image_info,
                            ExceptionInfo *exception)
 {
@@ -5749,7 +5820,7 @@ static Image *ReadMNGImage(const ImageIn
 {
   return (ReadPNGImage(image_info,exception));
 }
-#endif /* PNG_LIBPNG_VER > 95 */
+#endif /* PNG_LIBPNG_VER > 10011 */
 #endif
 
 /*
@@ -5960,7 +6031,7 @@ ModuleExport void UnregisterPNGImage(voi
 }
 
 #if defined(HasPNG)
-#if PNG_LIBPNG_VER > 95
+#if PNG_LIBPNG_VER > 10011
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %                                                                             %
@@ -6043,20 +6114,6 @@ ModuleExport void UnregisterPNGImage(voi
 */
 
 
-#if (PNG_LIBPNG_VER > 99 && PNG_LIBPNG_VER < 10007)
-/* This function became available in libpng version 1.0.6g. */
-static void
-png_set_compression_buffer_size(png_structp png_ptr, png_uint_32 size)
-{
-  if (png_ptr->zbuf)
-    png_free(png_ptr, png_ptr->zbuf); png_ptr->zbuf=NULL;
-  png_ptr->zbuf_size=(png_size_t) size;
-  png_ptr->zbuf=(png_bytep) png_malloc(png_ptr, size);
-  if (!png_ptr->zbuf)
-    png_error(png_ptr,"Unable to allocate zbuf");
-}
-#endif
-
 static void
 png_write_raw_profile(const ImageInfo *image_info,png_struct *ping,
                       png_info *ping_info, const char *profile_type,
@@ -6064,7 +6121,6 @@ png_write_raw_profile(const ImageInfo *i
                       const unsigned char *profile_data,
                       png_uint_32 length)
 {
-#if (PNG_LIBPNG_VER > 10005)
   png_textp
     text;
 
@@ -6083,25 +6139,12 @@ png_write_raw_profile(const ImageInfo *i
 
   unsigned char
     hex[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
-#endif
 
-#if (PNG_LIBPNG_VER <= 10005)
-  if (image_info->verbose)
-    (void) printf("Not ");
-  (void) image_info;
-  (void) ping;
-  (void) ping_info;
-  (void) profile_type;
-  (void) profile_description;
-  (void) profile_data;
-  (void) length;
-#endif
   if (image_info->verbose)
     {
       (void) printf("writing raw profile: type=%.1024s, length=%lu\n",
                     profile_type, (unsigned long)length);
     }
-#if (PNG_LIBPNG_VER > 10005)
   text=(png_textp) png_malloc(ping,(png_uint_32) sizeof(png_text));
   description_length=strlen((const char *) profile_description);
   allocated_length=(png_uint_32) (length*2 + (length >> 5) + 20
@@ -6137,7 +6180,6 @@ png_write_raw_profile(const ImageInfo *i
   png_free(ping,text[0].text);
   png_free(ping,text[0].key);
   png_free(ping,text);
-#endif
 }
 
 static MagickPassFail WriteOnePNGImage(MngInfo *mng_info,
@@ -6152,17 +6194,34 @@ static MagickPassFail WriteOnePNGImage(M
 
   int
     num_passes,
-    pass;
+    pass,
+    ping_bit_depth = 0,
+    ping_colortype = 0,
+    ping_interlace_method = 0,
+    ping_compression_method = 0,
+    ping_filter_method = 0,
+    ping_num_trans = 0;
+
+  png_bytep
+     ping_trans_alpha = NULL;
 
   png_colorp
     palette;
 
+  png_color_16
+    ping_background,
+    ping_trans_color;
+
   png_info
     *ping_info;
 
   png_struct
     *ping;
 
+  png_uint_32
+    ping_width,
+    ping_height;
+
   long
     y;
 
@@ -6181,8 +6240,7 @@ static MagickPassFail WriteOnePNGImage(M
     image_depth,
     image_matte,
     logging,
-    matte,
-    not_valid;
+    matte;
 
   unsigned long
     quantum_size,  /* depth for ExportImage */
@@ -6211,6 +6269,18 @@ static MagickPassFail WriteOnePNGImage(M
       return MagickFail;
     }
 
+  /* Initialize some stuff */
+  ping_background.red = 0;
+  ping_background.green = 0;
+  ping_background.blue = 0;
+  ping_background.gray = 0;
+  ping_background.index = 0;
+
+  ping_trans_color.red=0;
+  ping_trans_color.green=0;
+  ping_trans_color.blue=0;
+  ping_trans_color.gray=0;
+
   image_colors=image->colors;
   image_depth=image->depth;
   image_matte=image->matte;
@@ -6259,7 +6329,7 @@ static MagickPassFail WriteOnePNGImage(M
   LockSemaphoreInfo(png_semaphore);
 #endif
 
-  if (setjmp(ping->jmpbuf))
+  if (setjmp(png_jmpbuf(ping)))
     {
       /*
         PNG write failed.
@@ -6288,16 +6358,16 @@ static MagickPassFail WriteOnePNGImage(M
 # endif
 #endif
   x=0;
-  ping_info->width=image->columns;
-  ping_info->height=image->rows;
+  ping_width=image->columns;
+  ping_height=image->rows;
   if (logging)
     {
       (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                             "    width=%lu",
-                            (unsigned long)ping_info->width);
+                            (unsigned long)ping_width);
       (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                             "    height=%lu",
-                            (unsigned long)ping_info->height);
+                            (unsigned long)ping_height);
       (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                             "    image->depth=%u",image_depth);
     }
@@ -6306,12 +6376,12 @@ static MagickPassFail WriteOnePNGImage(M
   quantum_size=(image_depth > 8) ? 16:8;
 
   save_image_depth=image_depth;
-  ping_info->bit_depth=(png_byte) save_image_depth;
+  ping_bit_depth=(png_byte) save_image_depth;
   if (logging)
     {
       (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-                            "    ping_info->bit_depth=%u",
-                            ping_info->bit_depth);
+                            "    ping_bit_depth=%u",
+                            ping_bit_depth);
     }
 #if defined(PNG_pHYs_SUPPORTED)
   if ((image->x_resolution != 0) && (image->y_resolution != 0) &&
@@ -6398,8 +6468,8 @@ static MagickPassFail WriteOnePNGImage(M
   matte=image_matte;
   if (mng_info->write_png8)
     {
-      ping_info->color_type=PNG_COLOR_TYPE_PALETTE;
-      ping_info->bit_depth=8;
+      ping_colortype=PNG_COLOR_TYPE_PALETTE;
+      ping_bit_depth=8;
       {
         /* TO DO: make this a function cause it's used twice, except
            for reducing the sample depth from 8. */
@@ -6424,13 +6494,13 @@ static MagickPassFail WriteOnePNGImage(M
                                     "    Colors quantized to %ld",
                                     number_colors);
           }
-        if (matte)
-          ping_info->valid|=PNG_INFO_tRNS;
+
         /*
           Set image palette.
         */
-        ping_info->color_type=PNG_COLOR_TYPE_PALETTE;
-        ping_info->valid|=PNG_INFO_PLTE;
+
+        ping_colortype=PNG_COLOR_TYPE_PALETTE;
+
 #if defined(PNG_SORT_PALETTE)
         save_number_colors=image_colors;
         if (CompressColormapTransFirst(image) == MagickFail)
@@ -6465,20 +6535,17 @@ static MagickPassFail WriteOnePNGImage(M
 
           }
         png_set_PLTE(ping,ping_info,palette,(int) number_colors);
-#if (PNG_LIBPNG_VER > 10008)
         MagickFreeMemory(palette);
-#endif
         /*
           Identify which colormap entry is transparent.
         */
-        ping_info->trans_alpha=MagickAllocateMemory(unsigned char *,
-           number_colors);
-        if (ping_info->trans_alpha == (unsigned char *) NULL)
+        ping_trans_alpha=MagickAllocateMemory(unsigned char *, number_colors);
+        if (ping_trans_alpha == (unsigned char *) NULL)
           ThrowWriterException(ResourceLimitError,MemoryAllocationFailed,
                                image);
         assert(number_colors <= 256);
         for (i=0; i < (long) number_colors; i++)
-          ping_info->trans_alpha[i]=255;
+          ping_trans_alpha[i]=255;
         for (y=0; y < (long) image->rows; y++)
           {
             register const PixelPacket
@@ -6498,29 +6565,29 @@ static MagickPassFail WriteOnePNGImage(M
 
                     index=indexes[x];
                     assert((unsigned long) index < number_colors);
-                    ping_info->trans_alpha[index]=(png_byte) (255-
+                    ping_trans_alpha[index]=(png_byte) (255-
                                             ScaleQuantumToChar(p->opacity));
                   }
                 p++;
               }
           }
-        ping_info->num_trans=0;
+        ping_num_trans=0;
         for (i=0; i < (long) number_colors; i++)
-          if (ping_info->trans_alpha[i] != 255)
-            ping_info->num_trans=(unsigned short) (i+1);
-        if (ping_info->num_trans == 0)
-          ping_info->valid&=(~PNG_INFO_tRNS);
-        if (!(ping_info->valid & PNG_INFO_tRNS))
-          ping_info->num_trans=0;
-        if (ping_info->num_trans == 0)
-          MagickFreeMemory(ping_info->trans_alpha);
+          if (ping_trans_alpha[i] != 255)
+            ping_num_trans=(unsigned short) (i+1);
+        if (ping_num_trans == 0)
+          png_set_invalid(ping,ping_info,PNG_INFO_tRNS);
+        if (!(png_get_valid(ping,ping_info,PNG_INFO_tRNS)))
+          ping_num_trans=0;
+        if (ping_num_trans == 0)
+          MagickFreeMemory(ping_trans_alpha);
         /*
           Identify which colormap entry is the background color.
         */
         for (i=0; i < (long) Max(number_colors-1,1); i++)
-          if (RGBColorMatchExact(ping_info->background,image->colormap[i]))
+          if (RGBColorMatchExact(ping_background,image->colormap[i]))
             break;
-        ping_info->background.index=(png_uint_16) i;
+        ping_background.index=(png_uint_16) i;
       }
       if (image_matte)
         {
@@ -6530,79 +6597,79 @@ static MagickPassFail WriteOnePNGImage(M
   else if (mng_info->write_png24)
     {
       image_matte=MagickFalse;
-      ping_info->color_type=PNG_COLOR_TYPE_RGB;
+      ping_colortype=PNG_COLOR_TYPE_RGB;
     }
   else if (mng_info->write_png32)
     {
       image_matte=MagickTrue;
-      ping_info->color_type=PNG_COLOR_TYPE_RGB_ALPHA;
+      ping_colortype=PNG_COLOR_TYPE_RGB_ALPHA;
     }
   else
     {
-      if (ping_info->bit_depth < 8)
-        ping_info->bit_depth=8;
+      if (ping_bit_depth < 8)
+        ping_bit_depth=8;
 
-      ping_info->color_type=PNG_COLOR_TYPE_RGB;
+      ping_colortype=PNG_COLOR_TYPE_RGB;
       if (characteristics.monochrome)
         {
           if (characteristics.opaque)
             {
-              ping_info->color_type=PNG_COLOR_TYPE_GRAY;
-              ping_info->bit_depth=1;
+              ping_colortype=PNG_COLOR_TYPE_GRAY;
+              ping_bit_depth=1;
             }
           else
             {
-              ping_info->color_type=PNG_COLOR_TYPE_GRAY_ALPHA;
+              ping_colortype=PNG_COLOR_TYPE_GRAY_ALPHA;
             }
         }
       else if (characteristics.grayscale)
         {
           if (characteristics.opaque)
-            ping_info->color_type=PNG_COLOR_TYPE_GRAY;
+            ping_colortype=PNG_COLOR_TYPE_GRAY;
           else
-            ping_info->color_type=PNG_COLOR_TYPE_GRAY_ALPHA;
+            ping_colortype=PNG_COLOR_TYPE_GRAY_ALPHA;
         }
       else if (characteristics.palette && image_colors <= 256)
         {
-          ping_info->color_type=PNG_COLOR_TYPE_PALETTE;
-          ping_info->bit_depth=8;
+          ping_colortype=PNG_COLOR_TYPE_PALETTE;
+          ping_bit_depth=8;
           mng_info->IsPalette=MagickTrue;
         }
       else
         {
           if (characteristics.opaque)
-            ping_info->color_type=PNG_COLOR_TYPE_RGB;
+            ping_colortype=PNG_COLOR_TYPE_RGB;
           else
-            ping_info->color_type=PNG_COLOR_TYPE_RGB_ALPHA;
+            ping_colortype=PNG_COLOR_TYPE_RGB_ALPHA;
         }
       if (image_info->type == BilevelType)
         {
           if (characteristics.monochrome)
             {
               if (!image_matte)
-                ping_info->bit_depth=1;
+                ping_bit_depth=1;
             }
         }
       if (image_info->type == GrayscaleType)
-        ping_info->color_type=PNG_COLOR_TYPE_GRAY;
+        ping_colortype=PNG_COLOR_TYPE_GRAY;
       if (image_info->type == GrayscaleMatteType)
-        ping_info->color_type=PNG_COLOR_TYPE_GRAY_ALPHA;
+        ping_colortype=PNG_COLOR_TYPE_GRAY_ALPHA;
       /*       if (!mng_info->optimize && matte) */
-      /*         ping_info->color_type=PNG_COLOR_TYPE_RGB_ALPHA; */
+      /*         ping_colortype=PNG_COLOR_TYPE_RGB_ALPHA; */
 
       if (logging)
         {
           (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                                 "    Tentative PNG color type: %s (%d)",
-                                PngColorTypeToString(ping_info->color_type),
-                                ping_info->color_type);
+                                PngColorTypeToString(ping_colortype),
+                                ping_colortype);
           (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                                 "    image_info->type: %d",image_info->type);
           (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                                 "    image->depth: %u",image_depth);
           (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-                                "    ping_info->bit_depth: %d",
-                                ping_info->bit_depth);
+                                "    ping_bit_depth: %d",
+                                ping_bit_depth);
         }
 
       if (matte && (mng_info->optimize || mng_info->IsPalette))
@@ -6614,10 +6681,10 @@ static MagickPassFail WriteOnePNGImage(M
             {
               /*
                 No transparent pixels are present.  Change 4 or 6 to 0 or 2,
-                and do not set the PNG_INFO_tRNS flag in ping_info->valid.
+                and do not set the PNG_INFO_tRNS flag.
               */
               image_matte=MagickFalse;
-              ping_info->color_type&=0x03;
+              ping_colortype&=0x03;
             }
           else
             {
@@ -6625,13 +6692,13 @@ static MagickPassFail WriteOnePNGImage(M
                 mask;
 
               mask=0xffff;
-              if (ping_info->bit_depth == 8)
+              if (ping_bit_depth == 8)
                 mask=0x00ff;
-              if (ping_info->bit_depth == 4)
+              if (ping_bit_depth == 4)
                 mask=0x000f;
-              if (ping_info->bit_depth == 2)
+              if (ping_bit_depth == 2)
                 mask=0x0003;
-              if (ping_info->bit_depth == 1)
+              if (ping_bit_depth == 1)
                 mask=0x0001;
 
               /*
@@ -6655,19 +6722,20 @@ static MagickPassFail WriteOnePNGImage(M
               if ((p != (const PixelPacket *) NULL) &&
                   (p->opacity != OpaqueOpacity))
                 {
-                  ping_info->valid|=PNG_INFO_tRNS;
-                  ping_info->trans_color.red=ScaleQuantumToShort(p->red)&mask;
-                  ping_info->trans_color.green=ScaleQuantumToShort(p->green)
+                  ping_trans_color.red=ScaleQuantumToShort(p->red)&mask;
+                  ping_trans_color.green=ScaleQuantumToShort(p->green)
                                                 &mask;
-                  ping_info->trans_color.blue=ScaleQuantumToShort(p->blue)
+                  ping_trans_color.blue=ScaleQuantumToShort(p->blue)
                                                &mask;
-                  ping_info->trans_color.gray=
+                  ping_trans_color.gray=
                     (png_uint_16) ScaleQuantumToShort(PixelIntensity(p))&mask;
-                  ping_info->trans_color.index=(unsigned char)
+                  ping_trans_color.index=(unsigned char)
                     (ScaleQuantumToChar(MaxRGB-p->opacity));
+                  (void) png_set_tRNS(ping, ping_info, NULL, 0,
+                                      &ping_trans_color);
                 }
             }
-          if (ping_info->valid & PNG_INFO_tRNS)
+          if (png_get_valid(ping, ping_info, PNG_INFO_tRNS))
             {
               /*
                 Determine if there is one and only one transparent color
@@ -6684,7 +6752,7 @@ static MagickPassFail WriteOnePNGImage(M
                     {
                       if (p->opacity != OpaqueOpacity)
                         {
-                          if (!RGBColorMatchExact(ping_info->trans_color,*p))
+                          if (!RGBColorMatchExact(ping_trans_color,*p))
                             {
                               break;  /* Can't use RGB + tRNS for multiple
                                          transparent colors.  */
@@ -6697,7 +6765,7 @@ static MagickPassFail WriteOnePNGImage(M
                         }
                       else
                         {
-                          if (RGBColorMatchExact(ping_info->trans_color,*p))
+                          if (RGBColorMatchExact(ping_trans_color,*p))
                             break; /* Can't use RGB + tRNS when another pixel
                                       having the same RGB samples is
                                       transparent. */
@@ -6708,50 +6776,50 @@ static MagickPassFail WriteOnePNGImage(M
                     break;
                 }
               if (x != 0)
-                ping_info->valid&=(~PNG_INFO_tRNS);
+                png_set_invalid(ping, ping_info, PNG_INFO_tRNS);
             }
-          if (ping_info->valid & PNG_INFO_tRNS)
+          if (png_get_valid(ping, ping_info, PNG_INFO_tRNS))
             {
-              ping_info->color_type &= 0x03;  /* changes 4 or 6 to 0 or 2 */
+              ping_colortype &= 0x03;  /* changes 4 or 6 to 0 or 2 */
               if (image_depth == 8)
                 {
-                  ping_info->trans_color.red&=0xff;
-                  ping_info->trans_color.green&=0xff;
-                  ping_info->trans_color.blue&=0xff;
-                  ping_info->trans_color.gray&=0xff;
+                  ping_trans_color.red&=0xff;
+                  ping_trans_color.green&=0xff;
+                  ping_trans_color.blue&=0xff;
+                  ping_trans_color.gray&=0xff;
                 }
             }
         }
       matte=image_matte;
-      if (ping_info->valid & PNG_INFO_tRNS)
+      if (png_get_valid(ping, ping_info, PNG_INFO_tRNS))
         image_matte=MagickFalse;
       if ((mng_info->optimize || mng_info->IsPalette) &&
           characteristics.grayscale && (!image_matte || image_depth >= 8))
         {
           if (image_matte)
-            ping_info->color_type=PNG_COLOR_TYPE_GRAY_ALPHA;
+            ping_colortype=PNG_COLOR_TYPE_GRAY_ALPHA;
           else
             {
-              ping_info->color_type=PNG_COLOR_TYPE_GRAY;
+              ping_colortype=PNG_COLOR_TYPE_GRAY;
               if (save_image_depth == 16 && image_depth == 8)
-                ping_info->trans_color.gray*=0x0101;
+                ping_trans_color.gray*=0x0101;
             }
           if (image_depth > QuantumDepth)
             image_depth=QuantumDepth;
           if (image_colors == 0 || image_colors-1 > MaxRGB)
             image_colors=1 << image_depth;
           if (image_depth > 8)
-            ping_info->bit_depth=16;
+            ping_bit_depth=16;
           else
             {
-              if (ping_info->color_type == PNG_COLOR_TYPE_PALETTE)
+              if (ping_colortype == PNG_COLOR_TYPE_PALETTE)
                 {
-                  ping_info->bit_depth=1;
-                  while ((int) (1 << ping_info->bit_depth) <
+                  ping_bit_depth=1;
+                  while ((int) (1 << ping_bit_depth) <
                                 (long) image_colors)
-                    ping_info->bit_depth <<= 1;
+                    ping_bit_depth <<= 1;
                 }
-              else if (mng_info->optimize && ping_info->color_type ==
+              else if (mng_info->optimize && ping_colortype ==
                        PNG_COLOR_TYPE_GRAY && image_colors < 17 &&
                        mng_info->IsPalette)
                 {
@@ -6779,11 +6847,11 @@ static MagickPassFail WriteOnePNGImage(M
                         depth_1_ok=MagickFalse;
                     }
                   if (depth_1_ok)
-                    ping_info->bit_depth=1;
+                    ping_bit_depth=1;
                   else if (depth_2_ok)
-                    ping_info->bit_depth=2;
+                    ping_bit_depth=2;
                   else if (depth_4_ok)
-                    ping_info->bit_depth=4;
+                    ping_bit_depth=4;
                 }
             }
         }
@@ -6796,13 +6864,10 @@ static MagickPassFail WriteOnePNGImage(M
                   number_colors;
 
                 number_colors=image_colors;
-                if (matte)
-                  ping_info->valid|=PNG_INFO_tRNS;
                 /*
                   Set image palette.
                 */
-                ping_info->color_type=PNG_COLOR_TYPE_PALETTE;
-                ping_info->valid|=PNG_INFO_PLTE;
+                ping_colortype=PNG_COLOR_TYPE_PALETTE;
                 if (mng_info->have_write_global_plte && !matte)
                   {
                     png_set_PLTE(ping,ping_info,NULL,0);
@@ -6847,14 +6912,12 @@ static MagickPassFail WriteOnePNGImage(M
                            "  Setting up PLTE chunk with %d colors",
                            (int) number_colors);
                     png_set_PLTE(ping,ping_info,palette,(int) number_colors);
-#if (PNG_LIBPNG_VER > 10008)
                     MagickFreeMemory(palette);
-#endif
                   }
-                ping_info->bit_depth=1;
-                while ((1UL << ping_info->bit_depth) < number_colors)
-                  ping_info->bit_depth <<= 1;
-                ping_info->num_trans=0;
+                ping_bit_depth=1;
+                while ((1UL << ping_bit_depth) < number_colors)
+                  ping_bit_depth <<= 1;
+                ping_num_trans=0;
                 if (matte)
                   {
                     int
@@ -6890,7 +6953,7 @@ static MagickPassFail WriteOnePNGImage(M
                                     if (trans_alpha[index] != (png_byte) (255-
                                         ScaleQuantumToChar(p->opacity)))
                                       {
-                                        ping_info->color_type=
+                                        ping_colortype=
                                           PNG_COLOR_TYPE_RGB_ALPHA;
                                         break;
                                       }
@@ -6900,11 +6963,11 @@ static MagickPassFail WriteOnePNGImage(M
                               }
                             p++;
                           }
-                        if (ping_info->color_type==PNG_COLOR_TYPE_RGB_ALPHA)
+                        if (ping_colortype==PNG_COLOR_TYPE_RGB_ALPHA)
                           {
-                            ping_info->num_trans=0;
-                            ping_info->valid&=(~PNG_INFO_tRNS);
-                            ping_info->valid&=(~PNG_INFO_PLTE);
+                            ping_num_trans=0;
+                            png_set_invalid(ping, ping_info, PNG_INFO_tRNS);
+                            png_set_invalid(ping, ping_info, PNG_INFO_PLTE);
                             mng_info->IsPalette=MagickFalse;
                             (void) SyncImage(image);
                             if (logging)
@@ -6916,40 +6979,41 @@ static MagickPassFail WriteOnePNGImage(M
                             break;
                           }
                       }
-                    if ((ping_info->valid & PNG_INFO_tRNS))
+                    if (png_get_valid(ping, ping_info, PNG_INFO_tRNS))
                       {
                         for (i=0; i < (long) number_colors; i++)
                           {
                             if (trans_alpha[i] == 256)
                               trans_alpha[i]=255;
                             if (trans_alpha[i] != 255)
-                              ping_info->num_trans=(unsigned short) (i+1);
+                              ping_num_trans=(unsigned short) (i+1);
                           }
                       }
-                    if (ping_info->num_trans == 0)
-                      ping_info->valid&=(~PNG_INFO_tRNS);
-                    if (!(ping_info->valid & PNG_INFO_tRNS))
-                      ping_info->num_trans=0;
-                    if (ping_info->num_trans != 0)
+                    if (ping_num_trans == 0)
+                       png_set_invalid(ping, ping_info, PNG_INFO_tRNS);
+                    if (!png_get_valid(ping, ping_info, PNG_INFO_tRNS))
+                       ping_num_trans=0;
+
+                    if (ping_num_trans != 0)
                       {
-                        ping_info->trans_alpha=MagickAllocateMemory(
-                                              unsigned char *, number_colors);
-                        if (ping_info->trans_alpha == (unsigned char *) NULL)
-                          ThrowWriterException(ResourceLimitError,
-                                               MemoryAllocationFailed,image);
-                        for (i=0; i < (long) number_colors; i++)
-                          ping_info->trans_alpha[i]=(png_byte) trans_alpha[i];
+                        for (i=0; i<256; i++)
+                           ping_trans_alpha[i]=(png_byte) trans_alpha[i];
                       }
+
+                    (void) png_set_tRNS(ping, ping_info,
+                                        ping_trans_alpha,
+                                        ping_num_trans,
+                                        &ping_trans_color);
                   }
 
                 /*
                   Identify which colormap entry is the background color.
                 */
                 for (i=0; i < (long) Max(number_colors-1,1); i++)
-                  if (RGBColorMatchExact(ping_info->background,
+                  if (RGBColorMatchExact(ping_background,
                                          image->colormap[i]))
                     break;
-                ping_info->background.index=(png_uint_16) i;
+                ping_background.index=(png_uint_16) i;
               }
           }
         else
@@ -6958,10 +7022,10 @@ static MagickPassFail WriteOnePNGImage(M
               image_depth=8;
             if ((save_image_depth == 16) && (image_depth == 8))
               {
-                ping_info->trans_color.red*=0x0101;
-                ping_info->trans_color.green*=0x0101;
-                ping_info->trans_color.blue*=0x0101;
-                ping_info->trans_color.gray*=0x0101;
+                ping_trans_color.red*=0x0101;
+                ping_trans_color.green*=0x0101;
+                ping_trans_color.blue*=0x0101;
+                ping_trans_color.gray*=0x0101;
               }
           }
 
@@ -6969,7 +7033,7 @@ static MagickPassFail WriteOnePNGImage(M
         Adjust background and transparency samples in sub-8-bit
         grayscale files.
       */
-      if (ping_info->bit_depth < 8 && ping_info->color_type ==
+      if (ping_bit_depth < 8 && ping_colortype ==
           PNG_COLOR_TYPE_GRAY)
         {
           png_uint_16
@@ -6978,7 +7042,7 @@ static MagickPassFail WriteOnePNGImage(M
           png_color_16
             background;
 
-          maxval=(1 << ping_info->bit_depth)-1;
+          maxval=(1 << ping_bit_depth)-1;
 
 
           background.gray=(png_uint_16)
@@ -6989,28 +7053,26 @@ static MagickPassFail WriteOnePNGImage(M
                                   "  Setting up bKGD chunk");
           png_set_bKGD(ping,ping_info,&background);
 
-          ping_info->trans_color.gray=(png_uint_16)(maxval*
-                                        ping_info->trans_color.gray/
-                                        MaxRGB);
+          ping_trans_color.gray=(png_uint_16)(maxval*
+                                ping_trans_color.gray/
+                                MaxRGB);
         }
     }
   if (logging)
     (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                           "    PNG color type: %s (%d)",
-                          PngColorTypeToString(ping_info->color_type),
-                          ping_info->color_type);
+                          PngColorTypeToString(ping_colortype),
+                          ping_colortype);
   /*
     Initialize compression level and filtering.
   */
   if (logging)
     (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                           "  Setting up deflate compression");
-#if (PNG_LIBPNG_VER > 99)
   if (logging)
     (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                           "    Compression buffer size: 32768");
   png_set_compression_buffer_size(ping,32768L);
-#endif
   if (logging)
     (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                           "    Compression mem level: 9");
@@ -7044,7 +7106,7 @@ static MagickPassFail WriteOnePNGImage(M
       if (logging)
         (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                               "    Filter_type: PNG_INTRAPIXEL_DIFFERENCING");
-      ping_info->filter_type=PNG_INTRAPIXEL_DIFFERENCING;
+      ping_filter_method=PNG_INTRAPIXEL_DIFFERENCING;
     }
   else
     if (logging)
@@ -7061,8 +7123,8 @@ static MagickPassFail WriteOnePNGImage(M
       if ((image_info->quality % 10) != 5)
         base_filter=(int) image_info->quality % 10;
       else
-        if ((ping_info->color_type == PNG_COLOR_TYPE_GRAY) ||
-            (ping_info->color_type == PNG_COLOR_TYPE_PALETTE) ||
+        if ((ping_colortype == PNG_COLOR_TYPE_GRAY) ||
+            (ping_colortype == PNG_COLOR_TYPE_PALETTE) ||
             (image_info->quality < 50))
           base_filter=PNG_NO_FILTERS;
         else
@@ -7099,7 +7161,7 @@ static MagickPassFail WriteOnePNGImage(M
           {
             if (LocaleCompare(profile_name,"ICM") == 0)
               {
-#if (PNG_LIBPNG_VER > 10008) && defined(PNG_WRITE_iCCP_SUPPORTED)
+#if defined(PNG_WRITE_iCCP_SUPPORTED)
                 {
                   if (logging)
                     (void) LogMagickEvent(CoderEvent,GetMagickModule(),
@@ -7170,8 +7232,8 @@ static MagickPassFail WriteOnePNGImage(M
         (void) png_set_sRGB(ping,ping_info,PerceptualIntent);
       png_set_gAMA(ping,ping_info,0.45455);
     }
-  not_valid=(!ping_info->valid);
-  if ((!mng_info->write_mng) || not_valid & PNG_INFO_sRGB)
+  if ((!mng_info->write_mng) || 
+       !png_get_valid(ping, ping_info, PNG_INFO_sRGB))
 #endif
     {
       if (!mng_info->have_write_global_gama && (image->gamma != 0.0))
@@ -7210,7 +7272,7 @@ static MagickPassFail WriteOnePNGImage(M
                        bp.x,bp.y);
         }
     }
-  ping_info->interlace_type=(image_info->interlace == LineInterlace);
+  ping_interlace_method=(image_info->interlace == LineInterlace);
 
   if (mng_info->write_mng)
     png_set_sig_bytes(ping,8);
@@ -7219,6 +7281,15 @@ static MagickPassFail WriteOnePNGImage(M
     (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                           "  Writing PNG header chunks");
 
+  png_set_IHDR(ping,ping_info,
+               ping_width,
+               ping_height,
+               ping_bit_depth,
+               ping_colortype,
+               ping_interlace_method,
+               ping_compression_method,
+               ping_filter_method);
+
   png_write_info(ping,ping_info);
 
 #if (PNG_LIBPNG_VER == 10206)
@@ -7313,7 +7384,7 @@ static MagickPassFail WriteOnePNGImage(M
       {
         if ((!mng_info->write_png8 && !mng_info->write_png24 &&
              !mng_info->write_png32) &&
-            (!image_matte || (ping_info->bit_depth >= QuantumDepth)) &&
+            (!image_matte || (ping_bit_depth >= QuantumDepth)) &&
             (mng_info->optimize || mng_info->IsPalette) &&
             IsGrayImage(image,&image->exception))
           {
@@ -7325,7 +7396,7 @@ static MagickPassFail WriteOnePNGImage(M
                 if (!AcquireImagePixels(image,0,y,image->columns,1,
                                         &image->exception))
                   break;
-                if (ping_info->color_type == PNG_COLOR_TYPE_GRAY)
+                if (ping_colortype == PNG_COLOR_TYPE_GRAY)
                   {
                     if (mng_info->IsPalette)
                       (void) ExportImagePixelArea(image,
@@ -7368,14 +7439,14 @@ static MagickPassFail WriteOnePNGImage(M
                                           "  pass %d, Image Is RGB,"
                                           " PNG colortype is %s (%d)",pass,
                                           PngColorTypeToString(
-                                             ping_info->color_type),
-                                          ping_info->color_type);
+                                             ping_colortype),
+                                          ping_colortype);
                   for (y=0; y < (long) image->rows; y++)
                     {
                       if (!AcquireImagePixels(image,0,y,image->columns,1,
                                               &image->exception))
                         break;
-                      if (ping_info->color_type == PNG_COLOR_TYPE_GRAY)
+                      if (ping_colortype == PNG_COLOR_TYPE_GRAY)
                         {
                           if (image->storage_class == DirectClass)
                             (void) ExportImagePixelArea(image,(QuantumType)
@@ -7388,7 +7459,7 @@ static MagickPassFail WriteOnePNGImage(M
                                                         quantum_size,
                                                         png_pixels,0,0);
                         }
-                      else if (ping_info->color_type ==
+                      else if (ping_colortype ==
                                PNG_COLOR_TYPE_GRAY_ALPHA)
                         (void) ExportImagePixelArea(image,(QuantumType)
                                                     GrayAlphaQuantum,
@@ -7433,12 +7504,12 @@ static MagickPassFail WriteOnePNGImage(M
                       if (!AcquireImagePixels(image,0,y,image->columns,1,
                                               &image->exception))
                         break;
-                      if (ping_info->color_type == PNG_COLOR_TYPE_GRAY)
+                      if (ping_colortype == PNG_COLOR_TYPE_GRAY)
                         (void) ExportImagePixelArea(image,(QuantumType)
                                                     GrayQuantum,
                                                     quantum_size,
                                                     png_pixels,0,0);
-                      else if (ping_info->color_type ==
+                      else if (ping_colortype ==
                                PNG_COLOR_TYPE_GRAY_ALPHA)
                         (void) ExportImagePixelArea(image,(QuantumType)
                                                     GrayAlphaQuantum,
@@ -7471,38 +7542,32 @@ static MagickPassFail WriteOnePNGImage(M
                             "  Writing PNG image data");
       (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                             "    Width: %lu",
-                            (unsigned long)ping_info->width);
+                            (unsigned long)ping_width);
       (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                             "    Height: %lu",
-                            (unsigned long)ping_info->height);
+                            (unsigned long)ping_height);
       (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-                            "    PNG sample depth: %d",ping_info->bit_depth);
+                            "    PNG sample depth: %d",ping_bit_depth);
       (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                             "    PNG color type: %s (%d)",
-                            PngColorTypeToString(ping_info->color_type),
-                            ping_info->color_type);
+                            PngColorTypeToString(ping_colortype),
+                            ping_colortype);
       (void) LogMagickEvent(CoderEvent,GetMagickModule(),
                             "    PNG Interlace method: %d",
-                            ping_info->interlace_type);
+                            ping_interlace_method);
     }
   /*
     Generate text chunks.
   */
-#if (PNG_LIBPNG_VER <= 10005)
-  ping_info->num_text=0;
-#endif
   attribute=GetImageAttribute(image,(char *) NULL);
   for ( ; attribute != (const ImageAttribute *) NULL;
         attribute=attribute->next)
     {
-#if (PNG_LIBPNG_VER > 10005)
       png_textp
         text;
-#endif
 
       if (*attribute->key == '[')
         continue;
-#if (PNG_LIBPNG_VER > 10005)
       text=(png_textp) png_malloc(ping,(png_uint_32) sizeof(png_text));
       text[0].key=attribute->key;
       text[0].text=attribute->value;
@@ -7519,40 +7584,6 @@ static MagickPassFail WriteOnePNGImage(M
         }
       png_set_text(ping,ping_info,text,1);
       png_free(ping,text);
-#else
-      /* Work directly with ping_info struct;
-       * png_set_text before libpng version
-       * 1.0.5a is leaky */
-      if (ping_info->num_text == 0)
-        {
-          ping_info->text=MagickAllocateMemory(png_text *,
-                                               256*sizeof(png_text));
-          if (ping_info->text == (png_text *) NULL)
-            (void) ThrowException(&image->exception,(ExceptionType)
-                                  ResourceLimitError,MemoryAllocationFailed,
-                                  image->filename);
-        }
-      i=ping_info->num_text++;
-      if (i > 255)
-        (void) ThrowException(&image->exception,(ExceptionType)
-                              ResourceLimitError,
-                              "Cannot write more than 256 PNG text chunks",
-                              image->filename);
-      ping_info->text[i].key=attribute->key;
-      ping_info->text[i].text=attribute->value;
-      ping_info->text[i].text_length=strlen(attribute->value);
-      ping_info->text[i].compression=
-        image_info->compression == NoCompression ||
-        (image_info->compression == UndefinedCompression &&
-         ping_info->text[i].text_length < 128) ? -1 : 0;
-      if (logging)
-        {
-          (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-                                "  Setting up text chunk");
-          (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-                                "    keyword: %s",ping_info->text[i].key);
-        }
-#endif
     }
   if (logging)
     (void) LogMagickEvent(CoderEvent,GetMagickModule(),
@@ -7560,9 +7591,9 @@ static MagickPassFail WriteOnePNGImage(M
   png_write_end(ping,ping_info);
   if (mng_info->need_fram && (int) image->dispose == BackgroundDispose)
     {
-      if (mng_info->page.x || mng_info->page.y || (ping_info->width !=
+      if (mng_info->page.x || mng_info->page.y || (ping_width !=
                                                    mng_info->page.width) ||
-          (ping_info->height != mng_info->page.height))
+          (ping_height != mng_info->page.height))
         {
           unsigned char
             chunk[32];
@@ -7583,10 +7614,10 @@ static MagickPassFail WriteOnePNGImage(M
           chunk[14]=0; /* clipping boundaries delta type */
           PNGLong(chunk+15,(png_uint_32) (mng_info->page.x)); /* left cb */
           PNGLong(chunk+19,(png_uint_32) (mng_info->page.x +
-                                          ping_info->width));
+                                          ping_width));
           PNGLong(chunk+23,(png_uint_32) (mng_info->page.y)); /* top cb */
           PNGLong(chunk+27,(png_uint_32) (mng_info->page.y +
-                                          ping_info->height));
+                                          ping_height));
           (void) WriteBlob(image,31,(char *) chunk);
           (void) WriteBlobMSBULong(image,crc32(0,chunk,31));
           mng_info->old_framing_mode=4;
@@ -7605,7 +7636,7 @@ static MagickPassFail WriteOnePNGImage(M
 
   /* Save depth actually written */
 
-  s[0]=(char) ping_info->bit_depth;
+  s[0]=(char) ping_bit_depth;
   s[1]='\0';
 
   (void) SetImageAttribute(image,"[png:bit-depth-written]",s);
@@ -7613,18 +7644,6 @@ static MagickPassFail WriteOnePNGImage(M
   /*
     Free PNG resources.
   */
-#if (PNG_LIBPNG_VER < 10007)
-  if (ping_info->valid & PNG_INFO_PLTE)
-    {
-      MagickFreeMemory(ping_info->palette);
-      ping_info->valid&=(~PNG_INFO_PLTE);
-    }
-#endif
-  if (ping_info->valid & PNG_INFO_tRNS)
-    {
-      MagickFreeMemory(ping_info->trans_alpha);
-      ping_info->valid&=(~PNG_INFO_tRNS);
-    }
   png_destroy_write_struct(&ping,&ping_info);
 
   MagickFreeMemory(png_pixels);
@@ -8365,23 +8384,12 @@ static unsigned int WriteMNGImage(const 
     final_delay=0,
     initial_delay;
 
-#if (PNG_LIBPNG_VER < 10007)
+#if (PNG_LIBPNG_VER < 10200)
   if (image_info->verbose)
     printf("Your PNG library (libpng-%s) is rather old.\n",
            PNG_LIBPNG_VER_STRING);
 #endif
 
-#if (PNG_LIBPNG_VER >= 10400)
-#  ifndef  PNG_TRANSFORM_GRAY_TO_RGB    /* Added at libpng-1.4.0beta67 */
-  if (image_info->verbose)
-    {
-      printf("Your PNG library (libpng-%s) is an old beta version.\n",
-           PNG_LIBPNG_VER_STRING);
-      printf("Please update it.\n");
-    }
-#  endif
-#endif
-
   /*
     Open image file.
   */
@@ -9196,7 +9204,7 @@ static unsigned int WriteMNGImage(const 
     (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit WriteMNGImage()");
   return(MagickPass);
 }
-#else /* PNG_LIBPNG_VER > 95 */
+#else /* PNG_LIBPNG_VER > 10011 */
 static unsigned int WritePNGImage(const ImageInfo *image_info,Image *image)
 {
   image=image;
@@ -9208,5 +9216,5 @@ static unsigned int WriteMNGImage(const 
 {
   return (WritePNGImage(image_info,image));
 }
-#endif /* PNG_LIBPNG_VER > 95 */
+#endif /* PNG_LIBPNG_VER > 10011 */
 #endif