Imported from libpng-1.0.7beta17.tar
diff --git a/ANNOUNCE b/ANNOUNCE
index a0518ca..c4f8b83 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,5 +1,5 @@
 
-Libpng 1.0.7beta16 - June 4, 2000
+Libpng 1.0.7beta17 - June 24, 2000
 
 This is a public release of libpng, intended for use in production codes.
 
@@ -80,15 +80,18 @@
   Set each pointer to NULL after freeing it in png_free_data().
   Worked around a problem in pngconf.h; AIX's strings.h defines an "index"
     macro that conflicts with libpng's png_color_16.index. (Dimitri Papadapoulos)
-  Added "msvc" directory with MSVC++ project files (Simon-Pierre Cadieux).
   Added PNG_NO_POINTER_INDEXING macro to use array-indexing instead of pointer
     indexing in pngrutil.c and pngwutil.c to accommodate a buggy compiler.
   Added a check for overlength PLTE chunk in pngrutil.c.
   Added PNG_NO_POINTER_INDEXING macro to use array-indexing instead of pointer
     indexing in pngrutil.c and pngwutil.c to accommodate a buggy compiler.
   Added a warning in png_decompress_chunk() when it runs out of data.
-  Added PNG_USE_DLL macro.
   Revised the copyright/disclaimer/license notice.
+  Corrected the definition of PNG_TRANSFORM_INVERT_ALPHA  (0x0400 not 0x0200)
+  Added PNG_USE_DLL macro.
+  Added "msvc" and contrib/msvctest directories with MSVC++ project files
+    (Simon-Pierre Cadieux) and contrib/visupng directory (Willem van Schaik).
+  Removed leading underscores from "_PNG_H" and "_PNG_SAVE_BSD_SOURCE" macros.
 
 Send comments/corrections/commendations to
 png-implement@ccrc.wustl.edu or to randeg@alum.rpi.edu
diff --git a/CHANGES b/CHANGES
index ee77fd5..c86a536 100644
--- a/CHANGES
+++ b/CHANGES
@@ -757,7 +757,7 @@
   Removed info_ptr->valid tests from png_free_data(), as in version 1.0.5.
   Added png_set_invalid() function.
   Fixed incorrect illustrations of png_destroy_write_struct() in example.c.
-version 1.0.7beta15 [May 29, 2000]
+version 1.0.7beta15 [May 30, 2000]
   Revised the deliberately erroneous Linux setjmp code in pngconf.h to produce
     fewer error messages.
   Rearranged checks for Z_OK to check the most likely path first in pngpread.c
@@ -779,6 +779,16 @@
   Added a warning in png_decompress_chunk() when it runs out of data.
   Added PNG_USE_DLL macro.
   Revised the copyright/disclaimer/license notice.
+  Added contrib/msvctest directory
+version 1.0.7rc1 [June 9, 2000]
+  Corrected the definition of PNG_TRANSFORM_INVERT_ALPHA  (0x0400 not 0x0200)
+  Added contrib/visupng directory (Willem van Schaik)
+version 1.0.7beta17 [June 24, 2000]
+  Revised PNGAPI definition, and pngvcrd.c to work with __GCC__
+    and do not redefine PNGAPI if it is passed in via a compiler directive.
+  Revised visupng/PngFile.c to remove returns from within the Try block.
+  Removed leading underscores from "_PNG_H" and "_PNG_SAVE_BSD_SOURCE" macros.
+  Updated contrib/visupng/cexcept.h to version 1.0.0.
 
 Send comments/corrections/commendations to
 png-implement@ccrc.wustl.edu or to randeg@alum.rpi.edu
diff --git a/INSTALL b/INSTALL
index b3fc612..797a972 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,5 +1,5 @@
 
-Installing libpng version 1.0.7beta16 - June 4, 2000
+Installing libpng version 1.0.7beta17 - June 24, 2000
 
 Before installing libpng, you must first install zlib.  zlib
 can usually be found wherever you got libpng.  zlib can be
@@ -10,7 +10,7 @@
 version of zlib that's installed.
 
 You can rename the directories that you downloaded (they
-might be called "libpng-1.0.7beta16" or "lpng106" and "zlib-1.1.3"
+might be called "libpng-1.0.7beta17" or "lpng107" and "zlib-1.1.3"
 or "zlib113") so that you have directories called "zlib" and "libpng".
 
 Your directory structure should look like this:
@@ -26,6 +26,7 @@
              msvctest
              pngminus
              pngsuite
+             visupng
           msvc
           scripts
              makefile.*
@@ -42,18 +43,19 @@
 distribution of libpng.  It is available in both tar.gz (UNIX style line
 endings) and zip (DOS style line endings) formats.
 
-If you are building libpng with MSVC, you can enter the msvc directory and
-follow the instructions in msvc/README.txt.
+If you are building libpng with MSVC, you can enter the libpng\msvc directory
+and follow the instructions in msvc\README.txt.
 
-Else enter the zlib directory and follow the instructions in zlib/README.
-Then come back here and choose the appropriate makefile.sys in the scripts
+Else enter the zlib directory and follow the instructions in zlib/README,
+then come back here and choose the appropriate makefile.sys in the scripts
 directory.  
+
 The files that are presently available in the scripts directory
 include
 
  makefile.std      =>  Generic UNIX makefile (cc, creates static libpng.a)
- makefile.linux    =>  Linux/ELF makefile (gcc, creates libpng.so.2.1.0.7beta16)
- makefile.gcmmx    =>  Linux/ELF makefile (gcc, creates libpng.so.2.1.0.7beta16,
+ makefile.linux    =>  Linux/ELF makefile (gcc, creates libpng.so.2.1.0.7beta17)
+ makefile.gcmmx    =>  Linux/ELF makefile (gcc, creates libpng.so.2.1.0.7beta17,
                        uses assembler code tuned for Intel MMX platform)
  makefile.gcc      =>  Generic makefile (gcc, creates static libpng.a)
  makefile.knr      =>  Archaic UNIX Makefile that converts files with
@@ -65,9 +67,9 @@
  makefile.intel    =>  Intel C/C++ version 4.0 and later
  libpng.icc        =>  Project file for IBM VisualAge/C++ version 4.0 or later
  makefile.sgi      =>  Silicon Graphics IRIX makefile (cc, creates static lib)
- makefile.sggcc    =>  Silicon Graphics (gcc, creates libpng.so.2.1.0.7beta16)
+ makefile.sggcc    =>  Silicon Graphics (gcc, creates libpng.so.2.1.0.7beta17)
  makefile.sunos    =>  Sun makefile
- makefile.solaris  =>  Solaris 2.X makefile (gcc, creates libpng.so.2.1.0.7beta16)
+ makefile.solaris  =>  Solaris 2.X makefile (gcc, creates libpng.so.2.1.0.7beta17)
  makefile.sco      =>  For SCO OSr5  ELF and Unixware 7 with Native cc
  makefile.mips     =>  MIPS makefile
  makefile.acorn    =>  Acorn makefile
diff --git a/KNOWNBUG b/KNOWNBUG
index 07b4ab1..7a9ca86 100644
--- a/KNOWNBUG
+++ b/KNOWNBUG
@@ -1,97 +1,7 @@
 
-Known bugs and suggested enhancements in libpng-1.0.6
+Known bugs and suggested enhancements in libpng-1.0.7
 
-1. April 24, 2000 -- BUG -- binary incompatibility
-
-   Libpng-1.0.6 is binary incompatible with old applications that
-   allocate the png_struct and png_info structures themselves instead
-   of using png_create_*().  They do not allocate enough space for
-   the structures because they have an incorrect notion of
-   sizeof(png_struct) and sizeof(png_info).  Although such applications
-   should be considered broken rather than considering libpng to be broken,
-   they are numerous and include products of the PNG group, such
-   as gif2png and pnmtopng-2.36 (pnmtopng-2.37 is OK), so libpng will
-   be fixed in version 1.0.7 to work around this problem.
-
-   Applications that use png_create_*() instead of png_ptr=malloc(...)
-   are immune to this problem.
-
-   STATUS:  Fixed in libpng-1.0.6ad, libpng-1.0.6j, and patch-d
-   which are currently being tested by the PNG group.
-   The fix necessarily reintroduces a binary incompatibility with any
-   application that makes direct access to the png_info and
-   png_struct members that deal with the pCAL chunk, palette_lookup,
-   dither_index, time_buffer, or weighted filtering, i.e., any members
-   coming after the new "free_me" member of either structure.  It
-   is believed that applications affected by this reintroduced binary
-   incompatibility are rare (none are known to the PNG group). An
-   effective  workaround for this and the next bug is to recompile the
-   old applications with the installed version of libpng.
-
-2. April 23, 2000 -- BUG -- binary incompatibility
-
-   Libpng-1.0.6 introduced binary incompatibility for applications that
-   make direct access to members of the png_struct and png_info structures,
-   due to the insertion of the free_me member ahead of some previously
-   existing members.
-
-   Applications that use png_set_*(), png_get_*() are immune to this
-   problem, but people are still to this day writing applications that
-   make ill-advised direct access to members of the png_struct and
-   png_info structures, so libpng-1.0.6 will be patched to work around
-   this problem.
-
-   STATUS:  Fixed in libpng-1.0.6j and patch-d, which are currently being
-   tested by the PNG group.  Users can work around the problem without
-   patching libpng by recompiling their applications.
-
-3. April 15, 2000 -- BUG -- pnggccrd.c
-
-   If PNG_NO_GLOBAL_ARRAYS is defined, pnggccrd.c will not compile.
-
-   STATUS: Fixed in libpng-1.0.6g
-
-4. April 1, 2000 -- BUG
-
-   Under some circumstances old applications that make direct access to
-   the info_ptr->text and its members might free the same memory that
-   is also free'ed by libpng during the png_destroy_struct process.
-
-   Fixed in libpng-1.0.6-patch-c and libpng-1.0.6d.  The PNG_FREE_TEXT flag
-   bit in info_ptr->free_me is now checked to make sure libpng is responsible
-   for freeing the memory.
-
-5. April 1, 2000 -- BUG
-
-   The non-ISO-C "strdup()" function is used in png.c
-
-   STATUS: The function has been simplified and no longer uses strdup()
-   in libpng-1.0.6-patch-c and libpng-1.0.6d.
-
-6. March 24, 2000 -- BUG
-
-   The png_set_rgb_to_gray_fixed() function is setting incorrect weighting
-   factors.
-
-   STATUS: Fixed in libpng-1.0.6-patch-b and libpng-1.0.6d.
-
-7. March 22, 2000 -- BUG
-
-   There are some printf() and fprintf() statements active in pngwutil.c
-   when PNG_NO_STDIO and PNG_sCAL_SUPPORTED are both defined.
-
-   STATUS: Fixed in libpng-1.0.6-patch-a and libpng-1.0.6d.  The strcpy()
-   function is used instead.
-
-8. March 22, 2000 -- BUG
-
-   The length of the iCCP chunk data is calculated incorrectly; because
-   it can contain zeroes, strlen() doesn't work.
-
-   STATUS: Fixed in libpng-1.0.6-patch-a and libpng-1.0.6d by adding a
-   data_length parameter to the png_decompress_chunk() function.
-
-9. March 15, 1998 -- OPTIMIZATION -- Kevin Bracey
+1. March 15, 1998 -- OPTIMIZATION -- Kevin Bracey
 
    Loops need to be optimized everywhere
 
@@ -106,7 +16,7 @@
    libpng-1.1.0.  About 160 loops will be turned around
    in libpng-1.1.Nn, for testing.
 
-10. July 4, 1998 -- ENHANCEMENT -- Glenn R-P
+2. July 4, 1998 -- ENHANCEMENT -- Glenn R-P
 
    libpng-1.0.5 and earlier transform colors to gamma=1.0 space for
    merging with background, and then back to the image's gamma.  The
@@ -118,12 +28,12 @@
 
    STATUS: under development.
 
-11. September 1999 -- ENHANCEMENT --
+3. September 1999 -- ENHANCEMENT --
 
    It should be possible to use libpng without floating-point aritmetic.
 
    STATUS: Under investigation, implementation postponed until after
-   libpng-1.0.6.  The application interface will change because replacements
+   libpng-1.0.7.  The application interface will change because replacements
    for the png_set_gAMA(), png_set_cHRM(), and corresponding png_get_()
    functions will be needed.
 
diff --git a/LICENSE b/LICENSE
index 822fc04..5915849 100644
--- a/LICENSE
+++ b/LICENSE
@@ -5,7 +5,7 @@
 Copyright (c) 1996, 1997 Andreas Dilger
 (libpng versions 0.90, December 1996, through 0.96, May 1997)
 Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
-(libpng versions 0.97, January 1998, through 1.0.7beta16, June 4, 2000)
+(libpng versions 0.97, January 1998, through 1.0.7beta17, June 24, 2000)
 
 For the purposes of this copyright and license, "Contributing Authors"
 is defined as the following set of individuals:
@@ -68,4 +68,4 @@
 
 Glenn Randers-Pehrson
 randeg@alum.rpi.edu
-June 4, 2000
+June 24, 2000
diff --git a/README b/README
index 244f997..884cd58 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-README for libpng 1.0.7beta16 - June 4, 2000 (shared library 2.1)
+README for libpng 1.0.7beta17 - June 24, 2000 (shared library 2.1)
 See the note about version numbers near the top of png.h
 
 See INSTALL for instructions on how to install libpng.
@@ -169,15 +169,16 @@
        msvctest     =>  Builds and runs pngtest using a MSVC workspace
        pngminus     =>  Simple pnm2png and png2pnm programs
        pngsuite     =>  Test images
+       visupng      =>  Contains a MSVC workspace for VisualPng
       msvc          =>  Contains a Microsoft Visual C++ (MSVC) workspace
                         for building libpng and zlib
       scripts       =>  Directory containing scripts for building libpng:
        descrip.mms      =>  VMS makefile for MMS or MMK
        makefile.std     =>  Generic UNIX makefile (cc, creates static libpng.a)
        makefile.linux   =>  Linux/ELF makefile
-                            (gcc, creates libpng.so.2.1.0.7beta16)
+                            (gcc, creates libpng.so.2.1.0.7beta17)
        makefile.gcmmx   =>  Linux/ELF makefile (gcc, creates
-                            libpng.so.2.1.0.7beta16, uses assembler code
+                            libpng.so.2.1.0.7beta17, uses assembler code
                             tuned for Intel MMX platform)
        makefile.gcc     =>  Generic makefile (gcc, creates static libpng.a)
        makefile.knr     =>  Archaic UNIX Makefile that converts files with
@@ -189,10 +190,10 @@
        makefile.intel   =>  Intel C/C++ version 4.0 and later
        libpng.icc       =>  Project file, IBM VisualAge/C++ 4.0 or later
        makefile.sgi     =>  Silicon Graphics IRIX (cc, creates static lib)
-       makefile.sggcc   =>  Silicon Graphics (gcc, creates libpng.so.2.1.0.7beta16)
+       makefile.sggcc   =>  Silicon Graphics (gcc, creates libpng.so.2.1.0.7beta17)
        makefile.sunos   =>  Sun makefile
        makefile.solaris =>  Solaris 2.X makefile
-                            (gcc, creates libpng.so.2.1.0.7beta16)
+                            (gcc, creates libpng.so.2.1.0.7beta17)
        makefile.sco     =>  For SCO OSr5  ELF and Unixware 7 with Native cc
        makefile.mips    =>  MIPS makefile
        makefile.acorn   =>  Acorn makefile
diff --git a/Y2KINFO b/Y2KINFO
index 395d8c7..019f25a 100644
--- a/Y2KINFO
+++ b/Y2KINFO
@@ -1,13 +1,13 @@
    Y2K compliance in libpng:
    =========================
 
-      June 4, 2000
+      June 24, 2000
 
       Since the PNG Development group is an ad-hoc body, we can't make
       an official declaration.
 
       This is your unofficial assurance that libpng from version 0.71 and
-      upward through 1.0.7beta16 are Y2K compliant.  It is my belief that earlier
+      upward through 1.0.7beta17 are Y2K compliant.  It is my belief that earlier
       versions were also Y2K compliant.
 
       Libpng only has three year fields.  One is a 2-byte unsigned integer
diff --git a/configure b/configure
index 556f271..d92ed41 100755
--- a/configure
+++ b/configure
@@ -1,5 +1,5 @@
 echo "
-  There is no \"configure\" script for Libpng-1.0.7beta16.  Instead, please
+  There is no \"configure\" script for Libpng-1.0.7beta17.  Instead, please
   copy the appropriate makefile for your system from the \"scripts\"
   directory.  Read the INSTALL file for more details.
 "
diff --git a/contrib/msvctest/msvctest.dsp b/contrib/msvctest/msvctest.dsp
index 926e5ed..d743840 100644
--- a/contrib/msvctest/msvctest.dsp
+++ b/contrib/msvctest/msvctest.dsp
@@ -119,7 +119,7 @@
 OutDir=.\dll_asm
 SOURCE="$(InputPath)"
 PostBuild_Desc=[Run Test]
-PostBuild_Cmds=set path=..\..\msvc\win32\libpng\dll_asm;..\..\msvc\win32\zlib\dll;	$(outdir)\msvctest.exe ..\..\pngtest.png
+PostBuild_Cmds=set path=..\..\msvc\win32\libpng\dll_asm;..\..\msvc\win32\zlib\dll_asm;	$(outdir)\msvctest.exe ..\..\pngtest.png
 # End Special Build Tool
 
 !ELSEIF  "$(CFG)" == "msvctest - Win32 Debug ASM DLL"
@@ -149,7 +149,7 @@
 OutDir=.\dll_dbga
 SOURCE="$(InputPath)"
 PostBuild_Desc=[Run Test]
-PostBuild_Cmds=set path=..\..\msvc\win32\libpng\dll_dbga;..\..\msvc\win32\zlib\dll_dbg;	$(outdir)\msvctest.exe ..\..\pngtest.png
+PostBuild_Cmds=set path=..\..\msvc\win32\libpng\dll_dbga;..\..\msvc\win32\zlib\dll_dbga;	$(outdir)\msvctest.exe ..\..\pngtest.png
 # End Special Build Tool
 
 !ELSEIF  "$(CFG)" == "msvctest - Win32 LIB"
diff --git a/contrib/visupng/PngFile.c b/contrib/visupng/PngFile.c
new file mode 100644
index 0000000..a0cd8e5
--- /dev/null
+++ b/contrib/visupng/PngFile.c
@@ -0,0 +1,443 @@
+//-------------------------------------
+//  PNGFILE.C -- Image File Functions
+//-------------------------------------
+
+// Copyright 2000, Willem van Schaik.  For conditions of distribution and
+// use, see the copyright/license/disclaimer notice in png.h
+
+#include <windows.h>
+#include <commdlg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "png.h"
+#include "pngfile.h"
+#include "cexcept.h"
+
+define_exception_type(const char *);
+extern struct exception_context the_exception_context[1];
+struct exception_context the_exception_context[1];
+png_const_charp msg;
+
+static OPENFILENAME ofn;
+
+static png_structp png_ptr = NULL;
+static png_infop info_ptr = NULL;
+
+
+// cexcept interface
+
+static void
+png_cexcept_error(png_structp png_ptr, png_const_charp msg)
+{
+   if(png_ptr)
+     ;
+#ifndef PNG_NO_CONSOLE_IO
+   fprintf(stderr, "libpng error: %s\n", msg);
+#endif
+   {
+      Throw msg;
+   }
+}
+
+// Windows open-file functions
+
+void PngFileInitialize (HWND hwnd)
+{
+    static TCHAR szFilter[] = TEXT ("PNG Files (*.PNG)\0*.png\0")
+        TEXT ("All Files (*.*)\0*.*\0\0");
+
+    ofn.lStructSize       = sizeof (OPENFILENAME);
+    ofn.hwndOwner         = hwnd;
+    ofn.hInstance         = NULL;
+    ofn.lpstrFilter       = szFilter;
+    ofn.lpstrCustomFilter = NULL;
+    ofn.nMaxCustFilter    = 0;
+    ofn.nFilterIndex      = 0;
+    ofn.lpstrFile         = NULL;          // Set in Open and Close functions
+    ofn.nMaxFile          = MAX_PATH;
+    ofn.lpstrFileTitle    = NULL;          // Set in Open and Close functions
+    ofn.nMaxFileTitle     = MAX_PATH;
+    ofn.lpstrInitialDir   = NULL;
+    ofn.lpstrTitle        = NULL;
+    ofn.Flags             = 0;             // Set in Open and Close functions
+    ofn.nFileOffset       = 0;
+    ofn.nFileExtension    = 0;
+    ofn.lpstrDefExt       = TEXT ("png");
+    ofn.lCustData         = 0;
+    ofn.lpfnHook          = NULL;
+    ofn.lpTemplateName    = NULL;
+}
+
+BOOL PngFileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
+{
+    ofn.hwndOwner         = hwnd;
+    ofn.lpstrFile         = pstrFileName;
+    ofn.lpstrFileTitle    = pstrTitleName;
+    ofn.Flags             = OFN_HIDEREADONLY;
+
+    return GetOpenFileName (&ofn);
+}
+
+BOOL PngFileSaveDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
+{
+    ofn.hwndOwner         = hwnd;
+    ofn.lpstrFile         = pstrFileName;
+    ofn.lpstrFileTitle    = pstrTitleName;
+    ofn.Flags             = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
+
+    return GetSaveFileName (&ofn);
+}
+
+// PNG image handler functions
+
+BOOL PngLoadImage (PTSTR pstrFileName, png_byte **ppbImageData,
+                   int *piWidth, int *piHeight, int *piChannels, png_color *pBkgColor)
+{
+    static FILE        *pfFile;
+    png_byte            pbSig[8];
+    int                 iBitDepth;
+    int                 iColorType;
+    double              dGamma;
+    png_color_16       *pBackground;
+    png_uint_32         ulChannels;
+    png_uint_32         ulRowBytes;
+    png_byte           *pbImageData = *ppbImageData;
+    static png_byte   **ppbRowPointers = NULL;
+    int                 i;
+
+    // open the PNG input file
+
+    if (!pstrFileName)
+    {
+        *ppbImageData = pbImageData = NULL;
+        return FALSE;
+    }
+
+    if (!(pfFile = fopen(pstrFileName, "rb")))
+    {
+        *ppbImageData = pbImageData = NULL;
+        return FALSE;
+    }
+
+    // first check the eight byte PNG signature
+
+    fread(pbSig, 1, 8, pfFile);
+    if (!png_check_sig(pbSig, 8))
+    {
+        *ppbImageData = pbImageData = NULL;
+        return FALSE;
+    }
+
+    // create the two png(-info) structures
+
+    png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL,
+      (png_error_ptr)png_cexcept_error, (png_error_ptr)NULL);
+    if (!png_ptr)
+    {
+        *ppbImageData = pbImageData = NULL;
+        return FALSE;
+    }
+
+    info_ptr = png_create_info_struct(png_ptr);
+    if (!info_ptr)
+    {
+        png_destroy_read_struct(&png_ptr, NULL, NULL);
+        *ppbImageData = pbImageData = NULL;
+        return FALSE;
+    }
+
+    Try
+    {
+        
+        // initialize the png structure
+        
+#if !defined(PNG_NO_STDIO)
+        png_init_io(png_ptr, pfFile);
+#else
+        png_set_read_fn(png_ptr, (png_voidp)pfFile, png_read_data);
+#endif
+        
+        png_set_sig_bytes(png_ptr, 8);
+        
+        // read all PNG info up to image data
+        
+        png_read_info(png_ptr, info_ptr);
+        
+        // get width, height, bit-depth and color-type
+        
+        png_get_IHDR(png_ptr, info_ptr, piWidth, piHeight, &iBitDepth,
+            &iColorType, NULL, NULL, NULL);
+        
+        // expand images of all color-type and bit-depth to 3x8 bit RGB images
+        // let the library process things like alpha, transparency, background
+        
+        if (iBitDepth == 16)
+            png_set_strip_16(png_ptr);
+        if (iColorType == PNG_COLOR_TYPE_PALETTE)
+            png_set_expand(png_ptr);
+        if (iBitDepth < 8)
+            png_set_expand(png_ptr);
+        if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
+            png_set_expand(png_ptr);
+        if (iColorType == PNG_COLOR_TYPE_GRAY ||
+            iColorType == PNG_COLOR_TYPE_GRAY_ALPHA)
+            png_set_gray_to_rgb(png_ptr);
+        
+        // set the background color to draw transparent and alpha images over.
+        if (png_get_bKGD(png_ptr, info_ptr, &pBackground))
+        {
+            png_set_background(png_ptr, pBackground, PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
+            pBkgColor->red   = (byte) pBackground->red;
+            pBkgColor->green = (byte) pBackground->green;
+            pBkgColor->blue  = (byte) pBackground->blue;
+        }
+        else
+        {
+            pBkgColor = NULL;
+        }
+        
+        // if required set gamma conversion
+        if (png_get_gAMA(png_ptr, info_ptr, &dGamma))
+            png_set_gamma(png_ptr, (double) 2.2, dGamma);
+        
+        // after the transformations have been registered update info_ptr data
+        
+        png_read_update_info(png_ptr, info_ptr);
+        
+        // get again width, height and the new bit-depth and color-type
+        
+        png_get_IHDR(png_ptr, info_ptr, piWidth, piHeight, &iBitDepth,
+            &iColorType, NULL, NULL, NULL);
+        
+        
+        // row_bytes is the width x number of channels
+        
+        ulRowBytes = png_get_rowbytes(png_ptr, info_ptr);
+        ulChannels = png_get_channels(png_ptr, info_ptr);
+        
+        *piChannels = ulChannels;
+        
+        // now we can allocate memory to store the image
+        
+        if (pbImageData)
+        {
+            free (pbImageData);
+            pbImageData = NULL;
+        }
+        if ((pbImageData = (png_byte *) malloc(ulRowBytes * (*piHeight)
+                            * sizeof(png_byte))) == NULL)
+        {
+            png_error(png_ptr, "Visual PNG: out of memory");
+        }
+        *ppbImageData = pbImageData;
+        
+        // and allocate memory for an array of row-pointers
+        
+        if ((ppbRowPointers = (png_bytepp) malloc((*piHeight)
+                            * sizeof(png_bytep))) == NULL)
+        {
+            png_error(png_ptr, "Visual PNG: out of memory");
+        }
+        
+        // set the individual row-pointers to point at the correct offsets
+        
+        for (i = 0; i < (*piHeight); i++)
+            ppbRowPointers[i] = pbImageData + i * ulRowBytes;
+        
+        // now we can go ahead and just read the whole image
+        
+        png_read_image(png_ptr, ppbRowPointers);
+        
+        // read the additional chunks in the PNG file (not really needed)
+        
+        png_read_end(png_ptr, NULL);
+        
+        // and we're done
+        
+        free (ppbRowPointers);
+        ppbRowPointers = NULL;
+        
+        // yepp, done
+    }
+
+    Catch (msg)
+    {
+        png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
+
+        *ppbImageData = pbImageData = NULL;
+        
+        if(ppbRowPointers)
+            free (ppbRowPointers);
+
+        fclose(pfFile);
+
+        return FALSE;
+    }
+
+    fclose (pfFile);
+
+    return TRUE;
+}
+
+
+BOOL PngSaveImage (PTSTR pstrFileName, png_byte *pDiData,
+                   int iWidth, int iHeight, png_color bkgColor)
+{
+    const int           ciBitDepth = 8;
+    const int           ciChannels = 3;
+
+    static FILE        *pfFile;
+    png_uint_32         ulRowBytes;
+    static png_byte   **ppbRowPointers = NULL;
+    int                 i;
+
+    // open the PNG output file
+
+    if (!pstrFileName)
+        return FALSE;
+
+    if (!(pfFile = fopen(pstrFileName, "wb")))
+        return FALSE;
+
+    // prepare the standard PNG structures
+
+    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL,
+      (png_error_ptr)png_cexcept_error, (png_error_ptr)NULL);
+    if (!png_ptr)
+    {
+        fclose(pfFile);
+        return FALSE;
+    }
+
+    info_ptr = png_create_info_struct(png_ptr);
+    if (!info_ptr) {
+        fclose(pfFile);
+        png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
+        return FALSE;
+    }
+
+    Try
+    {
+        // initialize the png structure
+        
+#if !defined(PNG_NO_STDIO)
+        png_init_io(png_ptr, pfFile);
+#else
+        png_set_write_fn(png_ptr, (png_voidp)pfFile, png_write_data, png_flush);
+#endif
+        
+        // we're going to write a very simple 3x8 bit RGB image
+        
+        png_set_IHDR(png_ptr, info_ptr, iWidth, iHeight, ciBitDepth,
+            PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE,
+            PNG_FILTER_TYPE_BASE);
+        
+        // write the file header information
+        
+        png_write_info(png_ptr, info_ptr);
+        
+        // swap the BGR pixels in the DiData structure to RGB
+        
+        png_set_bgr(png_ptr);
+        
+        // row_bytes is the width x number of channels
+        
+        ulRowBytes = iWidth * ciChannels;
+        
+        // we can allocate memory for an array of row-pointers
+        
+        if ((ppbRowPointers = (png_bytepp) malloc(iHeight * sizeof(png_bytep))) == NULL)
+        {
+            fclose(pfFile);
+            png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
+            return FALSE;
+        }
+        
+        // set the individual row-pointers to point at the correct offsets
+        
+        for (i = 0; i < iHeight; i++)
+            ppbRowPointers[i] = pDiData + i * (((ulRowBytes + 3) >> 2) << 2);
+        
+        // write out the entire image data in one call
+        
+        png_write_image (png_ptr, ppbRowPointers);
+        
+        // write the additional chunks to the PNG file (not really needed)
+        
+        png_write_end(png_ptr, info_ptr);
+        
+        // and we're done
+        
+        free (ppbRowPointers);
+        ppbRowPointers = NULL;
+        
+        // clean up after the write, and free any memory allocated
+        
+        png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
+        
+        // yepp, done
+    }
+
+    Catch (msg)
+    {
+        png_destroy_write_struct(&png_ptr, (png_infopp) NULL);
+
+        if(ppbRowPointers)
+            free (ppbRowPointers);
+
+        fclose(pfFile);
+
+        return FALSE;
+    }
+    
+    fclose (pfFile);
+    
+    return TRUE;
+}
+
+#ifdef PNG_NO_STDIO
+
+static void
+png_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
+{
+   png_size_t check;
+
+   /* fread() returns 0 on error, so it is OK to store this in a png_size_t
+    * instead of an int, which is what fread() actually returns.
+    */
+   check = (png_size_t)fread(data, (png_size_t)1, length,
+      (FILE *)png_ptr->io_ptr);
+
+   if (check != length)
+   {
+      png_error(png_ptr, "Read Error");
+   }
+}
+
+static void
+png_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
+{
+   png_uint_32 check;
+
+   check = fwrite(data, 1, length, (FILE *)(png_ptr->io_ptr));
+   if (check != length)
+   {
+      png_error(png_ptr, "Write Error");
+   }
+}
+
+static void
+png_flush(png_structp png_ptr)
+{
+   FILE *io_ptr;
+   io_ptr = (FILE *)CVT_PTR((png_ptr->io_ptr));
+   if (io_ptr != NULL)
+      fflush(io_ptr);
+}
+
+#endif
+
+//-----------------
+//  end of source
+//-----------------
diff --git a/contrib/visupng/PngFile.h b/contrib/visupng/PngFile.h
new file mode 100644
index 0000000..a900fd4
--- /dev/null
+++ b/contrib/visupng/PngFile.h
@@ -0,0 +1,27 @@
+//------------------------------------------
+//  PNGFILE.H -- Header File for pngfile.c
+//------------------------------------------
+
+// Copyright 2000, Willem van Schaik.  For conditions of distribution and
+// use, see the copyright/license/disclaimer notice in png.h
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <windows.h>
+
+void PngFileInitialize (HWND hwnd) ;
+BOOL PngFileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName) ;
+BOOL PngFileSaveDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName) ;
+
+BOOL PngLoadImage (PTSTR pstrFileName, png_byte **ppbImageData, 
+                   int *piWidth, int *piHeight, int *piChannels, png_color *pBkgColor);
+BOOL PngSaveImage (PTSTR pstrFileName, png_byte *pDiData,
+                   int iWidth, int iHeight, png_color BkgColor);
+
+#if defined(PNG_NO_STDIO)
+static void png_read_data(png_structp png_ptr, png_bytep data, png_size_t length);
+static void png_write_data(png_structp png_ptr, png_bytep data, png_size_t length);
+static void png_flush(png_structp png_ptr);
+#endif
+
diff --git a/contrib/visupng/README.txt b/contrib/visupng/README.txt
new file mode 100644
index 0000000..7594ec3
--- /dev/null
+++ b/contrib/visupng/README.txt
@@ -0,0 +1,58 @@
+Microsoft Developer Studio Build File, Format Version 6.00 for VisualPng
+------------------------------------------------------------------------
+
+Copyright 2000, Willem van Schaik.  For conditions of distribution and
+use, see the copyright/license/disclaimer notice in png.h
+
+As a PNG .dll demo VisualPng is finished. More features would only hinder
+the program's objective. However, further extensions (like support for other 
+graphics formats) are in development. To get these, or for pre-compiled 
+binaries, go to "http://www.schaik.com/png/visualpng.html".
+
+------------------------------------------------------------------------
+
+Assumes that
+
+   libpng DLLs and LIBs are in ..\..\msvc\win32\libpng
+   zlib DLLs and LIBs are in   ..\..\msvc\win32\zlib
+   libpng header files are in  ..\..\..\libpng
+   zlib header files are in    ..\..\..\zlib
+   the pngsuite images are in  ..\pngsuite
+
+To build:
+
+1) On the main menu Select "Build|Set Active configuration".
+   Choose the configuration that corresponds to the library you want to test.
+   This library must have been built using the libpng MS project located in
+   the "..\..\mscv" subdirectory.
+
+2) Select "Build|Clean"
+
+3) Select "Build|Rebuild All"
+
+4) After compiling and linking VisualPng will be started to view an image
+   from the PngSuite directory.  Press Ctrl-N (and Ctrl-V) for other images.
+
+
+To install:
+
+When distributing VisualPng (or a further development) the following options
+are available:
+
+1) Build the program with the configuration "Win32 LIB" and you only need to
+   include the executable from the ./lib directory in your distribution.
+
+2) Build the program with the configuration "Win32 DLL" and you need to put
+   in your distribution the executable from the ./dll directory and the dll's
+   libpng1.dll, zlib.dll and msvcrt.dll.  These need to be in the user's PATH.
+
+
+Willem van Schaik
+Calgary, June 6th 2000
+
+P.S. VisualPng was written based on preliminary work of:
+
+    - Simon-Pierre Cadieux
+    - Glenn Randers-Pehrson
+    - Greg Roelofs
+
diff --git a/contrib/visupng/VisualPng.c b/contrib/visupng/VisualPng.c
new file mode 100644
index 0000000..f2cf6ee
--- /dev/null
+++ b/contrib/visupng/VisualPng.c
@@ -0,0 +1,961 @@
+//------------------------------------
+//  VisualPng.C -- Shows a PNG image
+//------------------------------------
+
+// Copyright 2000, Willem van Schaik.  For conditions of distribution and
+// use, see the copyright/license/disclaimer notice in png.h
+
+// switches
+
+// defines
+
+#define PROGNAME  "VisualPng"
+#define LONGNAME  "Win32 Viewer for PNG-files"
+#define VERSION   "1.0 of 2000 June 07"
+
+// constants
+
+#define MARGIN 8
+
+// standard includes
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <windows.h>
+
+// application includes
+
+#include "png.h"
+#include "pngfile.h"
+#include "resource.h"
+
+// macros
+
+// function prototypes
+
+LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
+BOOL    CALLBACK AboutDlgProc (HWND, UINT, WPARAM, LPARAM) ;
+
+BOOL CenterAbout (HWND hwndChild, HWND hwndParent);
+
+BOOL BuildPngList (PTSTR pstrPathName, TCHAR **ppFileList, int *pFileCount,
+        int *pFileIndex);
+
+BOOL SearchPngList (TCHAR *pFileList, int FileCount, int *pFileIndex,
+        PTSTR pstrPrevName, PTSTR pstrNextName);
+
+BOOL LoadImageFile(HWND hwnd, PTSTR pstrPathName,
+        png_byte **ppbImage, int *pxImgSize, int *pyImgSize, int *piChannels,
+        png_color *pBkgColor);
+
+BOOL DisplayImage (HWND hwnd, BYTE **ppDib,
+        BYTE **ppDiData, int cxWinSize, int cyWinSize,
+        BYTE *pbImage, int cxImgSize, int cyImgSize, int cImgChannels,
+        BOOL bStretched);
+
+BOOL InitBitmap (
+        BYTE *pDiData, int cxWinSize, int cyWinSize);
+
+BOOL FillBitmap (
+        BYTE *pDiData, int cxWinSize, int cyWinSize,
+        BYTE *pbImage, int cxImgSize, int cyImgSize, int cImgChannels,
+        BOOL bStretched);
+
+// a few global variables
+
+static char *szProgName = PROGNAME;
+static char *szAppName = LONGNAME;
+static char *szIconName = PROGNAME;
+static char szCmdFileName [MAX_PATH];
+
+// MAIN routine
+
+int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
+                    PSTR szCmdLine, int iCmdShow)
+{
+    HACCEL   hAccel;
+    HWND     hwnd;
+    MSG      msg;
+    WNDCLASS wndclass;
+    int ixBorders, iyBorders;
+
+    wndclass.style         = CS_HREDRAW | CS_VREDRAW;
+    wndclass.lpfnWndProc   = WndProc;
+    wndclass.cbClsExtra    = 0;
+    wndclass.cbWndExtra    = 0;
+    wndclass.hInstance     = hInstance;
+    wndclass.hIcon         = LoadIcon (hInstance, szIconName) ;
+    wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW);
+    wndclass.hbrBackground = NULL; // (HBRUSH) GetStockObject (GRAY_BRUSH);
+    wndclass.lpszMenuName  = szProgName;
+    wndclass.lpszClassName = szProgName;
+
+    if (!RegisterClass (&wndclass))
+    {
+        MessageBox (NULL, TEXT ("Error: this program requires Windows NT!"),
+            szProgName, MB_ICONERROR);
+        return 0;
+    }
+
+    // if filename given on commandline, store it
+    if ((szCmdLine != NULL) && (*szCmdLine != '\0'))
+        if (szCmdLine[0] == '"')
+            strncpy (szCmdFileName, szCmdLine + 1, strlen(szCmdLine) - 2);
+        else
+            strcpy (szCmdFileName, szCmdLine);
+    else
+        strcpy (szCmdFileName, "");
+
+    // calculate size of window-borders
+    ixBorders = 2 * (GetSystemMetrics (SM_CXBORDER) +
+                     GetSystemMetrics (SM_CXDLGFRAME));
+    iyBorders = 2 * (GetSystemMetrics (SM_CYBORDER) +
+                     GetSystemMetrics (SM_CYDLGFRAME)) +
+                     GetSystemMetrics (SM_CYCAPTION) +
+                     GetSystemMetrics (SM_CYMENUSIZE) +
+                     1; /* WvS: don't ask me why? */
+
+    hwnd = CreateWindow (szProgName, szAppName,
+        WS_OVERLAPPEDWINDOW,
+        CW_USEDEFAULT, CW_USEDEFAULT,
+        512 + 2 * MARGIN + ixBorders, 384 + 2 * MARGIN + iyBorders,
+//      CW_USEDEFAULT, CW_USEDEFAULT,
+        NULL, NULL, hInstance, NULL);
+
+    ShowWindow (hwnd, iCmdShow);
+    UpdateWindow (hwnd);
+
+    hAccel = LoadAccelerators (hInstance, szProgName);
+
+    while (GetMessage (&msg, NULL, 0, 0))
+    {
+        if (!TranslateAccelerator (hwnd, hAccel, &msg))
+        {
+            TranslateMessage (&msg);
+            DispatchMessage (&msg);
+        }
+    }
+    return msg.wParam;
+}
+
+LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
+        LPARAM lParam)
+{
+    static HINSTANCE          hInstance ;
+    static HDC                hdc;
+    static PAINTSTRUCT        ps;
+    static HMENU              hMenu;
+
+    static BITMAPFILEHEADER  *pbmfh;
+    static BITMAPINFOHEADER  *pbmih;
+    static BYTE              *pbImage;
+    static int                cxWinSize, cyWinSize;
+    static int                cxImgSize, cyImgSize;
+    static int                cImgChannels;
+    static png_color          bkgColor = {127, 127, 127};
+
+    static BOOL               bStretched = TRUE;
+
+    static BYTE              *pDib = NULL;
+    static BYTE              *pDiData = NULL;
+
+    static TCHAR              szImgPathName [MAX_PATH];
+    static TCHAR              szTitleName [MAX_PATH];
+
+    static TCHAR             *pPngFileList = NULL;
+    static int                iPngFileCount;
+    static int                iPngFileIndex;
+
+    BOOL                      bOk;
+
+    switch (message)
+    {
+    case WM_CREATE:
+        hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
+        PngFileInitialize (hwnd);
+
+        strcpy (szImgPathName, "");
+
+        // in case we process file given on command-line
+
+        if (szCmdFileName[0] != '\0')
+        {
+            strcpy (szImgPathName, szCmdFileName);
+
+            // read the other png-files in the directory for later
+            // next/previous commands
+
+            BuildPngList (szImgPathName, &pPngFileList, &iPngFileCount,
+                          &iPngFileIndex);
+
+            // load the image from file
+
+            if (!LoadImageFile (hwnd, szImgPathName,
+                &pbImage, &cxImgSize, &cyImgSize, &cImgChannels, &bkgColor))
+                return 0;
+
+            // invalidate the client area for later update
+
+            InvalidateRect (hwnd, NULL, TRUE);
+
+            // display the PNG into the DIBitmap
+
+            DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
+                pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
+        }
+
+        return 0;
+
+    case WM_SIZE:
+        cxWinSize = LOWORD (lParam);
+        cyWinSize = HIWORD (lParam);
+
+        // invalidate the client area for later update
+
+        InvalidateRect (hwnd, NULL, TRUE);
+
+        // display the PNG into the DIBitmap
+
+        DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
+            pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
+
+        return 0;
+
+    case WM_INITMENUPOPUP:
+        hMenu = GetMenu (hwnd);
+
+        if (pbImage)
+            EnableMenuItem (hMenu, IDM_FILE_SAVE, MF_ENABLED);
+        else
+            EnableMenuItem (hMenu, IDM_FILE_SAVE, MF_GRAYED);
+
+        return 0;
+
+    case WM_COMMAND:
+        hMenu = GetMenu (hwnd);
+
+        switch (LOWORD (wParam))
+        {
+        case IDM_FILE_OPEN:
+
+            // show the File Open dialog box
+
+            if (!PngFileOpenDlg (hwnd, szImgPathName, szTitleName))
+                return 0;
+
+            // read the other png-files in the directory for later
+            // next/previous commands
+
+            BuildPngList (szImgPathName, &pPngFileList, &iPngFileCount,
+                          &iPngFileIndex);
+
+            // load the image from file
+
+            if (!LoadImageFile (hwnd, szImgPathName,
+                &pbImage, &cxImgSize, &cyImgSize, &cImgChannels, &bkgColor))
+                return 0;
+
+            // invalidate the client area for later update
+
+            InvalidateRect (hwnd, NULL, TRUE);
+
+            // display the PNG into the DIBitmap
+
+            DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
+                pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
+
+            return 0;
+
+        case IDM_FILE_SAVE:
+
+            // show the File Save dialog box
+
+            if (!PngFileSaveDlg (hwnd, szImgPathName, szTitleName))
+                return 0;
+
+            // save the PNG to a disk file
+
+            SetCursor (LoadCursor (NULL, IDC_WAIT));
+            ShowCursor (TRUE);
+
+            bOk = PngSaveImage (szImgPathName, pDiData, cxWinSize, cyWinSize,
+                  bkgColor);
+
+            ShowCursor (FALSE);
+            SetCursor (LoadCursor (NULL, IDC_ARROW));
+
+            if (!bOk)
+                MessageBox (hwnd, TEXT ("Error in saving the PNG image"),
+                szProgName, MB_ICONEXCLAMATION | MB_OK);
+            return 0;
+
+        case IDM_FILE_NEXT:
+
+            // read next entry in the directory
+
+            if (SearchPngList (pPngFileList, iPngFileCount, &iPngFileIndex,
+                NULL, szImgPathName))
+            {
+                if (strcmp (szImgPathName, "") == 0)
+                    return 0;
+                
+                // load the image from file
+                
+                if (!LoadImageFile (hwnd, szImgPathName, &pbImage,
+                        &cxImgSize, &cyImgSize, &cImgChannels, &bkgColor))
+                    return 0;
+                
+                // invalidate the client area for later update
+                
+                InvalidateRect (hwnd, NULL, TRUE);
+                
+                // display the PNG into the DIBitmap
+                
+                DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
+                    pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
+            }
+            
+            return 0;
+
+        case IDM_FILE_PREVIOUS:
+
+            // read previous entry in the directory
+
+            if (SearchPngList (pPngFileList, iPngFileCount, &iPngFileIndex,
+                szImgPathName, NULL))
+            {
+                
+                if (strcmp (szImgPathName, "") == 0)
+                    return 0;
+                
+                // load the image from file
+                
+                if (!LoadImageFile (hwnd, szImgPathName, &pbImage, &cxImgSize,
+                    &cyImgSize, &cImgChannels, &bkgColor))
+                    return 0;
+                
+                // invalidate the client area for later update
+                
+                InvalidateRect (hwnd, NULL, TRUE);
+                
+                // display the PNG into the DIBitmap
+                
+                DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
+                    pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
+            }
+
+            return 0;
+
+        case IDM_FILE_EXIT:
+
+            // more cleanup needed...
+
+            // free image buffer
+
+            if (pDib != NULL)
+            {
+                free (pDib);
+                pDib = NULL;
+            }
+
+            // free file-list
+
+            if (pPngFileList != NULL)
+            {
+                free (pPngFileList);
+                pPngFileList = NULL;
+            }
+
+            // let's go ...
+
+            exit (0);
+
+            return 0;
+
+        case IDM_OPTIONS_STRETCH:
+            bStretched = !bStretched;
+            if (bStretched)
+                CheckMenuItem (hMenu, IDM_OPTIONS_STRETCH, MF_CHECKED);
+            else
+                CheckMenuItem (hMenu, IDM_OPTIONS_STRETCH, MF_UNCHECKED);
+
+            // invalidate the client area for later update
+
+            InvalidateRect (hwnd, NULL, TRUE);
+
+            // display the PNG into the DIBitmap
+
+            DisplayImage (hwnd, &pDib, &pDiData, cxWinSize, cyWinSize,
+                pbImage, cxImgSize, cyImgSize, cImgChannels, bStretched);
+
+            return 0;
+
+        case IDM_HELP_ABOUT:
+            DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc) ;
+            return 0;
+
+        } // end switch
+
+        break;
+
+    case WM_PAINT:
+        hdc = BeginPaint (hwnd, &ps);
+
+        if (pDib)
+            SetDIBitsToDevice (hdc, 0, 0, cxWinSize, cyWinSize, 0, 0,
+                0, cyWinSize, pDiData, (BITMAPINFO *) pDib, DIB_RGB_COLORS);
+
+        EndPaint (hwnd, &ps);
+        return 0;
+
+    case WM_DESTROY:
+        if (pbmfh)
+        {
+            free (pbmfh);
+            pbmfh = NULL;
+        }
+
+        PostQuitMessage (0);
+        return 0;
+    }
+
+    return DefWindowProc (hwnd, message, wParam, lParam);
+}
+
+BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,
+                            WPARAM wParam, LPARAM lParam)
+{
+     switch (message)
+     {
+     case WM_INITDIALOG :
+          ShowWindow (hDlg, SW_HIDE);
+          CenterAbout (hDlg, GetWindow (hDlg, GW_OWNER));
+          ShowWindow (hDlg, SW_SHOW);
+          return TRUE ;
+
+     case WM_COMMAND :
+          switch (LOWORD (wParam))
+          {
+          case IDOK :
+          case IDCANCEL :
+               EndDialog (hDlg, 0) ;
+               return TRUE ;
+          }
+          break ;
+     }
+     return FALSE ;
+}
+
+//---------------
+//  CenterAbout
+//---------------
+
+BOOL CenterAbout (HWND hwndChild, HWND hwndParent)
+{
+   RECT    rChild, rParent, rWorkArea;
+   int     wChild, hChild, wParent, hParent;
+   int     xNew, yNew;
+   BOOL  bResult;
+
+   // Get the Height and Width of the child window
+   GetWindowRect (hwndChild, &rChild);
+   wChild = rChild.right - rChild.left;
+   hChild = rChild.bottom - rChild.top;
+
+   // Get the Height and Width of the parent window
+   GetWindowRect (hwndParent, &rParent);
+   wParent = rParent.right - rParent.left;
+   hParent = rParent.bottom - rParent.top;
+
+   // Get the limits of the 'workarea'
+   bResult = SystemParametersInfo(
+      SPI_GETWORKAREA,  // system parameter to query or set
+      sizeof(RECT),
+      &rWorkArea,
+      0);
+   if (!bResult) {
+      rWorkArea.left = rWorkArea.top = 0;
+      rWorkArea.right = GetSystemMetrics(SM_CXSCREEN);
+      rWorkArea.bottom = GetSystemMetrics(SM_CYSCREEN);
+   }
+
+   // Calculate new X position, then adjust for workarea
+   xNew = rParent.left + ((wParent - wChild) /2);
+   if (xNew < rWorkArea.left) {
+      xNew = rWorkArea.left;
+   } else if ((xNew+wChild) > rWorkArea.right) {
+      xNew = rWorkArea.right - wChild;
+   }
+
+   // Calculate new Y position, then adjust for workarea
+   yNew = rParent.top  + ((hParent - hChild) /2);
+   if (yNew < rWorkArea.top) {
+      yNew = rWorkArea.top;
+   } else if ((yNew+hChild) > rWorkArea.bottom) {
+      yNew = rWorkArea.bottom - hChild;
+   }
+
+   // Set it, and return
+   return SetWindowPos (hwndChild, NULL, xNew, yNew, 0, 0, SWP_NOSIZE |
+          SWP_NOZORDER);
+}
+
+//----------------
+//  BuildPngList
+//----------------
+
+BOOL BuildPngList (PTSTR pstrPathName, TCHAR **ppFileList, int *pFileCount,
+     int *pFileIndex)
+{
+    static TCHAR              szImgPathName [MAX_PATH];
+    static TCHAR              szImgFileName [MAX_PATH];
+    static TCHAR              szImgFindName [MAX_PATH];
+
+    WIN32_FIND_DATA           finddata;
+    HANDLE                    hFind;
+
+    static TCHAR              szTmp [MAX_PATH];
+    BOOL                      bOk;
+    int                       i, ii;
+    int                       j, jj;
+
+    // free previous file-list
+
+    if (*ppFileList != NULL)
+    {
+        free (*ppFileList);
+        *ppFileList = NULL;
+    }
+
+    // extract foldername, filename and search-name
+
+    strcpy (szImgPathName, pstrPathName);
+    strcpy (szImgFileName, strrchr (pstrPathName, '\\') + 1);
+
+    strcpy (szImgFindName, szImgPathName);
+    *(strrchr (szImgFindName, '\\') + 1) = '\0';
+    strcat (szImgFindName, "*.png");
+
+    // first cycle: count number of files in directory for memory allocation
+
+    *pFileCount = 0;
+
+    hFind = FindFirstFile(szImgFindName, &finddata);
+    bOk = (hFind != (HANDLE) -1);
+
+    while (bOk)
+    {
+        *pFileCount += 1;
+        bOk = FindNextFile(hFind, &finddata);
+    }
+    FindClose(hFind);
+
+    // allocation memory for file-list
+
+    *ppFileList = (TCHAR *) malloc (*pFileCount * MAX_PATH);
+
+    // second cycle: read directory and store filenames in file-list
+
+    hFind = FindFirstFile(szImgFindName, &finddata);
+    bOk = (hFind != (HANDLE) -1);
+
+    i = 0;
+    ii = 0;
+    while (bOk)
+    {
+        strcpy (*ppFileList + ii, szImgPathName);
+        strcpy (strrchr(*ppFileList + ii, '\\') + 1, finddata.cFileName);
+
+        if (strcmp(pstrPathName, *ppFileList + ii) == 0)
+            *pFileIndex = i;
+
+        ii += MAX_PATH;
+        i++;
+
+        bOk = FindNextFile(hFind, &finddata);
+    }
+    FindClose(hFind);
+
+    // finally we must sort the file-list
+
+    for (i = 0; i < *pFileCount - 1; i++)
+    {
+        ii = i * MAX_PATH;
+        for (j = i+1; j < *pFileCount; j++)
+        {
+            jj = j * MAX_PATH;
+            if (strcmp (*ppFileList + ii, *ppFileList + jj) > 0)
+            {
+                strcpy (szTmp, *ppFileList + jj);
+                strcpy (*ppFileList + jj, *ppFileList + ii);
+                strcpy (*ppFileList + ii, szTmp);
+
+                // check if this was the current image that we moved
+
+                if (*pFileIndex == i)
+                    *pFileIndex = j;
+                else
+                    if (*pFileIndex == j)
+                        *pFileIndex = i;
+            }
+        }
+    }
+
+    return TRUE;
+}
+
+//----------------
+//  SearchPngList
+//----------------
+
+BOOL SearchPngList (
+        TCHAR *pFileList, int FileCount, int *pFileIndex,
+        PTSTR pstrPrevName, PTSTR pstrNextName)
+{
+    if (FileCount > 0)
+    {
+        // get previous entry
+        
+        if (pstrPrevName != NULL)
+        {
+            if (*pFileIndex > 0)
+                *pFileIndex -= 1;
+            else
+                *pFileIndex = FileCount - 1;
+            
+            strcpy (pstrPrevName, pFileList + (*pFileIndex * MAX_PATH));
+        }
+        
+        // get next entry
+        
+        if (pstrNextName != NULL)
+        {
+            if (*pFileIndex < FileCount - 1)
+                *pFileIndex += 1;
+            else
+                *pFileIndex = 0;
+            
+            strcpy (pstrNextName, pFileList + (*pFileIndex * MAX_PATH));
+        }
+        
+        return TRUE;
+    }
+    else
+    {
+        return FALSE;
+    }
+}
+
+//-----------------
+//  LoadImageFile
+//-----------------
+
+BOOL LoadImageFile (HWND hwnd, PTSTR pstrPathName,
+                png_byte **ppbImage, int *pxImgSize, int *pyImgSize,
+                int *piChannels, png_color *pBkgColor)
+{
+    static TCHAR szTmp [MAX_PATH];
+
+    // if there's an existing PNG, free the memory
+
+    if (*ppbImage)
+    {
+        free (*ppbImage);
+        *ppbImage = NULL;
+    }
+
+    // Load the entire PNG into memory
+
+    SetCursor (LoadCursor (NULL, IDC_WAIT));
+    ShowCursor (TRUE);
+
+    PngLoadImage (pstrPathName, ppbImage, pxImgSize, pyImgSize, piChannels,
+                  pBkgColor);
+
+    ShowCursor (FALSE);
+    SetCursor (LoadCursor (NULL, IDC_ARROW));
+
+    if (*ppbImage != NULL)
+    {
+        sprintf (szTmp, "VisualPng - %s", strrchr(pstrPathName, '\\') + 1);
+        SetWindowText (hwnd, szTmp);
+    }
+    else
+    {
+        MessageBox (hwnd, TEXT ("Error in loading the PNG image"),
+            szProgName, MB_ICONEXCLAMATION | MB_OK);
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+//----------------
+//  DisplayImage
+//----------------
+
+BOOL DisplayImage (HWND hwnd, BYTE **ppDib,
+        BYTE **ppDiData, int cxWinSize, int cyWinSize,
+        BYTE *pbImage, int cxImgSize, int cyImgSize, int cImgChannels,
+        BOOL bStretched)
+{
+    BYTE                       *pDib = *ppDib;
+    BYTE                       *pDiData = *ppDiData;
+    // BITMAPFILEHEADER        *pbmfh;
+    BITMAPINFOHEADER           *pbmih;
+    WORD                        wDIRowBytes;
+    png_color                   bkgBlack = {0, 0, 0};
+    png_color                   bkgGray  = {127, 127, 127};
+    png_color                   bkgWhite = {255, 255, 255};
+
+    // allocate memory for the Device Independant bitmap
+
+    wDIRowBytes = (WORD) ((3 * cxWinSize + 3L) >> 2) << 2;
+
+    if (pDib)
+    {
+        free (pDib);
+        pDib = NULL;
+    }
+
+    if (!(pDib = (BYTE *) malloc (sizeof(BITMAPINFOHEADER) +
+        wDIRowBytes * cyWinSize)))
+    {
+        MessageBox (hwnd, TEXT ("Error in displaying the PNG image"),
+            szProgName, MB_ICONEXCLAMATION | MB_OK);
+        *ppDib = pDib = NULL;
+        return FALSE;
+    }
+    *ppDib = pDib;
+    memset (pDib, 0, sizeof(BITMAPINFOHEADER));
+
+    // initialize the dib-structure
+
+    pbmih = (BITMAPINFOHEADER *) pDib;
+    pbmih->biSize = sizeof(BITMAPINFOHEADER);
+    pbmih->biWidth = cxWinSize;
+    pbmih->biHeight = -((long) cyWinSize);
+    pbmih->biPlanes = 1;
+    pbmih->biBitCount = 24;
+    pbmih->biCompression = 0;
+    pDiData = pDib + sizeof(BITMAPINFOHEADER);
+    *ppDiData = pDiData;
+
+    // first fill bitmap with gray and image border
+
+    InitBitmap (pDiData, cxWinSize, cyWinSize);
+
+    // then fill bitmap with image
+
+    if (pbImage)
+    {
+        FillBitmap (
+            pDiData, cxWinSize, cyWinSize,
+            pbImage, cxImgSize, cyImgSize, cImgChannels,
+            bStretched);
+    }
+
+    return TRUE;
+}
+
+//--------------
+//  InitBitmap
+//--------------
+
+BOOL InitBitmap (BYTE *pDiData, int cxWinSize, int cyWinSize)
+{
+    BYTE *dst;
+    int x, y, col;
+
+    // initialize the background with gray
+
+    dst = pDiData;
+    for (y = 0; y < cyWinSize; y++)
+    {
+        col = 0;
+        for (x = 0; x < cxWinSize; x++)
+        {
+            // fill with GRAY
+            *dst++ = 127;
+            *dst++ = 127;
+            *dst++ = 127;
+            col += 3;
+        }
+        // rows start on 4 byte boundaries
+        while ((col % 4) != 0)
+        {
+            dst++;
+            col++;
+        }
+    }
+
+    return TRUE;
+}
+
+//--------------
+//  FillBitmap
+//--------------
+
+BOOL FillBitmap (
+        BYTE *pDiData, int cxWinSize, int cyWinSize,
+        BYTE *pbImage, int cxImgSize, int cyImgSize, int cImgChannels,
+        BOOL bStretched)
+{
+    BYTE *pStretchedImage;
+    BYTE *pImg;
+    BYTE *src, *dst;
+    BYTE r, g, b, a;
+    const int cDIChannels = 3;
+    WORD wImgRowBytes;
+    WORD wDIRowBytes;
+    int cxNewSize, cyNewSize;
+    int cxImgPos, cyImgPos;
+    int xImg, yImg;
+    int xWin, yWin;
+    int xOld, yOld;
+    int xNew, yNew;
+
+    if (bStretched)
+    {
+        cxNewSize = cxWinSize - 2 * MARGIN;
+        cyNewSize = cyWinSize - 2 * MARGIN;
+
+        // stretch the image to it's window determined size
+
+        // the following two are the same, but the first has side-effects
+        // because of rounding
+//      if ((cyNewSize / cxNewSize) > (cyImgSize / cxImgSize))
+        if ((cyNewSize * cxImgSize) > (cyImgSize * cxNewSize))
+        {
+            cyNewSize = cxNewSize * cyImgSize / cxImgSize;
+            cxImgPos = MARGIN;
+            cyImgPos = (cyWinSize - cyNewSize) / 2;
+        }
+        else
+        {
+            cxNewSize = cyNewSize * cxImgSize / cyImgSize;
+            cyImgPos = MARGIN;
+            cxImgPos = (cxWinSize - cxNewSize) / 2;
+        }
+
+        pStretchedImage = malloc (cImgChannels * cxNewSize * cyNewSize);
+        pImg = pStretchedImage;
+
+        for (yNew = 0; yNew < cyNewSize; yNew++)
+        {
+            yOld = yNew * cyImgSize / cyNewSize;
+            for (xNew = 0; xNew < cxNewSize; xNew++)
+            {
+                xOld = xNew * cxImgSize / cxNewSize;
+
+                r = *(pbImage + cImgChannels * ((yOld * cxImgSize) + xOld) + 0);
+                g = *(pbImage + cImgChannels * ((yOld * cxImgSize) + xOld) + 1);
+                b = *(pbImage + cImgChannels * ((yOld * cxImgSize) + xOld) + 2);
+                *pImg++ = r;
+                *pImg++ = g;
+                *pImg++ = b;
+                if (cImgChannels == 4)
+                {
+                    a = *(pbImage + cImgChannels * ((yOld * cxImgSize) + xOld)
+                        + 3);
+                    *pImg++ = a;
+                }
+            }
+        }
+
+        // calculate row-bytes
+
+        wImgRowBytes = cImgChannels * cxNewSize;
+        wDIRowBytes = (WORD) ((cDIChannels * cxWinSize + 3L) >> 2) << 2;
+
+        // copy image to screen
+
+        for (yImg = 0, yWin = cyImgPos; yImg < cyNewSize; yImg++, yWin++)
+        {
+            if (yWin >= cyWinSize - cyImgPos)
+                break;
+            src = pStretchedImage + yImg * wImgRowBytes;
+            dst = pDiData + yWin * wDIRowBytes + cxImgPos * cDIChannels;
+
+            for (xImg = 0, xWin = cxImgPos; xImg < cxNewSize; xImg++, xWin++)
+            {
+                if (xWin >= cxWinSize - cxImgPos)
+                    break;
+                r = *src++;
+                g = *src++;
+                b = *src++;
+                *dst++ = b; /* note the reverse order */
+                *dst++ = g;
+                *dst++ = r;
+                if (cImgChannels == 4)
+                {
+                    a = *src++;
+                }
+            }
+        }
+
+        // free memory
+
+        if (pStretchedImage != NULL)
+        {
+            free (pStretchedImage);
+            pStretchedImage = NULL;
+        }
+
+    }
+
+    // process the image not-stretched
+
+    else
+    {
+        // calculate the central position
+
+        cxImgPos = (cxWinSize - cxImgSize) / 2;
+        cyImgPos = (cyWinSize - cyImgSize) / 2;
+
+        // check for image larger than window
+
+        if (cxImgPos < MARGIN)
+            cxImgPos = MARGIN;
+        if (cyImgPos < MARGIN)
+            cyImgPos = MARGIN;
+
+        // calculate both row-bytes
+
+        wImgRowBytes = cImgChannels * cxImgSize;
+        wDIRowBytes = (WORD) ((cDIChannels * cxWinSize + 3L) >> 2) << 2;
+
+        // copy image to screen
+
+        for (yImg = 0, yWin = cyImgPos; yImg < cyImgSize; yImg++, yWin++)
+        {
+            if (yWin >= cyWinSize - MARGIN)
+                break;
+            src = pbImage + yImg * wImgRowBytes;
+            dst = pDiData + yWin * wDIRowBytes + cxImgPos * cDIChannels;
+
+            for (xImg = 0, xWin = cxImgPos; xImg < cxImgSize; xImg++, xWin++)
+            {
+                if (xWin >= cxWinSize - MARGIN)
+                    break;
+                r = *src++;
+                g = *src++;
+                b = *src++;
+                *dst++ = b; /* note the reverse order */
+                *dst++ = g;
+                *dst++ = r;
+                if (cImgChannels == 4)
+                {
+                    a = *src++;
+                }
+            }
+        }
+    }
+
+    return TRUE;
+}
+
+//-----------------
+//  end of source
+//-----------------
diff --git a/contrib/visupng/VisualPng.dsp b/contrib/visupng/VisualPng.dsp
new file mode 100644
index 0000000..fb42c81
--- /dev/null
+++ b/contrib/visupng/VisualPng.dsp
@@ -0,0 +1,223 @@
+# Microsoft Developer Studio Project File - Name="VisualPng" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+
+# Copyright 2000, Willem van Schaik.  For conditions of distribution and
+# use, see the copyright/license/disclaimer notice in png.h
+
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=VisualPng - Win32 Debug LIB
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "VisualPng.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "VisualPng.mak" CFG="VisualPng - Win32 Debug LIB"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "VisualPng - Win32 DLL" (based on "Win32 (x86) Application")
+!MESSAGE "VisualPng - Win32 Debug DLL" (based on "Win32 (x86) Application")
+!MESSAGE "VisualPng - Win32 LIB" (based on "Win32 (x86) Application")
+!MESSAGE "VisualPng - Win32 Debug LIB" (based on "Win32 (x86) Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "VisualPng - Win32 DLL"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "VisualPng___Win32_DLL"
+# PROP BASE Intermediate_Dir "VisualPng___Win32_DLL"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "dll"
+# PROP Intermediate_Dir "dll"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /I "libpng" /I "zlib" /D "PNG_USE_DLL" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "..\..\..\libpng" /I "..\..\..\zlib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "PNG_USE_DLL" /D "PNG_NO_STDIO" /D "PNG_NO_GLOBAL_ARRAYS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 libpng1.lib zlibd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 /libpath:"libpng" /libpath:"zlib"
+# ADD LINK32 libpng1.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 /libpath:"..\..\msvc\win32\libpng\dll"
+# Begin Special Build Tool
+OutDir=.\dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=set path=..\..\msvc\win32\libpng\dll;..\..\msvc\win32\zlib\dll;	$(outdir)\VisualPng.exe ..\..\contrib\pngsuite\basn6a16.png
+# End Special Build Tool
+
+!ELSEIF  "$(CFG)" == "VisualPng - Win32 Debug DLL"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "VisualPng___Win32_Debug_DLL"
+# PROP BASE Intermediate_Dir "VisualPng___Win32_Debug_DLL"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "dll_dbg"
+# PROP Intermediate_Dir "dll_dbg"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /I "libpng" /I "zlib" /D "PNG_USE_DLL" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\..\libpng" /I "..\..\..\zlib" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "PNG_USE_DLL" /D "PNG_NO_STDIO" /D "PNG_NO_GLOBAL_ARRAYS" /FD /GZ /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 libpng1.lib zlibd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libc" /pdbtype:sept /libpath:"libpng" /libpath:"zlib"
+# SUBTRACT BASE LINK32 /nodefaultlib
+# ADD LINK32 libpng1d.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libc" /pdbtype:sept /libpath:"..\..\msvc\win32\libpng\dll_dbg"
+# SUBTRACT LINK32 /nodefaultlib
+# Begin Special Build Tool
+OutDir=.\dll_dbg
+SOURCE="$(InputPath)"
+PostBuild_Cmds=set path=..\..\msvc\win32\libpng\dll_dbg;..\..\msvc\win32\zlib\dll_dbg;	$(outdir)\VisualPng.exe ..\..\contrib\pngsuite\basn6a16.png
+# End Special Build Tool
+
+!ELSEIF  "$(CFG)" == "VisualPng - Win32 LIB"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "VisualPng___Win32_LIB"
+# PROP BASE Intermediate_Dir "VisualPng___Win32_LIB"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "lib"
+# PROP Intermediate_Dir "lib"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /I "..\..\..\libpng" /I "..\..\..\zlib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "PNG_USE_DLL" /D "PNG_NO_STDIO" /D "PNG_NO_GLOBAL_ARRAYS" /FD /c
+# SUBTRACT BASE CPP /YX
+# ADD CPP /nologo /W3 /GX /O2 /I "..\..\..\libpng" /I "..\..\..\zlib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "PNG_NO_STDIO" /D "PNG_NO_GLOBAL_ARRAYS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 libpng1.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 /libpath:"..\..\msvc\win32\libpng\dll"
+# ADD LINK32 libpng.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 /libpath:"..\..\msvc\win32\libpng\lib"
+# Begin Special Build Tool
+OutDir=.\lib
+SOURCE="$(InputPath)"
+PostBuild_Cmds=$(outdir)\VisualPng.exe ..\..\contrib\pngsuite\basn6a16.png
+# End Special Build Tool
+
+!ELSEIF  "$(CFG)" == "VisualPng - Win32 Debug LIB"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "VisualPng___Win32_Debug_LIB"
+# PROP BASE Intermediate_Dir "VisualPng___Win32_Debug_LIB"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "lib_dbg"
+# PROP Intermediate_Dir "lib_dbg"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\..\libpng" /I "..\..\..\zlib" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "PNG_USE_DLL" /D "PNG_NO_STDIO" /D "PNG_NO_GLOBAL_ARRAYS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\..\libpng" /I "..\..\..\zlib" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "PNG_NO_STDIO" /D "PNG_NO_GLOBAL_ARRAYS" /FD /GZ /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 libpng1d.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libc" /pdbtype:sept /libpath:"..\..\msvc\win32\libpng\dll_dbg"
+# SUBTRACT BASE LINK32 /nodefaultlib
+# ADD LINK32 libpng.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libc" /pdbtype:sept /libpath:"..\..\msvc\win32\libpng\lib_dbg"
+# SUBTRACT LINK32 /nodefaultlib
+# Begin Special Build Tool
+OutDir=.\lib_dbg
+SOURCE="$(InputPath)"
+PostBuild_Cmds=$(outdir)\VisualPng.exe ..\..\contrib\pngsuite\basn6a16.png
+# End Special Build Tool
+
+!ENDIF 
+
+# Begin Target
+
+# Name "VisualPng - Win32 DLL"
+# Name "VisualPng - Win32 Debug DLL"
+# Name "VisualPng - Win32 LIB"
+# Name "VisualPng - Win32 Debug LIB"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\PngFile.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\VisualPng.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\cexcept.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\PngFile.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\resource.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=.\VisualPng.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\VisualPng.rc
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/contrib/visupng/VisualPng.dsw b/contrib/visupng/VisualPng.dsw
new file mode 100644
index 0000000..17ad83a
--- /dev/null
+++ b/contrib/visupng/VisualPng.dsw
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "VisualPng"=.\VisualPng.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/contrib/visupng/VisualPng.ico b/contrib/visupng/VisualPng.ico
new file mode 100644
index 0000000..68aa371
--- /dev/null
+++ b/contrib/visupng/VisualPng.ico
Binary files differ
diff --git a/contrib/visupng/VisualPng.png b/contrib/visupng/VisualPng.png
new file mode 100644
index 0000000..c6aa80a
--- /dev/null
+++ b/contrib/visupng/VisualPng.png
Binary files differ
diff --git a/contrib/visupng/VisualPng.rc b/contrib/visupng/VisualPng.rc
new file mode 100644
index 0000000..151c68c
--- /dev/null
+++ b/contrib/visupng/VisualPng.rc
@@ -0,0 +1,152 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+VISUALPNG MENU DISCARDABLE 
+BEGIN
+    POPUP "&File"
+    BEGIN
+        MENUITEM "&Open Image...\tCtrl+O",      IDM_FILE_OPEN
+        MENUITEM "Save &As...",                 IDM_FILE_SAVE
+        MENUITEM SEPARATOR
+        MENUITEM "&Next Image\tCtrl+N",         IDM_FILE_NEXT
+        MENUITEM "Pre&vious Image\tCtrl+V",     IDM_FILE_PREVIOUS
+        MENUITEM SEPARATOR
+        MENUITEM "E&xit\tAlt+X",                IDM_FILE_EXIT
+    END
+    POPUP "&Options"
+    BEGIN
+        MENUITEM "&Stretch",                    IDM_OPTIONS_STRETCH, CHECKED
+    END
+    POPUP "&Help"
+    BEGIN
+        MENUITEM "&About",                      IDM_HELP_ABOUT
+    END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Accelerator
+//
+
+VISUALPNG ACCELERATORS DISCARDABLE 
+BEGIN
+    "N",            IDM_FILE_NEXT,          VIRTKEY, CONTROL, NOINVERT
+    "O",            IDM_FILE_OPEN,          VIRTKEY, CONTROL, NOINVERT
+    "P",            IDM_FILE_PREVIOUS,      VIRTKEY, CONTROL, NOINVERT
+    "V",            IDM_FILE_PREVIOUS,      VIRTKEY, CONTROL, NOINVERT
+    "X",            IDM_FILE_EXIT,          VIRTKEY, ALT, NOINVERT
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+VISUALPNG               ICON    DISCARDABLE     "VisualPng.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+ABOUTBOX DIALOG DISCARDABLE  0, 0, 186, 94
+STYLE DS_MODALFRAME | WS_POPUP
+FONT 8, "MS Sans Serif"
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,68,67,50,14
+    CTEXT           "VisualPng 1.0  -  June 2000",IDC_STATIC,49,14,88,8
+    LTEXT           "a PNG image viewer",IDC_STATIC,60,30,66,8
+    LTEXT           "(c) Willem van Schaik, 2000",IDC_STATIC,48,52,90,8
+    LTEXT           "to demonstrate the use of libpng in Visual C",
+                    IDC_STATIC,25,38,136,8
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO DISCARDABLE 
+BEGIN
+    "ABOUTBOX", DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 179
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 87
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+#endif    // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
diff --git a/contrib/visupng/cexcept.h b/contrib/visupng/cexcept.h
new file mode 100644
index 0000000..532b23d
--- /dev/null
+++ b/contrib/visupng/cexcept.h
@@ -0,0 +1,244 @@
+/*===
+cexcept.h 1.0.0 (2000-Jun-21-Wed)
+Adam M. Costello <amc@cs.berkeley.edu>
+
+An interface for exception-handling in ANSI C, developed jointly with
+Cosmin Truta <cosmin@cs.toronto.edu>.
+
+    Copyright (c) 2000 Adam M. Costello and Cosmin Truta.  Everyone
+    is hereby granted permission to do whatever they like with this
+    file, provided that if they modify it they take reasonable steps to
+    avoid confusing or misleading people about the authors, version,
+    and terms of use of the derived file.  The copyright holders make
+    no guarantees about the correctness of this file, and are not
+    responsible for any damage resulting from its use.
+
+If this interface is used by multiple .c files, they shouldn't include
+this header file directly.  Instead, create a wrapper header file that
+includes this header file and then invokes the define_exception_type
+macro (see below), and let your .c files include that header file.
+
+The interface consists of one type, one well-known name, and six macros.
+
+
+define_exception_type(type_name);
+
+    This macro is used like an external declaration.  It specifies
+    the type of object that gets copied from the exception thrower to
+    the exception catcher.  The type_name can be any type that can be
+    assigned to, that is, a non-constant arithmetic type, struct, union,
+    or pointer.  Examples:
+
+        define_exception_type(int);
+
+        enum exception { out_of_memory, bad_arguments, disk_full };
+        define_exception_type(enum exception);
+
+        struct exception { int code; const char *msg; };
+        define_exception_type(struct exception);
+
+
+struct exception_context;
+
+    This type may be used after the define_exception_type() macro has
+    been invoked.  A struct exception_context must be known to both
+    the thrower and the catcher.  It is expected that there be one
+    context for each thread that uses exceptions.  It would certainly
+    be dangerous for multiple threads to access the same context.
+    One thread can use multiple contexts, but that is likely to be
+    confusing and not typically useful.  The application can allocate
+    this structure in any way it pleases--automatic, static, or dynamic.
+    The application programmer should pretend not to know the structure
+    members, which are subject to change.
+
+
+struct exception_context *the_exception_context;
+
+    The Try/Catch and Throw statements (described below) implicitly
+    refer to a context, using the name the_exception_context.  It is
+    the application's responsibility to make sure that this name yields
+    the address of a mutable (non-constant) struct exception_context
+    wherever those statements are used.  Subject to that constraint, the
+    application may declare a variable of this name anywhere it likes
+    (inside a function, in a parameter list, or externally), and may
+    use whatever storage class specifiers (static, extern, etc) or type
+    qualifiers (const, volatile) it likes.  Examples:
+
+        static struct exception_context
+          * const the_exception_context = &foo;
+
+        { struct exception_context *the_exception_context = bar; ... }
+
+        int blah(struct exception_context *the_exception_context, ...);
+
+        extern struct exception_context the_exception_context[1];
+
+    The last example illustrates a trick that avoids creating a pointer
+    object separate from the structure object.
+
+    The name could even be a macro, for example:
+
+        struct exception_context ec_array[numthreads];
+        #define the_exception_context (ec_array + thread_id)
+
+    Be aware that the_exception_context is used several times by the
+    Try/Catch/Throw macros, so it shouldn't be expensive or have side
+    effects.  The expansion must be a drop-in replacement for an
+    identifier, so it's safest to put parentheses around it.
+
+
+void init_exception_context(struct exception_context *ec);
+
+    For context structures allocated statically (by an external
+    definition or using the "static" keyword), the implicit
+    initialization to all zeros is sufficient, but contexts allocated
+    by other means must be initialized using this macro before they
+    are used by a Try/Catch statement.  It does no harm to initialize
+    a context more than once (by using this macro on a statically
+    allocated context, or using this macro twice on the same context),
+    but a context must not be re-initialized after it has been used by a
+    Try/Catch statement.
+
+
+Try statement
+Catch (expression) statement
+
+    The Try/Catch/Throw macros are capitalized in order to avoid
+    confusion with the C++ keywords, which have subtly different
+    semantics.
+
+    A Try/Catch statement has a syntax similar to an if/else
+    statement, except that the parenthesized expression goes after
+    the second keyword rather than the first.  As with if/else,
+    there are two clauses, each of which may be a simple statement
+    ending with a semicolon or a brace-enclosed compound statement.
+    But whereas the else clause is optional, the Catch clause is
+    required.  The expression must be a modifiable lvalue (something
+    capable of being assigned to) of the exact same type passed to
+    define_exception_type().
+
+    If a Throw that uses the same exception context as the Try/Catch is
+    executed within the Try clause (typically within a function called
+    by the Try clause), and the exception is not caught by a nested
+    Try/Catch statement, then a copy of the exception will be assigned
+    to the expression, and control will jump to the Catch clause.  If no
+    such Throw is executed, then the assignment is not performed, and
+    the Catch clause is not executed.
+
+    Regardless of whether an exception is caught, the expression is
+    always evaluated exactly once, which is significant if it has side
+    effects, for example:
+
+        Try foo();
+        Catch (p[++i].e) { ... }
+
+    IMPORTANT: Jumping into or out of a Try clause (for example via
+    return, break, continue, goto, longjmp) is forbidden--the compiler
+    will not complain, but bad things will happen at run-time.  Jumping
+    into or out of a Catch clause is okay, and so is jumping around
+    inside a Try clause.  In many cases where one is tempted to return
+    from a Try clause, it will suffice to use Throw, and then return
+    from the Catch clause.  Another option is to set a flag variable and
+    use goto to jump to the end of the Try clause, then check the flag
+    after the Try/Catch statement.
+
+    IMPORTANT: The values of any non-volatile automatic variables
+    changed within the Try clause are undefined after an exception is
+    caught.  Therefore, variables modified inside the Try block whose
+    values are needed later outside the Try block must either use static
+    storage or be declared with the "volatile" type qualifier.
+
+
+Throw expression;
+
+    A Throw statement is very much like a return statement, except that
+    the expression is required.  Whereas return jumps back to the place
+    where the current function was called, Throw jumps back to the Catch
+    clause of the innermost enclosing Try clause.  The expression must
+    be compatible with the type passed to define_exception_type().  The
+    exception must be caught, otherwise the program may crash.
+
+    Slight limitation:  If the expression is a comma-expression it must
+    be enclosed in parentheses.
+
+
+Try statement
+Catch_anonymous statement
+
+    When the value of the exception is not needed, a Try/Catch statement
+    can use Catch_anonymous instead of Catch (expression).
+
+
+Everything below this point is for the benefit of the compiler.  The
+application programmer should pretend not to know any of it, because it
+is subject to change.
+
+===*/
+
+
+#ifndef CEXCEPT_H
+#define CEXCEPT_H
+
+
+#include <setjmp.h>
+
+#define define_exception_type(etype) \
+struct exception__state { \
+  etype *exception; \
+  jmp_buf env; \
+}
+
+struct exception_context { \
+  struct exception__state *last; \
+  int caught; \
+};
+
+#define init_exception_context(ec) ((void)((ec)->last = 0))
+
+#define Catch(e) exception__catch(&(e))
+#define Catch_anonymous exception__catch(0)
+
+#define Try \
+  { \
+    struct exception__state *exception__p, exception__s; \
+    int exception__i; \
+    exception__p = the_exception_context->last; \
+    the_exception_context->last = &exception__s; \
+    for (exception__i = 0; ; exception__i = 1) \
+      if (exception__i) { \
+        if (setjmp(exception__s.env) == 0) { \
+          if (&exception__s)
+
+#define exception__catch(e_addr) \
+          else { } \
+          the_exception_context->caught = 0; \
+        } \
+        else the_exception_context->caught = 1; \
+        the_exception_context->last = exception__p; \
+        break; \
+      } \
+      else exception__s.exception = e_addr; \
+  } \
+  if (!the_exception_context->caught) { } \
+  else
+
+/* Try ends with if(), and Catch begins and ends with else.  This     */
+/* ensures that the Try/Catch syntax is really the same as the        */
+/* if/else syntax.                                                    */
+/*                                                                    */
+/* We use &exception__s instead of 1 to appease compilers that        */
+/* warn about constant expressions inside if().  Most compilers       */
+/* should still recognize that &exception__s is never zero and avoid  */
+/* generating test code.                                              */
+/*                                                                    */
+/* We use the variable exception__i to start the loop at the bottom,  */
+/* rather than jump into the loop using a switch statement, to        */
+/* appease compilers that warn about jumping into loops.              */
+
+#define Throw \
+  for (;; longjmp(the_exception_context->last->env, 1)) \
+    if (the_exception_context->last->exception) \
+      *the_exception_context->last->exception =
+
+
+#endif /* CEXCEPT_H */
diff --git a/contrib/visupng/resource.h b/contrib/visupng/resource.h
new file mode 100644
index 0000000..611dd03
--- /dev/null
+++ b/contrib/visupng/resource.h
@@ -0,0 +1,23 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by VisualPng.rc
+//
+#define IDM_FILE_OPEN                   40001
+#define IDM_FILE_SAVE                   40002
+#define IDM_FILE_NEXT                   40003
+#define IDM_FILE_PREVIOUS               40004
+#define IDM_FILE_EXIT                   40005
+#define IDM_OPTIONS_BACKGROUND          40006
+#define IDM_OPTIONS_STRETCH             40007
+#define IDM_HELP_ABOUT                  40008
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        113
+#define _APS_NEXT_COMMAND_VALUE         40009
+#define _APS_NEXT_CONTROL_VALUE         1001
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
diff --git a/libpng.3 b/libpng.3
index 5faba90..32fbfa2 100644
--- a/libpng.3
+++ b/libpng.3
@@ -1,6 +1,6 @@
-.TH LIBPNG 3 "June 4, 2000"
+.TH LIBPNG 3 "June 24, 2000"
 .SH NAME
-libpng \- Portable Network Graphics (PNG) Reference Library 1.0.7beta16
+libpng \- Portable Network Graphics (PNG) Reference Library 1.0.7beta17
 .SH SYNOPSIS
 \fI\fB
 
@@ -747,7 +747,7 @@
 .SH LIBPNG.TXT
 libpng.txt - A description on how to use and modify libpng
 
- libpng version 1.0.7beta16 - June 4, 2000
+ libpng version 1.0.7beta17 - June 24, 2000
  Updated and distributed by Glenn Randers-Pehrson
  <randeg@alum.rpi.edu>
  Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
@@ -3379,13 +3379,13 @@
 
 .SH VII. Y2K Compliance in libpng
 
-June 4, 2000
+June 24, 2000
 
 Since the PNG Development group is an ad-hoc body, we can't make
 an official declaration.
 
 This is your unofficial assurance that libpng from version 0.71 and
-upward through 1.0.7beta16 are Y2K compliant.  It is my belief that earlier
+upward through 1.0.7beta17 are Y2K compliant.  It is my belief that earlier
 versions were also Y2K compliant.
 
 Libpng only has three year fields.  One is a 2-byte unsigned integer that
@@ -3526,7 +3526,7 @@
 
 Thanks to Frank J. T. Wojcik for helping with the documentation.
 
-Libpng version 1.0.7beta16 - June 4, 2000:
+Libpng version 1.0.7beta17 - June 24, 2000:
 Initially created in 1995 by Guy Eric Schalnat, then of Group 42, Inc.
 Currently maintained by Glenn Randers-Pehrson (randeg@alum.rpi.edu).
 
@@ -3541,7 +3541,7 @@
 Copyright (c) 1996, 1997 Andreas Dilger
 (libpng versions 0.89c, May 1996, through 0.96, May 1997)
 Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
-(libpng versions 0.97, January 1998, through 1.0.7beta16, June 4, 2000)
+(libpng versions 0.97, January 1998, through 1.0.7beta17, June 24, 2000)
 
 For the purposes of this copyright and license, "Contributing Authors"
 is defined as the following set of individuals:
diff --git a/libpng.txt b/libpng.txt
index 1c77a6f..21938d4 100644
--- a/libpng.txt
+++ b/libpng.txt
@@ -1,6 +1,6 @@
 libpng.txt - A description on how to use and modify libpng
 
- libpng version 1.0.7beta16 - June 4, 2000
+ libpng version 1.0.7beta17 - June 24, 2000
  Updated and distributed by Glenn Randers-Pehrson
  <randeg@alum.rpi.edu>
  Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
@@ -2632,13 +2632,13 @@
 
 VII. Y2K Compliance in libpng
 
-June 4, 2000
+June 24, 2000
 
 Since the PNG Development group is an ad-hoc body, we can't make
 an official declaration.
 
 This is your unofficial assurance that libpng from version 0.71 and
-upward through 1.0.7beta16 are Y2K compliant.  It is my belief that earlier
+upward through 1.0.7beta17 are Y2K compliant.  It is my belief that earlier
 versions were also Y2K compliant.
 
 Libpng only has three year fields.  One is a 2-byte unsigned integer that
diff --git a/libpngpf.3 b/libpngpf.3
index ab9c6a5..40b99b8 100644
--- a/libpngpf.3
+++ b/libpngpf.3
@@ -1,6 +1,6 @@
-.TH LIBPNGPF 3 "June 4, 2000"
+.TH LIBPNGPF 3 "June 24, 2000"
 .SH NAME
-libpng \- Portable Network Graphics (PNG) Reference Library 1.0.7beta16
+libpng \- Portable Network Graphics (PNG) Reference Library 1.0.7beta17
 (private functions)
 .SH SYNOPSIS
 \fB#include <png.h>\fP
diff --git a/msvc/README.txt b/msvc/README.txt
index 11c82dd..3a282e0 100644
--- a/msvc/README.txt
+++ b/msvc/README.txt
@@ -1,5 +1,5 @@
 Microsoft Developer Studio Build File, Format Version 6.00 for
-libpng 1.0.7beta16 (June 4, 2000) and zlib
+libpng 1.0.7beta17 (June 24, 2000) and zlib
 
 Copyright (C) 2000 Simon-Pierre Cadieux
 For conditions of distribution and use, see copyright notice in png.h
diff --git a/msvc/libpng.dsp b/msvc/libpng.dsp
index 8bd7611..1fb6b26 100644
--- a/msvc/libpng.dsp
+++ b/msvc/libpng.dsp
@@ -19,11 +19,11 @@
 !MESSAGE Possible choices for configuration are:
 !MESSAGE 
 !MESSAGE "libpng - Win32 DLL" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "libpng - Win32 Debug DLL" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "libpng - Win32 ASM DLL" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "libpng - Win32 Debug ASM DLL" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libpng - Win32 DLL Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libpng - Win32 DLL ASM" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libpng - Win32 DLL Debug ASM" (based on "Win32 (x86) Dynamic-Link Library")
 !MESSAGE "libpng - Win32 LIB" (based on "Win32 (x86) Static Library")
-!MESSAGE "libpng - Win32 Debug LIB" (based on "Win32 (x86) Static Library")
+!MESSAGE "libpng - Win32 LIB Debug" (based on "Win32 (x86) Static Library")
 !MESSAGE 
 
 # Begin Project
@@ -55,11 +55,11 @@
 # ADD BASE BSC32 /nologo
 # ADD BSC32 /nologo
 LINK32=link.exe
-# ADD BASE LINK32  /nologo /dll /machine:I386
+# ADD BASE LINK32 /nologo /dll /machine:I386
 # ADD LINK32 /nologo /dll /machine:I386 /out:".\win32\libpng\dll\libpng1.dll"
 # SUBTRACT LINK32 /pdb:none
 
-!ELSEIF  "$(CFG)" == "libpng - Win32 Debug DLL"
+!ELSEIF  "$(CFG)" == "libpng - Win32 DLL Debug"
 
 # PROP BASE Use_MFC 0
 # PROP BASE Use_Debug_Libraries 1
@@ -86,7 +86,7 @@
 # ADD BASE LINK32 /nologo /dll /debug /machine:I386 /pdbtype:sept
 # ADD LINK32 /nologo /dll /debug /machine:I386 /out:".\win32\libpng\dll_dbg\libpng1d.dll"
 
-!ELSEIF  "$(CFG)" == "libpng - Win32 ASM DLL"
+!ELSEIF  "$(CFG)" == "libpng - Win32 DLL ASM"
 
 # PROP BASE Use_MFC 0
 # PROP BASE Use_Debug_Libraries 0
@@ -105,16 +105,16 @@
 MTL=midl.exe
 RSC=rc.exe
 # ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /i ".." /d "NDEBUG"
+# ADD RSC /l 0x409 /i ".." /d "NDEBUG" /d "PNG_USE_PNGVCRD"
 BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 /nologo /dll /machine:I386
-# ADD LINK32 .\win32\zlib\dll\zlib.lib /nologo /dll /machine:I386 /out:".\win32\libpng\dll_asm\libpng1a.dll"
+# ADD LINK32 /nologo /dll /machine:I386 /out:".\win32\libpng\dll_asm\libpng1a.dll"
 # SUBTRACT LINK32 /pdb:none
 
-!ELSEIF  "$(CFG)" == "libpng - Win32 Debug ASM DLL"
+!ELSEIF  "$(CFG)" == "libpng - Win32 DLL Debug ASM"
 
 # PROP BASE Use_MFC 0
 # PROP BASE Use_Debug_Libraries 1
@@ -133,13 +133,13 @@
 MTL=midl.exe
 RSC=rc.exe
 # ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /i ".." /d "_DEBUG" /d PNG_DEBUG=1
+# ADD RSC /l 0x409 /i ".." /d "_DEBUG" /d PNG_DEBUG=1  /d "PNG_USE_PNGVCRD"
 BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 /nologo /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 .\win32\zlib\dll_dbg\zlibd.lib /nologo /dll /debug /machine:I386 /out:".\win32\libpng\dll_dbga\libpng1b.dll"
+# ADD LINK32 /nologo /dll /debug /machine:I386 /out:".\win32\libpng\dll_dbga\libpng1b.dll"
 
 !ELSEIF  "$(CFG)" == "libpng - Win32 LIB"
 
@@ -167,7 +167,7 @@
 # ADD BASE LIB32 /nologo
 # ADD LIB32 /nologo
 
-!ELSEIF  "$(CFG)" == "libpng - Win32 Debug LIB"
+!ELSEIF  "$(CFG)" == "libpng - Win32 LIB Debug"
 
 # PROP BASE Use_MFC 0
 # PROP BASE Use_Debug_Libraries 1
@@ -198,11 +198,11 @@
 # Begin Target
 
 # Name "libpng - Win32 DLL"
-# Name "libpng - Win32 Debug DLL"
-# Name "libpng - Win32 ASM DLL"
-# Name "libpng - Win32 Debug ASM DLL"
+# Name "libpng - Win32 DLL Debug"
+# Name "libpng - Win32 DLL ASM"
+# Name "libpng - Win32 DLL Debug ASM"
 # Name "libpng - Win32 LIB"
-# Name "libpng - Win32 Debug LIB"
+# Name "libpng - Win32 LIB Debug"
 # Begin Group "Source Files"
 
 # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
@@ -217,17 +217,17 @@
 
 !IF  "$(CFG)" == "libpng - Win32 DLL"
 
-!ELSEIF  "$(CFG)" == "libpng - Win32 Debug DLL"
+!ELSEIF  "$(CFG)" == "libpng - Win32 DLL Debug"
 
-!ELSEIF  "$(CFG)" == "libpng - Win32 ASM DLL"
+!ELSEIF  "$(CFG)" == "libpng - Win32 DLL ASM"
 
-!ELSEIF  "$(CFG)" == "libpng - Win32 Debug ASM DLL"
+!ELSEIF  "$(CFG)" == "libpng - Win32 DLL Debug ASM"
 
 !ELSEIF  "$(CFG)" == "libpng - Win32 LIB"
 
 # PROP Exclude_From_Build 1
 
-!ELSEIF  "$(CFG)" == "libpng - Win32 Debug LIB"
+!ELSEIF  "$(CFG)" == "libpng - Win32 LIB Debug"
 
 # PROP Exclude_From_Build 1
 
@@ -240,17 +240,17 @@
 
 !IF  "$(CFG)" == "libpng - Win32 DLL"
 
-!ELSEIF  "$(CFG)" == "libpng - Win32 Debug DLL"
+!ELSEIF  "$(CFG)" == "libpng - Win32 DLL Debug"
 
-!ELSEIF  "$(CFG)" == "libpng - Win32 ASM DLL"
+!ELSEIF  "$(CFG)" == "libpng - Win32 DLL ASM"
 
-!ELSEIF  "$(CFG)" == "libpng - Win32 Debug ASM DLL"
+!ELSEIF  "$(CFG)" == "libpng - Win32 DLL Debug ASM"
 
 !ELSEIF  "$(CFG)" == "libpng - Win32 LIB"
 
 # PROP Exclude_From_Build 1
 
-!ELSEIF  "$(CFG)" == "libpng - Win32 Debug LIB"
+!ELSEIF  "$(CFG)" == "libpng - Win32 LIB Debug"
 
 # PROP Exclude_From_Build 1
 
@@ -306,19 +306,19 @@
 
 # PROP Exclude_From_Build 1
 
-!ELSEIF  "$(CFG)" == "libpng - Win32 Debug DLL"
+!ELSEIF  "$(CFG)" == "libpng - Win32 DLL Debug"
 
 # PROP Exclude_From_Build 1
 
-!ELSEIF  "$(CFG)" == "libpng - Win32 ASM DLL"
+!ELSEIF  "$(CFG)" == "libpng - Win32 DLL ASM"
 
-!ELSEIF  "$(CFG)" == "libpng - Win32 Debug ASM DLL"
+!ELSEIF  "$(CFG)" == "libpng - Win32 DLL Debug ASM"
 
 !ELSEIF  "$(CFG)" == "libpng - Win32 LIB"
 
 # PROP Exclude_From_Build 1
 
-!ELSEIF  "$(CFG)" == "libpng - Win32 Debug LIB"
+!ELSEIF  "$(CFG)" == "libpng - Win32 LIB Debug"
 
 # PROP Exclude_From_Build 1
 
diff --git a/msvc/png.rc b/msvc/png.rc
index cba4c66..dec02e5 100644
--- a/msvc/png.rc
+++ b/msvc/png.rc
@@ -12,6 +12,14 @@
 #  error PRIVATEBUILD or SPECIALBUILD must be defined as a string describing the type of change brought to the standard library
 #endif /* defined(DLLFNAME_POSTFIX)... */
 
+#if !defined(DLLFNAME_POSTFIX) && defined(PNG_USE_PNGVCRD)
+#  if defined(PNG_DEBUG) && (PNG_DEBUG > 0)
+#    define DLLFNAME_POSTFIX "B"
+#  else
+#    define DLLFNAME_POSTFIX "A"
+#  endif /* !defined(DLLFNAME_POSTFIX)... */
+#endif
+
 #if defined(PNG_DEBUG) && (PNG_DEBUG > 0)
 #  define VS_DEBUG VS_FF_DEBUG
 #  ifndef DLLFNAME_POSTFIX
@@ -22,7 +30,9 @@
 #  endif /* COMMENTS */
 #else
 #  define VS_DEBUG 0
-#  define DLLFNAME_POSTFIX
+#  ifndef DLLFNAME_POSTFIX
+#     define DLLFNAME_POSTFIX
+#  endif /* DLLFNAME_POSTFIX */
 #endif /* defined(DEBUG)... */
 
 #ifdef PRIVATEBUILD
@@ -54,7 +64,7 @@
       VALUE "FileDescription", "PNG image compression library\000"
       VALUE "FileVersion", PNG_LIBPNG_VER_STRING "\000"
       VALUE "InternalName", PNG_LIBPNG_DLLFNAME QUOTE(PNG_LIBPNG_VER_MAJOR) DLLFNAME_POSTFIX " (Windows 32 bit)\000"
-      VALUE "LegalCopyright", "Copyright 1998-2000 Glenn Randers-Pehrson\000"
+      VALUE "LegalCopyright", "\251 1998-2000 Glenn Randers-Pehrson\000"
       VALUE "OriginalFilename", PNG_LIBPNG_DLLFNAME QUOTE(PNG_LIBPNG_VER_MAJOR) DLLFNAME_POSTFIX ".DLL\000"
 #ifdef PRIVATEBUILD
       VALUE "PrivateBuild", PRIVATEBUILD
diff --git a/msvc/png32ms.def b/msvc/png32ms.def
index 7771347..b4c05be 100644
--- a/msvc/png32ms.def
+++ b/msvc/png32ms.def
@@ -1,12 +1,12 @@
 ;------------------------------------------
-; PNGLIB module definition file for Windows
+; LIBPNG module definition file for Windows
 ;------------------------------------------
 
 LIBRARY
 DESCRIPTION "PNG image compression library for Windows"
 
 EXPORTS
-;Version 1.0.7beta16
+;Version 1.0.7beta17
   png_build_grayscale_palette  @1
   png_check_sig        @2
   png_chunk_error      @3
diff --git a/msvc/zlib.dsp b/msvc/zlib.dsp
index 1d6f7e3..92243a6 100644
--- a/msvc/zlib.dsp
+++ b/msvc/zlib.dsp
@@ -19,9 +19,11 @@
 !MESSAGE Possible choices for configuration are:
 !MESSAGE 
 !MESSAGE "zlib - Win32 DLL" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "zlib - Win32 Debug DLL" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "zlib - Win32 DLL Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "zlib - Win32 DLL ASM" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "zlib - Win32 DLL Debug ASM" (based on "Win32 (x86) Dynamic-Link Library")
 !MESSAGE "zlib - Win32 LIB" (based on "Win32 (x86) Static Library")
-!MESSAGE "zlib - Win32 Debug LIB" (based on "Win32 (x86) Static Library")
+!MESSAGE "zlib - Win32 LIB Debug" (based on "Win32 (x86) Static Library")
 !MESSAGE 
 
 # Begin Project
@@ -53,11 +55,11 @@
 # ADD BASE BSC32 /nologo
 # ADD BSC32 /nologo
 LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD BASE LINK32 /nologo /dll /machine:I386
 # ADD LINK32 /nologo /dll /machine:I386
 # SUBTRACT LINK32 /pdb:none
 
-!ELSEIF  "$(CFG)" == "zlib - Win32 Debug DLL"
+!ELSEIF  "$(CFG)" == "zlib - Win32 DLL Debug"
 
 # PROP BASE Use_MFC 0
 # PROP BASE Use_Debug_Libraries 1
@@ -81,9 +83,64 @@
 # ADD BASE BSC32 /nologo
 # ADD BSC32 /nologo
 LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD BASE LINK32 /nologo /dll /debug /machine:I386 /pdbtype:sept
 # ADD LINK32 /nologo /dll /debug /machine:I386 /out:".\win32\zlib\dll_dbg\zlibd.dll"
 
+!ELSEIF  "$(CFG)" == "zlib - Win32 DLL ASM"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ".\win32\zlib\dll_asm"
+# PROP Intermediate_Dir ".\win32\zlib\dll_asm"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+CPP=cl.exe
+# ADD BASE CPP /nologo /MD /W3 /O1 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_USRDLL" /FD /c
+# ADD CPP /nologo /MD /W3 /O1 /I "..\..\zlib" /D "NDEBUG" /D "WIN32" /D "_WIN32" /D "_WINDOWS" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FD /c
+MTL=midl.exe
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /i ".." /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 /nologo /dll /machine:I386
+# ADD LINK32 gvmat32.obj /nologo /dll /machine:I386 /out:".\win32\zlib\dll_asm\zliba.dll"
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "zlib - Win32 DLL Debug ASM"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ".\win32\zlib\dll_dbga"
+# PROP Intermediate_Dir ".\win32\zlib\dll_dbga"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+CPP=cl.exe
+# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_USRDLL" /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Zi /Od /I "..\..\zlib" /D "_DEBUG" /D "WIN32" /D "_WIN32" /D "_WINDOWS" /D "ZLIB_DLL" /D "DYNAMIC_CRC_TABLE" /D "ASMV" /FAcs /FD /GZ /c
+MTL=midl.exe
+RSC=rc.exe
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /i ".." /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 gvmat32d.obj /nologo /dll /debug /machine:I386 /out:".\win32\zlib\dll_dbga\zlibb.dll"
+
 !ELSEIF  "$(CFG)" == "zlib - Win32 LIB"
 
 # PROP BASE Use_MFC 0
@@ -110,7 +167,7 @@
 # ADD BASE LIB32 /nologo
 # ADD LIB32 /nologo
 
-!ELSEIF  "$(CFG)" == "zlib - Win32 Debug LIB"
+!ELSEIF  "$(CFG)" == "zlib - Win32 LIB Debug"
 
 # PROP BASE Use_MFC 0
 # PROP BASE Use_Debug_Libraries 1
@@ -141,9 +198,11 @@
 # Begin Target
 
 # Name "zlib - Win32 DLL"
-# Name "zlib - Win32 Debug DLL"
+# Name "zlib - Win32 DLL Debug"
+# Name "zlib - Win32 DLL ASM"
+# Name "zlib - Win32 DLL Debug ASM"
 # Name "zlib - Win32 LIB"
-# Name "zlib - Win32 Debug LIB"
+# Name "zlib - Win32 LIB Debug"
 # Begin Group "Source Files"
 
 # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
@@ -165,6 +224,33 @@
 # End Source File
 # Begin Source File
 
+SOURCE=..\..\zlib\contrib\asm386\gvmat32c.c
+
+!IF  "$(CFG)" == "zlib - Win32 DLL"
+
+# PROP Exclude_From_Build 1
+
+!ELSEIF  "$(CFG)" == "zlib - Win32 DLL Debug"
+
+# PROP Exclude_From_Build 1
+
+!ELSEIF  "$(CFG)" == "zlib - Win32 DLL ASM"
+
+!ELSEIF  "$(CFG)" == "zlib - Win32 DLL Debug ASM"
+
+!ELSEIF  "$(CFG)" == "zlib - Win32 LIB"
+
+# PROP Exclude_From_Build 1
+
+!ELSEIF  "$(CFG)" == "zlib - Win32 LIB Debug"
+
+# PROP Exclude_From_Build 1
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
 SOURCE=..\..\zlib\gzio.c
 # ADD CPP /Yc"zutil.h"
 # End Source File
@@ -212,13 +298,17 @@
 
 !IF  "$(CFG)" == "zlib - Win32 DLL"
 
-!ELSEIF  "$(CFG)" == "zlib - Win32 Debug DLL"
+!ELSEIF  "$(CFG)" == "zlib - Win32 DLL Debug"
+
+!ELSEIF  "$(CFG)" == "zlib - Win32 DLL ASM"
+
+!ELSEIF  "$(CFG)" == "zlib - Win32 DLL Debug ASM"
 
 !ELSEIF  "$(CFG)" == "zlib - Win32 LIB"
 
 # PROP Exclude_From_Build 1
 
-!ELSEIF  "$(CFG)" == "zlib - Win32 Debug LIB"
+!ELSEIF  "$(CFG)" == "zlib - Win32 LIB Debug"
 
 # PROP Exclude_From_Build 1
 
@@ -231,13 +321,17 @@
 
 !IF  "$(CFG)" == "zlib - Win32 DLL"
 
-!ELSEIF  "$(CFG)" == "zlib - Win32 Debug DLL"
+!ELSEIF  "$(CFG)" == "zlib - Win32 DLL Debug"
+
+!ELSEIF  "$(CFG)" == "zlib - Win32 DLL ASM"
+
+!ELSEIF  "$(CFG)" == "zlib - Win32 DLL Debug ASM"
 
 !ELSEIF  "$(CFG)" == "zlib - Win32 LIB"
 
 # PROP Exclude_From_Build 1
 
-!ELSEIF  "$(CFG)" == "zlib - Win32 Debug LIB"
+!ELSEIF  "$(CFG)" == "zlib - Win32 LIB Debug"
 
 # PROP Exclude_From_Build 1
 
diff --git a/png.5 b/png.5
index c5cbdfc..ae87d93 100644
--- a/png.5
+++ b/png.5
@@ -1,4 +1,4 @@
-.TH PNG 5 "June 4, 2000"
+.TH PNG 5 "June 24, 2000"
 .SH NAME
 png \- Portable Network Graphics (PNG) format
 .SH DESCRIPTION
diff --git a/png.c b/png.c
index 08b7ff1..986ecd9 100644
--- a/png.c
+++ b/png.c
@@ -1,7 +1,7 @@
 
 /* png.c - location for general purpose libpng functions
  *
- * libpng version 1.0.7beta16 - June 4, 2000
+ * libpng version 1.0.7beta17 - June 24, 2000
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
@@ -14,14 +14,14 @@
 #include "png.h"
 
 /* Generate a compiler error if there is an old png.h in the search path. */
-typedef version_1_0_7beta16 Your_png_h_is_not_version_1_0_7beta16;
+typedef version_1_0_7beta17 Your_png_h_is_not_version_1_0_7beta17;
 
 /* Version information for C files.  This had better match the version
  * string defined in png.h.  */
 
 #ifdef PNG_USE_GLOBAL_ARRAYS
 /* png_libpng_ver was changed to a function in version 1.0.5c */
-char png_libpng_ver[12] = "1.0.7beta16";
+char png_libpng_ver[12] = "1.0.7beta17";
 
 /* png_sig was changed to a function in version 1.0.5c */
 /* Place to hold the signature string for a PNG file. */
@@ -605,7 +605,7 @@
 png_get_copyright(png_structp png_ptr)
 {
    if (png_ptr != NULL || png_ptr == NULL)  /* silence compiler warning */
-   return ("\n libpng version 1.0.7beta16 - June 4, 2000\n\
+   return ("\n libpng version 1.0.7beta17 - June 24, 2000\n\
    Copyright (c) 1998-2000 Glenn Randers-Pehrson\n\
    Copyright (c) 1996, 1997 Andreas Dilger\n\
    Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.\n");
@@ -623,8 +623,8 @@
 {
    /* Version of *.c files used when building libpng */
    if(png_ptr != NULL) /* silence compiler warning about unused png_ptr */
-      return("1.0.7beta16");
-   return("1.0.7beta16");
+      return("1.0.7beta17");
+   return("1.0.7beta17");
 }
 
 png_charp PNGAPI
diff --git a/png.h b/png.h
index 85ed922..c38dbb0 100644
--- a/png.h
+++ b/png.h
@@ -1,7 +1,7 @@
 
 /* png.h - header file for PNG reference library
  *
- * libpng version 1.0.7beta16 - June 4, 2000
+ * libpng version 1.0.7beta17 - June 24, 2000
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
@@ -9,7 +9,7 @@
  * Authors and maintainers:
  *  libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
  *  libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger
- *  libpng versions 0.97, January 1998, through 1.0.7beta16 - June 4, 2000: Glenn
+ *  libpng versions 0.97, January 1998, through 1.0.7beta17 - June 24, 2000: Glenn
  *  See also "Contributing Authors", below.
  *
  * Note about libpng version numbers:
@@ -52,9 +52,9 @@
  *    1.0.6h                        10007  10.6h (testing xy.z so-numbering)
  *    1.0.6i                        10007  10.6i
  *    1.0.6j                        10007  2.1.0.6j (incompatible with 1.0.0)
- *    1.0.7beta11-16                10007  2.1.0.7beta11-16 (binary compatible)
+ *    1.0.7beta11-17                10007  2.1.0.7beta11-17 (binary compatible)
+ *    1.0.7rc1-2                    10007  2.1.0.7rc1-2 (binary compatible)
  *    planned:
- *    1.0.7rc1                      10007  2.1.0.7rc1 (binary compatible)
  *    1.0.6patch4 (w/4 patches)     10006  2.1.0.6 (binary compatible)
  *    1.0.7                         10007  (still compatible)
  *
@@ -83,7 +83,7 @@
  * If you modify libpng you may insert additional notices immediately following
  * this sentence.
  *
- * libpng versions 1.0.6, March 20, 2000, through 1.0.7beta16, June 4, 2000, are
+ * libpng versions 1.0.6, March 20, 2000, through 1.0.7beta17, June 24, 2000, are
  * Copyright (c) 2000 Glenn Randers-Pehrson
  * Distributed according to the same disclaimer and license as libpng-1.0.5
  * with the following individuals added to the list of Contributing Authors:
@@ -179,13 +179,13 @@
  * Y2K compliance in libpng:
  * =========================
  *
- *    June 4, 2000
+ *    June 24, 2000
  *
  *    Since the PNG Development group is an ad-hoc body, we can't make
  *    an official declaration.
  *
  *    This is your unofficial assurance that libpng from version 0.71 and
- *    upward through 1.0.7beta16 are Y2K compliant.  It is my belief that earlier
+ *    upward through 1.0.7beta17 are Y2K compliant.  It is my belief that earlier
  *    versions were also Y2K compliant.
  *
  *    Libpng only has three year fields.  One is a 2-byte unsigned integer
@@ -231,8 +231,8 @@
  *       PNG Development Group
  */
 
-#ifndef _PNG_H
-#define _PNG_H
+#ifndef PNG_H
+#define PNG_H
 
 /* This is not the place to learn how to use libpng.  The file libpng.txt
  * describes how to use libpng, and the file example.c summarizes it
@@ -241,7 +241,7 @@
  */
 
 /* Version information for png.h - this should match the version in png.c */
-#define PNG_LIBPNG_VER_STRING "1.0.7beta16"
+#define PNG_LIBPNG_VER_STRING "1.0.7beta17"
 
 #define PNG_LIBPNG_VER_SONUM   2
 
@@ -251,7 +251,7 @@
 #define PNG_LIBPNG_VER_RELEASE 7
 /* This should match the numeric part of the final component of
  * PNG_LIBPNG_VER_STRING, omitting any leading zero: */
-#define PNG_LIBPNG_VER_BUILD   16
+#define PNG_LIBPNG_VER_BUILD   17
 
 /* Careful here.  At one time, Guy wanted to use 082, but that would be octal.
  * We must not include leading zeros.
@@ -892,7 +892,7 @@
 #define PNG_TRANSFORM_BGR            0x0080    /* read and write */
 #define PNG_TRANSFORM_SWAP_ALPHA     0x0100    /* read and write */
 #define PNG_TRANSFORM_SWAP_ENDIAN    0x0200    /* read and write */
-#define PNG_TRANSFORM_INVERT_ALPHA   0x0200    /* read and write */
+#define PNG_TRANSFORM_INVERT_ALPHA   0x0400    /* read and write */
 #define PNG_TRANSFORM_STRIP_FILLER   0x0800    /* WRITE only */
 
 typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t));
@@ -1140,9 +1140,9 @@
 };
 
 /* This prevents a compiler error in png_get_copyright() in png.c if png.c
-and png.h are both at * version 1.0.7beta16
+and png.h are both at * version 1.0.7beta17
  */
-typedef png_structp version_1_0_7beta16;
+typedef png_structp version_1_0_7beta17;
 
 typedef png_struct FAR * FAR * png_structpp;
 
@@ -2161,7 +2161,7 @@
 extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr));
 
 #define PNG_HEADER_VERSION_STRING \
-   " libpng version 1.0.7beta16 - June 4, 2000 (header)\n"
+   " libpng version 1.0.7beta17 - June 24, 2000 (header)\n"
 
 #ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED
 /* With these routines we avoid an integer divide, which will be slower on
@@ -2955,4 +2955,4 @@
 
 #endif /* PNG_VERSION_INFO_ONLY */
 /* do not put anything past this line */
-#endif /* _PNG_H */
+#endif /* PNG_H */
diff --git a/pngasmrd.h b/pngasmrd.h
index 50dcf20..0933650 100644
--- a/pngasmrd.h
+++ b/pngasmrd.h
@@ -1,11 +1,14 @@
 /* pngasmrd.h - assembler version of utilities to read a PNG file
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1999, 2000 Glenn Randers-Pehrson
  *
  */
 
+#ifndef PNGASMRD_H
+#define PNGASMRD_H
+
 #ifdef PNG_ASSEMBLER_CODE_SUPPORTED
 
 /* Set this in the makefile for VC++ on Pentium, not in pngconf.h */
@@ -33,3 +36,4 @@
  */
 
 #endif
+#endif /* PNGASMRD_H */
diff --git a/pngconf.h b/pngconf.h
index 028936c..b6ada56 100644
--- a/pngconf.h
+++ b/pngconf.h
@@ -1,6 +1,6 @@
 /* pngconf.h - machine configurable file for libpng
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
@@ -133,7 +133,7 @@
 
 #  ifdef __linux__
 #    ifdef _BSD_SOURCE
-#      define _PNG_SAVE_BSD_SOURCE
+#      define PNG_SAVE_BSD_SOURCE
 #      undef _BSD_SOURCE
 #    endif
 #    ifdef _SETJMP_H
@@ -146,9 +146,9 @@
 #include <setjmp.h>
 
 #  ifdef __linux__
-#    ifdef _PNG_SAVE_BSD_SOURCE
+#    ifdef PNG_SAVE_BSD_SOURCE
 #      define _BSD_SOURCE
-#      undef _PNG_SAVE_BSD_SOURCE
+#      undef PNG_SAVE_BSD_SOURCE
 #    endif
 #  endif /* __linux__ */
 #endif /* PNG_SETJMP_SUPPORTED */
@@ -950,7 +950,15 @@
 #  endif
 #endif
 
-#if defined(PNG_BUILD_DLL) && !defined(PNG_NO_MODULEDEF)
+#ifndef PNGAPI
+
+#if defined(__MINGW32__) || defined(__CYGWIN32__) && !defined(PNG_MODULEDEF)
+#  ifndef PNG_NO_MODULEDEF
+#    define PNG_NO_MODULEDEF
+#  endif
+#endif
+
+#if !defined(PNG_IMPEXP) && defined(PNG_BUILD_DLL) && !defined(PNG_NO_MODULEDEF)
 #  define PNG_IMPEXP
 #endif
 
@@ -958,7 +966,11 @@
     defined(_Windows) || defined(_WINDOWS) || \
     defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
 
-#  define PNGAPI _cdecl
+#  ifdef __GNUC__
+#    define PNGAPI __cdecl
+#  else
+#    define PNGAPI _cdecl
+#  endif
 
 #  if !defined(PNG_IMPEXP) && (!defined(PNG_DLL) || \
        0 /* WINCOMPILER_WITH_NO_SUPPORT_FOR_DECLIMPEXP */)
@@ -994,19 +1006,17 @@
 #        endif
 #     endif
 #  endif  /* PNG_IMPEXP */
-#else
+#else /* !(DLL || WINDOWS) */
 #  if 0 /* ... other platforms, with other meanings */
 #  else
 #     define PNGAPI
+#     define PNG_IMPEXP
 #  endif
 #endif
+#endif
 
 #ifndef PNG_EXPORT
-#  define PNG_EXPORT(type,symbol) type PNGAPI symbol
-#endif
-
-#if defined(__MINGW32__) || defined(__CYGWIN32__)
-#  define PNG_ATTR_DLLIMP
+#  define PNG_EXPORT(type,symbol) PNG_IMPEXP type PNGAPI symbol
 #endif
 
 #ifdef PNG_USE_GLOBAL_ARRAYS
diff --git a/pngerror.c b/pngerror.c
index 6e4cd32..d56aecb 100644
--- a/pngerror.c
+++ b/pngerror.c
@@ -1,7 +1,7 @@
 
 /* pngerror.c - stub functions for i/o and memory allocation
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
diff --git a/pnggccrd.c b/pnggccrd.c
index d1372cd..88d027c 100644
--- a/pnggccrd.c
+++ b/pnggccrd.c
@@ -6,7 +6,7 @@
  *     and http://www.intel.com/drg/pentiumII/appnotes/923/923.htm
  *     for Intel's performance analysis of the MMX vs. non-MMX code.
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * Copyright (c) 1998, Intel Corporation
@@ -43,8 +43,8 @@
  */
 
 /*
- * GRR NOTES
- * =========
+ * NOTES (mostly by Greg Roelofs)
+ * =====
  *
  * 19991006:
  *  - fixed sign error in post-MMX cleanup code (16- & 32-bit cases)
@@ -125,9 +125,10 @@
  * 20000319:
  *  - fixed a register-name typo in png_do_read_interlace(), default (MMX) case,
  *     pass == 4 or 5, that caused visible corruption of interlaced images
+ *
+ *  - When compiling with gcc, be sure to use  -fomit-frame-pointer
  */
 
-
 #define PNG_INTERNAL
 #include "png.h"
 
@@ -143,8 +144,9 @@
 static const int png_pass_width[7] = {8, 4, 4, 2, 2, 1, 1};
 #endif
 
-// djgpp adds its own underscores to global variables, so define them without:
-#ifdef __DJGPP__
+// djgpp and Win32 add their own underscores to global variables,
+// so define them without:
+#if (defined __DJBPP__) || defined (WIN32)
 #  define _unmask      unmask
 #  define _const4      const4
 #  define _const6      const6
diff --git a/pngget.c b/pngget.c
index 1ff25f1..c9574a6 100644
--- a/pngget.c
+++ b/pngget.c
@@ -1,7 +1,7 @@
 
 /* pngget.c - retrieval of values from info struct
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
diff --git a/pngmem.c b/pngmem.c
index 94b0cf9..73f4554 100644
--- a/pngmem.c
+++ b/pngmem.c
@@ -1,7 +1,7 @@
 
 /* pngmem.c - stub functions for memory allocation
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
diff --git a/pngpread.c b/pngpread.c
index 1934b1f..6bae659 100644
--- a/pngpread.c
+++ b/pngpread.c
@@ -1,7 +1,7 @@
 
 /* pngpread.c - read a png file in push mode
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
diff --git a/pngread.c b/pngread.c
index ed94f68..c5c3317 100644
--- a/pngread.c
+++ b/pngread.c
@@ -1,7 +1,7 @@
 
 /* pngread.c - read a PNG file
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
@@ -697,7 +697,7 @@
  * not called png_set_interlace_handling(), the display_row buffer will
  * be ignored, so pass NULL to it.
  *
- * [*] png_handle_alpha() does not exist yet, as of libpng version 1.0.7beta16
+ * [*] png_handle_alpha() does not exist yet, as of libpng version 1.0.7beta17
  */
 
 void PNGAPI
@@ -746,7 +746,7 @@
  * only call this function once.  If you desire to have an image for
  * each pass of a interlaced image, use png_read_rows() instead.
  *
- * [*] png_handle_alpha() does not exist yet, as of libpng version 1.0.7beta16
+ * [*] png_handle_alpha() does not exist yet, as of libpng version 1.0.7beta17
  */
 void PNGAPI
 png_read_image(png_structp png_ptr, png_bytepp image)
diff --git a/pngrio.c b/pngrio.c
index eadf360..c5008e8 100644
--- a/pngrio.c
+++ b/pngrio.c
@@ -1,7 +1,7 @@
 
 /* pngrio.c - functions for data input
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
diff --git a/pngrtran.c b/pngrtran.c
index 72f8548..aa67150 100644
--- a/pngrtran.c
+++ b/pngrtran.c
@@ -1,7 +1,7 @@
 
 /* pngrtran.c - transforms the data in a row for PNG readers
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
diff --git a/pngrutil.c b/pngrutil.c
index 6f290c3..8795a31 100644
--- a/pngrutil.c
+++ b/pngrutil.c
@@ -1,7 +1,7 @@
 
 /* pngrutil.c - utilities to read a PNG file
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
@@ -224,8 +224,18 @@
          }
       }
       if (ret != Z_STREAM_END)
+      {
+#if !defined(PNG_NO_STDIO)
+         char umsg[50];
+
+         sprintf(umsg,"Incomplete compressed datastream in %s chunk",
+             png_ptr->chunk_name);
+         png_warning(png_ptr, umsg);
+#else
          png_warning(png_ptr,
-         "End of datastream not found in a compressed chunk (other than IDAT)");
+            "Incomplete compressed datastream in chunk other than IDAT");
+#endif
+      }
 
       inflateReset(&png_ptr->zstream);
       png_ptr->zstream.avail_in = 0;
@@ -234,7 +244,7 @@
       chunkdata = text;
       *newlength=text_size;
    }
-   else /* if (comp_type >= PNG_TEXT_COMPRESSION_LAST) */
+   else /* if (comp_type != PNG_TEXT_COMPRESSION_zTXt) */
    {
 #if !defined(PNG_NO_STDIO)
       char umsg[50];
diff --git a/pngset.c b/pngset.c
index bdb61e7..6f3c897 100644
--- a/pngset.c
+++ b/pngset.c
@@ -1,7 +1,7 @@
 
 /* pngset.c - storage of image information into info struct
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
diff --git a/pngtest.c b/pngtest.c
index d4155af..22b316c 100644
--- a/pngtest.c
+++ b/pngtest.c
@@ -1,7 +1,7 @@
 
 /* pngtest.c - a simple test program to test libpng
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
@@ -1159,7 +1159,7 @@
    fprintf(STDERR," library (%lu):%s", png_access_version_number(),
       png_get_header_version(NULL));
    /* Show the version of libpng used in building the application */
-   fprintf(STDERR," pngtest (%lu):%s", PNG_LIBPNG_VER,
+   fprintf(STDERR," pngtest (%lu):%s", (unsigned long)PNG_LIBPNG_VER,
       PNG_HEADER_VERSION_STRING);
    fprintf(STDERR," sizeof(png_struct)=%d, sizeof(png_info)=%d\n",
                     sizeof(png_struct), sizeof(png_info));
@@ -1392,4 +1392,4 @@
 }
 
 /* Generate a compiler error if there is an old png.h in the search path. */
-typedef version_1_0_7beta16 your_png_h_is_not_version_1_0_7beta16;
+typedef version_1_0_7beta17 your_png_h_is_not_version_1_0_7beta17;
diff --git a/pngtrans.c b/pngtrans.c
index c26baca..3c20be8 100644
--- a/pngtrans.c
+++ b/pngtrans.c
@@ -1,7 +1,7 @@
 
 /* pngtrans.c - transforms the data in a row (used by both readers and writers)
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
diff --git a/pngvcrd.c b/pngvcrd.c
index 38aa528..379c421 100644
--- a/pngvcrd.c
+++ b/pngvcrd.c
@@ -2,7 +2,7 @@
  *
  * For Intel x86 CPU and Microsoft Visual C++ compiler
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * Copyright (c) 1998, Intel Corporation
diff --git a/pngwio.c b/pngwio.c
index fbc25b7..661bebd 100644
--- a/pngwio.c
+++ b/pngwio.c
@@ -1,7 +1,7 @@
 
 /* pngwio.c - functions for data output
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
diff --git a/pngwrite.c b/pngwrite.c
index 48ea615..a2cf79a 100644
--- a/pngwrite.c
+++ b/pngwrite.c
@@ -1,7 +1,7 @@
 
 /* pngwrite.c - general routines to write a PNG file
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
diff --git a/pngwtran.c b/pngwtran.c
index d0e74c9..7a63132 100644
--- a/pngwtran.c
+++ b/pngwtran.c
@@ -1,7 +1,7 @@
 
 /* pngwtran.c - transforms the data in a row for PNG writers
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
diff --git a/pngwutil.c b/pngwutil.c
index df578c7..1a4da53 100644
--- a/pngwutil.c
+++ b/pngwutil.c
@@ -1,7 +1,7 @@
 
 /* pngwutil.c - utilities to write a PNG file
  *
- * libpng 1.0.7beta16 - June 4, 2000
+ * libpng 1.0.7beta17 - June 24, 2000
  * For conditions of distribution and use, see copyright notice in png.h
  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
diff --git a/scripts/makefile-amiga-wolf.txt b/scripts/makefile-amiga-wolf.txt
deleted file mode 100644
index 4587088..0000000
--- a/scripts/makefile-amiga-wolf.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-# Commodore Amiga Makefile
-# makefile for libpng and SAS C V6.5x compiler
-# Copyright (C) 1995-2000 Wolf Faust
-# For conditions of distribution and use, see copyright notice in png.h
-#
-# Note: Use #define PNG_READ_BIG_ENDIAN_SUPPORTED in pngconf.h
-#
-# Location/path of zlib include files
-ZLIB=/zlib
-#compiler
-CC=sc
-#compiler flags
-# WARNING: a bug in V6.51 causes bad code with OPTGO
-#          So use V6.55 or set NOOPTGO!!!!!!!!!
-CFLAGS= NOSTKCHK PARMS=REG OPTIMIZE OPTGO OPTPEEP OPTINLOCAL OPTINL\
-	OPTLOOP OPTRDEP=4 OPTDEP=4 OPTCOMP=4 INCLUDEDIR=$(ZLIB) \
-	DEFINE=PNG_INTERNAL 
-#linker flags
-LDFLAGS= SD ND BATCH
-#link libs
-LDLIBS= libpng.lib libgz.lib LIB:scm.lib LIB:sc.lib Lib:amiga.lib
-# linker
-LN= slink
-# file deletion command
-RM= delete quiet
-# library (.lib) file creation command
-AR= oml
-# make directory command
-MKDIR= makedir
-
-OBJS = png.o pngset.o pngget.o pngrutil.o pngtrans.o pngwutil.o \
-	pngread.o pngrio.o pngwio.o pngwrite.o pngrtran.o \
-	pngwtran.o pngmem.o pngerror.o pngpread.o
-
-all: libpng.lib pngtest
-
-libpng.lib: $(OBJS)
--$(RM) libpng.lib
-$(AR) libpng.lib r $(OBJS)
-
-pngtest: pngtest.o libpng.lib
-$(LN) <WITH <
-$(LDFLAGS)
-TO pngtest
-FROM LIB:c.o pngtest.o
-LIB $(LDLIBS)
-<
-
diff --git a/scripts/makefile.amiga b/scripts/makefile.amiga
index f92af3e..4587088 100644
--- a/scripts/makefile.amiga
+++ b/scripts/makefile.amiga
@@ -1,15 +1,20 @@
 # Commodore Amiga Makefile
-# makefile for libpng and SAS C V6.55 compiler
-# Copyright (C) 1995 Wolf Faust
+# makefile for libpng and SAS C V6.5x compiler
+# Copyright (C) 1995-2000 Wolf Faust
 # For conditions of distribution and use, see copyright notice in png.h
-
+#
+# Note: Use #define PNG_READ_BIG_ENDIAN_SUPPORTED in pngconf.h
+#
+# Location/path of zlib include files
+ZLIB=/zlib
 #compiler
 CC=sc
 #compiler flags
 # WARNING: a bug in V6.51 causes bad code with OPTGO
 #          So use V6.55 or set NOOPTGO!!!!!!!!!
 CFLAGS= NOSTKCHK PARMS=REG OPTIMIZE OPTGO OPTPEEP OPTINLOCAL OPTINL\
-	OPTLOOP OPTRDEP=4 OPTDEP=4 OPTCOMP=4 DEFINE=PNG_INTERNAL
+	OPTLOOP OPTRDEP=4 OPTDEP=4 OPTCOMP=4 INCLUDEDIR=$(ZLIB) \
+	DEFINE=PNG_INTERNAL 
 #linker flags
 LDFLAGS= SD ND BATCH
 #link libs
@@ -23,8 +28,9 @@
 # make directory command
 MKDIR= makedir
 
-OBJS = png.o pngset.o pngget.o pngrutil.o pngtrans.o pngwutil.o pngpread.o \
-pngread.o pngerror.o pngwrite.o pngrtran.o pngwtran.o pngrio.o pngwio.o pngmem.o
+OBJS = png.o pngset.o pngget.o pngrutil.o pngtrans.o pngwutil.o \
+	pngread.o pngrio.o pngwio.o pngwrite.o pngrtran.o \
+	pngwtran.o pngmem.o pngerror.o pngpread.o
 
 all: libpng.lib pngtest
 
@@ -40,4 +46,3 @@
 LIB $(LDLIBS)
 <
 
-
diff --git a/scripts/makefile.beos b/scripts/makefile.beos
index 5f168ba..dc7b587 100644
--- a/scripts/makefile.beos
+++ b/scripts/makefile.beos
@@ -31,7 +31,7 @@
 # read libpng.txt or png.h to see why PNGMAJ is 2.  You should not
 # have to change it.
 PNGMAJ = 2
-PNGMIN = 1.0.7beta16
+PNGMIN = 1.0.7beta17
 PNGVER = $(PNGMAJ).$(PNGMIN)
 
 # where make install puts libpng.a, libpng.so*, and png.h
diff --git a/scripts/makefile.dec b/scripts/makefile.dec
index f46c426..6ed1f43 100644
--- a/scripts/makefile.dec
+++ b/scripts/makefile.dec
@@ -14,7 +14,7 @@
 # read libpng.txt or png.h to see why PNGMAJ is 2.  You should not
 # have to change it.
 PNGMAJ = 2
-PNGMIN = 1.0.7beta16
+PNGMIN = 1.0.7beta17
 PNGVER = $(PNGMAJ).$(PNGMIN)
 
 CC=cc
diff --git a/scripts/makefile.gcmmx b/scripts/makefile.gcmmx
index e6a774b..083bf6f 100644
--- a/scripts/makefile.gcmmx
+++ b/scripts/makefile.gcmmx
@@ -34,7 +34,7 @@
 # read libpng.txt or png.h to see why PNGMAJ is 2.  You should not
 # have to change it.
 PNGMAJ = 2
-PNGMIN = 1.0.7beta16
+PNGMIN = 1.0.7beta17
 PNGVER = $(PNGMAJ).$(PNGMIN)
 
 INCPATH=$(prefix)/include
diff --git a/scripts/makefile.linux b/scripts/makefile.linux
index 2297d19..5aadc47 100644
--- a/scripts/makefile.linux
+++ b/scripts/makefile.linux
@@ -34,7 +34,7 @@
 # read libpng.txt or png.h to see why PNGMAJ is 2.  You should not
 # have to change it.
 PNGMAJ = 2
-PNGMIN = 1.0.7beta16
+PNGMIN = 1.0.7beta17
 PNGVER = $(PNGMAJ).$(PNGMIN)
 
 INCPATH=$(prefix)/include
diff --git a/scripts/makefile.sco b/scripts/makefile.sco
index a5f754a..8c543cf 100644
--- a/scripts/makefile.sco
+++ b/scripts/makefile.sco
@@ -25,7 +25,7 @@
 # read libpng.txt or png.h to see why PNGMAJ is 2.  You should not
 # have to change it.
 PNGMAJ = 2
-PNGMIN = 1.0.7beta16
+PNGMIN = 1.0.7beta17
 PNGVER = $(PNGMAJ).$(PNGMIN)
 
 INCPATH=$(prefix)/include
diff --git a/scripts/makefile.sggcc b/scripts/makefile.sggcc
index e5619ba..72d5d37 100644
--- a/scripts/makefile.sggcc
+++ b/scripts/makefile.sggcc
@@ -19,8 +19,8 @@
 LDFLAGS=-L. -L$(ZLIBLIB) -lpng -lz -lm
 LDSHARED=gcc -shared
 
-VER=1.0.7beta16
-LIBS=libpng.so.1.0.7beta16
+VER=1.0.7beta17
+LIBS=libpng.so.1.0.7beta17
 SHAREDLIB=libpng.so
 libdir=$(prefix)/lib32
 
diff --git a/scripts/makefile.solaris b/scripts/makefile.solaris
index fb2f7e4..81f78b3 100644
--- a/scripts/makefile.solaris
+++ b/scripts/makefile.solaris
@@ -31,7 +31,7 @@
 # read libpng.txt or png.h to see why PNGMAJ is 2.  You should not
 # have to change it.
 PNGMAJ = 2
-PNGMIN = 1.0.7beta16
+PNGMIN = 1.0.7beta17
 PNGVER = $(PNGMAJ).$(PNGMIN)
 
 INCPATH=$(prefix)/include
diff --git a/scripts/pngdef.pas b/scripts/pngdef.pas
index 3de3bed..914edbd 100644
--- a/scripts/pngdef.pas
+++ b/scripts/pngdef.pas
@@ -5,7 +5,7 @@
 interface
 
 const
-  PNG_LIBPNG_VER_STRING = '1.0.7beta16';
+  PNG_LIBPNG_VER_STRING = '1.0.7beta17';
   PNG_LIBPNG_VER        =  10007;
 
 type
diff --git a/scripts/pngos2.def b/scripts/pngos2.def
index 42fc57f..dcb9a32 100644
--- a/scripts/pngos2.def
+++ b/scripts/pngos2.def
@@ -1,5 +1,5 @@
 ;----------------------------------------
-; PNGLIB module definition file for OS/2
+; PNG.LIB module definition file for OS/2
 ;----------------------------------------
 
 ; Caution: This file is probably out of date.