Imported from libpng-0.87.tar
diff --git a/pngwutil.c b/pngwutil.c
index 1a877f1..39a950d 100644
--- a/pngwutil.c
+++ b/pngwutil.c
@@ -1,10 +1,10 @@
 
 /* pngwutil.c - utilities to write a png file
 
-	libpng 1.0 beta 2 - version 0.86
+	libpng 1.0 beta 2 - version 0.87
    For conditions of distribution and use, see copyright notice in png.h
 	Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
-   January 10, 1996
+   January 15, 1996
    */
 #define PNG_INTERNAL
 #include "png.h"
@@ -142,15 +142,15 @@
    /* pack the header information into the buffer */
    png_save_uint_32(buf, width);
    png_save_uint_32(buf + 4, height);
-   buf[8] = bit_depth;
-   buf[9] = color_type;
-   buf[10] = compression_type;
-   buf[11] = filter_type;
-   buf[12] = interlace_type;
-   /* save off the relevent information */
-   png_ptr->bit_depth = bit_depth;
-   png_ptr->color_type = color_type;
-   png_ptr->interlaced = interlace_type;
+	buf[8] = (png_byte)bit_depth;
+	buf[9] = (png_byte)color_type;
+	buf[10] = (png_byte)compression_type;
+	buf[11] = (png_byte)filter_type;
+	buf[12] = (png_byte)interlace_type;
+	/* save off the relevent information */
+	png_ptr->bit_depth = (png_byte)bit_depth;
+	png_ptr->color_type = (png_byte)color_type;
+	png_ptr->interlaced = (png_byte)interlace_type;
    png_ptr->width = width;
    png_ptr->height = height;
 
@@ -170,7 +170,7 @@
          png_ptr->channels = 4;
          break;
    }
-   png_ptr->pixel_depth = bit_depth * png_ptr->channels;
+	png_ptr->pixel_depth = (png_byte)(bit_depth * png_ptr->channels);
    png_ptr->rowbytes = ((width * (png_uint_32)png_ptr->pixel_depth + 7) >> 3);
    /* set the usr info, so any transformations can modify it */
    png_ptr->usr_width = png_ptr->width;
@@ -184,7 +184,7 @@
    png_ptr->zstream = (z_stream *)png_malloc(png_ptr, sizeof (z_stream));
    png_ptr->zstream->zalloc = png_zalloc;
    png_ptr->zstream->zfree = png_zfree;
-   png_ptr->zstream->opaque = (voidp)png_ptr;
+   png_ptr->zstream->opaque = (voidpf)png_ptr;
    if (!png_ptr->do_custom_filter)
    {
       if (png_ptr->color_type == 3 || png_ptr->bit_depth < 8)
@@ -476,12 +476,19 @@
 
             old_max = max_output_ptr;
             max_output_ptr = num_output_ptr + 4;
-            if (output_ptr)
-					output_ptr = (png_charpp)png_realloc(png_ptr, output_ptr,
-						max_output_ptr * sizeof (png_charpp),
-						old_max * sizeof (png_charp));
-            else
-					output_ptr = (png_charpp)png_malloc(png_ptr,
+				if (output_ptr)
+				{
+					png_charpp old_ptr;
+
+					old_ptr = output_ptr;
+					output_ptr = (png_charpp)png_large_malloc(png_ptr,
+						max_output_ptr * sizeof (png_charpp));
+					png_memcpy(output_ptr, old_ptr,
+						(png_size_t)(old_max * sizeof (png_charp)));
+					png_large_free(png_ptr, old_ptr);
+				}
+				else
+					output_ptr = (png_charpp)png_large_malloc(png_ptr,
 						max_output_ptr * sizeof (png_charp));
          }
 
@@ -516,7 +523,7 @@
       /* check to see if we need more room */
       if (!png_ptr->zstream->avail_out && ret == Z_OK)
       {
-         /* check to make sure our output array has room */
+			/* check to make sure our output array has room */
 			if (num_output_ptr >= max_output_ptr)
          {
             png_uint_32 old_max;
@@ -524,17 +531,24 @@
             old_max = max_output_ptr;
             max_output_ptr = num_output_ptr + 4;
             if (output_ptr)
-					output_ptr = (png_charpp)png_realloc(png_ptr, output_ptr,
-						max_output_ptr * sizeof (png_charp),
-						old_max * sizeof (png_charp));
-            else
-					output_ptr = (png_charpp)png_malloc(png_ptr,
-						max_output_ptr * sizeof (png_charp));
-         }
+				{
+					png_charpp old_ptr;
 
-         /* save off the data */
-         output_ptr[num_output_ptr] = png_large_malloc(png_ptr,
-            png_ptr->zbuf_size);
+					old_ptr = output_ptr;
+					output_ptr = (png_charpp)png_large_malloc(png_ptr,
+						max_output_ptr * sizeof (png_charpp));
+					png_memcpy(output_ptr, old_ptr,
+						(png_size_t)(old_max * sizeof (png_charp)));
+					png_large_free(png_ptr, old_ptr);
+				}
+				else
+					output_ptr = (png_charpp)png_large_malloc(png_ptr,
+						max_output_ptr * sizeof (png_charp));
+			}
+
+			/* save off the data */
+			output_ptr[num_output_ptr] = png_large_malloc(png_ptr,
+				png_ptr->zbuf_size);
 			png_memcpy(output_ptr[num_output_ptr], png_ptr->zbuf,
             (png_size_t)png_ptr->zbuf_size);
          num_output_ptr++;
@@ -556,7 +570,7 @@
       (png_uint_32)(key_len + text_len + 2));
    /* write key */
    png_write_chunk_data(png_ptr, (png_bytep )key, (png_uint_32)(key_len + 1));
-   buf[0] = compression;
+	buf[0] = (png_byte)compression;
    /* write compression */
    png_write_chunk_data(png_ptr, (png_bytep )buf, (png_uint_32)1);
 
@@ -567,7 +581,7 @@
 		png_large_free(png_ptr, output_ptr[i]);
    }
    if (max_output_ptr)
-      png_free(png_ptr, output_ptr);
+      png_large_free(png_ptr, output_ptr);
    /* write anything left in zbuf */
    if (png_ptr->zstream->avail_out < png_ptr->zbuf_size)
       png_write_chunk_data(png_ptr, png_ptr->zbuf,
@@ -591,7 +605,7 @@
 
    png_save_uint_32(buf, x_pixels_per_unit);
    png_save_uint_32(buf + 4, y_pixels_per_unit);
-   buf[8] = unit_type;
+	buf[8] = (png_byte)unit_type;
 
    png_write_chunk(png_ptr, png_pHYs, buf, (png_uint_32)9);
 }
@@ -608,7 +622,7 @@
 
    png_save_uint_32(buf, x_offset);
    png_save_uint_32(buf + 4, y_offset);
-   buf[8] = unit_type;
+	buf[8] = (png_byte)unit_type;
 
    png_write_chunk(png_ptr, png_oFFs, buf, (png_uint_32)9);
 }
@@ -804,7 +818,7 @@
                if (shift == 0)
                {
                   shift = 7;
-                  *dp++ = d;
+						*dp++ = (png_byte)d;
                   d = 0;
                }
                else
@@ -812,7 +826,7 @@
 
             }
             if (shift != 7)
-               *dp = d;
+					*dp = (png_byte)d;
             break;
          }
          case 2:
@@ -838,14 +852,14 @@
                if (shift == 0)
                {
                   shift = 6;
-                  *dp++ = d;
+						*dp++ = (png_byte)d;
                   d = 0;
                }
                else
                   shift -= 2;
             }
             if (shift != 6)
-                   *dp = d;
+						 *dp = (png_byte)d;
             break;
          }
          case 4:
@@ -871,14 +885,14 @@
                if (shift == 0)
                {
 						shift = 4;
-                  *dp++ = d;
+						*dp++ = (png_byte)d;
                   d = 0;
                }
                else
                   shift -= 4;
             }
             if (shift != 4)
-               *dp = d;
+					*dp = (png_byte)d;
             break;
          }
          default:
@@ -1038,7 +1052,7 @@
 
    if (s1 < mins)
    {
-      mins = s1;
+		mins = s1;
       minf = 1;
    }
 
@@ -1056,12 +1070,11 @@
 
    if (s4 < mins)
    {
-      mins = s4;
       minf = 4;
    }
 
    /* set filter byte */
-   row[0] = minf;
+	row[0] = (png_byte)minf;
 
    /* do filter */
    switch (minf)
@@ -1074,7 +1087,7 @@
          {
             *rp = (png_byte)(((int)*rp - (int)*lp) & 0xff);
          }
-         break;
+			break;
       /* up filter */
       case 2:
          for (i = 0, rp = row + (png_size_t)row_info->rowbytes,