[llvm-commits] CVS: llvm/runtime/libpng/contrib/visupng/PngFile.c PngFile.h README.txt VisualPng.c VisualPng.dsp VisualPng.dsw VisualPng.ico VisualPng.png VisualPng.rc cexcept.h resource.h

John Criswell criswell at cs.uiuc.edu
Fri Feb 6 10:54:09 PST 2004


Changes in directory llvm/runtime/libpng/contrib/visupng:

PngFile.c added (r1.1)
PngFile.h added (r1.1)
README.txt added (r1.1)
VisualPng.c added (r1.1)
VisualPng.dsp added (r1.1)
VisualPng.dsw added (r1.1)
VisualPng.ico added (r1.1)
VisualPng.png added (r1.1)
VisualPng.rc added (r1.1)
cexcept.h added (r1.1)
resource.h added (r1.1)

---
Log message:

Initial checking of the libpng library.



---
Diffs of the changes:  (+2156 -0)

Index: llvm/runtime/libpng/contrib/visupng/PngFile.c
diff -c /dev/null llvm/runtime/libpng/contrib/visupng/PngFile.c:1.1
*** /dev/null	Fri Feb  6 10:38:01 2004
--- llvm/runtime/libpng/contrib/visupng/PngFile.c	Fri Feb  6 10:37:51 2004
***************
*** 0 ****
--- 1,439 ----
+ //-------------------------------------
+ //  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)
+             Throw "Visualpng: Out of memory";
+         
+         // 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
+ //-----------------


Index: llvm/runtime/libpng/contrib/visupng/PngFile.h
diff -c /dev/null llvm/runtime/libpng/contrib/visupng/PngFile.h:1.1
*** /dev/null	Fri Feb  6 10:38:02 2004
--- llvm/runtime/libpng/contrib/visupng/PngFile.h	Fri Feb  6 10:37:51 2004
***************
*** 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
+ 


Index: llvm/runtime/libpng/contrib/visupng/README.txt
diff -c /dev/null llvm/runtime/libpng/contrib/visupng/README.txt:1.1
*** /dev/null	Fri Feb  6 10:38:02 2004
--- llvm/runtime/libpng/contrib/visupng/README.txt	Fri Feb  6 10:37:51 2004
***************
*** 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 ..\..\projects\msvc\win32\libpng
+    zlib DLLs and LIBs are in   ..\..\projects\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
+ 


Index: llvm/runtime/libpng/contrib/visupng/VisualPng.c
diff -c /dev/null llvm/runtime/libpng/contrib/visupng/VisualPng.c:1.1
*** /dev/null	Fri Feb  6 10:38:02 2004
--- llvm/runtime/libpng/contrib/visupng/VisualPng.c	Fri Feb  6 10:37:51 2004
***************
*** 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
+ //-----------------


Index: llvm/runtime/libpng/contrib/visupng/VisualPng.dsp
diff -c /dev/null llvm/runtime/libpng/contrib/visupng/VisualPng.dsp:1.1
*** /dev/null	Fri Feb  6 10:38:02 2004
--- llvm/runtime/libpng/contrib/visupng/VisualPng.dsp	Fri Feb  6 10:37:51 2004
***************
*** 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 libpng13.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 libpng13.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:"..\..\projects\msvc\win32\libpng\dll"
+ # Begin Special Build Tool
+ OutDir=.\dll
+ SOURCE="$(InputPath)"
+ PostBuild_Cmds=set path=..\..\projects\msvc\win32\libpng\dll;..\..\projects\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 libpng13.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 libpng13d.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:"..\..\projects\msvc\win32\libpng\dll_dbg"
+ # SUBTRACT LINK32 /nodefaultlib
+ # Begin Special Build Tool
+ OutDir=.\dll_dbg
+ SOURCE="$(InputPath)"
+ PostBuild_Cmds=set path=..\..\projects\msvc\win32\libpng\dll_dbg;..\..\projects\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 libpng13.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:"..\..\projects\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:"..\..\projects\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 libpng13d.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:"..\..\projects\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:"..\..\projects\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


Index: llvm/runtime/libpng/contrib/visupng/VisualPng.dsw
diff -c /dev/null llvm/runtime/libpng/contrib/visupng/VisualPng.dsw:1.1
*** /dev/null	Fri Feb  6 10:38:02 2004
--- llvm/runtime/libpng/contrib/visupng/VisualPng.dsw	Fri Feb  6 10:37:51 2004
***************
*** 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>
+ {{{
+ }}}
+ 
+ ###############################################################################
+ 


Index: llvm/runtime/libpng/contrib/visupng/VisualPng.ico


Index: llvm/runtime/libpng/contrib/visupng/VisualPng.png


Index: llvm/runtime/libpng/contrib/visupng/VisualPng.rc
diff -c /dev/null llvm/runtime/libpng/contrib/visupng/VisualPng.rc:1.1
*** /dev/null	Fri Feb  6 10:38:02 2004
--- llvm/runtime/libpng/contrib/visupng/VisualPng.rc	Fri Feb  6 10:37:51 2004
***************
*** 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
+ 


Index: llvm/runtime/libpng/contrib/visupng/cexcept.h
diff -c /dev/null llvm/runtime/libpng/contrib/visupng/cexcept.h:1.1
*** /dev/null	Fri Feb  6 10:38:02 2004
--- llvm/runtime/libpng/contrib/visupng/cexcept.h	Fri Feb  6 10:37:51 2004
***************
*** 0 ****
--- 1,244 ----
+ /*===
+ cexcept.h 1.0.0 (2000-Jun-21-Wed)
+ Adam M. Costello <amc at cs.berkeley.edu>
+ 
+ An interface for exception-handling in ANSI C, developed jointly with
+ Cosmin Truta <cosmin at 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 */


Index: llvm/runtime/libpng/contrib/visupng/resource.h
diff -c /dev/null llvm/runtime/libpng/contrib/visupng/resource.h:1.1
*** /dev/null	Fri Feb  6 10:38:02 2004
--- llvm/runtime/libpng/contrib/visupng/resource.h	Fri Feb  6 10:37:51 2004
***************
*** 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





More information about the llvm-commits mailing list