Initial checking of the libpng library.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11149 91177308-0d34-0410-b5e6-96231b3b80d8
							
								
								
									
										29
									
								
								runtime/libpng/ANNOUNCE
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,29 @@ | |||||||
|  |  | ||||||
|  | Libpng 1.2.5 - October 3, 2002 | ||||||
|  |  | ||||||
|  | This is a public release of libpng, intended for use in production codes. | ||||||
|  |  | ||||||
|  | Changes since the last public release (1.2.4): | ||||||
|  |  | ||||||
|  |   Revised makefile.cygwin to use DLL number 12 instead of 13. | ||||||
|  |   Added code to contrib/gregbook/readpng2.c to ignore unused chunks. | ||||||
|  |   Replaced toucan.png in contrib/gregbook (it has been corrupt since 1.0.11) | ||||||
|  |   Removed some stray *.o files from contrib/gregbook. | ||||||
|  |   Changed png_error() to png_warning() about "Too much data" in pngpread.c | ||||||
|  |     and about "Extra compressed data" in pngrutil.c. | ||||||
|  |   Prevent png_ptr->pass from exceeding 7 in png_push_finish_row(). | ||||||
|  |   Updated makefile.hggcc | ||||||
|  |   Updated png.c and pnggccrd.c handling of return from png_mmx_support() | ||||||
|  |   Only issue png_warning() about "Too much data" in pngpread.c when avail_in | ||||||
|  |     is nonzero. | ||||||
|  |   Updated makefiles to install a separate libpng.so.3 with its own rpath. | ||||||
|  |   Revised makefiles to not remove previous minor versions of shared libraries. | ||||||
|  |   Revised 13 makefiles to remove "-lz" and "-L$(ZLIBLIB)", etc., from shared | ||||||
|  |     library loader directive. | ||||||
|  |   Revised libpng-config script. | ||||||
|  |   Relocated two misplaced PNGAPI lines in pngtest.c | ||||||
|  |  | ||||||
|  | Send comments/corrections/commendations to | ||||||
|  | png-implement@ccrc.wustl.edu or to randeg@alum.rpi.edu | ||||||
|  |  | ||||||
|  | Glenn R-P | ||||||
							
								
								
									
										1184
									
								
								runtime/libpng/CHANGES
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										151
									
								
								runtime/libpng/INSTALL
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,151 @@ | |||||||
|  |  | ||||||
|  | Installing libpng version 1.2.5 - October 3, 2002 | ||||||
|  |  | ||||||
|  | Before installing libpng, you must first install zlib.  zlib | ||||||
|  | can usually be found wherever you got libpng.  zlib can be | ||||||
|  | placed in another directory, at the same level as libpng. | ||||||
|  | Note that your system might already have a preinstalled | ||||||
|  | zlib, but you will still need to have access to the | ||||||
|  | zlib.h and zconf.h include files that correspond to the | ||||||
|  | version of zlib that's installed. | ||||||
|  |  | ||||||
|  | You can rename the directories that you downloaded (they | ||||||
|  | might be called "libpng-1.2.5" or "lpng109" and "zlib-1.1.4" | ||||||
|  | or "zlib114") so that you have directories called "zlib" and "libpng". | ||||||
|  |  | ||||||
|  | Your directory structure should look like this: | ||||||
|  |  | ||||||
|  |    ..       (the parent directory) | ||||||
|  |       libpng  (this directory) | ||||||
|  |           INSTALL (this file) | ||||||
|  |           README | ||||||
|  |           *.h | ||||||
|  |           *.c | ||||||
|  |           contrib | ||||||
|  |              gregbook | ||||||
|  |              msvctest | ||||||
|  |              pngminus | ||||||
|  |              pngsuite | ||||||
|  |              visupng | ||||||
|  |           projects | ||||||
|  |              beos | ||||||
|  |              borland | ||||||
|  |              msvc | ||||||
|  |              netware.txt | ||||||
|  |              wince.txt | ||||||
|  |           scripts | ||||||
|  |              makefile.* | ||||||
|  |              libpng*.in | ||||||
|  |           pngtest.png | ||||||
|  |           etc. | ||||||
|  |       zlib | ||||||
|  |           README | ||||||
|  |           *.h | ||||||
|  |           *.c | ||||||
|  |           contrib | ||||||
|  |           etc. | ||||||
|  |  | ||||||
|  | If the line endings in the files look funny, you may wish to get the other | ||||||
|  | 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 libpng\msvc directory | ||||||
|  | and follow the instructions in msvc\README.txt. | ||||||
|  |  | ||||||
|  | You can build libpng for WindowsCE by entering the downloading and installing | ||||||
|  | the libpng\wince directory as instructed in the projects\wince.txt file, and | ||||||
|  | then following the instructions in the README* files.  Similarly, you can | ||||||
|  | build libpng for Netware as instructed in projects\netware.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 | ||||||
|  | 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 libpng12.so.0.1.2.5) | ||||||
|  |  makefile.gcmmx    =>  Linux/ELF makefile (gcc, creates libpng12.so.0.1.2.5, | ||||||
|  |                        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 | ||||||
|  |                        ansi2knr (Requires ansi2knr.c from | ||||||
|  |                        ftp://ftp.cs.wisc.edu/ghost) | ||||||
|  |  makefile.aix      =>  AIX/gcc makefile | ||||||
|  |  makefile.cygwin   =>  Cygwin/gcc makefile | ||||||
|  |  makefile.darwin   =>  Darwin makefile | ||||||
|  |  makefile.dec      =>  DEC Alpha UNIX makefile | ||||||
|  |  makefile.hpgcc    =>  FreeBSD makefile | ||||||
|  |  makefile.hpgcc    =>  HPUX makefile using gcc | ||||||
|  |  makefile.hpux     =>  HPUX (10.20 and 11.00) makefile | ||||||
|  |  makefile.ibmc     =>  IBM C/C++ version 3.x for Win32 and OS/2 (static) | ||||||
|  |  makefile.intel    =>  Intel C/C++ version 4.0 and later | ||||||
|  |  libpng.icc        =>  Project file for IBM VisualAge/C++ version 4.0 or later | ||||||
|  |  makefile.macosx   =>  MACOS X Makefile | ||||||
|  |  makefile.netbsd   =>  NetBSD/cc makefile, uses PNGGCCRD, makes libpng.so. | ||||||
|  |  makefile.ne0bsd  =>  NetBSD/cc makefile, uses PNGGCCRD, makes libpng0.so | ||||||
|  |  makefile.openbsd  =>  OpenBSD makefile | ||||||
|  |  makefile.sgi      =>  Silicon Graphics IRIX makefile (cc, creates static lib) | ||||||
|  |  makefile.sggcc    =>  Silicon Graphics (gcc, creates libpng12.so.0.1.2.5) | ||||||
|  |  makefile.sunos    =>  Sun makefile | ||||||
|  |  makefile.solaris  =>  Solaris 2.X makefile (gcc, creates libpng12.so.0.1.2.5) | ||||||
|  |  makefile.so9      =>  Solaris 9 makefile (gcc, creates libpng12.so.0.1.2.5) | ||||||
|  |  makefile.32sunu   =>  Sun Ultra 32-bit makefile | ||||||
|  |  makefile.64sunu   =>  Sun Ultra 64-bit makefile | ||||||
|  |  makefile.sco      =>  For SCO OSr5  ELF and Unixware 7 with Native cc | ||||||
|  |  makefile.mips     =>  MIPS makefile | ||||||
|  |  makefile.acorn    =>  Acorn makefile | ||||||
|  |  makefile.amiga    =>  Amiga makefile | ||||||
|  |  smakefile.ppc     =>  AMIGA smakefile for SAS C V6.58/7.00 PPC compiler | ||||||
|  |                        (Requires SCOPTIONS, copied from scripts/SCOPTIONS.ppc) | ||||||
|  |  makefile.atari    =>  Atari makefile | ||||||
|  |  makefile.beos     =>  BEOS makefile for X86 | ||||||
|  |  makefile.bor      =>  Borland makefile (uses bcc) | ||||||
|  |  makefile.bc32     =>  32-bit Borland C++ (all modules compiled in C mode) | ||||||
|  |  makefile.bd32     =>  To make a png32bd.dll with Borland C++ 4.5 | ||||||
|  |  makefile.tc3      =>  Turbo C 3.0 makefile | ||||||
|  |  makefile.dj2      =>  DJGPP 2 makefile | ||||||
|  |  makefile.msc      =>  Microsoft C makefile | ||||||
|  |  makefile.vcawin32 =>  makefile for Microsoft Visual C++ 5.0 and later (uses | ||||||
|  |                        assembler code tuned for Intel MMX platform) | ||||||
|  |  makefile.vcwin32  =>  makefile for Microsoft Visual C++ 4.0 and later (does | ||||||
|  |                        not use assembler code) | ||||||
|  |  makefile.os2      =>  OS/2 Makefile (gcc and emx, requires pngos2.def) | ||||||
|  |  pngos2.def        =>  OS/2 module definition file used by makefile.os2 | ||||||
|  |  makefile.watcom   =>  Watcom 10a+ Makefile, 32-bit flat memory model | ||||||
|  |  makevms.com       =>  VMS build script | ||||||
|  |  descrip.mms       =>  VMS makefile for MMS or MMK | ||||||
|  |  pngdef.pas        =>  Defines for a png32bd.dll with Borland C++ 4.5 | ||||||
|  |  SCOPTIONS.ppc     =>  Used with smakefile.ppc | ||||||
|  |  | ||||||
|  | Copy the file (or files) that you need from the | ||||||
|  | scripts directory into this directory, for example | ||||||
|  |  | ||||||
|  |    MSDOS example: copy scripts\makefile.msc makefile | ||||||
|  |    UNIX example:    cp scripts/makefile.std makefile | ||||||
|  |  | ||||||
|  | Read the makefile to see if you need to change any source or | ||||||
|  | target directories to match your preferences. | ||||||
|  |  | ||||||
|  | Then read pngconf.h to see if you want to make any configuration | ||||||
|  | changes. | ||||||
|  |  | ||||||
|  | Then just run "make test" which will create the libpng library in | ||||||
|  | this directory and run a quick test that reads the "pngtest.png" | ||||||
|  | file and writes a "pngout.png" file that should be identical to it. | ||||||
|  | Look for "9782 zero samples" in the output of the test.  For more | ||||||
|  | confidence, you can run another test by typing "pngtest pngnow.png" | ||||||
|  | and looking for "289 zero samples" in the output.  Also, you can | ||||||
|  | run "pngtest -m *.png" in the "contrib/pngsuite" directory and compare | ||||||
|  | your output with the result shown in contrib/pngsuite/README. | ||||||
|  |  | ||||||
|  | Most of the makefiles will allow you to run "make install" to | ||||||
|  | put the library in its final resting place (if you want to | ||||||
|  | do that, run "make install" in the zlib directory first if necessary). | ||||||
|  | Some also allow you to run "make test-installed" after you have | ||||||
|  | run "make install". | ||||||
|  |  | ||||||
|  | Further information can be found in the README and libpng.txt | ||||||
|  | files, in the individual makefiles, in png.h, in the README files in | ||||||
|  | subdirectories of the LIB directory, and the manual pages libpng.3 and png.5. | ||||||
							
								
								
									
										11
									
								
								runtime/libpng/KNOWNBUG
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,11 @@ | |||||||
|  |  | ||||||
|  | Known bugs in libpng version 1.2.5 | ||||||
|  |  | ||||||
|  | 1. April 22, 2001: pnggccrd.c has been reported to crash on NetBSD when | ||||||
|  |    reading interlaced PNG files, when assembler code is enabled but running | ||||||
|  |    on a non-MMX i386 platform. | ||||||
|  |  | ||||||
|  |    STATUS: Under investigation.  The change to pnggccrd.c in libpng-1.2.1 | ||||||
|  |    fixed a problem under FreeBSD but not the problem with NetBSD, which | ||||||
|  |    still fails as of libpng-1.2.2rc1. | ||||||
|  |  | ||||||
							
								
								
									
										102
									
								
								runtime/libpng/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,102 @@ | |||||||
|  |  | ||||||
|  | This copy of the libpng notices is provided for your convenience.  In case of | ||||||
|  | any discrepancy between this copy and the notices in the file png.h that is | ||||||
|  | included in the libpng distribution, the latter shall prevail. | ||||||
|  |  | ||||||
|  | COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: | ||||||
|  |  | ||||||
|  | If you modify libpng you may insert additional notices immediately following | ||||||
|  | this sentence. | ||||||
|  |  | ||||||
|  | libpng versions 1.0.7, July 1, 2000, through 1.2.5, October 3, 2002, are | ||||||
|  | Copyright (c) 2000-2002 Glenn Randers-Pehrson | ||||||
|  | and are distributed according to the same disclaimer and license as libpng-1.0.6 | ||||||
|  | with the following individuals added to the list of Contributing Authors | ||||||
|  |  | ||||||
|  |    Simon-Pierre Cadieux | ||||||
|  |    Eric S. Raymond | ||||||
|  |    Gilles Vollant | ||||||
|  |  | ||||||
|  | and with the following additions to the disclaimer: | ||||||
|  |  | ||||||
|  |    There is no warranty against interference with your enjoyment of the | ||||||
|  |    library or against infringement.  There is no warranty that our | ||||||
|  |    efforts or the library will fulfill any of your particular purposes | ||||||
|  |    or needs.  This library is provided with all faults, and the entire | ||||||
|  |    risk of satisfactory quality, performance, accuracy, and effort is with | ||||||
|  |    the user. | ||||||
|  |  | ||||||
|  | libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are | ||||||
|  | Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are | ||||||
|  | distributed according to the same disclaimer and license as libpng-0.96, | ||||||
|  | with the following individuals added to the list of Contributing Authors: | ||||||
|  |  | ||||||
|  |    Tom Lane | ||||||
|  |    Glenn Randers-Pehrson | ||||||
|  |    Willem van Schaik | ||||||
|  |  | ||||||
|  | libpng versions 0.89, June 1996, through 0.96, May 1997, are | ||||||
|  | Copyright (c) 1996, 1997 Andreas Dilger | ||||||
|  | Distributed according to the same disclaimer and license as libpng-0.88, | ||||||
|  | with the following individuals added to the list of Contributing Authors: | ||||||
|  |  | ||||||
|  |    John Bowler | ||||||
|  |    Kevin Bracey | ||||||
|  |    Sam Bushell | ||||||
|  |    Magnus Holmgren | ||||||
|  |    Greg Roelofs | ||||||
|  |    Tom Tanner | ||||||
|  |  | ||||||
|  | libpng versions 0.5, May 1995, through 0.88, January 1996, are | ||||||
|  | Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. | ||||||
|  |  | ||||||
|  | For the purposes of this copyright and license, "Contributing Authors" | ||||||
|  | is defined as the following set of individuals: | ||||||
|  |  | ||||||
|  |    Andreas Dilger | ||||||
|  |    Dave Martindale | ||||||
|  |    Guy Eric Schalnat | ||||||
|  |    Paul Schmidt | ||||||
|  |    Tim Wegner | ||||||
|  |  | ||||||
|  | The PNG Reference Library is supplied "AS IS".  The Contributing Authors | ||||||
|  | and Group 42, Inc. disclaim all warranties, expressed or implied, | ||||||
|  | including, without limitation, the warranties of merchantability and of | ||||||
|  | fitness for any purpose.  The Contributing Authors and Group 42, Inc. | ||||||
|  | assume no liability for direct, indirect, incidental, special, exemplary, | ||||||
|  | or consequential damages, which may result from the use of the PNG | ||||||
|  | Reference Library, even if advised of the possibility of such damage. | ||||||
|  |  | ||||||
|  | Permission is hereby granted to use, copy, modify, and distribute this | ||||||
|  | source code, or portions hereof, for any purpose, without fee, subject | ||||||
|  | to the following restrictions: | ||||||
|  |  | ||||||
|  | 1. The origin of this source code must not be misrepresented. | ||||||
|  |  | ||||||
|  | 2. Altered versions must be plainly marked as such and must not | ||||||
|  |    be misrepresented as being the original source. | ||||||
|  |  | ||||||
|  | 3. This Copyright notice may not be removed or altered from any | ||||||
|  |    source or altered source distribution. | ||||||
|  |  | ||||||
|  | The Contributing Authors and Group 42, Inc. specifically permit, without | ||||||
|  | fee, and encourage the use of this source code as a component to | ||||||
|  | supporting the PNG file format in commercial products.  If you use this | ||||||
|  | source code in a product, acknowledgment is not required but would be | ||||||
|  | appreciated. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | A "png_get_copyright" function is available, for convenient use in "about" | ||||||
|  | boxes and the like: | ||||||
|  |  | ||||||
|  |    printf("%s",png_get_copyright(NULL)); | ||||||
|  |  | ||||||
|  | Also, the PNG logo (in PNG format, of course) is supplied in the | ||||||
|  | files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). | ||||||
|  |  | ||||||
|  | Libpng is OSI Certified Open Source Software.  OSI Certified Open Source is a | ||||||
|  | certification mark of the Open Source Initiative. | ||||||
|  |  | ||||||
|  | Glenn Randers-Pehrson | ||||||
|  | randeg@alum.rpi.edu | ||||||
|  | October 3, 2002 | ||||||
							
								
								
									
										9
									
								
								runtime/libpng/LICENSE.TXT
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,9 @@ | |||||||
|  | This is the libpng library.  It is licensed to you under the Illinois Open | ||||||
|  | Source License. | ||||||
|  |  | ||||||
|  | In addition, you must follow any additional licensing restrictions in the | ||||||
|  | LICENSE file. | ||||||
|  |  | ||||||
|  | The LICENSE file from the original libpng distribution contains additional | ||||||
|  | copyrights. | ||||||
|  |  | ||||||
							
								
								
									
										18
									
								
								runtime/libpng/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,18 @@ | |||||||
|  | ##===- runtime/libdummy/Makefile ------------------------------*- Makefile -*-===## | ||||||
|  | #  | ||||||
|  | #                     The LLVM Compiler Infrastructure | ||||||
|  | # | ||||||
|  | # This file was developed by the LLVM research group and is distributed under | ||||||
|  | # the University of Illinois Open Source License. See LICENSE.TXT for details. | ||||||
|  | #  | ||||||
|  | ##===----------------------------------------------------------------------===## | ||||||
|  | LEVEL = ../.. | ||||||
|  | BYTECODE_LIBRARY=1 | ||||||
|  | DONT_BUILD_RELINKED=1 | ||||||
|  | LIBRARYNAME=png | ||||||
|  |  | ||||||
|  | Source = png.c pngset.c pngget.c pngrutil.c pngtrans.c pngwutil.c \ | ||||||
|  | 	       pngread.c pngrio.c pngwio.c pngwrite.c pngrtran.c \ | ||||||
|  | 	       pngwtran.c pngmem.c pngerror.c pngpread.c | ||||||
|  |  | ||||||
|  | include $(LEVEL)/Makefile.common | ||||||
							
								
								
									
										269
									
								
								runtime/libpng/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,269 @@ | |||||||
|  | README for libpng 1.2.5 - October 3, 2002 (shared library 12.0) | ||||||
|  | See the note about version numbers near the top of png.h | ||||||
|  |  | ||||||
|  | See INSTALL for instructions on how to install libpng. | ||||||
|  |  | ||||||
|  | Libpng comes in two distribution formats.  Get libpng-*.tar.gz if you | ||||||
|  | want UNIX-style line endings in the text files, or lpng*.zip if you want | ||||||
|  | DOS-style line endings. | ||||||
|  |  | ||||||
|  | Version 0.89 was the first official release of libpng.  Don't let the | ||||||
|  | fact that it's the first release fool you.  The libpng library has been in | ||||||
|  | extensive use and testing since mid-1995.  By late 1997 it had | ||||||
|  | finally gotten to the stage where there hadn't been significant | ||||||
|  | changes to the API in some time, and people have a bad feeling about | ||||||
|  | libraries with versions < 1.0.  Version 1.0.0 was released in | ||||||
|  | March 1998. | ||||||
|  |  | ||||||
|  | **** | ||||||
|  | Note that some of the changes to the png_info structure render this | ||||||
|  | version of the library binary incompatible with libpng-0.89 or | ||||||
|  | earlier versions if you are using a shared library.  The type of the | ||||||
|  | "filler" parameter for png_set_filler() has changed from png_byte to | ||||||
|  | png_uint_32, which will affect shared-library applications that use | ||||||
|  | this function. | ||||||
|  |  | ||||||
|  | To avoid problems with changes to the internals of png_info_struct, | ||||||
|  | new APIs have been made available in 0.95 to avoid direct application | ||||||
|  | access to info_ptr.  These functions are the png_set_<chunk> and | ||||||
|  | png_get_<chunk> functions.  These functions should be used when | ||||||
|  | accessing/storing the info_struct data, rather than manipulating it | ||||||
|  | directly, to avoid such problems in the future. | ||||||
|  |  | ||||||
|  | It is important to note that the APIs do not make current programs | ||||||
|  | that access the info struct directly incompatible with the new | ||||||
|  | library.  However, it is strongly suggested that new programs use | ||||||
|  | the new APIs (as shown in example.c and pngtest.c), and older programs | ||||||
|  | be converted to the new format, to facilitate upgrades in the future. | ||||||
|  | **** | ||||||
|  |  | ||||||
|  | Additions since 0.90 include the ability to compile libpng as a | ||||||
|  | Windows DLL, and new APIs for accessing data in the info struct. | ||||||
|  | Experimental functions include the ability to set weighting and cost | ||||||
|  | factors for row filter selection, direct reads of integers from buffers | ||||||
|  | on big-endian processors that support misaligned data access, faster | ||||||
|  | methods of doing alpha composition, and more accurate 16->8 bit color | ||||||
|  | conversion. | ||||||
|  |  | ||||||
|  | The additions since 0.89 include the ability to read from a PNG stream | ||||||
|  | which has had some (or all) of the signature bytes read by the calling | ||||||
|  | application.  This also allows the reading of embedded PNG streams that | ||||||
|  | do not have the PNG file signature.  As well, it is now possible to set | ||||||
|  | the library action on the detection of chunk CRC errors.  It is possible | ||||||
|  | to set different actions based on whether the CRC error occurred in a | ||||||
|  | critical or an ancillary chunk. | ||||||
|  |  | ||||||
|  | The changes made to the library, and bugs fixed are based on discussions | ||||||
|  | on the PNG implementation mailing list <png-implement@ccrc.wustl.edu> | ||||||
|  | and not on material submitted privately to Guy, Andreas, or Glenn.  They will | ||||||
|  | forward any good suggestions to the list. | ||||||
|  |  | ||||||
|  | For a detailed description on using libpng, read libpng.txt.  For | ||||||
|  | examples of libpng in a program, see example.c and pngtest.c.  For usage | ||||||
|  | information and restrictions (what little they are) on libpng, see | ||||||
|  | png.h.  For a description on using zlib (the compression library used by | ||||||
|  | libpng) and zlib's restrictions, see zlib.h | ||||||
|  |  | ||||||
|  | I have included a general makefile, as well as several machine and | ||||||
|  | compiler specific ones, but you may have to modify one for your own needs. | ||||||
|  |  | ||||||
|  | You should use zlib 1.0.4 or later to run this, but it MAY work with | ||||||
|  | versions as old as zlib 0.95.  Even so, there are bugs in older zlib | ||||||
|  | versions which can cause the output of invalid compression streams for | ||||||
|  | some images.  You will definitely need zlib 1.0.4 or later if you are | ||||||
|  | taking advantage of the MS-DOS "far" structure allocation for the small | ||||||
|  | and medium memory models.  You should also note that zlib is a | ||||||
|  | compression library that is useful for more things than just PNG files. | ||||||
|  | You can use zlib as a drop-in replacement for fread() and fwrite() if | ||||||
|  | you are so inclined. | ||||||
|  |  | ||||||
|  | zlib should be available at the same place that libpng is. | ||||||
|  | If not, it should be at ftp.uu.net in /graphics/png | ||||||
|  | Eventually, it will be at ftp.uu.net in /pub/archiving/zip/zlib | ||||||
|  |  | ||||||
|  | You may also want a copy of the PNG specification.  It is available | ||||||
|  | as an RFC and a W3C Recommendation.  Failing | ||||||
|  | these resources you can try ftp.uu.net in the /graphics/png directory. | ||||||
|  |  | ||||||
|  | This code is currently being archived at ftp.uu.net in the | ||||||
|  | /graphics/png directory, and on CompuServe, Lib 20 (PNG SUPPORT) | ||||||
|  | at GO GRAPHSUP.  If you can't find it in any of those places, | ||||||
|  | e-mail me, and I'll help you find it. | ||||||
|  |  | ||||||
|  | If you have any code changes, requests, problems, etc., please e-mail | ||||||
|  | them to me.  Also, I'd appreciate any make files or project files, | ||||||
|  | and any modifications you needed to make to get libpng to compile, | ||||||
|  | along with a #define variable to tell what compiler/system you are on. | ||||||
|  | If you needed to add transformations to libpng, or wish libpng would | ||||||
|  | provide the image in a different way, drop me a note (and code, if | ||||||
|  | possible), so I can consider supporting the transformation. | ||||||
|  | Finally, if you get any warning messages when compiling libpng | ||||||
|  | (note: not zlib), and they are easy to fix, I'd appreciate the | ||||||
|  | fix.  Please mention "libpng" somewhere in the subject line.  Thanks. | ||||||
|  |  | ||||||
|  | This release was created and will be supported by myself (of course | ||||||
|  | based in a large way on Guy's and Andreas' earlier work), and the PNG group. | ||||||
|  |  | ||||||
|  | randeg@alum.rpi.edu | ||||||
|  | png-implement@ccrc.wustl.edu | ||||||
|  |  | ||||||
|  | You can't reach Guy, the original libpng author, at the addresses | ||||||
|  | given in previous versions of this document.  He and Andreas will read mail | ||||||
|  | addressed to the png-implement list, however. | ||||||
|  |  | ||||||
|  | Please do not send general questions about PNG.  Send them to | ||||||
|  | the address in the specification (png-group@w3.org).  At the same | ||||||
|  | time, please do not send libpng questions to that address, send them to me | ||||||
|  | or to png-implement@ccrc.wustl.edu.  I'll | ||||||
|  | get them in the end anyway.  If you have a question about something | ||||||
|  | in the PNG specification that is related to using libpng, send it | ||||||
|  | to me.  Send me any questions that start with "I was using libpng, | ||||||
|  | and ...".  If in doubt, send questions to me.  I'll bounce them | ||||||
|  | to others, if necessary. | ||||||
|  |  | ||||||
|  | Please do not send suggestions on how to change PNG.  We have | ||||||
|  | been discussing PNG for three years now, and it is official and | ||||||
|  | finished.  If you have suggestions for libpng, however, I'll | ||||||
|  | gladly listen.  Even if your suggestion is not used for version | ||||||
|  | 1.0, it may be used later. | ||||||
|  |  | ||||||
|  | Files in this distribution: | ||||||
|  |  | ||||||
|  |       ANNOUNCE      =>  Announcement of this version, with recent changes | ||||||
|  |       CHANGES       =>  Description of changes between libpng versions | ||||||
|  |       KNOWNBUG      =>  List of known bugs and deficiencies | ||||||
|  |       LICENSE       =>  License to use and redistribute libpng | ||||||
|  |       README        =>  This file | ||||||
|  |       TODO          =>  Things not implemented in the current library | ||||||
|  |       Y2KINFO       =>  Statement of Y2K compliance | ||||||
|  |       example.c     =>  Example code for using libpng functions | ||||||
|  |       libpng.3      =>  manual page for libpng (includes libpng.txt) | ||||||
|  |       libpng.txt    =>  Description of libpng and its functions | ||||||
|  |       libpngpf.3    =>  manual page for libpng's private functions | ||||||
|  |       png.5         =>  manual page for the PNG format | ||||||
|  |       png.c         =>  Basic interface functions common to library | ||||||
|  |       png.h         =>  Library function and interface declarations | ||||||
|  |       pngconf.h     =>  System specific library configuration | ||||||
|  |       pngasmrd.h    =>  Header file for assembler-coded functions | ||||||
|  |       pngerror.c    =>  Error/warning message I/O functions | ||||||
|  |       pngget.c      =>  Functions for retrieving info from struct | ||||||
|  |       pngmem.c      =>  Memory handling functions | ||||||
|  |       pngbar.png    =>  PNG logo, 88x31 | ||||||
|  |       pngnow.png    =>  PNG logo, 98x31 | ||||||
|  |       pngpread.c    =>  Progressive reading functions | ||||||
|  |       pngread.c     =>  Read data/helper high-level functions | ||||||
|  |       pngrio.c      =>  Lowest-level data read I/O functions | ||||||
|  |       pngrtran.c    =>  Read data transformation functions | ||||||
|  |       pngrutil.c    =>  Read data utility functions | ||||||
|  |       pngset.c      =>  Functions for storing data into the info_struct | ||||||
|  |       pngtest.c     =>  Library test program | ||||||
|  |       pngtest.png   =>  Library test sample image | ||||||
|  |       pngtrans.c    =>  Common data transformation functions | ||||||
|  |       pngwio.c      =>  Lowest-level write I/O functions | ||||||
|  |       pngwrite.c    =>  High-level write functions | ||||||
|  |       pngwtran.c    =>  Write data transformations | ||||||
|  |       pngwutil.c    =>  Write utility functions | ||||||
|  |       contrib       =>  Contributions | ||||||
|  |        gregbook         =>  source code for PNG reading and writing, from | ||||||
|  |                             Greg Roelofs' "PNG: The Definitive Guide", | ||||||
|  |                             O'Reilly, 1999 | ||||||
|  |        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 | ||||||
|  |       projects      =>  Contains project files and workspaces for building DLL | ||||||
|  |        beos             =>  Contains a Beos workspace for building libpng | ||||||
|  |        borland          =>  Contains a Borland workspace for building libpng | ||||||
|  |                             and zlib | ||||||
|  |        msvc             =>  Contains a Microsoft Visual C++ (MSVC) workspace | ||||||
|  |                             for building libpng and zlib | ||||||
|  |        netware.txt      =>  Contains instructions for downloading a set of | ||||||
|  |                             project files for building libpng and zlib on | ||||||
|  |                             Netware. | ||||||
|  |        wince.txt        =>  Contains instructions for downloading a Microsoft | ||||||
|  |                             Visual C++ (Windows CD Toolkit) workspace for | ||||||
|  |                             building libpng and zlib on WindowsCE | ||||||
|  |       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 libpng12.so.0.1.2.5) | ||||||
|  |        makefile.gcmmx   =>  Linux/ELF makefile (gcc, creates | ||||||
|  |                             libpng12.so.0.1.2.5, 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 | ||||||
|  |                             ansi2knr (Requires ansi2knr.c from | ||||||
|  |                             ftp://ftp.cs.wisc.edu/ghost) | ||||||
|  |        makefile.aix     =>  AIX makefile | ||||||
|  |        makefile.cygwin  =>  Cygwin/gcc makefile | ||||||
|  |        makefile.darwin  =>  Darwin makefile | ||||||
|  |        makefile.dec     =>  DEC Alpha UNIX makefile | ||||||
|  |        makefile.freebsd =>  FreeBSD makefile | ||||||
|  |        makefile.hpgcc   =>  HPUX makefile using gcc | ||||||
|  |        makefile.hpux    =>  HPUX (10.20 and 11.00) makefile | ||||||
|  |        makefile.ibmc    =>  IBM C/C++ version 3.x for Win32 and OS/2 (static) | ||||||
|  |        makefile.intel   =>  Intel C/C++ version 4.0 and later | ||||||
|  |        libpng.icc       =>  Project file, IBM VisualAge/C++ 4.0 or later | ||||||
|  |        makefile.macosx  =>  MACOS X Makefile | ||||||
|  |        makefile.netbsd  =>  NetBSD/cc makefile, PNGGCCRD, makes libpng.so. | ||||||
|  |        makefile.ne0bsd =>  NetBSD/cc makefile, PNGGCCRD, makes libpng0.so | ||||||
|  |        makefile.openbsd =>  OpenBSD makefile | ||||||
|  |        makefile.sgi     =>  Silicon Graphics IRIX (cc, creates static lib) | ||||||
|  |        makefile.sggcc   =>  Silicon Graphics (gcc, creates libpng12.so.0.1.2.5) | ||||||
|  |        makefile.sunos   =>  Sun makefile | ||||||
|  |        makefile.solaris =>  Solaris 2.X makefile | ||||||
|  |                             (gcc, creates libpng12.so.0.1.2.5) | ||||||
|  |        makefile.so9     =>  Solaris 9 makefile | ||||||
|  |                             (gcc, creates libpng12.so.0.1.2.5) | ||||||
|  |        makefile.32sunu  =>  Sun Ultra 32-bit makefile | ||||||
|  |        makefile.64sunu  =>  Sun Ultra 64-bit makefile | ||||||
|  |        makefile.sco     =>  For SCO OSr5  ELF and Unixware 7 with Native cc | ||||||
|  |        makefile.mips    =>  MIPS makefile | ||||||
|  |        makefile.acorn   =>  Acorn makefile | ||||||
|  |        makefile.amiga   =>  Amiga makefile | ||||||
|  |        smakefile.ppc    =>  AMIGA smakefile for SAS C V6.58/7.00 PPC | ||||||
|  |                             compiler (Requires SCOPTIONS, copied from | ||||||
|  |                             scripts/SCOPTIONS.ppc) | ||||||
|  |        makefile.atari   =>  Atari makefile | ||||||
|  |        makefile.beos    =>  BEOS makefile for X86 | ||||||
|  |        makefile.bor     =>  Borland makefile (uses bcc) | ||||||
|  |        makefile.bc32    =>  32-bit Borland C++ (all modules compiled in C mode) | ||||||
|  |        makefile.bd32    =>  To make a png32bd.dll with Borland C++ 4.5 | ||||||
|  |        makefile.tc3     =>  Turbo C 3.0 makefile | ||||||
|  |        makefile.dj2     =>  DJGPP 2 makefile | ||||||
|  |        makefile.msc     =>  Microsoft C makefile | ||||||
|  |        makefile.vcawin32 => makefile for Microsoft Visual C++ 5.0 and | ||||||
|  |                             later (uses assembler code tuned for Intel MMX | ||||||
|  |                             platform) | ||||||
|  |        makefile.vcwin32 =>  makefile for Microsoft Visual C++ 4.0 and | ||||||
|  |                             later (does not use assembler code) | ||||||
|  |        makefile.os2     =>  OS/2 Makefile (gcc and emx, requires pngos2.def) | ||||||
|  |        pngos2.def       =>  OS/2 module definition file used by makefile.os2 | ||||||
|  |        makefile.watcom  =>  Watcom 10a+ Makefile, 32-bit flat memory model | ||||||
|  |        makevms.com      =>  VMS build script | ||||||
|  |        pngdef.pas       =>  Defines for a png32bd.dll with Borland C++ 4.5 | ||||||
|  |        SCOPTIONS.ppc    =>  Used with smakefile.ppc | ||||||
|  |       mangle        =>  Directory containing scripts to build libpng12m.so: | ||||||
|  |        mangle.in        =>  Function-decoration macros added to png.h by the | ||||||
|  |                             makefiles. | ||||||
|  |        makefile.linux   =>  Linux/ELF makefile | ||||||
|  |                             (gcc, creates libpng12m.so.0.1.2.5) | ||||||
|  |        makefile.gcmmx   =>  Linux/ELF makefile (gcc, creates | ||||||
|  |                             libpng12.so.0m.1.2.5, uses assembler code | ||||||
|  |                             tuned for Intel MMX platform) | ||||||
|  |        makefile.sgi     =>  Silicon Graphics (cc, creates libpng12m.so) | ||||||
|  |        makefile.sggcc   =>  Silicon Graphics (gcc, creates libpng12m.so) | ||||||
|  |  | ||||||
|  | Good luck, and happy coding. | ||||||
|  |  | ||||||
|  | -Glenn Randers-Pehrson | ||||||
|  |  Internet: randeg@alum.rpi.edu | ||||||
|  |  | ||||||
|  | -Andreas Eric Dilger | ||||||
|  |  Internet: adilger@enel.ucalgary.ca | ||||||
|  |  Web: http://www-mddsp.enel.ucalgary.ca/People/adilger/ | ||||||
|  |  | ||||||
|  | -Guy Eric Schalnat | ||||||
|  |  (formerly of Group 42, Inc) | ||||||
|  |  Internet: gschal@infinet.com | ||||||
							
								
								
									
										24
									
								
								runtime/libpng/TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,24 @@ | |||||||
|  | TODO - list of things to do for libpng: | ||||||
|  |  | ||||||
|  | Final bug fixes. | ||||||
|  | Improve API by hiding the png_struct and png_info structs. | ||||||
|  | Finish work on the no-floating-point version (including gamma compensation) | ||||||
|  | Better C++ wrapper/full C++ implementation? | ||||||
|  | Fix problem with C++ and EXTERN "C". | ||||||
|  | cHRM transformation. | ||||||
|  | Improve setjmp/longjmp usage or remove it in favor of returning error codes. | ||||||
|  | Add "grayscale->palette" transformation and "palette->grayscale" detection. | ||||||
|  | Improved dithering. | ||||||
|  | Multi-lingual error and warning message support. | ||||||
|  | Complete sRGB transformation (presently it simply uses gamma=0.45455). | ||||||
|  | Man pages for function calls. | ||||||
|  | Better documentation. | ||||||
|  | Better filter selection | ||||||
|  |    (counting huffman bits/precompression?  filter inertia?  filter costs?). | ||||||
|  | Histogram creation. | ||||||
|  | Text conversion between different code pages (Latin-1 -> Mac and DOS). | ||||||
|  | Should we always malloc 2^bit_depth PLTE/tRNS/hIST entries for safety? | ||||||
|  | Build gamma tables using fixed point (and do away with floating point entirely). | ||||||
|  | Use greater precision when changing to linear gamma for compositing against | ||||||
|  |   background and doing rgb-to-gray transformation. | ||||||
|  | Investigate pre-incremented loop counters and other loop constructions. | ||||||
							
								
								
									
										55
									
								
								runtime/libpng/Y2KINFO
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,55 @@ | |||||||
|  |    Y2K compliance in libpng: | ||||||
|  |    ========================= | ||||||
|  |  | ||||||
|  |       October 3, 2002 | ||||||
|  |  | ||||||
|  |       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.2.5 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 will hold years up to 65535.  The other two hold the date in text | ||||||
|  |       format, and will hold years up to 9999. | ||||||
|  |  | ||||||
|  |       The integer is | ||||||
|  |           "png_uint_16 year" in png_time_struct. | ||||||
|  |  | ||||||
|  |       The strings are | ||||||
|  |           "png_charp time_buffer" in png_struct and | ||||||
|  |           "near_time_buffer", which is a local character string in png.c. | ||||||
|  |  | ||||||
|  |       There are seven time-related functions: | ||||||
|  |  | ||||||
|  |           png_convert_to_rfc_1123() in png.c | ||||||
|  |             (formerly png_convert_to_rfc_1152() in error) | ||||||
|  |           png_convert_from_struct_tm() in pngwrite.c, called in pngwrite.c | ||||||
|  |           png_convert_from_time_t() in pngwrite.c | ||||||
|  |           png_get_tIME() in pngget.c | ||||||
|  |           png_handle_tIME() in pngrutil.c, called in pngread.c | ||||||
|  |           png_set_tIME() in pngset.c | ||||||
|  |           png_write_tIME() in pngwutil.c, called in pngwrite.c | ||||||
|  |  | ||||||
|  |       All appear to handle dates properly in a Y2K environment.  The | ||||||
|  |       png_convert_from_time_t() function calls gmtime() to convert from system | ||||||
|  |       clock time, which returns (year - 1900), which we properly convert to | ||||||
|  |       the full 4-digit year.  There is a possibility that applications using | ||||||
|  |       libpng are not passing 4-digit years into the png_convert_to_rfc_1123() | ||||||
|  |       function, or that they are incorrectly passing only a 2-digit year | ||||||
|  |       instead of "year - 1900" into the png_convert_from_struct_tm() function, | ||||||
|  |       but this is not under our control.  The libpng documentation has always | ||||||
|  |       stated that it works with 4-digit years, and the APIs have been | ||||||
|  |       documented as such. | ||||||
|  |  | ||||||
|  |       The tIME chunk itself is also Y2K compliant.  It uses a 2-byte unsigned | ||||||
|  |       integer to hold the year, and can hold years as large as 65535. | ||||||
|  |  | ||||||
|  |       zlib, upon which libpng depends, is also Y2K compliant.  It contains | ||||||
|  |       no date-related code. | ||||||
|  |  | ||||||
|  |  | ||||||
|  |          Glenn Randers-Pehrson | ||||||
|  |          libpng maintainer | ||||||
|  |          PNG Development Group | ||||||
							
								
								
									
										6
									
								
								runtime/libpng/configure
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						| @@ -0,0 +1,6 @@ | |||||||
|  | echo " | ||||||
|  |   There is no \"configure\" script for Libpng-1.2.5.  Instead, please | ||||||
|  |   copy the appropriate makefile for your system from the \"scripts\" | ||||||
|  |   directory.  Read the INSTALL file for more details. | ||||||
|  | " | ||||||
|  |  | ||||||
							
								
								
									
										26
									
								
								runtime/libpng/contrib/gregbook/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,26 @@ | |||||||
|  |   --------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |       Copyright (c) 1998-2001 Greg Roelofs.  All rights reserved. | ||||||
|  |  | ||||||
|  |       This software is provided "as is," without warranty of any kind, | ||||||
|  |       express or implied.  In no event shall the author or contributors | ||||||
|  |       be held liable for any damages arising in any way from the use of | ||||||
|  |       this software. | ||||||
|  |  | ||||||
|  |       Permission is granted to anyone to use this software for any purpose, | ||||||
|  |       including commercial applications, and to alter it and redistribute | ||||||
|  |       it freely, subject to the following restrictions: | ||||||
|  |  | ||||||
|  |       1. Redistributions of source code must retain the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions. | ||||||
|  |       2. Redistributions in binary form must reproduce the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions in the documenta- | ||||||
|  |          tion and/or other materials provided with the distribution. | ||||||
|  |       3. All advertising materials mentioning features or use of this | ||||||
|  |          software must display the following acknowledgment: | ||||||
|  |  | ||||||
|  |             This product includes software developed by Greg Roelofs | ||||||
|  |             and contributors for the book, "PNG: The Definitive Guide," | ||||||
|  |             published by O'Reilly and Associates. | ||||||
|  |  | ||||||
|  |   --------------------------------------------------------------------------- | ||||||
							
								
								
									
										104
									
								
								runtime/libpng/contrib/gregbook/Makefile.sgi
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,104 @@ | |||||||
|  | # Sample makefile for rpng-x / rpng2-x / wpng for SGI using cc and make. | ||||||
|  | # Greg Roelofs | ||||||
|  | # Last modified:  7 March 2002 | ||||||
|  | # | ||||||
|  | #	The programs built by this makefile are described in the book, | ||||||
|  | #	"PNG:  The Definitive Guide," by Greg Roelofs (O'Reilly and | ||||||
|  | #	Associates, 1999).  Go buy a copy, eh?  Buy some for friends | ||||||
|  | #	and family, too.  (Not that this is a blatant plug or anything.) | ||||||
|  | # | ||||||
|  | # Invoke this makefile from a shell prompt in the usual way; for example: | ||||||
|  | # | ||||||
|  | #	make -f Makefile.sgi | ||||||
|  | # | ||||||
|  | # This makefile assumes libpng and zlib have already been built or downloaded | ||||||
|  | # and are both installed in /usr/local/{include,lib} (as indicated by the | ||||||
|  | # PNG* and Z* macros below).  Edit as appropriate--choose only ONE each of | ||||||
|  | # the PNGINC, PNGLIB, ZINC and ZLIB lines. | ||||||
|  | # | ||||||
|  | # This makefile builds dynamically linked executables (against libpng and zlib, | ||||||
|  | # that is), but that can be changed by uncommenting the appropriate PNGLIB and | ||||||
|  | # ZLIB lines. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # macros -------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | PNGINC = -I/usr/local/include/libpng12 | ||||||
|  | PNGLIB = -L/usr/local/lib -lpng12	  # dynamically linked against libpng | ||||||
|  | #PNGLIB = /usr/local/lib/libpng12.a # statically linked against libpng | ||||||
|  | # or: | ||||||
|  | #PNGINC = -I../.. | ||||||
|  | #PNGLIB = -L../.. -lpng | ||||||
|  | #PNGLIB = ../../libpng.a | ||||||
|  |  | ||||||
|  | ZINC = -I/usr/local/include | ||||||
|  | ZLIB = -L/usr/local/lib -lz		# dynamically linked against zlib | ||||||
|  | #ZLIB = /usr/local/lib/libz.a		# statically linked against zlib | ||||||
|  | #ZINC = -I../zlib | ||||||
|  | #ZLIB = -L../zlib -lz | ||||||
|  | #ZLIB = ../../../zlib/libz.a | ||||||
|  |  | ||||||
|  | XINC = -I/usr/include/X11		# old-style, stock X distributions | ||||||
|  | XLIB = -L/usr/lib/X11 -lX11 | ||||||
|  | #XINC = -I/usr/openwin/include    	# Sun workstations (OpenWindows) | ||||||
|  | #XLIB = -L/usr/openwin/lib -lX11 | ||||||
|  | #XINC = -I/usr/X11R6/include		# new X distributions (XFree86, etc.) | ||||||
|  | #XLIB = -L/usr/X11R6/lib -lX11 | ||||||
|  |  | ||||||
|  | INCS = $(PNGINC) $(ZINC) $(XINC) | ||||||
|  | RLIBS = $(PNGLIB) $(ZLIB) $(XLIB) -lm | ||||||
|  | WLIBS = $(PNGLIB) $(ZLIB) | ||||||
|  |  | ||||||
|  | CC = cc | ||||||
|  | LD = cc | ||||||
|  | RM = rm -f | ||||||
|  | # ABI must be the same as that used to build libpng. | ||||||
|  | ABI= | ||||||
|  | CFLAGS = $(ABI) -O -fullwarn $(INCS) | ||||||
|  | LDFLAGS = $(ABI) | ||||||
|  | O = .o | ||||||
|  | E = | ||||||
|  |  | ||||||
|  | RPNG  = rpng-x | ||||||
|  | RPNG2 = rpng2-x | ||||||
|  | WPNG  = wpng | ||||||
|  |  | ||||||
|  | ROBJS  = $(RPNG)$(O) readpng$(O) | ||||||
|  | ROBJS2 = $(RPNG2)$(O) readpng2$(O) | ||||||
|  | WOBJS  = $(WPNG)$(O) writepng$(O) | ||||||
|  |  | ||||||
|  | EXES = $(RPNG)$(E) $(RPNG2)$(E) $(WPNG)$(E) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # implicit make rules ------------------------------------------------------- | ||||||
|  |  | ||||||
|  | .c$(O): | ||||||
|  | 	$(CC) -c $(CFLAGS) $< | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # dependencies -------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | all:  $(EXES) | ||||||
|  |  | ||||||
|  | $(RPNG)$(E): $(ROBJS) | ||||||
|  | 	$(LD) $(LDFLAGS) -o $@ $(ROBJS) $(RLIBS) | ||||||
|  |  | ||||||
|  | $(RPNG2)$(E): $(ROBJS2) | ||||||
|  | 	$(LD) $(LDFLAGS) -o $@ $(ROBJS2) $(RLIBS) | ||||||
|  |  | ||||||
|  | $(WPNG)$(E): $(WOBJS) | ||||||
|  | 	$(LD) $(LDFLAGS) -o $@ $(WOBJS) $(WLIBS) | ||||||
|  |  | ||||||
|  | $(RPNG)$(O):	$(RPNG).c readpng.h | ||||||
|  | $(RPNG2)$(O):	$(RPNG2).c readpng2.h | ||||||
|  | $(WPNG)$(O):	$(WPNG).c writepng.h | ||||||
|  |  | ||||||
|  | readpng$(O):	readpng.c readpng.h | ||||||
|  | readpng2$(O):	readpng2.c readpng2.h | ||||||
|  | writepng$(O):	writepng.c writepng.h | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # maintenance --------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	$(RM) $(EXES) $(ROBJS) $(ROBJS2) $(WOBJS) | ||||||
							
								
								
									
										104
									
								
								runtime/libpng/contrib/gregbook/Makefile.unx
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,104 @@ | |||||||
|  | # Sample makefile for rpng-x / rpng2-x / wpng using gcc and make. | ||||||
|  | # Greg Roelofs | ||||||
|  | # Last modified:  7 March 2002 | ||||||
|  | # | ||||||
|  | #	The programs built by this makefile are described in the book, | ||||||
|  | #	"PNG:  The Definitive Guide," by Greg Roelofs (O'Reilly and | ||||||
|  | #	Associates, 1999).  Go buy a copy, eh?  Buy some for friends | ||||||
|  | #	and family, too.  (Not that this is a blatant plug or anything.) | ||||||
|  | # | ||||||
|  | # Invoke this makefile from a shell prompt in the usual way; for example: | ||||||
|  | # | ||||||
|  | #	make -f Makefile.unx | ||||||
|  | # | ||||||
|  | # This makefile assumes libpng and zlib have already been built or downloaded | ||||||
|  | # and are both installed in /usr/local/{include,lib} (as indicated by the | ||||||
|  | # PNG* and Z* macros below).  Edit as appropriate--choose only ONE each of | ||||||
|  | # the PNGINC, PNGLIB, ZINC and ZLIB lines. | ||||||
|  | # | ||||||
|  | # This makefile builds statically linked executables (against libpng and zlib, | ||||||
|  | # that is), but that can be changed by uncommenting the appropriate PNGLIB and | ||||||
|  | # ZLIB lines. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # macros -------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | PNGINC = -I/usr/local/include/libpng12 | ||||||
|  | #PNGLIB = -L/usr/local/lib -lpng12 # dynamically linked against libpng | ||||||
|  | PNGLIB = /usr/local/lib/libpng12.a # statically linked against libpng | ||||||
|  | # or: | ||||||
|  | #PNGINC = -I../libpng | ||||||
|  | #PNGLIB = -L../libpng -lpng | ||||||
|  | #PNGLIB = ../libpng/libpng.a | ||||||
|  |  | ||||||
|  | ZINC = -I/usr/local/include | ||||||
|  | #ZLIB = -L/usr/local/lib -lz		# dynamically linked against zlib | ||||||
|  | ZLIB = /usr/local/lib/libz.a		# statically linked against zlib | ||||||
|  | #ZINC = -I../zlib | ||||||
|  | #ZLIB = -L../zlib -lz | ||||||
|  | #ZLIB = ../zlib/libz.a | ||||||
|  |  | ||||||
|  | #XINC = -I/usr/include			# old-style, stock X distributions | ||||||
|  | #XLIB = -L/usr/lib/X11 -lX11 | ||||||
|  | #XINC = -I/usr/openwin/include		# Sun workstations (OpenWindows) | ||||||
|  | #XLIB = -L/usr/openwin/lib -lX11 | ||||||
|  | XINC = -I/usr/X11R6/include		# new X distributions (XFree86, etc.) | ||||||
|  | XLIB = -L/usr/X11R6/lib -lX11 | ||||||
|  |  | ||||||
|  | INCS = $(PNGINC) $(ZINC) $(XINC) | ||||||
|  | RLIBS = $(PNGLIB) $(ZLIB) $(XLIB) -lm | ||||||
|  | WLIBS = $(PNGLIB) $(ZLIB) | ||||||
|  |  | ||||||
|  | CC = gcc | ||||||
|  | LD = gcc | ||||||
|  | RM = rm -f | ||||||
|  | CFLAGS = -O -Wall $(INCS) | ||||||
|  | # [note that -Wall is a gcc-specific compilation flag ("most warnings on")] | ||||||
|  | # [-ansi, -pedantic and -W can also be used] | ||||||
|  | LDFLAGS = | ||||||
|  | O = .o | ||||||
|  | E = | ||||||
|  |  | ||||||
|  | RPNG  = rpng-x | ||||||
|  | RPNG2 = rpng2-x | ||||||
|  | WPNG  = wpng | ||||||
|  |  | ||||||
|  | ROBJS  = $(RPNG)$(O) readpng$(O) | ||||||
|  | ROBJS2 = $(RPNG2)$(O) readpng2$(O) | ||||||
|  | WOBJS  = $(WPNG)$(O) writepng$(O) | ||||||
|  |  | ||||||
|  | EXES = $(RPNG)$(E) $(RPNG2)$(E) $(WPNG)$(E) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # implicit make rules ------------------------------------------------------- | ||||||
|  |  | ||||||
|  | .c$(O): | ||||||
|  | 	$(CC) -c $(CFLAGS) $< | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # dependencies -------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | all:  $(EXES) | ||||||
|  |  | ||||||
|  | $(RPNG)$(E): $(ROBJS) | ||||||
|  | 	$(LD) $(LDFLAGS) -o $@ $(ROBJS) $(RLIBS) | ||||||
|  |  | ||||||
|  | $(RPNG2)$(E): $(ROBJS2) | ||||||
|  | 	$(LD) $(LDFLAGS) -o $@ $(ROBJS2) $(RLIBS) | ||||||
|  |  | ||||||
|  | $(WPNG)$(E): $(WOBJS) | ||||||
|  | 	$(LD) $(LDFLAGS) -o $@ $(WOBJS) $(WLIBS) | ||||||
|  |  | ||||||
|  | $(RPNG)$(O):	$(RPNG).c readpng.h | ||||||
|  | $(RPNG2)$(O):	$(RPNG2).c readpng2.h | ||||||
|  | $(WPNG)$(O):	$(WPNG).c writepng.h | ||||||
|  |  | ||||||
|  | readpng$(O):	readpng.c readpng.h | ||||||
|  | readpng2$(O):	readpng2.c readpng2.h | ||||||
|  | writepng$(O):	writepng.c writepng.h | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # maintenance --------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	$(RM) $(EXES) $(ROBJS) $(ROBJS2) $(WOBJS) | ||||||
							
								
								
									
										112
									
								
								runtime/libpng/contrib/gregbook/Makefile.w32
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,112 @@ | |||||||
|  | # Sample makefile for rpng-win / rpng2-win / wpng using MSVC and NMAKE. | ||||||
|  | # Greg Roelofs | ||||||
|  | # Last modified:  16 February 1999 | ||||||
|  | # | ||||||
|  | #	The programs built by this makefile are described in the book, | ||||||
|  | #	"PNG:  The Definitive Guide," by Greg Roelofs (O'Reilly and | ||||||
|  | #	Associates, 1999).  Go buy a copy, eh?  Buy some for friends | ||||||
|  | #	and family, too.  (Not that this is a blatant plug or anything.) | ||||||
|  | # | ||||||
|  | # Invoke this makefile from a DOS prompt window via: | ||||||
|  | # | ||||||
|  | #	%devstudio%\vc\bin\vcvars32.bat | ||||||
|  | #	nmake -nologo -f Makefile.w32 | ||||||
|  | # | ||||||
|  | # where %devstudio% is the installation directory for MSVC / DevStudio.  If | ||||||
|  | # you get "environment out of space" errors, create a desktop shortcut with | ||||||
|  | # "c:\windows\command.com /e:4096" as the program command line and set the | ||||||
|  | # working directory to this directory.  Then double-click to open the new | ||||||
|  | # DOS-prompt window with a bigger environment and retry the commands above. | ||||||
|  | #  | ||||||
|  | # This makefile assumes libpng and zlib have already been built or downloaded | ||||||
|  | # and are in subdirectories at the same level as the current subdirectory | ||||||
|  | # (as indicated by the PNGPATH and ZPATH macros below).  Edit as appropriate. | ||||||
|  | # | ||||||
|  | # Note that the names of the dynamic and static libpng and zlib libraries | ||||||
|  | # used below may change in later releases of the libraries.  This makefile | ||||||
|  | # builds statically linked executables, but that can be changed by uncom- | ||||||
|  | # menting the appropriate PNGLIB and ZLIB lines. | ||||||
|  |  | ||||||
|  | !include <ntwin32.mak> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # macros -------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | PNGPATH = ../libpng | ||||||
|  | PNGINC = -I$(PNGPATH) | ||||||
|  | #PNGLIB = $(PNGPATH)/pngdll.lib | ||||||
|  | PNGLIB = $(PNGPATH)/libpng.lib | ||||||
|  |  | ||||||
|  | ZPATH = ../zlib | ||||||
|  | ZINC = -I$(ZPATH) | ||||||
|  | #ZLIB = $(ZPATH)/zlibdll.lib | ||||||
|  | ZLIB = $(ZPATH)/zlibstat.lib | ||||||
|  |  | ||||||
|  | WINLIBS = -defaultlib:user32.lib gdi32.lib | ||||||
|  | # ["real" apps may also need comctl32.lib, comdlg32.lib, winmm.lib, etc.] | ||||||
|  |  | ||||||
|  | INCS = $(PNGINC) $(ZINC) | ||||||
|  | RLIBS = $(PNGLIB) $(ZLIB) $(WINLIBS) | ||||||
|  | WLIBS = $(PNGLIB) $(ZLIB) | ||||||
|  |  | ||||||
|  | CC = cl | ||||||
|  | LD = link | ||||||
|  | RM = del | ||||||
|  | CFLAGS = -nologo -O -W3 $(INCS) $(cvars) | ||||||
|  | # [note that -Wall is an MSVC-specific compilation flag ("all warnings on")] | ||||||
|  | # [see %devstudio%\vc\include\win32.mak for cvars macro definition] | ||||||
|  | O = .obj | ||||||
|  | E = .exe | ||||||
|  |  | ||||||
|  | RLDFLAGS = -nologo -subsystem:windows | ||||||
|  | WLDFLAGS = -nologo | ||||||
|  |  | ||||||
|  | RPNG  = rpng-win | ||||||
|  | RPNG2 = rpng2-win | ||||||
|  | WPNG  = wpng | ||||||
|  |  | ||||||
|  | ROBJS  = $(RPNG)$(O) readpng$(O) | ||||||
|  | ROBJS2 = $(RPNG2)$(O) readpng2$(O) | ||||||
|  | WOBJS  = $(WPNG)$(O) writepng$(O) | ||||||
|  |  | ||||||
|  | EXES = $(RPNG)$(E) $(RPNG2)$(E) $(WPNG)$(E) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # implicit make rules ------------------------------------------------------- | ||||||
|  |  | ||||||
|  | .c$(O): | ||||||
|  | 	$(CC) -c $(CFLAGS) $< | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # dependencies -------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | all:  $(EXES) | ||||||
|  |  | ||||||
|  | $(RPNG)$(E): $(ROBJS) | ||||||
|  | 	$(LD) $(RLDFLAGS) -out:$@ $(ROBJS) $(RLIBS) | ||||||
|  |  | ||||||
|  | $(RPNG2)$(E): $(ROBJS2) | ||||||
|  | 	$(LD) $(RLDFLAGS) -out:$@ $(ROBJS2) $(RLIBS) | ||||||
|  |  | ||||||
|  | $(WPNG)$(E): $(WOBJS) | ||||||
|  | 	$(LD) $(WLDFLAGS) -out:$@ $(WOBJS) $(WLIBS) | ||||||
|  |  | ||||||
|  | $(RPNG)$(O):	$(RPNG).c readpng.h | ||||||
|  | $(RPNG2)$(O):	$(RPNG2).c readpng2.h | ||||||
|  | $(WPNG)$(O):	$(WPNG).c writepng.h | ||||||
|  |  | ||||||
|  | readpng$(O):	readpng.c readpng.h | ||||||
|  | readpng2$(O):	readpng2.c readpng2.h | ||||||
|  | writepng$(O):	writepng.c writepng.h | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # maintenance --------------------------------------------------------------- | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | #	ideally we could just do this: | ||||||
|  | #	$(RM) $(EXES) $(ROBJS) $(ROBJS2) $(WOBJS) | ||||||
|  | #	...but the Windows "DEL" command is none too bright, so: | ||||||
|  | 	$(RM) r*$(E) | ||||||
|  | 	$(RM) w*$(E) | ||||||
|  | 	$(RM) r*$(O) | ||||||
|  | 	$(RM) w*$(O) | ||||||
							
								
								
									
										185
									
								
								runtime/libpng/contrib/gregbook/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,185 @@ | |||||||
|  |                      =========================== | ||||||
|  |                       PNG: The Definitive Guide | ||||||
|  |                      =========================== | ||||||
|  |  | ||||||
|  |                              Source Code | ||||||
|  |  | ||||||
|  | Chapters 13, 14 and 15 of "PNG: The Definitive Guide" discuss three free, | ||||||
|  | cross-platform demo programs that show how to use the libpng reference | ||||||
|  | library:  rpng, rpng2 and wpng.  rpng and rpng2 are viewers; the first is | ||||||
|  | a very simple example that that shows how a standard file-viewer might use | ||||||
|  | libpng, while the second is designed to process streaming data and shows | ||||||
|  | how a web browser might be written.  wpng is a simple command-line program | ||||||
|  | that reads binary PGM and PPM files (the ``raw'' grayscale and RGB subsets | ||||||
|  | of PBMPLUS/NetPBM) and converts them to PNG. | ||||||
|  |  | ||||||
|  | The source code for all three demo programs currently compiles under | ||||||
|  | Unix, OpenVMS, and 32-bit Windows.  (Special thanks to Martin Zinser, | ||||||
|  | zinser@decus.de, for making the necessary changes for OpenVMS and for | ||||||
|  | providing an appropriate build script.)  Build instructions can be found | ||||||
|  | below. | ||||||
|  |  | ||||||
|  | Files: | ||||||
|  |  | ||||||
|  |    README             this file | ||||||
|  |    LICENSE            terms of distribution and reuse (BSD-like) | ||||||
|  |  | ||||||
|  |    Makefile.unx       Unix makefile | ||||||
|  |    Makefile.w32       Windows (MSVC) makefile | ||||||
|  |    makevms.com        OpenVMS build script | ||||||
|  |  | ||||||
|  |    rpng-win.c         Windows front end for the basic viewer | ||||||
|  |    rpng-x.c           X Window System (Unix, OpenVMS) front end | ||||||
|  |    readpng.c          generic back end for the basic viewer | ||||||
|  |    readpng.h          header file for the basic viewer | ||||||
|  |  | ||||||
|  |    rpng2-win.c        Windows front end for the progressive viewer | ||||||
|  |    rpng2-x.c          X front end for the progressive viewer | ||||||
|  |    readpng2.c         generic back end for the progressive viewer | ||||||
|  |    readpng2.h         header file for the progressive viewer | ||||||
|  |  | ||||||
|  |    wpng.c             generic (text) front end for the converter | ||||||
|  |    writepng.c         generic back end for the converter | ||||||
|  |    writepng.h         header file for the converter | ||||||
|  |  | ||||||
|  |    toucan.png         transparent PNG for testing (by Stefan Schneider) | ||||||
|  |  | ||||||
|  | Note that, although the programs are designed to be functional, their | ||||||
|  | primary purpose is to illustrate how to use libpng to add PNG support to | ||||||
|  | other programs.  As such, their user interfaces are crude and definitely | ||||||
|  | are not intended for everyday use. | ||||||
|  |  | ||||||
|  | Please see http://www.libpng.org/pub/png/pngbook.html for further infor- | ||||||
|  | mation and links to the latest version of the source code, and Chapters | ||||||
|  | 13-15 of the book for detailed discussion of the three programs. | ||||||
|  |  | ||||||
|  | Greg Roelofs | ||||||
|  | newt@pobox.com | ||||||
|  | 30 June 2001 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | BUILD INSTRUCTIONS | ||||||
|  |  | ||||||
|  |  - Prerequisites (in order of compilation): | ||||||
|  |  | ||||||
|  |       - zlib		http://www.gzip.org/zlib/ | ||||||
|  |       - libpng		http://www.libpng.org/pub/png/libpng.html | ||||||
|  |       - pngbook		http://www.libpng.org/pub/png/book/sources.html | ||||||
|  |  | ||||||
|  |      The pngbook demo programs are explicitly designed to demonstrate proper | ||||||
|  |      coding techniques for using the libpng reference library.  As a result, | ||||||
|  |      you need to download and build both zlib (on which libpng depends) and | ||||||
|  |      libpng.  A common build setup is to place the zlib, libpng and pngbook | ||||||
|  |      subdirectory trees ("folders") in the same parent directory.  Then the | ||||||
|  |      libpng build can refer to files in ../zlib (or ..\zlib or [-.zlib]), | ||||||
|  |      and similarly for the pngbook build. | ||||||
|  |  | ||||||
|  |      Note that all three packages are designed to be built from a command | ||||||
|  |      line by default; those who wish to use a graphical or other integrated | ||||||
|  |      development environments are on their own. | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  - Unix: | ||||||
|  |  | ||||||
|  |      Unpack the latest pngbook sources (which should correspond to this | ||||||
|  |      README file) into a directory and change into that directory. | ||||||
|  |  | ||||||
|  |      Copy Makefile.unx to Makefile and edit the PNG* and Z* variables | ||||||
|  |      appropriately (possibly also the X* variables if necessary). | ||||||
|  |  | ||||||
|  |      make | ||||||
|  |  | ||||||
|  |      There is no "install" target, so copy the three executables somewhere | ||||||
|  |      in your path or run them from the current directory.  All three will | ||||||
|  |      print a basic usage screen when run without any command-line arguments; | ||||||
|  |      see the book for more details. | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  - Windows: | ||||||
|  |  | ||||||
|  |      Unpack the latest pngbook sources (which should correspond to this | ||||||
|  |      README file) into a folder, open a "DOS shell" or "command prompt" | ||||||
|  |      or equivalent command-line window, and cd into the folder where you | ||||||
|  |      unpacked the source code. | ||||||
|  |  | ||||||
|  |      For MSVC, set up the necessary environment variables by invoking | ||||||
|  |   | ||||||
|  |         %devstudio%\vc\bin\vcvars32.bat | ||||||
|  |  | ||||||
|  |      where where %devstudio% is the installation directory for MSVC / | ||||||
|  |      DevStudio.  If you get "environment out of space" errors under 95/98, | ||||||
|  |      create a desktop shortcut with "c:\windows\command.com /e:4096" as | ||||||
|  |      the program command line and set the working directory to the pngbook | ||||||
|  |      directory.  Then double-click to open the new DOS-prompt window with | ||||||
|  |      a bigger environment and retry the commands above. | ||||||
|  |  | ||||||
|  |      Copy Makefile.w32 to Makefile and edit the PNGPATH and ZPATH variables | ||||||
|  |      appropriately (possibly also the "INC" and "LIB" variables if needed). | ||||||
|  |      Note that the names of the dynamic and static libpng and zlib libraries | ||||||
|  |      used in the makefile may change in later releases of the libraries. | ||||||
|  |      Also note that, as of libpng version 1.0.5, MSVC DLL builds do not work. | ||||||
|  |      This makefile therefore builds statically linked executables, but if | ||||||
|  |      the DLL problems ever get fixed, uncommenting the appropriate PNGLIB | ||||||
|  |      and ZLIB lines will build dynamically linked executables instead. | ||||||
|  |  | ||||||
|  |      Do the build by typing | ||||||
|  |  | ||||||
|  |         nmake | ||||||
|  |  | ||||||
|  |      The result should be three executables:  rpng-win.exe, rpng2-win.exe, | ||||||
|  |      and wpng.exe.  Copy them somewhere in your PATH or run them from the | ||||||
|  |      current folder.  Like the Unix versions, the two windowed programs | ||||||
|  |      (rpng and rpng2) now display a usage screen in a console window when | ||||||
|  |      invoked without command-line arguments; this is new behavior as of | ||||||
|  |      the June 2001 release.  Note that the programs use the Unix-style "-" | ||||||
|  |      character to specify options, instead of the more common DOS/Windows | ||||||
|  |      "/" character.  (For example:  "rpng2-win -bgpat 4 foo.png", not | ||||||
|  |      "rpng2-win /bgpat 4 foo.png") | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  - OpenVMS: | ||||||
|  |  | ||||||
|  |      Unpack the pngbook sources into a subdirectory and change into that | ||||||
|  |      subdirectory. | ||||||
|  |  | ||||||
|  |      Edit makevms.com appropriately, specifically the zpath and pngpath | ||||||
|  |      variables. | ||||||
|  |  | ||||||
|  |      @makevms | ||||||
|  |  | ||||||
|  |      To run the programs, they probably first need to be set up as "foreign | ||||||
|  |      symbols," with "disk" and "dir" set appropriately: | ||||||
|  |  | ||||||
|  |      $ rpng == "$disk:[dir]rpng-x.exe" | ||||||
|  |      $ rpng2 == "$disk:[dir]rpng2-x.exe" | ||||||
|  |      $ wpng == "$disk:[dir]wpng.exe" | ||||||
|  |  | ||||||
|  |      All three will print a basic usage screen when run without any command- | ||||||
|  |      line arguments; see the book for more details.  Note that the options | ||||||
|  |      style is Unix-like, i.e., preceded by "-" rather than "/". | ||||||
|  |  | ||||||
|  |  | ||||||
|  | RUNNING THE PROGRAMS:  (VERY) BRIEF INTRO | ||||||
|  |  | ||||||
|  |      rpng is a simple PNG viewer that can display transparent PNGs with a | ||||||
|  |      specified background color; for example, | ||||||
|  |  | ||||||
|  | 	rpng -bgcolor #ff0000 toucan.png | ||||||
|  |  | ||||||
|  |      would display the image with a red background.  rpng2 is a progressive | ||||||
|  |      viewer that simulates a web browser in some respects; it can display | ||||||
|  |      images against either a background color or a dynamically generated | ||||||
|  |      background image.  For example: | ||||||
|  |  | ||||||
|  | 	rpng2 -bgpat 16 toucan.png | ||||||
|  |  | ||||||
|  |      wpng is a purely command-line image converter from binary PBMPLUS/NetPBM | ||||||
|  |      format (.pgm or .ppm) to PNG; for example, | ||||||
|  |  | ||||||
|  | 	wpng -time < toucan.ppm > toucan.png | ||||||
|  |  | ||||||
|  |      would convert the specified PPM file (using redirection) to PNG, auto- | ||||||
|  |      matically setting the PNG modification-time chunk. | ||||||
|  |  | ||||||
|  |      All options can be abbreviated to the shortest unique value; for example, | ||||||
|  |      "-bgc" for -bgcolor (versus "-bgp" for -bgpat), or "-g" for -gamma. | ||||||
							
								
								
									
										132
									
								
								runtime/libpng/contrib/gregbook/makevms.com
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,132 @@ | |||||||
|  | $!------------------------------------------------------------------------------ | ||||||
|  | $! make "PNG: The Definitive Guide" demo programs (for X) under OpenVMS | ||||||
|  | $! | ||||||
|  | $! Script created by Martin Zinser for libpng; modified by Greg Roelofs | ||||||
|  | $! for standalone pngbook source distribution. | ||||||
|  | $! | ||||||
|  | $! | ||||||
|  | $!    Set locations where zlib and libpng sources live. | ||||||
|  | $! | ||||||
|  | $ zpath   = "" | ||||||
|  | $ pngpath = "" | ||||||
|  | $! | ||||||
|  | $ if f$search("[---.zlib]zlib.h").nes."" then zpath = "[---.zlib]" | ||||||
|  | $ if f$search("[--]png.h").nes."" then pngpath = "[--]" | ||||||
|  | $! | ||||||
|  | $ if f$search("[-.zlib]zlib.h").nes."" then zpath = "[-.zlib]" | ||||||
|  | $ if f$search("[-.libpng]png.h").nes."" then pngpath = "[-.libpng]" | ||||||
|  | $! | ||||||
|  | $ if zpath .eqs. "" | ||||||
|  | $ then | ||||||
|  | $   write sys$output "zlib include not found. Exiting..." | ||||||
|  | $   exit 2 | ||||||
|  | $ endif  | ||||||
|  | $! | ||||||
|  | $ if pngpath .eqs. "" | ||||||
|  | $ then | ||||||
|  | $   write sys$output "libpng include not found. Exiting..." | ||||||
|  | $   exit 2 | ||||||
|  | $ endif  | ||||||
|  | $! | ||||||
|  | $!    Look for the compiler used. | ||||||
|  | $! | ||||||
|  | $ ccopt="/include=(''zpath',''pngpath')" | ||||||
|  | $ if f$getsyi("HW_MODEL").ge.1024 | ||||||
|  | $ then | ||||||
|  | $  ccopt = "/prefix=all"+ccopt | ||||||
|  | $  comp  = "__decc__=1" | ||||||
|  | $  if f$trnlnm("SYS").eqs."" then define sys sys$library: | ||||||
|  | $ else | ||||||
|  | $  if f$search("SYS$SYSTEM:DECC$COMPILER.EXE").eqs."" | ||||||
|  | $   then | ||||||
|  | $    if f$trnlnm("SYS").eqs."" then define sys sys$library: | ||||||
|  | $    if f$search("SYS$SYSTEM:VAXC.EXE").eqs."" | ||||||
|  | $     then | ||||||
|  | $      comp  = "__gcc__=1" | ||||||
|  | $      CC :== GCC | ||||||
|  | $     else | ||||||
|  | $      comp = "__vaxc__=1" | ||||||
|  | $     endif | ||||||
|  | $   else | ||||||
|  | $    if f$trnlnm("SYS").eqs."" then define sys decc$library_include: | ||||||
|  | $    ccopt = "/decc/prefix=all"+ccopt | ||||||
|  | $    comp  = "__decc__=1" | ||||||
|  | $  endif | ||||||
|  | $ endif | ||||||
|  | $ open/write lopt lib.opt | ||||||
|  | $ write lopt "''pngpath'libpng.olb/lib" | ||||||
|  | $ write lopt "''zpath'libz.olb/lib" | ||||||
|  | $ close lopt | ||||||
|  | $ open/write xopt x11.opt | ||||||
|  | $ write xopt "sys$library:decw$xlibshr.exe/share" | ||||||
|  | $ close xopt | ||||||
|  | $! | ||||||
|  | $!    Build 'em. | ||||||
|  | $! | ||||||
|  | $ write sys$output "Compiling PNG book programs ..." | ||||||
|  | $   CALL MAKE readpng.OBJ "cc ''CCOPT' readpng" - | ||||||
|  | 	readpng.c readpng.h | ||||||
|  | $   CALL MAKE readpng2.OBJ "cc ''CCOPT' readpng2" - | ||||||
|  | 	readpng2.c readpng2.h | ||||||
|  | $   CALL MAKE writepng.OBJ "cc ''CCOPT' writepng" - | ||||||
|  | 	writepng.c writepng.h | ||||||
|  | $   write sys$output "Building rpng-x..." | ||||||
|  | $   CALL MAKE rpng-x.OBJ "cc ''CCOPT' rpng-x" - | ||||||
|  | 	rpng-x.c readpng.h | ||||||
|  | $   call make rpng-x.exe - | ||||||
|  | 	"LINK rpng-x,readpng,lib.opt/opt,x11.opt/opt" - | ||||||
|  | 	rpng-x.obj readpng.obj | ||||||
|  | $   write sys$output "Building rpng2-x..." | ||||||
|  | $   CALL MAKE rpng2-x.OBJ "cc ''CCOPT' rpng2-x" - | ||||||
|  | 	rpng2-x.c readpng2.h | ||||||
|  | $   call make rpng2-x.exe - | ||||||
|  | 	"LINK rpng2-x,readpng2,lib.opt/opt,x11.opt/opt" - | ||||||
|  | 	rpng2-x.obj readpng2.obj | ||||||
|  | $   write sys$output "Building wpng..." | ||||||
|  | $   CALL MAKE wpng.OBJ "cc ''CCOPT' wpng" - | ||||||
|  | 	wpng.c writepng.h | ||||||
|  | $   call make wpng.exe - | ||||||
|  | 	"LINK wpng,writepng,lib.opt/opt" - | ||||||
|  | 	wpng.obj writepng.obj | ||||||
|  | $ exit | ||||||
|  | $! | ||||||
|  | $! | ||||||
|  | $MAKE: SUBROUTINE   !SUBROUTINE TO CHECK DEPENDENCIES | ||||||
|  | $ V = 'F$Verify(0) | ||||||
|  | $! P1 = What we are trying to make | ||||||
|  | $! P2 = Command to make it | ||||||
|  | $! P3 - P8  What it depends on | ||||||
|  | $ | ||||||
|  | $ If F$Search(P1) .Eqs. "" Then Goto Makeit | ||||||
|  | $ Time = F$CvTime(F$File(P1,"RDT")) | ||||||
|  | $arg=3 | ||||||
|  | $Loop: | ||||||
|  | $       Argument = P'arg | ||||||
|  | $       If Argument .Eqs. "" Then Goto Exit | ||||||
|  | $       El=0 | ||||||
|  | $Loop2: | ||||||
|  | $       File = F$Element(El," ",Argument) | ||||||
|  | $       If File .Eqs. " " Then Goto Endl | ||||||
|  | $       AFile = "" | ||||||
|  | $Loop3: | ||||||
|  | $       OFile = AFile | ||||||
|  | $       AFile = F$Search(File) | ||||||
|  | $       If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl | ||||||
|  | $       If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit | ||||||
|  | $       Goto Loop3 | ||||||
|  | $NextEL: | ||||||
|  | $       El = El + 1 | ||||||
|  | $       Goto Loop2 | ||||||
|  | $EndL: | ||||||
|  | $ arg=arg+1 | ||||||
|  | $ If arg .Le. 8 Then Goto Loop | ||||||
|  | $ Goto Exit | ||||||
|  | $ | ||||||
|  | $Makeit: | ||||||
|  | $ VV=F$VERIFY(0) | ||||||
|  | $ write sys$output P2 | ||||||
|  | $ 'P2 | ||||||
|  | $ VV='F$Verify(VV) | ||||||
|  | $Exit: | ||||||
|  | $ If V Then Set Verify | ||||||
|  | $ENDSUBROUTINE | ||||||
							
								
								
									
										280
									
								
								runtime/libpng/contrib/gregbook/readpng.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,280 @@ | |||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |    rpng - simple PNG display program                              readpng.c | ||||||
|  |  | ||||||
|  |   --------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |       Copyright (c) 1998-2000 Greg Roelofs.  All rights reserved. | ||||||
|  |  | ||||||
|  |       This software is provided "as is," without warranty of any kind, | ||||||
|  |       express or implied.  In no event shall the author or contributors | ||||||
|  |       be held liable for any damages arising in any way from the use of | ||||||
|  |       this software. | ||||||
|  |  | ||||||
|  |       Permission is granted to anyone to use this software for any purpose, | ||||||
|  |       including commercial applications, and to alter it and redistribute | ||||||
|  |       it freely, subject to the following restrictions: | ||||||
|  |  | ||||||
|  |       1. Redistributions of source code must retain the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions. | ||||||
|  |       2. Redistributions in binary form must reproduce the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions in the documenta- | ||||||
|  |          tion and/or other materials provided with the distribution. | ||||||
|  |       3. All advertising materials mentioning features or use of this | ||||||
|  |          software must display the following acknowledgment: | ||||||
|  |  | ||||||
|  |             This product includes software developed by Greg Roelofs | ||||||
|  |             and contributors for the book, "PNG: The Definitive Guide," | ||||||
|  |             published by O'Reilly and Associates. | ||||||
|  |  | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  |  | ||||||
|  | #include "png.h"        /* libpng header; includes zlib.h */ | ||||||
|  | #include "readpng.h"    /* typedefs, common macros, public prototypes */ | ||||||
|  |  | ||||||
|  | /* future versions of libpng will provide this macro: */ | ||||||
|  | #ifndef png_jmpbuf | ||||||
|  | #  define png_jmpbuf(png_ptr)   ((png_ptr)->jmpbuf) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static png_structp png_ptr = NULL; | ||||||
|  | static png_infop info_ptr = NULL; | ||||||
|  |  | ||||||
|  | png_uint_32  width, height; | ||||||
|  | int  bit_depth, color_type; | ||||||
|  | uch  *image_data = NULL; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void readpng_version_info(void) | ||||||
|  | { | ||||||
|  |     fprintf(stderr, "   Compiled with libpng %s; using libpng %s.\n", | ||||||
|  |       PNG_LIBPNG_VER_STRING, png_libpng_ver); | ||||||
|  |     fprintf(stderr, "   Compiled with zlib %s; using zlib %s.\n", | ||||||
|  |       ZLIB_VERSION, zlib_version); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* return value = 0 for success, 1 for bad sig, 2 for bad IHDR, 4 for no mem */ | ||||||
|  |  | ||||||
|  | int readpng_init(FILE *infile, ulg *pWidth, ulg *pHeight) | ||||||
|  | { | ||||||
|  |     uch sig[8]; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* first do a quick check that the file really is a PNG image; could | ||||||
|  |      * have used slightly more general png_sig_cmp() function instead */ | ||||||
|  |  | ||||||
|  |     fread(sig, 1, 8, infile); | ||||||
|  |     if (!png_check_sig(sig, 8)) | ||||||
|  |         return 1;   /* bad signature */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* could pass pointers to user-defined error handlers instead of NULLs: */ | ||||||
|  |  | ||||||
|  |     png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); | ||||||
|  |     if (!png_ptr) | ||||||
|  |         return 4;   /* out of memory */ | ||||||
|  |  | ||||||
|  |     info_ptr = png_create_info_struct(png_ptr); | ||||||
|  |     if (!info_ptr) { | ||||||
|  |         png_destroy_read_struct(&png_ptr, NULL, NULL); | ||||||
|  |         return 4;   /* out of memory */ | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* we could create a second info struct here (end_info), but it's only | ||||||
|  |      * useful if we want to keep pre- and post-IDAT chunk info separated | ||||||
|  |      * (mainly for PNG-aware image editors and converters) */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* setjmp() must be called in every function that calls a PNG-reading | ||||||
|  |      * libpng function */ | ||||||
|  |  | ||||||
|  |     if (setjmp(png_jmpbuf(png_ptr))) { | ||||||
|  |         png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||||||
|  |         return 2; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     png_init_io(png_ptr, infile); | ||||||
|  |     png_set_sig_bytes(png_ptr, 8);  /* we already read the 8 signature bytes */ | ||||||
|  |  | ||||||
|  |     png_read_info(png_ptr, info_ptr);  /* read all PNG info up to image data */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* alternatively, could make separate calls to png_get_image_width(), | ||||||
|  |      * etc., but want bit_depth and color_type for later [don't care about | ||||||
|  |      * compression_type and filter_type => NULLs] */ | ||||||
|  |  | ||||||
|  |     png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, | ||||||
|  |       NULL, NULL, NULL); | ||||||
|  |     *pWidth = width; | ||||||
|  |     *pHeight = height; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* OK, that's all we need for now; return happy */ | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* returns 0 if succeeds, 1 if fails due to no bKGD chunk, 2 if libpng error; | ||||||
|  |  * scales values to 8-bit if necessary */ | ||||||
|  |  | ||||||
|  | int readpng_get_bgcolor(uch *red, uch *green, uch *blue) | ||||||
|  | { | ||||||
|  |     png_color_16p pBackground; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* setjmp() must be called in every function that calls a PNG-reading | ||||||
|  |      * libpng function */ | ||||||
|  |  | ||||||
|  |     if (setjmp(png_jmpbuf(png_ptr))) { | ||||||
|  |         png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||||||
|  |         return 2; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     if (!png_get_valid(png_ptr, info_ptr, PNG_INFO_bKGD)) | ||||||
|  |         return 1; | ||||||
|  |  | ||||||
|  |     /* it is not obvious from the libpng documentation, but this function | ||||||
|  |      * takes a pointer to a pointer, and it always returns valid red, green | ||||||
|  |      * and blue values, regardless of color_type: */ | ||||||
|  |  | ||||||
|  |     png_get_bKGD(png_ptr, info_ptr, &pBackground); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* however, it always returns the raw bKGD data, regardless of any | ||||||
|  |      * bit-depth transformations, so check depth and adjust if necessary */ | ||||||
|  |  | ||||||
|  |     if (bit_depth == 16) { | ||||||
|  |         *red   = pBackground->red   >> 8; | ||||||
|  |         *green = pBackground->green >> 8; | ||||||
|  |         *blue  = pBackground->blue  >> 8; | ||||||
|  |     } else if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) { | ||||||
|  |         if (bit_depth == 1) | ||||||
|  |             *red = *green = *blue = pBackground->gray? 255 : 0; | ||||||
|  |         else if (bit_depth == 2) | ||||||
|  |             *red = *green = *blue = (255/3) * pBackground->gray; | ||||||
|  |         else /* bit_depth == 4 */ | ||||||
|  |             *red = *green = *blue = (255/15) * pBackground->gray; | ||||||
|  |     } else { | ||||||
|  |         *red   = (uch)pBackground->red; | ||||||
|  |         *green = (uch)pBackground->green; | ||||||
|  |         *blue  = (uch)pBackground->blue; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* display_exponent == LUT_exponent * CRT_exponent */ | ||||||
|  |  | ||||||
|  | uch *readpng_get_image(double display_exponent, int *pChannels, ulg *pRowbytes) | ||||||
|  | { | ||||||
|  |     double  gamma; | ||||||
|  |     png_uint_32  i, rowbytes; | ||||||
|  |     png_bytepp  row_pointers = NULL; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* setjmp() must be called in every function that calls a PNG-reading | ||||||
|  |      * libpng function */ | ||||||
|  |  | ||||||
|  |     if (setjmp(png_jmpbuf(png_ptr))) { | ||||||
|  |         png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* expand palette images to RGB, low-bit-depth grayscale images to 8 bits, | ||||||
|  |      * transparency chunks to full alpha channel; strip 16-bit-per-sample | ||||||
|  |      * images to 8 bits per sample; and convert grayscale to RGB[A] */ | ||||||
|  |  | ||||||
|  |     if (color_type == PNG_COLOR_TYPE_PALETTE) | ||||||
|  |         png_set_expand(png_ptr); | ||||||
|  |     if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) | ||||||
|  |         png_set_expand(png_ptr); | ||||||
|  |     if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) | ||||||
|  |         png_set_expand(png_ptr); | ||||||
|  |     if (bit_depth == 16) | ||||||
|  |         png_set_strip_16(png_ptr); | ||||||
|  |     if (color_type == PNG_COLOR_TYPE_GRAY || | ||||||
|  |         color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | ||||||
|  |         png_set_gray_to_rgb(png_ptr); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* unlike the example in the libpng documentation, we have *no* idea where | ||||||
|  |      * this file may have come from--so if it doesn't have a file gamma, don't | ||||||
|  |      * do any correction ("do no harm") */ | ||||||
|  |  | ||||||
|  |     if (png_get_gAMA(png_ptr, info_ptr, &gamma)) | ||||||
|  |         png_set_gamma(png_ptr, display_exponent, gamma); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* all transformations have been registered; now update info_ptr data, | ||||||
|  |      * get rowbytes and channels, and allocate image memory */ | ||||||
|  |  | ||||||
|  |     png_read_update_info(png_ptr, info_ptr); | ||||||
|  |  | ||||||
|  |     *pRowbytes = rowbytes = png_get_rowbytes(png_ptr, info_ptr); | ||||||
|  |     *pChannels = (int)png_get_channels(png_ptr, info_ptr); | ||||||
|  |  | ||||||
|  |     if ((image_data = (uch *)malloc(rowbytes*height)) == NULL) { | ||||||
|  |         png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  |     if ((row_pointers = (png_bytepp)malloc(height*sizeof(png_bytep))) == NULL) { | ||||||
|  |         png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||||||
|  |         free(image_data); | ||||||
|  |         image_data = NULL; | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     Trace((stderr, "readpng_get_image:  channels = %d, rowbytes = %ld, height = %ld\n", *pChannels, rowbytes, height)); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* set the individual row_pointers to point at the correct offsets */ | ||||||
|  |  | ||||||
|  |     for (i = 0;  i < height;  ++i) | ||||||
|  |         row_pointers[i] = image_data + i*rowbytes; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* now we can go ahead and just read the whole image */ | ||||||
|  |  | ||||||
|  |     png_read_image(png_ptr, row_pointers); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* and we're done!  (png_read_end() can be omitted if no processing of | ||||||
|  |      * post-IDAT text/time/etc. is desired) */ | ||||||
|  |  | ||||||
|  |     free(row_pointers); | ||||||
|  |     row_pointers = NULL; | ||||||
|  |  | ||||||
|  |     png_read_end(png_ptr, NULL); | ||||||
|  |  | ||||||
|  |     return image_data; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void readpng_cleanup(int free_image_data) | ||||||
|  | { | ||||||
|  |     if (free_image_data && image_data) { | ||||||
|  |         free(image_data); | ||||||
|  |         image_data = NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (png_ptr && info_ptr) { | ||||||
|  |         png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||||||
|  |         png_ptr = NULL; | ||||||
|  |         info_ptr = NULL; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										64
									
								
								runtime/libpng/contrib/gregbook/readpng.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,64 @@ | |||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |    rpng - simple PNG display program                              readpng.h | ||||||
|  |  | ||||||
|  |   --------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |       Copyright (c) 1998-2000 Greg Roelofs.  All rights reserved. | ||||||
|  |  | ||||||
|  |       This software is provided "as is," without warranty of any kind, | ||||||
|  |       express or implied.  In no event shall the author or contributors | ||||||
|  |       be held liable for any damages arising in any way from the use of | ||||||
|  |       this software. | ||||||
|  |  | ||||||
|  |       Permission is granted to anyone to use this software for any purpose, | ||||||
|  |       including commercial applications, and to alter it and redistribute | ||||||
|  |       it freely, subject to the following restrictions: | ||||||
|  |  | ||||||
|  |       1. Redistributions of source code must retain the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions. | ||||||
|  |       2. Redistributions in binary form must reproduce the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions in the documenta- | ||||||
|  |          tion and/or other materials provided with the distribution. | ||||||
|  |       3. All advertising materials mentioning features or use of this | ||||||
|  |          software must display the following acknowledgment: | ||||||
|  |  | ||||||
|  |             This product includes software developed by Greg Roelofs | ||||||
|  |             and contributors for the book, "PNG: The Definitive Guide," | ||||||
|  |             published by O'Reilly and Associates. | ||||||
|  |  | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  | #ifndef TRUE | ||||||
|  | #  define TRUE 1 | ||||||
|  | #  define FALSE 0 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef MAX | ||||||
|  | #  define MAX(a,b)  ((a) > (b)? (a) : (b)) | ||||||
|  | #  define MIN(a,b)  ((a) < (b)? (a) : (b)) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef DEBUG | ||||||
|  | #  define Trace(x)  {fprintf x ; fflush(stderr); fflush(stdout);} | ||||||
|  | #else | ||||||
|  | #  define Trace(x)  ; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | typedef unsigned char   uch; | ||||||
|  | typedef unsigned short  ush; | ||||||
|  | typedef unsigned long   ulg; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* prototypes for public functions in readpng.c */ | ||||||
|  |  | ||||||
|  | void readpng_version_info(void); | ||||||
|  |  | ||||||
|  | int readpng_init(FILE *infile, ulg *pWidth, ulg *pHeight); | ||||||
|  |  | ||||||
|  | int readpng_get_bgcolor(uch *bg_red, uch *bg_green, uch *bg_blue); | ||||||
|  |  | ||||||
|  | uch *readpng_get_image(double display_exponent, int *pChannels, | ||||||
|  |                        ulg *pRowbytes); | ||||||
|  |  | ||||||
|  | void readpng_cleanup(int free_image_data); | ||||||
							
								
								
									
										624
									
								
								runtime/libpng/contrib/gregbook/readpng2.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,624 @@ | |||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |    rpng2 - progressive-model PNG display program                 readpng2.c | ||||||
|  |  | ||||||
|  |   --------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |    Changelog: | ||||||
|  |     - 1.01:  initial public release | ||||||
|  |     - 1.02:  added code to skip unused chunks (GR-P) | ||||||
|  |  | ||||||
|  |   --------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |       Copyright (c) 1998-2002 Greg Roelofs.  All rights reserved. | ||||||
|  |  | ||||||
|  |       This software is provided "as is," without warranty of any kind, | ||||||
|  |       express or implied.  In no event shall the author or contributors | ||||||
|  |       be held liable for any damages arising in any way from the use of | ||||||
|  |       this software. | ||||||
|  |  | ||||||
|  |       Permission is granted to anyone to use this software for any purpose, | ||||||
|  |       including commercial applications, and to alter it and redistribute | ||||||
|  |       it freely, subject to the following restrictions: | ||||||
|  |  | ||||||
|  |       1. Redistributions of source code must retain the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions. | ||||||
|  |       2. Redistributions in binary form must reproduce the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions in the documenta- | ||||||
|  |          tion and/or other materials provided with the distribution. | ||||||
|  |       3. All advertising materials mentioning features or use of this | ||||||
|  |          software must display the following acknowledgment: | ||||||
|  |  | ||||||
|  |             This product includes software developed by Greg Roelofs | ||||||
|  |             and contributors for the book, "PNG: The Definitive Guide," | ||||||
|  |             published by O'Reilly and Associates. | ||||||
|  |  | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #include <stdlib.h>     /* for exit() prototype */ | ||||||
|  |  | ||||||
|  | #include "png.h"        /* libpng header; includes zlib.h and setjmp.h */ | ||||||
|  | #include "readpng2.h"   /* typedefs, common macros, public prototypes */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* local prototypes */ | ||||||
|  |  | ||||||
|  | static void readpng2_info_callback(png_structp png_ptr, png_infop info_ptr); | ||||||
|  | static void readpng2_row_callback(png_structp png_ptr, png_bytep new_row, | ||||||
|  |                                  png_uint_32 row_num, int pass); | ||||||
|  | static void readpng2_end_callback(png_structp png_ptr, png_infop info_ptr); | ||||||
|  | static void readpng2_error_handler(png_structp png_ptr, png_const_charp msg); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void readpng2_version_info(void) | ||||||
|  | { | ||||||
|  | #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && \ | ||||||
|  |     (defined(__i386__) || defined(_M_IX86)) && \ | ||||||
|  |     defined(PNG_LIBPNG_VER) && (PNG_LIBPNG_VER >= 10200) | ||||||
|  |     /* | ||||||
|  |      * WARNING:  This preprocessor approach means that the following code | ||||||
|  |      *           cannot be used with a libpng DLL older than 1.2.0--the | ||||||
|  |      *           compiled-in symbols for the new functions will not exist. | ||||||
|  |      *           (Could use dlopen() and dlsym() on Unix and corresponding | ||||||
|  |      *           calls for Windows, but not portable...) | ||||||
|  |      */ | ||||||
|  |     { | ||||||
|  |         int mmxsupport = png_mmx_support(); | ||||||
|  |         if (mmxsupport < 0) | ||||||
|  |             fprintf(stderr, "   Compiled with libpng %s; using libpng %s " | ||||||
|  |               "without MMX support.\n", PNG_LIBPNG_VER_STRING, png_libpng_ver); | ||||||
|  |         else { | ||||||
|  |             int compilerID; | ||||||
|  |             png_uint_32 mmx_mask = png_get_mmx_flagmask( | ||||||
|  |               PNG_SELECT_READ | PNG_SELECT_WRITE, &compilerID); | ||||||
|  |  | ||||||
|  |             fprintf(stderr, "   Compiled with libpng %s; using libpng %s " | ||||||
|  |               "with MMX support\n   (%s version).", PNG_LIBPNG_VER_STRING, | ||||||
|  |               png_libpng_ver, compilerID == 1? "MSVC++" : | ||||||
|  |               (compilerID == 2? "GNU C" : "unknown")); | ||||||
|  |             fprintf(stderr, "  Processor %s MMX instructions.\n", | ||||||
|  |               mmxsupport? "supports" : "does not support"); | ||||||
|  |             if (mmxsupport > 0) { | ||||||
|  |                 int num_optims = 0; | ||||||
|  |  | ||||||
|  |                 fprintf(stderr, | ||||||
|  |                   "      Potential MMX optimizations supported by libpng:\n"); | ||||||
|  |                 if (mmx_mask & PNG_ASM_FLAG_MMX_READ_FILTER_SUB) | ||||||
|  |                     ++num_optims; | ||||||
|  |                 if (mmx_mask & PNG_ASM_FLAG_MMX_READ_FILTER_UP) | ||||||
|  |                     ++num_optims; | ||||||
|  |                 if (mmx_mask & PNG_ASM_FLAG_MMX_READ_FILTER_AVG) | ||||||
|  |                     ++num_optims; | ||||||
|  |                 if (mmx_mask & PNG_ASM_FLAG_MMX_READ_FILTER_PAETH) | ||||||
|  |                     ++num_optims; | ||||||
|  |                 if (num_optims) | ||||||
|  |                     fprintf(stderr, | ||||||
|  |                       "         decoding %s row filters (reading)\n", | ||||||
|  |                       (num_optims == 4)? "all non-trivial" : "some"); | ||||||
|  |                 if (mmx_mask & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) { | ||||||
|  |                     fprintf(stderr, "         combining rows (reading)\n"); | ||||||
|  |                     ++num_optims; | ||||||
|  |                 } | ||||||
|  |                 if (mmx_mask & PNG_ASM_FLAG_MMX_READ_INTERLACE) { | ||||||
|  |                     fprintf(stderr, | ||||||
|  |                       "         expanding interlacing (reading)\n"); | ||||||
|  |                     ++num_optims; | ||||||
|  |                 } | ||||||
|  |                 mmx_mask &= ~( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW  \ | ||||||
|  |                              | PNG_ASM_FLAG_MMX_READ_INTERLACE    \ | ||||||
|  |                              | PNG_ASM_FLAG_MMX_READ_FILTER_SUB   \ | ||||||
|  |                              | PNG_ASM_FLAG_MMX_READ_FILTER_UP    \ | ||||||
|  |                              | PNG_ASM_FLAG_MMX_READ_FILTER_AVG   \ | ||||||
|  |                              | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ); | ||||||
|  |                 if (mmx_mask) { | ||||||
|  |                     fprintf(stderr, "         other (unknown)\n"); | ||||||
|  |                     ++num_optims; | ||||||
|  |                 } | ||||||
|  |                 if (num_optims == 0) | ||||||
|  |                     fprintf(stderr, "         (none)\n"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | #else | ||||||
|  |     fprintf(stderr, "   Compiled with libpng %s; using libpng %s " | ||||||
|  |       "without MMX support.\n", PNG_LIBPNG_VER_STRING, png_libpng_ver); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     fprintf(stderr, "   Compiled with zlib %s; using zlib %s.\n", | ||||||
|  |       ZLIB_VERSION, zlib_version); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int readpng2_check_sig(uch *sig, int num) | ||||||
|  | { | ||||||
|  |     return png_check_sig(sig, num); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* returns 0 for success, 2 for libpng problem, 4 for out of memory */ | ||||||
|  |  | ||||||
|  | int readpng2_init(mainprog_info *mainprog_ptr) | ||||||
|  | { | ||||||
|  |     png_structp  png_ptr;       /* note:  temporary variables! */ | ||||||
|  |     png_infop  info_ptr; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* could also replace libpng warning-handler (final NULL), but no need: */ | ||||||
|  |  | ||||||
|  |     png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, mainprog_ptr, | ||||||
|  |       readpng2_error_handler, NULL); | ||||||
|  |     if (!png_ptr) | ||||||
|  |         return 4;   /* out of memory */ | ||||||
|  |  | ||||||
|  |     info_ptr = png_create_info_struct(png_ptr); | ||||||
|  |     if (!info_ptr) { | ||||||
|  |         png_destroy_read_struct(&png_ptr, NULL, NULL); | ||||||
|  |         return 4;   /* out of memory */ | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* we could create a second info struct here (end_info), but it's only | ||||||
|  |      * useful if we want to keep pre- and post-IDAT chunk info separated | ||||||
|  |      * (mainly for PNG-aware image editors and converters) */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* setjmp() must be called in every function that calls a PNG-reading | ||||||
|  |      * libpng function, unless an alternate error handler was installed-- | ||||||
|  |      * but compatible error handlers must either use longjmp() themselves | ||||||
|  |      * (as in this program) or exit immediately, so here we are: */ | ||||||
|  |  | ||||||
|  |     if (setjmp(mainprog_ptr->jmpbuf)) { | ||||||
|  |         png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||||||
|  |         return 2; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /* prepare the reader to ignore all recognized chunks whose data isn't | ||||||
|  |      * going to be used, i.e., all chunks recognized by libpng except for | ||||||
|  |      * IHDR, PLTE, IDAT, IEND, tRNS, bKGD, gAMA, and sRGB : */ | ||||||
|  |  | ||||||
|  | #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) | ||||||
|  |     { | ||||||
|  | #ifndef HANDLE_CHUNK_NEVER | ||||||
|  | /* prior to libpng-1.2.5, this macro was internal, so we define it here. */ | ||||||
|  | # define HANDLE_CHUNK_NEVER 1 | ||||||
|  | #endif | ||||||
|  |        /* these byte strings were copied from png.h. | ||||||
|  |         * If a future libpng version recognizes more chunks, add them | ||||||
|  |         * to this list.  If a future version of readpng2.c recognizes | ||||||
|  |         * more chunks, delete them from this list. */ | ||||||
|  |        png_byte png_chunk_types_to_ignore[]= | ||||||
|  |           { 99,  72,  82,  77, '\0', /* cHRM */ | ||||||
|  |            104,  73,  83,  84, '\0', /* hIST */ | ||||||
|  |            105,  67,  67,  80, '\0', /* iCCP */ | ||||||
|  |            105,  84,  88, 116, '\0', /* iTXt */ | ||||||
|  |            111,  70,  70, 115, '\0', /* oFFs */ | ||||||
|  |            112,  67,  65,  76, '\0', /* pCAL */ | ||||||
|  |            115,  67,  65,  76, '\0', /* sCAL */ | ||||||
|  |            112,  72,  89, 115, '\0', /* pHYs */ | ||||||
|  |            115,  66,  73,  84, '\0', /* sBIT */ | ||||||
|  |            115,  80,  76,  84, '\0', /* sPLT */ | ||||||
|  |            116,  69,  88, 116, '\0', /* tEXt */ | ||||||
|  |            116,  73,  77,  69, '\0', /* tIME */ | ||||||
|  |            122,  84,  88, 116, '\0'}; /* zTXt */ | ||||||
|  | #define NUM_PNG_CHUNK_TYPES_TO_IGNORE 13 | ||||||
|  |  | ||||||
|  |     png_set_keep_unknown_chunks(png_ptr, HANDLE_CHUNK_NEVER, | ||||||
|  |         png_chunk_types_to_ignore, NUM_PNG_CHUNK_TYPES_TO_IGNORE); | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     /* instead of doing png_init_io() here, now we set up our callback | ||||||
|  |      * functions for progressive decoding */ | ||||||
|  |  | ||||||
|  |     png_set_progressive_read_fn(png_ptr, mainprog_ptr, | ||||||
|  |       readpng2_info_callback, readpng2_row_callback, readpng2_end_callback); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* | ||||||
|  |      * may as well enable or disable MMX routines here, if supported; | ||||||
|  |      * | ||||||
|  |      * to enable all:  mask = png_get_mmx_flagmask ( | ||||||
|  |      *                   PNG_SELECT_READ | PNG_SELECT_WRITE, &compilerID); | ||||||
|  |      *                 flags = png_get_asm_flags (png_ptr); | ||||||
|  |      *                 flags |= mask; | ||||||
|  |      *                 png_set_asm_flags (png_ptr, flags); | ||||||
|  |      * | ||||||
|  |      * to disable all:  mask = png_get_mmx_flagmask ( | ||||||
|  |      *                   PNG_SELECT_READ | PNG_SELECT_WRITE, &compilerID); | ||||||
|  |      *                  flags = png_get_asm_flags (png_ptr); | ||||||
|  |      *                  flags &= ~mask; | ||||||
|  |      *                  png_set_asm_flags (png_ptr, flags); | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  | #if (defined(__i386__) || defined(_M_IX86)) && \ | ||||||
|  |     defined(PNG_LIBPNG_VER) && (PNG_LIBPNG_VER >= 10200) | ||||||
|  |     /* | ||||||
|  |      * WARNING:  This preprocessor approach means that the following code | ||||||
|  |      *           cannot be used with a libpng DLL older than 1.2.0--the | ||||||
|  |      *           compiled-in symbols for the new functions will not exist. | ||||||
|  |      *           (Could use dlopen() and dlsym() on Unix and corresponding | ||||||
|  |      *           calls for Windows, but not portable...) | ||||||
|  |      */ | ||||||
|  |     { | ||||||
|  | #ifdef PNG_ASSEMBLER_CODE_SUPPORTED | ||||||
|  |         png_uint_32 mmx_disable_mask = 0; | ||||||
|  |         png_uint_32 asm_flags, mmx_mask; | ||||||
|  |         int compilerID; | ||||||
|  |  | ||||||
|  |         if (mainprog_ptr->nommxfilters) | ||||||
|  |             mmx_disable_mask |= ( PNG_ASM_FLAG_MMX_READ_FILTER_SUB   \ | ||||||
|  |                                 | PNG_ASM_FLAG_MMX_READ_FILTER_UP    \ | ||||||
|  |                                 | PNG_ASM_FLAG_MMX_READ_FILTER_AVG   \ | ||||||
|  |                                 | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ); | ||||||
|  |         if (mainprog_ptr->nommxcombine) | ||||||
|  |             mmx_disable_mask |= PNG_ASM_FLAG_MMX_READ_COMBINE_ROW; | ||||||
|  |         if (mainprog_ptr->nommxinterlace) | ||||||
|  |             mmx_disable_mask |= PNG_ASM_FLAG_MMX_READ_INTERLACE; | ||||||
|  |         asm_flags = png_get_asm_flags(png_ptr); | ||||||
|  |         png_set_asm_flags(png_ptr, asm_flags & ~mmx_disable_mask); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         /* Now query libpng's asm settings, just for yuks.  Note that this | ||||||
|  |          * differs from the querying of its *potential* MMX capabilities | ||||||
|  |          * in readpng2_version_info(); this is true runtime verification. */ | ||||||
|  |  | ||||||
|  |         asm_flags = png_get_asm_flags(png_ptr); | ||||||
|  |         mmx_mask = png_get_mmx_flagmask(PNG_SELECT_READ | PNG_SELECT_WRITE, | ||||||
|  |           &compilerID); | ||||||
|  |         if (asm_flags & PNG_ASM_FLAG_MMX_SUPPORT_COMPILED) | ||||||
|  |             fprintf(stderr, | ||||||
|  |               "  MMX support (%s version) is compiled into libpng\n", | ||||||
|  |               compilerID == 1? "MSVC++" : | ||||||
|  |               (compilerID == 2? "GNU C" : "unknown")); | ||||||
|  |         else | ||||||
|  |             fprintf(stderr, "  MMX support is not compiled into libpng\n"); | ||||||
|  |         fprintf(stderr, "  MMX instructions are %ssupported by CPU\n", | ||||||
|  |           (asm_flags & PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU)? "" : "not "); | ||||||
|  |         fprintf(stderr, "  MMX read support for combining rows is %sabled\n", | ||||||
|  |           (asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW)? "en" : "dis"); | ||||||
|  |         fprintf(stderr, | ||||||
|  |           "  MMX read support for expanding interlacing is %sabled\n", | ||||||
|  |           (asm_flags & PNG_ASM_FLAG_MMX_READ_INTERLACE)? "en" : "dis"); | ||||||
|  |         fprintf(stderr, "  MMX read support for \"sub\" filter is %sabled\n", | ||||||
|  |           (asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_SUB)? "en" : "dis"); | ||||||
|  |         fprintf(stderr, "  MMX read support for \"up\" filter is %sabled\n", | ||||||
|  |           (asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_UP)? "en" : "dis"); | ||||||
|  |         fprintf(stderr, "  MMX read support for \"avg\" filter is %sabled\n", | ||||||
|  |           (asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_AVG)? "en" : "dis"); | ||||||
|  |         fprintf(stderr, "  MMX read support for \"Paeth\" filter is %sabled\n", | ||||||
|  |           (asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_PAETH)? "en" : "dis"); | ||||||
|  |         asm_flags &= (mmx_mask & ~( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW  \ | ||||||
|  |                                   | PNG_ASM_FLAG_MMX_READ_INTERLACE    \ | ||||||
|  |                                   | PNG_ASM_FLAG_MMX_READ_FILTER_SUB   \ | ||||||
|  |                                   | PNG_ASM_FLAG_MMX_READ_FILTER_UP    \ | ||||||
|  |                                   | PNG_ASM_FLAG_MMX_READ_FILTER_AVG   \ | ||||||
|  |                                   | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH )); | ||||||
|  |         if (asm_flags) | ||||||
|  |             fprintf(stderr, | ||||||
|  |               "  additional MMX support is also enabled (0x%02lx)\n", | ||||||
|  |               asm_flags); | ||||||
|  | #else  /* !PNG_ASSEMBLER_CODE_SUPPORTED */ | ||||||
|  |         fprintf(stderr, "  MMX querying is disabled in libpng.\n"); | ||||||
|  | #endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */ | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* make sure we save our pointers for use in readpng2_decode_data() */ | ||||||
|  |  | ||||||
|  |     mainprog_ptr->png_ptr = png_ptr; | ||||||
|  |     mainprog_ptr->info_ptr = info_ptr; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* and that's all there is to initialization */ | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* returns 0 for success, 2 for libpng (longjmp) problem */ | ||||||
|  |  | ||||||
|  | int readpng2_decode_data(mainprog_info *mainprog_ptr, uch *rawbuf, ulg length) | ||||||
|  | { | ||||||
|  |     png_structp png_ptr = (png_structp)mainprog_ptr->png_ptr; | ||||||
|  |     png_infop info_ptr = (png_infop)mainprog_ptr->info_ptr; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* setjmp() must be called in every function that calls a PNG-reading | ||||||
|  |      * libpng function */ | ||||||
|  |  | ||||||
|  |     if (setjmp(mainprog_ptr->jmpbuf)) { | ||||||
|  |         png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||||||
|  |         mainprog_ptr->png_ptr = NULL; | ||||||
|  |         mainprog_ptr->info_ptr = NULL; | ||||||
|  |         return 2; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* hand off the next chunk of input data to libpng for decoding */ | ||||||
|  |  | ||||||
|  |     png_process_data(png_ptr, info_ptr, rawbuf, length); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static void readpng2_info_callback(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |     mainprog_info  *mainprog_ptr; | ||||||
|  |     int  color_type, bit_depth; | ||||||
|  |     double  gamma; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* setjmp() doesn't make sense here, because we'd either have to exit(), | ||||||
|  |      * longjmp() ourselves, or return control to libpng, which doesn't want | ||||||
|  |      * to see us again.  By not doing anything here, libpng will instead jump | ||||||
|  |      * to readpng2_decode_data(), which can return an error value to the main | ||||||
|  |      * program. */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* retrieve the pointer to our special-purpose struct, using the png_ptr | ||||||
|  |      * that libpng passed back to us (i.e., not a global this time--there's | ||||||
|  |      * no real difference for a single image, but for a multithreaded browser | ||||||
|  |      * decoding several PNG images at the same time, one needs to avoid mixing | ||||||
|  |      * up different images' structs) */ | ||||||
|  |  | ||||||
|  |     mainprog_ptr = png_get_progressive_ptr(png_ptr); | ||||||
|  |  | ||||||
|  |     if (mainprog_ptr == NULL) {         /* we be hosed */ | ||||||
|  |         fprintf(stderr, | ||||||
|  |           "readpng2 error:  main struct not recoverable in info_callback.\n"); | ||||||
|  |         fflush(stderr); | ||||||
|  |         return; | ||||||
|  |         /* | ||||||
|  |          * Alternatively, we could call our error-handler just like libpng | ||||||
|  |          * does, which would effectively terminate the program.  Since this | ||||||
|  |          * can only happen if png_ptr gets redirected somewhere odd or the | ||||||
|  |          * main PNG struct gets wiped, we're probably toast anyway.  (If | ||||||
|  |          * png_ptr itself is NULL, we would not have been called.) | ||||||
|  |          */ | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* this is just like in the non-progressive case */ | ||||||
|  |  | ||||||
|  |     png_get_IHDR(png_ptr, info_ptr, &mainprog_ptr->width, | ||||||
|  |       &mainprog_ptr->height, &bit_depth, &color_type, NULL, NULL, NULL); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* since we know we've read all of the PNG file's "header" (i.e., up | ||||||
|  |      * to IDAT), we can check for a background color here */ | ||||||
|  |  | ||||||
|  |     if (mainprog_ptr->need_bgcolor && | ||||||
|  |         png_get_valid(png_ptr, info_ptr, PNG_INFO_bKGD)) | ||||||
|  |     { | ||||||
|  |         png_color_16p pBackground; | ||||||
|  |  | ||||||
|  |         /* it is not obvious from the libpng documentation, but this function | ||||||
|  |          * takes a pointer to a pointer, and it always returns valid red, | ||||||
|  |          * green and blue values, regardless of color_type: */ | ||||||
|  |         png_get_bKGD(png_ptr, info_ptr, &pBackground); | ||||||
|  |  | ||||||
|  |         /* however, it always returns the raw bKGD data, regardless of any | ||||||
|  |          * bit-depth transformations, so check depth and adjust if necessary */ | ||||||
|  |         if (bit_depth == 16) { | ||||||
|  |             mainprog_ptr->bg_red   = pBackground->red   >> 8; | ||||||
|  |             mainprog_ptr->bg_green = pBackground->green >> 8; | ||||||
|  |             mainprog_ptr->bg_blue  = pBackground->blue  >> 8; | ||||||
|  |         } else if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) { | ||||||
|  |             if (bit_depth == 1) | ||||||
|  |                 mainprog_ptr->bg_red = mainprog_ptr->bg_green = | ||||||
|  |                   mainprog_ptr->bg_blue = pBackground->gray? 255 : 0; | ||||||
|  |             else if (bit_depth == 2) | ||||||
|  |                 mainprog_ptr->bg_red = mainprog_ptr->bg_green = | ||||||
|  |                   mainprog_ptr->bg_blue = (255/3) * pBackground->gray; | ||||||
|  |             else /* bit_depth == 4 */ | ||||||
|  |                 mainprog_ptr->bg_red = mainprog_ptr->bg_green = | ||||||
|  |                   mainprog_ptr->bg_blue = (255/15) * pBackground->gray; | ||||||
|  |         } else { | ||||||
|  |             mainprog_ptr->bg_red   = (uch)pBackground->red; | ||||||
|  |             mainprog_ptr->bg_green = (uch)pBackground->green; | ||||||
|  |             mainprog_ptr->bg_blue  = (uch)pBackground->blue; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* as before, let libpng expand palette images to RGB, low-bit-depth | ||||||
|  |      * grayscale images to 8 bits, transparency chunks to full alpha channel; | ||||||
|  |      * strip 16-bit-per-sample images to 8 bits per sample; and convert | ||||||
|  |      * grayscale to RGB[A] */ | ||||||
|  |  | ||||||
|  |     if (color_type == PNG_COLOR_TYPE_PALETTE) | ||||||
|  |         png_set_expand(png_ptr); | ||||||
|  |     if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) | ||||||
|  |         png_set_expand(png_ptr); | ||||||
|  |     if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) | ||||||
|  |         png_set_expand(png_ptr); | ||||||
|  |     if (bit_depth == 16) | ||||||
|  |         png_set_strip_16(png_ptr); | ||||||
|  |     if (color_type == PNG_COLOR_TYPE_GRAY || | ||||||
|  |         color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | ||||||
|  |         png_set_gray_to_rgb(png_ptr); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* Unlike the basic viewer, which was designed to operate on local files, | ||||||
|  |      * this program is intended to simulate a web browser--even though we | ||||||
|  |      * actually read from a local file, too.  But because we are pretending | ||||||
|  |      * that most of the images originate on the Internet, we follow the recom- | ||||||
|  |      * mendation of the sRGB proposal and treat unlabelled images (no gAMA | ||||||
|  |      * chunk) as existing in the sRGB color space.  That is, we assume that | ||||||
|  |      * such images have a file gamma of 0.45455, which corresponds to a PC-like | ||||||
|  |      * display system.  This change in assumptions will have no effect on a | ||||||
|  |      * PC-like system, but on a Mac, SGI, NeXT or other system with a non- | ||||||
|  |      * identity lookup table, it will darken unlabelled images, which effec- | ||||||
|  |      * tively favors images from PC-like systems over those originating on | ||||||
|  |      * the local platform.  Note that mainprog_ptr->display_exponent is the | ||||||
|  |      * "gamma" value for the entire display system, i.e., the product of | ||||||
|  |      * LUT_exponent and CRT_exponent. */ | ||||||
|  |  | ||||||
|  |     if (png_get_gAMA(png_ptr, info_ptr, &gamma)) | ||||||
|  |         png_set_gamma(png_ptr, mainprog_ptr->display_exponent, gamma); | ||||||
|  |     else | ||||||
|  |         png_set_gamma(png_ptr, mainprog_ptr->display_exponent, 0.45455); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* we'll let libpng expand interlaced images, too */ | ||||||
|  |  | ||||||
|  |     mainprog_ptr->passes = png_set_interlace_handling(png_ptr); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* all transformations have been registered; now update info_ptr data and | ||||||
|  |      * then get rowbytes and channels */ | ||||||
|  |  | ||||||
|  |     png_read_update_info(png_ptr, info_ptr); | ||||||
|  |  | ||||||
|  |     mainprog_ptr->rowbytes = (int)png_get_rowbytes(png_ptr, info_ptr); | ||||||
|  |     mainprog_ptr->channels = png_get_channels(png_ptr, info_ptr); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* Call the main program to allocate memory for the image buffer and | ||||||
|  |      * initialize windows and whatnot.  (The old-style function-pointer | ||||||
|  |      * invocation is used for compatibility with a few supposedly ANSI | ||||||
|  |      * compilers that nevertheless barf on "fn_ptr()"-style syntax.) */ | ||||||
|  |  | ||||||
|  |     (*mainprog_ptr->mainprog_init)(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* and that takes care of initialization */ | ||||||
|  |  | ||||||
|  |     return; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static void readpng2_row_callback(png_structp png_ptr, png_bytep new_row, | ||||||
|  |                                   png_uint_32 row_num, int pass) | ||||||
|  | { | ||||||
|  |     mainprog_info  *mainprog_ptr; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* first check whether the row differs from the previous pass; if not, | ||||||
|  |      * nothing to combine or display */ | ||||||
|  |  | ||||||
|  |     if (!new_row) | ||||||
|  |         return; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* retrieve the pointer to our special-purpose struct so we can access | ||||||
|  |      * the old rows and image-display callback function */ | ||||||
|  |  | ||||||
|  |     mainprog_ptr = png_get_progressive_ptr(png_ptr); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* save the pass number for optional use by the front end */ | ||||||
|  |  | ||||||
|  |     mainprog_ptr->pass = pass; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* have libpng either combine the new row data with the existing row data | ||||||
|  |      * from previous passes (if interlaced) or else just copy the new row | ||||||
|  |      * into the main program's image buffer */ | ||||||
|  |  | ||||||
|  |     png_progressive_combine_row(png_ptr, mainprog_ptr->row_pointers[row_num], | ||||||
|  |       new_row); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* finally, call the display routine in the main program with the number | ||||||
|  |      * of the row we just updated */ | ||||||
|  |  | ||||||
|  |     (*mainprog_ptr->mainprog_display_row)(row_num); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* and we're ready for more */ | ||||||
|  |  | ||||||
|  |     return; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static void readpng2_end_callback(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |     mainprog_info  *mainprog_ptr; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* retrieve the pointer to our special-purpose struct */ | ||||||
|  |  | ||||||
|  |     mainprog_ptr = png_get_progressive_ptr(png_ptr); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* let the main program know that it should flush any buffered image | ||||||
|  |      * data to the display now and set a "done" flag or whatever, but note | ||||||
|  |      * that it SHOULD NOT DESTROY THE PNG STRUCTS YET--in other words, do | ||||||
|  |      * NOT call readpng2_cleanup() either here or in the finish_display() | ||||||
|  |      * routine; wait until control returns to the main program via | ||||||
|  |      * readpng2_decode_data() */ | ||||||
|  |  | ||||||
|  |     (*mainprog_ptr->mainprog_finish_display)(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* all done */ | ||||||
|  |  | ||||||
|  |     return; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void readpng2_cleanup(mainprog_info *mainprog_ptr) | ||||||
|  | { | ||||||
|  |     png_structp png_ptr = (png_structp)mainprog_ptr->png_ptr; | ||||||
|  |     png_infop info_ptr = (png_infop)mainprog_ptr->info_ptr; | ||||||
|  |  | ||||||
|  |     if (png_ptr && info_ptr) | ||||||
|  |         png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||||||
|  |  | ||||||
|  |     mainprog_ptr->png_ptr = NULL; | ||||||
|  |     mainprog_ptr->info_ptr = NULL; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static void readpng2_error_handler(png_structp png_ptr, png_const_charp msg) | ||||||
|  | { | ||||||
|  |     mainprog_info  *mainprog_ptr; | ||||||
|  |  | ||||||
|  |     /* This function, aside from the extra step of retrieving the "error | ||||||
|  |      * pointer" (below) and the fact that it exists within the application | ||||||
|  |      * rather than within libpng, is essentially identical to libpng's | ||||||
|  |      * default error handler.  The second point is critical:  since both | ||||||
|  |      * setjmp() and longjmp() are called from the same code, they are | ||||||
|  |      * guaranteed to have compatible notions of how big a jmp_buf is, | ||||||
|  |      * regardless of whether _BSD_SOURCE or anything else has (or has not) | ||||||
|  |      * been defined. */ | ||||||
|  |  | ||||||
|  |     fprintf(stderr, "readpng2 libpng error: %s\n", msg); | ||||||
|  |     fflush(stderr); | ||||||
|  |  | ||||||
|  |     mainprog_ptr = png_get_error_ptr(png_ptr); | ||||||
|  |     if (mainprog_ptr == NULL) {         /* we are completely hosed now */ | ||||||
|  |         fprintf(stderr, | ||||||
|  |           "readpng2 severe error:  jmpbuf not recoverable; terminating.\n"); | ||||||
|  |         fflush(stderr); | ||||||
|  |         exit(99); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     longjmp(mainprog_ptr->jmpbuf, 1); | ||||||
|  | } | ||||||
							
								
								
									
										91
									
								
								runtime/libpng/contrib/gregbook/readpng2.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,91 @@ | |||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |    rpng2 - progressive-model PNG display program                 readpng2.h | ||||||
|  |  | ||||||
|  |   --------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |       Copyright (c) 1998-2001 Greg Roelofs.  All rights reserved. | ||||||
|  |  | ||||||
|  |       This software is provided "as is," without warranty of any kind, | ||||||
|  |       express or implied.  In no event shall the author or contributors | ||||||
|  |       be held liable for any damages arising in any way from the use of | ||||||
|  |       this software. | ||||||
|  |  | ||||||
|  |       Permission is granted to anyone to use this software for any purpose, | ||||||
|  |       including commercial applications, and to alter it and redistribute | ||||||
|  |       it freely, subject to the following restrictions: | ||||||
|  |  | ||||||
|  |       1. Redistributions of source code must retain the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions. | ||||||
|  |       2. Redistributions in binary form must reproduce the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions in the documenta- | ||||||
|  |          tion and/or other materials provided with the distribution. | ||||||
|  |       3. All advertising materials mentioning features or use of this | ||||||
|  |          software must display the following acknowledgment: | ||||||
|  |  | ||||||
|  |             This product includes software developed by Greg Roelofs | ||||||
|  |             and contributors for the book, "PNG: The Definitive Guide," | ||||||
|  |             published by O'Reilly and Associates. | ||||||
|  |  | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  | #ifndef TRUE | ||||||
|  | #  define TRUE 1 | ||||||
|  | #  define FALSE 0 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef MAX | ||||||
|  | #  define MAX(a,b)  ((a) > (b)? (a) : (b)) | ||||||
|  | #  define MIN(a,b)  ((a) < (b)? (a) : (b)) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef DEBUG | ||||||
|  | #  define Trace(x)  {fprintf x ; fflush(stderr); fflush(stdout);} | ||||||
|  | #else | ||||||
|  | #  define Trace(x)  ; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | typedef unsigned char   uch; | ||||||
|  | typedef unsigned short  ush; | ||||||
|  | typedef unsigned long   ulg; | ||||||
|  |  | ||||||
|  | typedef struct _mainprog_info { | ||||||
|  |     double display_exponent; | ||||||
|  |     ulg width; | ||||||
|  |     ulg height; | ||||||
|  |     void *png_ptr; | ||||||
|  |     void *info_ptr; | ||||||
|  |     void (*mainprog_init)(void); | ||||||
|  |     void (*mainprog_display_row)(ulg row_num); | ||||||
|  |     void (*mainprog_finish_display)(void); | ||||||
|  |     uch *image_data; | ||||||
|  |     uch **row_pointers; | ||||||
|  |     jmp_buf jmpbuf; | ||||||
|  |     int passes;              /* not used */ | ||||||
|  |     int pass; | ||||||
|  |     int rowbytes; | ||||||
|  |     int channels; | ||||||
|  |     int need_bgcolor; | ||||||
|  | #if (defined(__i386__) || defined(_M_IX86)) | ||||||
|  |     int nommxfilters; | ||||||
|  |     int nommxcombine; | ||||||
|  |     int nommxinterlace; | ||||||
|  | #endif | ||||||
|  |     int done; | ||||||
|  |     uch bg_red; | ||||||
|  |     uch bg_green; | ||||||
|  |     uch bg_blue; | ||||||
|  | } mainprog_info; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* prototypes for public functions in readpng2.c */ | ||||||
|  |  | ||||||
|  | void readpng2_version_info(void); | ||||||
|  |  | ||||||
|  | int readpng2_check_sig(uch *sig, int num); | ||||||
|  |  | ||||||
|  | int readpng2_init(mainprog_info *mainprog_ptr); | ||||||
|  |  | ||||||
|  | int readpng2_decode_data(mainprog_info *mainprog_ptr, uch *rawbuf, ulg length); | ||||||
|  |  | ||||||
|  | void readpng2_cleanup(mainprog_info *mainprog_ptr); | ||||||
							
								
								
									
										642
									
								
								runtime/libpng/contrib/gregbook/rpng-win.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,642 @@ | |||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |    rpng - simple PNG display program                             rpng-win.c | ||||||
|  |  | ||||||
|  |    This program decodes and displays PNG images, with gamma correction and | ||||||
|  |    optionally with a user-specified background color (in case the image has | ||||||
|  |    transparency).  It is very nearly the most basic PNG viewer possible. | ||||||
|  |    This version is for 32-bit Windows; it may compile under 16-bit Windows | ||||||
|  |    with a little tweaking (or maybe not). | ||||||
|  |  | ||||||
|  |    to do: | ||||||
|  |     - handle quoted command-line args (especially filenames with spaces) | ||||||
|  |     - have minimum window width:  oh well | ||||||
|  |     - use %.1023s to simplify truncation of title-bar string? | ||||||
|  |  | ||||||
|  |   --------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |    Changelog: | ||||||
|  |     - 1.00:  initial public release | ||||||
|  |     - 1.01:  modified to allow abbreviated options; fixed long/ulong mis- | ||||||
|  |               match; switched to png_jmpbuf() macro | ||||||
|  |     - 1.02:  added extra set of parentheses to png_jmpbuf() macro; fixed | ||||||
|  |               command-line parsing bug | ||||||
|  |     - 1.10:  enabled "message window"/console (thanks to David Geldreich) | ||||||
|  |  | ||||||
|  |   --------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |       Copyright (c) 1998-2001 Greg Roelofs.  All rights reserved. | ||||||
|  |  | ||||||
|  |       This software is provided "as is," without warranty of any kind, | ||||||
|  |       express or implied.  In no event shall the author or contributors | ||||||
|  |       be held liable for any damages arising in any way from the use of | ||||||
|  |       this software. | ||||||
|  |  | ||||||
|  |       Permission is granted to anyone to use this software for any purpose, | ||||||
|  |       including commercial applications, and to alter it and redistribute | ||||||
|  |       it freely, subject to the following restrictions: | ||||||
|  |  | ||||||
|  |       1. Redistributions of source code must retain the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions. | ||||||
|  |       2. Redistributions in binary form must reproduce the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions in the documenta- | ||||||
|  |          tion and/or other materials provided with the distribution. | ||||||
|  |       3. All advertising materials mentioning features or use of this | ||||||
|  |          software must display the following acknowledgment: | ||||||
|  |  | ||||||
|  |             This product includes software developed by Greg Roelofs | ||||||
|  |             and contributors for the book, "PNG: The Definitive Guide," | ||||||
|  |             published by O'Reilly and Associates. | ||||||
|  |  | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  | #define PROGNAME  "rpng-win" | ||||||
|  | #define LONGNAME  "Simple PNG Viewer for Windows" | ||||||
|  | #define VERSION   "1.20 of 28 May 2001" | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <time.h> | ||||||
|  | #include <windows.h> | ||||||
|  | #include <conio.h>      /* only for _getch() */ | ||||||
|  |  | ||||||
|  | /* #define DEBUG  :  this enables the Trace() macros */ | ||||||
|  |  | ||||||
|  | #include "readpng.h"    /* typedefs, common macros, readpng prototypes */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* could just include png.h, but this macro is the only thing we need | ||||||
|  |  * (name and typedefs changed to local versions); note that side effects | ||||||
|  |  * only happen with alpha (which could easily be avoided with | ||||||
|  |  * "ush acopy = (alpha);") */ | ||||||
|  |  | ||||||
|  | #define alpha_composite(composite, fg, alpha, bg) {               \ | ||||||
|  |     ush temp = ((ush)(fg)*(ush)(alpha) +                          \ | ||||||
|  |                 (ush)(bg)*(ush)(255 - (ush)(alpha)) + (ush)128);  \ | ||||||
|  |     (composite) = (uch)((temp + (temp >> 8)) >> 8);               \ | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* local prototypes */ | ||||||
|  | static int        rpng_win_create_window(HINSTANCE hInst, int showmode); | ||||||
|  | static int        rpng_win_display_image(void); | ||||||
|  | static void       rpng_win_cleanup(void); | ||||||
|  | LRESULT CALLBACK  rpng_win_wndproc(HWND, UINT, WPARAM, LPARAM); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static char titlebar[1024], *window_name = titlebar; | ||||||
|  | static char *progname = PROGNAME; | ||||||
|  | static char *appname = LONGNAME; | ||||||
|  | static char *icon_name = PROGNAME;     /* GRR:  not (yet) used */ | ||||||
|  | static char *filename; | ||||||
|  | static FILE *infile; | ||||||
|  |  | ||||||
|  | static char *bgstr; | ||||||
|  | static uch bg_red=0, bg_green=0, bg_blue=0; | ||||||
|  |  | ||||||
|  | static double display_exponent; | ||||||
|  |  | ||||||
|  | static ulg image_width, image_height, image_rowbytes; | ||||||
|  | static int image_channels; | ||||||
|  | static uch *image_data; | ||||||
|  |  | ||||||
|  | /* Windows-specific variables */ | ||||||
|  | static ulg wimage_rowbytes; | ||||||
|  | static uch *dib; | ||||||
|  | static uch *wimage_data; | ||||||
|  | static BITMAPINFOHEADER *bmih; | ||||||
|  |  | ||||||
|  | static HWND global_hwnd; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, PSTR cmd, int showmode) | ||||||
|  | { | ||||||
|  |     char *args[1024];                 /* arbitrary limit, but should suffice */ | ||||||
|  |     char *p, *q, **argv = args; | ||||||
|  |     int argc = 0; | ||||||
|  |     int rc, alen, flen; | ||||||
|  |     int error = 0; | ||||||
|  |     int have_bg = FALSE; | ||||||
|  |     double LUT_exponent;              /* just the lookup table */ | ||||||
|  |     double CRT_exponent = 2.2;        /* just the monitor */ | ||||||
|  |     double default_display_exponent;  /* whole display system */ | ||||||
|  |     MSG msg; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     filename = (char *)NULL; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* First reenable console output, which normally goes to the bit bucket | ||||||
|  |      * for windowed apps.  Closing the console window will terminate the | ||||||
|  |      * app.  Thanks to David.Geldreich@realviz.com for supplying the magical | ||||||
|  |      * incantation. */ | ||||||
|  |  | ||||||
|  |     AllocConsole(); | ||||||
|  |     freopen("CONOUT$", "a", stderr); | ||||||
|  |     freopen("CONOUT$", "a", stdout); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* Next set the default value for our display-system exponent, i.e., | ||||||
|  |      * the product of the CRT exponent and the exponent corresponding to | ||||||
|  |      * the frame-buffer's lookup table (LUT), if any.  This is not an | ||||||
|  |      * exhaustive list of LUT values (e.g., OpenStep has a lot of weird | ||||||
|  |      * ones), but it should cover 99% of the current possibilities.  And | ||||||
|  |      * yes, these ifdefs are completely wasted in a Windows program... */ | ||||||
|  |  | ||||||
|  | #if defined(NeXT) | ||||||
|  |     LUT_exponent = 1.0 / 2.2; | ||||||
|  |     /* | ||||||
|  |     if (some_next_function_that_returns_gamma(&next_gamma)) | ||||||
|  |         LUT_exponent = 1.0 / next_gamma; | ||||||
|  |      */ | ||||||
|  | #elif defined(sgi) | ||||||
|  |     LUT_exponent = 1.0 / 1.7; | ||||||
|  |     /* there doesn't seem to be any documented function to get the | ||||||
|  |      * "gamma" value, so we do it the hard way */ | ||||||
|  |     infile = fopen("/etc/config/system.glGammaVal", "r"); | ||||||
|  |     if (infile) { | ||||||
|  |         double sgi_gamma; | ||||||
|  |  | ||||||
|  |         fgets(tmpline, 80, infile); | ||||||
|  |         fclose(infile); | ||||||
|  |         sgi_gamma = atof(tmpline); | ||||||
|  |         if (sgi_gamma > 0.0) | ||||||
|  |             LUT_exponent = 1.0 / sgi_gamma; | ||||||
|  |     } | ||||||
|  | #elif defined(Macintosh) | ||||||
|  |     LUT_exponent = 1.8 / 2.61; | ||||||
|  |     /* | ||||||
|  |     if (some_mac_function_that_returns_gamma(&mac_gamma)) | ||||||
|  |         LUT_exponent = mac_gamma / 2.61; | ||||||
|  |      */ | ||||||
|  | #else | ||||||
|  |     LUT_exponent = 1.0;   /* assume no LUT:  most PCs */ | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     /* the defaults above give 1.0, 1.3, 1.5 and 2.2, respectively: */ | ||||||
|  |     default_display_exponent = LUT_exponent * CRT_exponent; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* If the user has set the SCREEN_GAMMA environment variable as suggested | ||||||
|  |      * (somewhat imprecisely) in the libpng documentation, use that; otherwise | ||||||
|  |      * use the default value we just calculated.  Either way, the user may | ||||||
|  |      * override this via a command-line option. */ | ||||||
|  |  | ||||||
|  |     if ((p = getenv("SCREEN_GAMMA")) != NULL) | ||||||
|  |         display_exponent = atof(p); | ||||||
|  |     else | ||||||
|  |         display_exponent = default_display_exponent; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* Windows really hates command lines, so we have to set up our own argv. | ||||||
|  |      * Note that we do NOT bother with quoted arguments here, so don't use | ||||||
|  |      * filenames with spaces in 'em! */ | ||||||
|  |  | ||||||
|  |     argv[argc++] = PROGNAME; | ||||||
|  |     p = cmd; | ||||||
|  |     for (;;) { | ||||||
|  |         if (*p == ' ') | ||||||
|  |             while (*++p == ' ') | ||||||
|  |                 ; | ||||||
|  |         /* now p points at the first non-space after some spaces */ | ||||||
|  |         if (*p == '\0') | ||||||
|  |             break;    /* nothing after the spaces:  done */ | ||||||
|  |         argv[argc++] = q = p; | ||||||
|  |         while (*q && *q != ' ') | ||||||
|  |             ++q; | ||||||
|  |         /* now q points at a space or the end of the string */ | ||||||
|  |         if (*q == '\0') | ||||||
|  |             break;    /* last argv already terminated; quit */ | ||||||
|  |         *q = '\0';    /* change space to terminator */ | ||||||
|  |         p = q + 1; | ||||||
|  |     } | ||||||
|  |     argv[argc] = NULL;   /* terminate the argv array itself */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* Now parse the command line for options and the PNG filename. */ | ||||||
|  |  | ||||||
|  |     while (*++argv && !error) { | ||||||
|  |         if (!strncmp(*argv, "-gamma", 2)) { | ||||||
|  |             if (!*++argv) | ||||||
|  |                 ++error; | ||||||
|  |             else { | ||||||
|  |                 display_exponent = atof(*argv); | ||||||
|  |                 if (display_exponent <= 0.0) | ||||||
|  |                     ++error; | ||||||
|  |             } | ||||||
|  |         } else if (!strncmp(*argv, "-bgcolor", 2)) { | ||||||
|  |             if (!*++argv) | ||||||
|  |                 ++error; | ||||||
|  |             else { | ||||||
|  |                 bgstr = *argv; | ||||||
|  |                 if (strlen(bgstr) != 7 || bgstr[0] != '#') | ||||||
|  |                     ++error; | ||||||
|  |                 else | ||||||
|  |                     have_bg = TRUE; | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             if (**argv != '-') { | ||||||
|  |                 filename = *argv; | ||||||
|  |                 if (argv[1])   /* shouldn't be any more args after filename */ | ||||||
|  |                     ++error; | ||||||
|  |             } else | ||||||
|  |                 ++error;   /* not expecting any other options */ | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (!filename) { | ||||||
|  |         ++error; | ||||||
|  |     } else if (!(infile = fopen(filename, "rb"))) { | ||||||
|  |         fprintf(stderr, PROGNAME ":  can't open PNG file [%s]\n", filename); | ||||||
|  |         ++error; | ||||||
|  |     } else { | ||||||
|  |         if ((rc = readpng_init(infile, &image_width, &image_height)) != 0) { | ||||||
|  |             switch (rc) { | ||||||
|  |                 case 1: | ||||||
|  |                     fprintf(stderr, PROGNAME | ||||||
|  |                       ":  [%s] is not a PNG file: incorrect signature\n", | ||||||
|  |                       filename); | ||||||
|  |                     break; | ||||||
|  |                 case 2: | ||||||
|  |                     fprintf(stderr, PROGNAME | ||||||
|  |                       ":  [%s] has bad IHDR (libpng longjmp)\n", | ||||||
|  |                       filename); | ||||||
|  |                     break; | ||||||
|  |                 case 4: | ||||||
|  |                     fprintf(stderr, PROGNAME ":  insufficient memory\n"); | ||||||
|  |                     break; | ||||||
|  |                 default: | ||||||
|  |                     fprintf(stderr, PROGNAME | ||||||
|  |                       ":  unknown readpng_init() error\n"); | ||||||
|  |                     break; | ||||||
|  |             } | ||||||
|  |             ++error; | ||||||
|  |         } | ||||||
|  |         if (error) | ||||||
|  |             fclose(infile); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* usage screen */ | ||||||
|  |  | ||||||
|  |     if (error) { | ||||||
|  |         int ch; | ||||||
|  |  | ||||||
|  |         fprintf(stderr, "\n%s %s:  %s\n\n", PROGNAME, VERSION, appname); | ||||||
|  |         readpng_version_info(); | ||||||
|  |         fprintf(stderr, "\n" | ||||||
|  |           "Usage:  %s [-gamma exp] [-bgcolor bg] file.png\n" | ||||||
|  |           "    exp \ttransfer-function exponent (``gamma'') of the display\n" | ||||||
|  |           "\t\t  system in floating-point format (e.g., ``%.1f''); equal\n" | ||||||
|  |           "\t\t  to the product of the lookup-table exponent (varies)\n" | ||||||
|  |           "\t\t  and the CRT exponent (usually 2.2); must be positive\n" | ||||||
|  |           "    bg  \tdesired background color in 7-character hex RGB format\n" | ||||||
|  |           "\t\t  (e.g., ``#ff7700'' for orange:  same as HTML colors);\n" | ||||||
|  |           "\t\t  used with transparent images\n" | ||||||
|  |           "\nPress Q, Esc or mouse button 1 after image is displayed to quit.\n" | ||||||
|  |           "Press Q or Esc to quit this usage screen.\n" | ||||||
|  |           "\n", PROGNAME, default_display_exponent); | ||||||
|  |         do | ||||||
|  |             ch = _getch(); | ||||||
|  |         while (ch != 'q' && ch != 'Q' && ch != 0x1B); | ||||||
|  |         exit(1); | ||||||
|  |     } else { | ||||||
|  |         fprintf(stderr, "\n%s %s:  %s\n", PROGNAME, VERSION, appname); | ||||||
|  |         fprintf(stderr, | ||||||
|  |           "\n   [console window:  closing this window will terminate %s]\n\n", | ||||||
|  |           PROGNAME); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* set the title-bar string, but make sure buffer doesn't overflow */ | ||||||
|  |  | ||||||
|  |     alen = strlen(appname); | ||||||
|  |     flen = strlen(filename); | ||||||
|  |     if (alen + flen + 3 > 1023) | ||||||
|  |         sprintf(titlebar, "%s:  ...%s", appname, filename+(alen+flen+6-1023)); | ||||||
|  |     else | ||||||
|  |         sprintf(titlebar, "%s:  %s", appname, filename); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* if the user didn't specify a background color on the command line, | ||||||
|  |      * check for one in the PNG file--if not, the initialized values of 0 | ||||||
|  |      * (black) will be used */ | ||||||
|  |  | ||||||
|  |     if (have_bg) | ||||||
|  |         sscanf(bgstr+1, "%2x%2x%2x", &bg_red, &bg_green, &bg_blue); | ||||||
|  |     else if (readpng_get_bgcolor(&bg_red, &bg_green, &bg_blue) > 1) { | ||||||
|  |         readpng_cleanup(TRUE); | ||||||
|  |         fprintf(stderr, PROGNAME | ||||||
|  |           ":  libpng error while checking for background color\n"); | ||||||
|  |         exit(2); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* do the basic Windows initialization stuff, make the window and fill it | ||||||
|  |      * with the background color */ | ||||||
|  |  | ||||||
|  |     if (rpng_win_create_window(hInst, showmode)) | ||||||
|  |         exit(2); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* decode the image, all at once */ | ||||||
|  |  | ||||||
|  |     Trace((stderr, "calling readpng_get_image()\n")) | ||||||
|  |     image_data = readpng_get_image(display_exponent, &image_channels, | ||||||
|  |       &image_rowbytes); | ||||||
|  |     Trace((stderr, "done with readpng_get_image()\n")) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* done with PNG file, so clean up to minimize memory usage (but do NOT | ||||||
|  |      * nuke image_data!) */ | ||||||
|  |  | ||||||
|  |     readpng_cleanup(FALSE); | ||||||
|  |     fclose(infile); | ||||||
|  |  | ||||||
|  |     if (!image_data) { | ||||||
|  |         fprintf(stderr, PROGNAME ":  unable to decode PNG image\n"); | ||||||
|  |         exit(3); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* display image (composite with background if requested) */ | ||||||
|  |  | ||||||
|  |     Trace((stderr, "calling rpng_win_display_image()\n")) | ||||||
|  |     if (rpng_win_display_image()) { | ||||||
|  |         free(image_data); | ||||||
|  |         exit(4); | ||||||
|  |     } | ||||||
|  |     Trace((stderr, "done with rpng_win_display_image()\n")) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* wait for the user to tell us when to quit */ | ||||||
|  |  | ||||||
|  |     printf( | ||||||
|  |       "Done.  Press Q, Esc or mouse button 1 (within image window) to quit.\n"); | ||||||
|  |     fflush(stdout); | ||||||
|  |  | ||||||
|  |     while (GetMessage(&msg, NULL, 0, 0)) { | ||||||
|  |         TranslateMessage(&msg); | ||||||
|  |         DispatchMessage(&msg); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* OK, we're done:  clean up all image and Windows resources and go away */ | ||||||
|  |  | ||||||
|  |     rpng_win_cleanup(); | ||||||
|  |  | ||||||
|  |     return msg.wParam; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static int rpng_win_create_window(HINSTANCE hInst, int showmode) | ||||||
|  | { | ||||||
|  |     uch *dest; | ||||||
|  |     int extra_width, extra_height; | ||||||
|  |     ulg i, j; | ||||||
|  |     WNDCLASSEX wndclass; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |     Allocate memory for the display-specific version of the image (round up | ||||||
|  |     to multiple of 4 for Windows DIB). | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  |     wimage_rowbytes = ((3*image_width + 3L) >> 2) << 2; | ||||||
|  |  | ||||||
|  |     if (!(dib = (uch *)malloc(sizeof(BITMAPINFOHEADER) + | ||||||
|  |                               wimage_rowbytes*image_height))) | ||||||
|  |     { | ||||||
|  |         return 4;   /* fail */ | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |     Initialize the DIB.  Negative height means to use top-down BMP ordering | ||||||
|  |     (must be uncompressed, but that's what we want).  Bit count of 1, 4 or 8 | ||||||
|  |     implies a colormap of RGBX quads, but 24-bit BMPs just use B,G,R values | ||||||
|  |     directly => wimage_data begins immediately after BMP header. | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  |     memset(dib, 0, sizeof(BITMAPINFOHEADER)); | ||||||
|  |     bmih = (BITMAPINFOHEADER *)dib; | ||||||
|  |     bmih->biSize = sizeof(BITMAPINFOHEADER); | ||||||
|  |     bmih->biWidth = image_width; | ||||||
|  |     bmih->biHeight = -((long)image_height); | ||||||
|  |     bmih->biPlanes = 1; | ||||||
|  |     bmih->biBitCount = 24; | ||||||
|  |     bmih->biCompression = 0; | ||||||
|  |     wimage_data = dib + sizeof(BITMAPINFOHEADER); | ||||||
|  |  | ||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |     Fill in background color (black by default); data are in BGR order. | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  |     for (j = 0;  j < image_height;  ++j) { | ||||||
|  |         dest = wimage_data + j*wimage_rowbytes; | ||||||
|  |         for (i = image_width;  i > 0;  --i) { | ||||||
|  |             *dest++ = bg_blue; | ||||||
|  |             *dest++ = bg_green; | ||||||
|  |             *dest++ = bg_red; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |     Set the window parameters. | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  |     memset(&wndclass, 0, sizeof(wndclass)); | ||||||
|  |  | ||||||
|  |     wndclass.cbSize = sizeof(wndclass); | ||||||
|  |     wndclass.style = CS_HREDRAW | CS_VREDRAW; | ||||||
|  |     wndclass.lpfnWndProc = rpng_win_wndproc; | ||||||
|  |     wndclass.hInstance = hInst; | ||||||
|  |     wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); | ||||||
|  |     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); | ||||||
|  |     wndclass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH); | ||||||
|  |     wndclass.lpszMenuName = NULL; | ||||||
|  |     wndclass.lpszClassName = progname; | ||||||
|  |     wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); | ||||||
|  |  | ||||||
|  |     RegisterClassEx(&wndclass); | ||||||
|  |  | ||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |     Finally, create the window. | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  |     extra_width  = 2*(GetSystemMetrics(SM_CXBORDER) + | ||||||
|  |                       GetSystemMetrics(SM_CXDLGFRAME)); | ||||||
|  |     extra_height = 2*(GetSystemMetrics(SM_CYBORDER) + | ||||||
|  |                       GetSystemMetrics(SM_CYDLGFRAME)) + | ||||||
|  |                       GetSystemMetrics(SM_CYCAPTION); | ||||||
|  |  | ||||||
|  |     global_hwnd = CreateWindow(progname, titlebar, WS_OVERLAPPEDWINDOW, | ||||||
|  |       CW_USEDEFAULT, CW_USEDEFAULT, image_width+extra_width, | ||||||
|  |       image_height+extra_height, NULL, NULL, hInst, NULL); | ||||||
|  |  | ||||||
|  |     ShowWindow(global_hwnd, showmode); | ||||||
|  |     UpdateWindow(global_hwnd); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  |  | ||||||
|  | } /* end function rpng_win_create_window() */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static int rpng_win_display_image() | ||||||
|  | { | ||||||
|  |     uch *src, *dest; | ||||||
|  |     uch r, g, b, a; | ||||||
|  |     ulg i, row, lastrow; | ||||||
|  |     RECT rect; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     Trace((stderr, "beginning display loop (image_channels == %d)\n", | ||||||
|  |       image_channels)) | ||||||
|  |     Trace((stderr, "(width = %ld, rowbytes = %ld, wimage_rowbytes = %d)\n", | ||||||
|  |       image_width, image_rowbytes, wimage_rowbytes)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |     Blast image data to buffer.  This whole routine takes place before the | ||||||
|  |     message loop begins, so there's no real point in any pseudo-progressive | ||||||
|  |     display... | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  |     for (lastrow = row = 0;  row < image_height;  ++row) { | ||||||
|  |         src = image_data + row*image_rowbytes; | ||||||
|  |         dest = wimage_data + row*wimage_rowbytes; | ||||||
|  |         if (image_channels == 3) { | ||||||
|  |             for (i = image_width;  i > 0;  --i) { | ||||||
|  |                 r = *src++; | ||||||
|  |                 g = *src++; | ||||||
|  |                 b = *src++; | ||||||
|  |                 *dest++ = b; | ||||||
|  |                 *dest++ = g;   /* note reverse order */ | ||||||
|  |                 *dest++ = r; | ||||||
|  |             } | ||||||
|  |         } else /* if (image_channels == 4) */ { | ||||||
|  |             for (i = image_width;  i > 0;  --i) { | ||||||
|  |                 r = *src++; | ||||||
|  |                 g = *src++; | ||||||
|  |                 b = *src++; | ||||||
|  |                 a = *src++; | ||||||
|  |                 if (a == 255) { | ||||||
|  |                     *dest++ = b; | ||||||
|  |                     *dest++ = g; | ||||||
|  |                     *dest++ = r; | ||||||
|  |                 } else if (a == 0) { | ||||||
|  |                     *dest++ = bg_blue; | ||||||
|  |                     *dest++ = bg_green; | ||||||
|  |                     *dest++ = bg_red; | ||||||
|  |                 } else { | ||||||
|  |                     /* this macro (copied from png.h) composites the | ||||||
|  |                      * foreground and background values and puts the | ||||||
|  |                      * result into the first argument; there are no | ||||||
|  |                      * side effects with the first argument */ | ||||||
|  |                     alpha_composite(*dest++, b, a, bg_blue); | ||||||
|  |                     alpha_composite(*dest++, g, a, bg_green); | ||||||
|  |                     alpha_composite(*dest++, r, a, bg_red); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         /* display after every 16 lines */ | ||||||
|  |         if (((row+1) & 0xf) == 0) { | ||||||
|  |             rect.left = 0L; | ||||||
|  |             rect.top = (LONG)lastrow; | ||||||
|  |             rect.right = (LONG)image_width;      /* possibly off by one? */ | ||||||
|  |             rect.bottom = (LONG)lastrow + 16L;   /* possibly off by one? */ | ||||||
|  |             InvalidateRect(global_hwnd, &rect, FALSE); | ||||||
|  |             UpdateWindow(global_hwnd);     /* similar to XFlush() */ | ||||||
|  |             lastrow = row + 1; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     Trace((stderr, "calling final image-flush routine\n")) | ||||||
|  |     if (lastrow < image_height) { | ||||||
|  |         rect.left = 0L; | ||||||
|  |         rect.top = (LONG)lastrow; | ||||||
|  |         rect.right = (LONG)image_width;      /* possibly off by one? */ | ||||||
|  |         rect.bottom = (LONG)image_height;    /* possibly off by one? */ | ||||||
|  |         InvalidateRect(global_hwnd, &rect, FALSE); | ||||||
|  |         UpdateWindow(global_hwnd);     /* similar to XFlush() */ | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |     last param determines whether or not background is wiped before paint | ||||||
|  |     InvalidateRect(global_hwnd, NULL, TRUE); | ||||||
|  |     UpdateWindow(global_hwnd); | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static void rpng_win_cleanup() | ||||||
|  | { | ||||||
|  |     if (image_data) { | ||||||
|  |         free(image_data); | ||||||
|  |         image_data = NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (dib) { | ||||||
|  |         free(dib); | ||||||
|  |         dib = NULL; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | LRESULT CALLBACK rpng_win_wndproc(HWND hwnd, UINT iMsg, WPARAM wP, LPARAM lP) | ||||||
|  | { | ||||||
|  |     HDC         hdc; | ||||||
|  |     PAINTSTRUCT ps; | ||||||
|  |     int rc; | ||||||
|  |  | ||||||
|  |     switch (iMsg) { | ||||||
|  |         case WM_CREATE: | ||||||
|  |             /* one-time processing here, if any */ | ||||||
|  |             return 0; | ||||||
|  |  | ||||||
|  |         case WM_PAINT: | ||||||
|  |             hdc = BeginPaint(hwnd, &ps); | ||||||
|  |                     /*                    dest                          */ | ||||||
|  |             rc = StretchDIBits(hdc, 0, 0, image_width, image_height, | ||||||
|  |                     /*                    source                        */ | ||||||
|  |                                     0, 0, image_width, image_height, | ||||||
|  |                                     wimage_data, (BITMAPINFO *)bmih, | ||||||
|  |                     /*              iUsage: no clue                     */ | ||||||
|  |                                     0, SRCCOPY); | ||||||
|  |             EndPaint(hwnd, &ps); | ||||||
|  |             return 0; | ||||||
|  |  | ||||||
|  |         /* wait for the user to tell us when to quit */ | ||||||
|  |         case WM_CHAR: | ||||||
|  |             switch (wP) {      /* only need one, so ignore repeat count */ | ||||||
|  |                 case 'q': | ||||||
|  |                 case 'Q': | ||||||
|  |                 case 0x1B:     /* Esc key */ | ||||||
|  |                     PostQuitMessage(0); | ||||||
|  |             } | ||||||
|  |             return 0; | ||||||
|  |  | ||||||
|  |         case WM_LBUTTONDOWN:   /* another way of quitting */ | ||||||
|  |         case WM_DESTROY: | ||||||
|  |             PostQuitMessage(0); | ||||||
|  |             return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return DefWindowProc(hwnd, iMsg, wP, lP); | ||||||
|  | } | ||||||
							
								
								
									
										858
									
								
								runtime/libpng/contrib/gregbook/rpng-x.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,858 @@ | |||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |    rpng - simple PNG display program                               rpng-x.c | ||||||
|  |  | ||||||
|  |    This program decodes and displays PNG images, with gamma correction and | ||||||
|  |    optionally with a user-specified background color (in case the image has | ||||||
|  |    transparency).  It is very nearly the most basic PNG viewer possible. | ||||||
|  |    This version is for the X Window System (tested by author under Unix and | ||||||
|  |    by Martin Zinser under OpenVMS; may work under OS/2 with some tweaking). | ||||||
|  |  | ||||||
|  |    to do: | ||||||
|  |     - 8-bit support | ||||||
|  |     - use %.1023s to simplify truncation of title-bar string? | ||||||
|  |  | ||||||
|  |   --------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |    Changelog: | ||||||
|  |     - 1.01:  initial public release | ||||||
|  |     - 1.02:  modified to allow abbreviated options; fixed long/ulong mis- | ||||||
|  |               match; switched to png_jmpbuf() macro | ||||||
|  |     - 1.10:  added support for non-default visuals; fixed X pixel-conversion | ||||||
|  |     - 1.11:  added extra set of parentheses to png_jmpbuf() macro; fixed | ||||||
|  |               command-line parsing bug | ||||||
|  |     - 1.12:  fixed small X memory leak (thanks to Francois Petitjean) | ||||||
|  |     - 1.13:  fixed XFreeGC() crash bug | ||||||
|  |  | ||||||
|  |   --------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |       Copyright (c) 1998-2001 Greg Roelofs.  All rights reserved. | ||||||
|  |  | ||||||
|  |       This software is provided "as is," without warranty of any kind, | ||||||
|  |       express or implied.  In no event shall the author or contributors | ||||||
|  |       be held liable for any damages arising in any way from the use of | ||||||
|  |       this software. | ||||||
|  |  | ||||||
|  |       Permission is granted to anyone to use this software for any purpose, | ||||||
|  |       including commercial applications, and to alter it and redistribute | ||||||
|  |       it freely, subject to the following restrictions: | ||||||
|  |  | ||||||
|  |       1. Redistributions of source code must retain the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions. | ||||||
|  |       2. Redistributions in binary form must reproduce the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions in the documenta- | ||||||
|  |          tion and/or other materials provided with the distribution. | ||||||
|  |       3. All advertising materials mentioning features or use of this | ||||||
|  |          software must display the following acknowledgment: | ||||||
|  |  | ||||||
|  |             This product includes software developed by Greg Roelofs | ||||||
|  |             and contributors for the book, "PNG: The Definitive Guide," | ||||||
|  |             published by O'Reilly and Associates. | ||||||
|  |  | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  | #define PROGNAME  "rpng-x" | ||||||
|  | #define LONGNAME  "Simple PNG Viewer for X" | ||||||
|  | #define VERSION   "1.13 of 16 August 2001" | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <time.h> | ||||||
|  | #include <X11/Xlib.h> | ||||||
|  | #include <X11/Xutil.h> | ||||||
|  | #include <X11/Xos.h> | ||||||
|  | #include <X11/keysym.h> | ||||||
|  |  | ||||||
|  | /* #define DEBUG  :  this enables the Trace() macros */ | ||||||
|  |  | ||||||
|  | #include "readpng.h"   /* typedefs, common macros, readpng prototypes */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* could just include png.h, but this macro is the only thing we need | ||||||
|  |  * (name and typedefs changed to local versions); note that side effects | ||||||
|  |  * only happen with alpha (which could easily be avoided with | ||||||
|  |  * "ush acopy = (alpha);") */ | ||||||
|  |  | ||||||
|  | #define alpha_composite(composite, fg, alpha, bg) {               \ | ||||||
|  |     ush temp = ((ush)(fg)*(ush)(alpha) +                          \ | ||||||
|  |                 (ush)(bg)*(ush)(255 - (ush)(alpha)) + (ush)128);  \ | ||||||
|  |     (composite) = (uch)((temp + (temp >> 8)) >> 8);               \ | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* local prototypes */ | ||||||
|  | static int  rpng_x_create_window(void); | ||||||
|  | static int  rpng_x_display_image(void); | ||||||
|  | static void rpng_x_cleanup(void); | ||||||
|  | static int  rpng_x_msb(ulg u32val); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static char titlebar[1024], *window_name = titlebar; | ||||||
|  | static char *appname = LONGNAME; | ||||||
|  | static char *icon_name = PROGNAME; | ||||||
|  | static char *filename; | ||||||
|  | static FILE *infile; | ||||||
|  |  | ||||||
|  | static char *bgstr; | ||||||
|  | static uch bg_red=0, bg_green=0, bg_blue=0; | ||||||
|  |  | ||||||
|  | static double display_exponent; | ||||||
|  |  | ||||||
|  | static ulg image_width, image_height, image_rowbytes; | ||||||
|  | static int image_channels; | ||||||
|  | static uch *image_data; | ||||||
|  |  | ||||||
|  | /* X-specific variables */ | ||||||
|  | static char *displayname; | ||||||
|  | static XImage *ximage; | ||||||
|  | static Display *display; | ||||||
|  | static int depth; | ||||||
|  | static Visual *visual; | ||||||
|  | static XVisualInfo *visual_list; | ||||||
|  | static int RShift, GShift, BShift; | ||||||
|  | static ulg RMask, GMask, BMask; | ||||||
|  | static Window window; | ||||||
|  | static GC gc; | ||||||
|  | static Colormap colormap; | ||||||
|  |  | ||||||
|  | static int have_nondefault_visual = FALSE; | ||||||
|  | static int have_colormap = FALSE; | ||||||
|  | static int have_window = FALSE; | ||||||
|  | static int have_gc = FALSE; | ||||||
|  | /* | ||||||
|  | ulg numcolors=0, pixels[256]; | ||||||
|  | ush reds[256], greens[256], blues[256]; | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int main(int argc, char **argv) | ||||||
|  | { | ||||||
|  | #ifdef sgi | ||||||
|  |     char tmpline[80]; | ||||||
|  | #endif | ||||||
|  |     char *p; | ||||||
|  |     int rc, alen, flen; | ||||||
|  |     int error = 0; | ||||||
|  |     int have_bg = FALSE; | ||||||
|  |     double LUT_exponent;               /* just the lookup table */ | ||||||
|  |     double CRT_exponent = 2.2;         /* just the monitor */ | ||||||
|  |     double default_display_exponent;   /* whole display system */ | ||||||
|  |     XEvent e; | ||||||
|  |     KeySym k; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     displayname = (char *)NULL; | ||||||
|  |     filename = (char *)NULL; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* First set the default value for our display-system exponent, i.e., | ||||||
|  |      * the product of the CRT exponent and the exponent corresponding to | ||||||
|  |      * the frame-buffer's lookup table (LUT), if any.  This is not an | ||||||
|  |      * exhaustive list of LUT values (e.g., OpenStep has a lot of weird | ||||||
|  |      * ones), but it should cover 99% of the current possibilities. */ | ||||||
|  |  | ||||||
|  | #if defined(NeXT) | ||||||
|  |     LUT_exponent = 1.0 / 2.2; | ||||||
|  |     /* | ||||||
|  |     if (some_next_function_that_returns_gamma(&next_gamma)) | ||||||
|  |         LUT_exponent = 1.0 / next_gamma; | ||||||
|  |      */ | ||||||
|  | #elif defined(sgi) | ||||||
|  |     LUT_exponent = 1.0 / 1.7; | ||||||
|  |     /* there doesn't seem to be any documented function to get the | ||||||
|  |      * "gamma" value, so we do it the hard way */ | ||||||
|  |     infile = fopen("/etc/config/system.glGammaVal", "r"); | ||||||
|  |     if (infile) { | ||||||
|  |         double sgi_gamma; | ||||||
|  |  | ||||||
|  |         fgets(tmpline, 80, infile); | ||||||
|  |         fclose(infile); | ||||||
|  |         sgi_gamma = atof(tmpline); | ||||||
|  |         if (sgi_gamma > 0.0) | ||||||
|  |             LUT_exponent = 1.0 / sgi_gamma; | ||||||
|  |     } | ||||||
|  | #elif defined(Macintosh) | ||||||
|  |     LUT_exponent = 1.8 / 2.61; | ||||||
|  |     /* | ||||||
|  |     if (some_mac_function_that_returns_gamma(&mac_gamma)) | ||||||
|  |         LUT_exponent = mac_gamma / 2.61; | ||||||
|  |      */ | ||||||
|  | #else | ||||||
|  |     LUT_exponent = 1.0;   /* assume no LUT:  most PCs */ | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     /* the defaults above give 1.0, 1.3, 1.5 and 2.2, respectively: */ | ||||||
|  |     default_display_exponent = LUT_exponent * CRT_exponent; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* If the user has set the SCREEN_GAMMA environment variable as suggested | ||||||
|  |      * (somewhat imprecisely) in the libpng documentation, use that; otherwise | ||||||
|  |      * use the default value we just calculated.  Either way, the user may | ||||||
|  |      * override this via a command-line option. */ | ||||||
|  |  | ||||||
|  |     if ((p = getenv("SCREEN_GAMMA")) != NULL) | ||||||
|  |         display_exponent = atof(p); | ||||||
|  |     else | ||||||
|  |         display_exponent = default_display_exponent; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* Now parse the command line for options and the PNG filename. */ | ||||||
|  |  | ||||||
|  |     while (*++argv && !error) { | ||||||
|  |         if (!strncmp(*argv, "-display", 2)) { | ||||||
|  |             if (!*++argv) | ||||||
|  |                 ++error; | ||||||
|  |             else | ||||||
|  |                 displayname = *argv; | ||||||
|  |         } else if (!strncmp(*argv, "-gamma", 2)) { | ||||||
|  |             if (!*++argv) | ||||||
|  |                 ++error; | ||||||
|  |             else { | ||||||
|  |                 display_exponent = atof(*argv); | ||||||
|  |                 if (display_exponent <= 0.0) | ||||||
|  |                     ++error; | ||||||
|  |             } | ||||||
|  |         } else if (!strncmp(*argv, "-bgcolor", 2)) { | ||||||
|  |             if (!*++argv) | ||||||
|  |                 ++error; | ||||||
|  |             else { | ||||||
|  |                 bgstr = *argv; | ||||||
|  |                 if (strlen(bgstr) != 7 || bgstr[0] != '#') | ||||||
|  |                     ++error;  | ||||||
|  |                 else  | ||||||
|  |                     have_bg = TRUE; | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             if (**argv != '-') { | ||||||
|  |                 filename = *argv; | ||||||
|  |                 if (argv[1])   /* shouldn't be any more args after filename */ | ||||||
|  |                     ++error; | ||||||
|  |             } else | ||||||
|  |                 ++error;   /* not expecting any other options */ | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (!filename) { | ||||||
|  |         ++error; | ||||||
|  |     } else if (!(infile = fopen(filename, "rb"))) { | ||||||
|  |         fprintf(stderr, PROGNAME ":  can't open PNG file [%s]\n", filename); | ||||||
|  |         ++error; | ||||||
|  |     } else { | ||||||
|  |         if ((rc = readpng_init(infile, &image_width, &image_height)) != 0) { | ||||||
|  |             switch (rc) { | ||||||
|  |                 case 1: | ||||||
|  |                     fprintf(stderr, PROGNAME | ||||||
|  |                       ":  [%s] is not a PNG file: incorrect signature\n", | ||||||
|  |                       filename); | ||||||
|  |                     break; | ||||||
|  |                 case 2: | ||||||
|  |                     fprintf(stderr, PROGNAME | ||||||
|  |                       ":  [%s] has bad IHDR (libpng longjmp)\n", | ||||||
|  |                       filename); | ||||||
|  |                     break; | ||||||
|  |                 case 4: | ||||||
|  |                     fprintf(stderr, PROGNAME ":  insufficient memory\n"); | ||||||
|  |                     break; | ||||||
|  |                 default: | ||||||
|  |                     fprintf(stderr, PROGNAME | ||||||
|  |                       ":  unknown readpng_init() error\n"); | ||||||
|  |                     break; | ||||||
|  |             } | ||||||
|  |             ++error; | ||||||
|  |         } else { | ||||||
|  |             display = XOpenDisplay(displayname); | ||||||
|  |             if (!display) { | ||||||
|  |                 readpng_cleanup(TRUE); | ||||||
|  |                 fprintf(stderr, PROGNAME ":  can't open X display [%s]\n", | ||||||
|  |                   displayname? displayname : "default"); | ||||||
|  |                 ++error; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         if (error) | ||||||
|  |             fclose(infile); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* usage screen */ | ||||||
|  |  | ||||||
|  |     if (error) { | ||||||
|  |         fprintf(stderr, "\n%s %s:  %s\n", PROGNAME, VERSION, appname); | ||||||
|  |         readpng_version_info(); | ||||||
|  |         fprintf(stderr, "\n" | ||||||
|  |           "Usage:  %s [-display xdpy] [-gamma exp] [-bgcolor bg] file.png\n" | ||||||
|  |           "    xdpy\tname of the target X display (e.g., ``hostname:0'')\n" | ||||||
|  |           "    exp \ttransfer-function exponent (``gamma'') of the display\n" | ||||||
|  |           "\t\t  system in floating-point format (e.g., ``%.1f''); equal\n" | ||||||
|  |           "\t\t  to the product of the lookup-table exponent (varies)\n" | ||||||
|  |           "\t\t  and the CRT exponent (usually 2.2); must be positive\n" | ||||||
|  |           "    bg  \tdesired background color in 7-character hex RGB format\n" | ||||||
|  |           "\t\t  (e.g., ``#ff7700'' for orange:  same as HTML colors);\n" | ||||||
|  |           "\t\t  used with transparent images\n" | ||||||
|  |           "\nPress Q, Esc or mouse button 1 (within image window, after image\n" | ||||||
|  |           "is displayed) to quit.\n" | ||||||
|  |           "\n", PROGNAME, default_display_exponent); | ||||||
|  |         exit(1); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* set the title-bar string, but make sure buffer doesn't overflow */ | ||||||
|  |  | ||||||
|  |     alen = strlen(appname); | ||||||
|  |     flen = strlen(filename); | ||||||
|  |     if (alen + flen + 3 > 1023) | ||||||
|  |         sprintf(titlebar, "%s:  ...%s", appname, filename+(alen+flen+6-1023)); | ||||||
|  |     else | ||||||
|  |         sprintf(titlebar, "%s:  %s", appname, filename); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* if the user didn't specify a background color on the command line, | ||||||
|  |      * check for one in the PNG file--if not, the initialized values of 0 | ||||||
|  |      * (black) will be used */ | ||||||
|  |  | ||||||
|  |     if (have_bg) { | ||||||
|  |         unsigned r, g, b;   /* this approach quiets compiler warnings */ | ||||||
|  |  | ||||||
|  |         sscanf(bgstr+1, "%2x%2x%2x", &r, &g, &b); | ||||||
|  |         bg_red   = (uch)r; | ||||||
|  |         bg_green = (uch)g; | ||||||
|  |         bg_blue  = (uch)b; | ||||||
|  |     } else if (readpng_get_bgcolor(&bg_red, &bg_green, &bg_blue) > 1) { | ||||||
|  |         readpng_cleanup(TRUE); | ||||||
|  |         fprintf(stderr, PROGNAME | ||||||
|  |           ":  libpng error while checking for background color\n"); | ||||||
|  |         exit(2); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* do the basic X initialization stuff, make the window and fill it | ||||||
|  |      * with the background color */ | ||||||
|  |  | ||||||
|  |     if (rpng_x_create_window()) | ||||||
|  |         exit(2); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* decode the image, all at once */ | ||||||
|  |  | ||||||
|  |     Trace((stderr, "calling readpng_get_image()\n")) | ||||||
|  |     image_data = readpng_get_image(display_exponent, &image_channels, | ||||||
|  |       &image_rowbytes); | ||||||
|  |     Trace((stderr, "done with readpng_get_image()\n")) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* done with PNG file, so clean up to minimize memory usage (but do NOT | ||||||
|  |      * nuke image_data!) */ | ||||||
|  |  | ||||||
|  |     readpng_cleanup(FALSE); | ||||||
|  |     fclose(infile); | ||||||
|  |  | ||||||
|  |     if (!image_data) { | ||||||
|  |         fprintf(stderr, PROGNAME ":  unable to decode PNG image\n"); | ||||||
|  |         exit(3); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* display image (composite with background if requested) */ | ||||||
|  |  | ||||||
|  |     Trace((stderr, "calling rpng_x_display_image()\n")) | ||||||
|  |     if (rpng_x_display_image()) { | ||||||
|  |         free(image_data); | ||||||
|  |         exit(4); | ||||||
|  |     } | ||||||
|  |     Trace((stderr, "done with rpng_x_display_image()\n")) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* wait for the user to tell us when to quit */ | ||||||
|  |  | ||||||
|  |     printf( | ||||||
|  |       "Done.  Press Q, Esc or mouse button 1 (within image window) to quit.\n"); | ||||||
|  |     fflush(stdout); | ||||||
|  |  | ||||||
|  |     do | ||||||
|  |         XNextEvent(display, &e); | ||||||
|  |     while (!(e.type == ButtonPress && e.xbutton.button == Button1) && | ||||||
|  |            !(e.type == KeyPress &&    /*  v--- or 1 for shifted keys */ | ||||||
|  |              ((k = XLookupKeysym(&e.xkey, 0)) == XK_q || k == XK_Escape) )); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* OK, we're done:  clean up all image and X resources and go away */ | ||||||
|  |  | ||||||
|  |     rpng_x_cleanup(); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static int rpng_x_create_window(void) | ||||||
|  | { | ||||||
|  |     uch *xdata; | ||||||
|  |     int need_colormap = FALSE; | ||||||
|  |     int screen, pad; | ||||||
|  |     ulg bg_pixel = 0L; | ||||||
|  |     ulg attrmask; | ||||||
|  |     Window root; | ||||||
|  |     XEvent e; | ||||||
|  |     XGCValues gcvalues; | ||||||
|  |     XSetWindowAttributes attr; | ||||||
|  |     XSizeHints *size_hints; | ||||||
|  |     XTextProperty windowName, *pWindowName = &windowName; | ||||||
|  |     XTextProperty iconName, *pIconName = &iconName; | ||||||
|  |     XVisualInfo visual_info; | ||||||
|  |     XWMHints *wm_hints; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     screen = DefaultScreen(display); | ||||||
|  |     depth = DisplayPlanes(display, screen); | ||||||
|  |     root = RootWindow(display, screen); | ||||||
|  |  | ||||||
|  | #ifdef DEBUG | ||||||
|  |     XSynchronize(display, True); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if 0 | ||||||
|  | /* GRR:  add 8-bit support */ | ||||||
|  |     if (/* depth != 8 && */ depth != 16 && depth != 24 && depth != 32) { | ||||||
|  |         fprintf(stderr, | ||||||
|  |           "screen depth %d not supported (only 16-, 24- or 32-bit TrueColor)\n", | ||||||
|  |           depth); | ||||||
|  |         return 2; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     XMatchVisualInfo(display, screen, depth, | ||||||
|  |       (depth == 8)? PseudoColor : TrueColor, &visual_info); | ||||||
|  |     visual = visual_info.visual; | ||||||
|  | #else | ||||||
|  |     if (depth != 16 && depth != 24 && depth != 32) { | ||||||
|  |         int visuals_matched = 0; | ||||||
|  |  | ||||||
|  |         Trace((stderr, "default depth is %d:  checking other visuals\n", | ||||||
|  |           depth)) | ||||||
|  |  | ||||||
|  |         /* 24-bit first */ | ||||||
|  |         visual_info.screen = screen; | ||||||
|  |         visual_info.depth = 24; | ||||||
|  |         visual_list = XGetVisualInfo(display, | ||||||
|  |           VisualScreenMask | VisualDepthMask, &visual_info, &visuals_matched); | ||||||
|  |         if (visuals_matched == 0) { | ||||||
|  | /* GRR:  add 15-, 16- and 32-bit TrueColor visuals (also DirectColor?) */ | ||||||
|  |             fprintf(stderr, "default screen depth %d not supported, and no" | ||||||
|  |               " 24-bit visuals found\n", depth); | ||||||
|  |             return 2; | ||||||
|  |         } | ||||||
|  |         Trace((stderr, "XGetVisualInfo() returned %d 24-bit visuals\n", | ||||||
|  |           visuals_matched)) | ||||||
|  |         visual = visual_list[0].visual; | ||||||
|  |         depth = visual_list[0].depth; | ||||||
|  | /* | ||||||
|  |         colormap_size = visual_list[0].colormap_size; | ||||||
|  |         visual_class = visual->class; | ||||||
|  |         visualID = XVisualIDFromVisual(visual); | ||||||
|  |  */ | ||||||
|  |         have_nondefault_visual = TRUE; | ||||||
|  |         need_colormap = TRUE; | ||||||
|  |     } else { | ||||||
|  |         XMatchVisualInfo(display, screen, depth, TrueColor, &visual_info); | ||||||
|  |         visual = visual_info.visual; | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     RMask = visual->red_mask; | ||||||
|  |     GMask = visual->green_mask; | ||||||
|  |     BMask = visual->blue_mask; | ||||||
|  |  | ||||||
|  | /* GRR:  add/check 8-bit support */ | ||||||
|  |     if (depth == 8 || need_colormap) { | ||||||
|  |         colormap = XCreateColormap(display, root, visual, AllocNone); | ||||||
|  |         if (!colormap) { | ||||||
|  |             fprintf(stderr, "XCreateColormap() failed\n"); | ||||||
|  |             return 2; | ||||||
|  |         } | ||||||
|  |         have_colormap = TRUE; | ||||||
|  |     } | ||||||
|  |     if (depth == 15 || depth == 16) { | ||||||
|  |         RShift = 15 - rpng_x_msb(RMask);    /* these are right-shifts */ | ||||||
|  |         GShift = 15 - rpng_x_msb(GMask); | ||||||
|  |         BShift = 15 - rpng_x_msb(BMask); | ||||||
|  |     } else if (depth > 16) { | ||||||
|  | #define NO_24BIT_MASKS | ||||||
|  | #ifdef NO_24BIT_MASKS | ||||||
|  |         RShift = rpng_x_msb(RMask) - 7;     /* these are left-shifts */ | ||||||
|  |         GShift = rpng_x_msb(GMask) - 7; | ||||||
|  |         BShift = rpng_x_msb(BMask) - 7; | ||||||
|  | #else | ||||||
|  |         RShift = 7 - rpng_x_msb(RMask);     /* these are right-shifts, too */ | ||||||
|  |         GShift = 7 - rpng_x_msb(GMask); | ||||||
|  |         BShift = 7 - rpng_x_msb(BMask); | ||||||
|  | #endif | ||||||
|  |     } | ||||||
|  |     if (depth >= 15 && (RShift < 0 || GShift < 0 || BShift < 0)) { | ||||||
|  |         fprintf(stderr, "rpng internal logic error:  negative X shift(s)!\n"); | ||||||
|  |         return 2; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |     Finally, create the window. | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  |     attr.backing_store = Always; | ||||||
|  |     attr.event_mask = ExposureMask | KeyPressMask | ButtonPressMask; | ||||||
|  |     attrmask = CWBackingStore | CWEventMask; | ||||||
|  |     if (have_nondefault_visual) { | ||||||
|  |         attr.colormap = colormap; | ||||||
|  |         attr.background_pixel = 0; | ||||||
|  |         attr.border_pixel = 1; | ||||||
|  |         attrmask |= CWColormap | CWBackPixel | CWBorderPixel; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     window = XCreateWindow(display, root, 0, 0, image_width, image_height, 0, | ||||||
|  |       depth, InputOutput, visual, attrmask, &attr); | ||||||
|  |  | ||||||
|  |     if (window == None) { | ||||||
|  |         fprintf(stderr, "XCreateWindow() failed\n"); | ||||||
|  |         return 2; | ||||||
|  |     } else | ||||||
|  |         have_window = TRUE; | ||||||
|  |  | ||||||
|  |     if (depth == 8) | ||||||
|  |         XSetWindowColormap(display, window, colormap); | ||||||
|  |  | ||||||
|  |     if (!XStringListToTextProperty(&window_name, 1, pWindowName)) | ||||||
|  |         pWindowName = NULL; | ||||||
|  |     if (!XStringListToTextProperty(&icon_name, 1, pIconName)) | ||||||
|  |         pIconName = NULL; | ||||||
|  |  | ||||||
|  |     /* OK if either hints allocation fails; XSetWMProperties() allows NULLs */ | ||||||
|  |  | ||||||
|  |     if ((size_hints = XAllocSizeHints()) != NULL) { | ||||||
|  |         /* window will not be resizable */ | ||||||
|  |         size_hints->flags = PMinSize | PMaxSize; | ||||||
|  |         size_hints->min_width = size_hints->max_width = (int)image_width; | ||||||
|  |         size_hints->min_height = size_hints->max_height = (int)image_height; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if ((wm_hints = XAllocWMHints()) != NULL) { | ||||||
|  |         wm_hints->initial_state = NormalState; | ||||||
|  |         wm_hints->input = True; | ||||||
|  |      /* wm_hints->icon_pixmap = icon_pixmap; */ | ||||||
|  |         wm_hints->flags = StateHint | InputHint  /* | IconPixmapHint */ ; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     XSetWMProperties(display, window, pWindowName, pIconName, NULL, 0, | ||||||
|  |       size_hints, wm_hints, NULL); | ||||||
|  |  | ||||||
|  |     /* various properties and hints no longer needed; free memory */ | ||||||
|  |     if (pWindowName) | ||||||
|  |        XFree(pWindowName->value); | ||||||
|  |     if (pIconName) | ||||||
|  |        XFree(pIconName->value); | ||||||
|  |     if (size_hints) | ||||||
|  |         XFree(size_hints); | ||||||
|  |     if (wm_hints) | ||||||
|  |        XFree(wm_hints); | ||||||
|  |  | ||||||
|  |     XMapWindow(display, window); | ||||||
|  |  | ||||||
|  |     gc = XCreateGC(display, window, 0, &gcvalues); | ||||||
|  |     have_gc = TRUE; | ||||||
|  |  | ||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |     Fill window with the specified background color. | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  |     if (depth == 24 || depth == 32) { | ||||||
|  |         bg_pixel = ((ulg)bg_red   << RShift) | | ||||||
|  |                    ((ulg)bg_green << GShift) | | ||||||
|  |                    ((ulg)bg_blue  << BShift); | ||||||
|  |     } else if (depth == 16) { | ||||||
|  |         bg_pixel = ((((ulg)bg_red   << 8) >> RShift) & RMask) | | ||||||
|  |                    ((((ulg)bg_green << 8) >> GShift) & GMask) | | ||||||
|  |                    ((((ulg)bg_blue  << 8) >> BShift) & BMask); | ||||||
|  |     } else /* depth == 8 */ { | ||||||
|  |  | ||||||
|  |         /* GRR:  add 8-bit support */ | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     XSetForeground(display, gc, bg_pixel); | ||||||
|  |     XFillRectangle(display, window, gc, 0, 0, image_width, image_height); | ||||||
|  |  | ||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |     Wait for first Expose event to do any drawing, then flush. | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  |     do | ||||||
|  |         XNextEvent(display, &e); | ||||||
|  |     while (e.type != Expose || e.xexpose.count); | ||||||
|  |  | ||||||
|  |     XFlush(display); | ||||||
|  |  | ||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |     Allocate memory for the X- and display-specific version of the image. | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  |     if (depth == 24 || depth == 32) { | ||||||
|  |         xdata = (uch *)malloc(4*image_width*image_height); | ||||||
|  |         pad = 32; | ||||||
|  |     } else if (depth == 16) { | ||||||
|  |         xdata = (uch *)malloc(2*image_width*image_height); | ||||||
|  |         pad = 16; | ||||||
|  |     } else /* depth == 8 */ { | ||||||
|  |         xdata = (uch *)malloc(image_width*image_height); | ||||||
|  |         pad = 8; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (!xdata) { | ||||||
|  |         fprintf(stderr, PROGNAME ":  unable to allocate image memory\n"); | ||||||
|  |         return 4; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     ximage = XCreateImage(display, visual, depth, ZPixmap, 0, | ||||||
|  |       (char *)xdata, image_width, image_height, pad, 0); | ||||||
|  |  | ||||||
|  |     if (!ximage) { | ||||||
|  |         fprintf(stderr, PROGNAME ":  XCreateImage() failed\n"); | ||||||
|  |         free(xdata); | ||||||
|  |         return 3; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /* to avoid testing the byte order every pixel (or doubling the size of | ||||||
|  |      * the drawing routine with a giant if-test), we arbitrarily set the byte | ||||||
|  |      * order to MSBFirst and let Xlib worry about inverting things on little- | ||||||
|  |      * endian machines (like Linux/x86, old VAXen, etc.)--this is not the most | ||||||
|  |      * efficient approach (the giant if-test would be better), but in the | ||||||
|  |      * interest of clarity, we take the easy way out... */ | ||||||
|  |  | ||||||
|  |     ximage->byte_order = MSBFirst; | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  |  | ||||||
|  | } /* end function rpng_x_create_window() */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static int rpng_x_display_image(void) | ||||||
|  | { | ||||||
|  |     uch *src; | ||||||
|  |     char *dest; | ||||||
|  |     uch r, g, b, a; | ||||||
|  |     ulg i, row, lastrow = 0; | ||||||
|  |     ulg pixel; | ||||||
|  |     int ximage_rowbytes = ximage->bytes_per_line; | ||||||
|  | /*  int bpp = ximage->bits_per_pixel;  */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     Trace((stderr, "beginning display loop (image_channels == %d)\n", | ||||||
|  |       image_channels)) | ||||||
|  |     Trace((stderr, "   (width = %ld, rowbytes = %ld, ximage_rowbytes = %d)\n", | ||||||
|  |       image_width, image_rowbytes, ximage_rowbytes)) | ||||||
|  |     Trace((stderr, "   (bpp = %d)\n", ximage->bits_per_pixel)) | ||||||
|  |     Trace((stderr, "   (byte_order = %s)\n", ximage->byte_order == MSBFirst? | ||||||
|  |       "MSBFirst" : (ximage->byte_order == LSBFirst? "LSBFirst" : "unknown"))) | ||||||
|  |  | ||||||
|  |     if (depth == 24 || depth == 32) { | ||||||
|  |         ulg red, green, blue; | ||||||
|  |  | ||||||
|  |         for (lastrow = row = 0;  row < image_height;  ++row) { | ||||||
|  |             src = image_data + row*image_rowbytes; | ||||||
|  |             dest = ximage->data + row*ximage_rowbytes; | ||||||
|  |             if (image_channels == 3) { | ||||||
|  |                 for (i = image_width;  i > 0;  --i) { | ||||||
|  |                     red   = *src++; | ||||||
|  |                     green = *src++; | ||||||
|  |                     blue  = *src++; | ||||||
|  | #ifdef NO_24BIT_MASKS | ||||||
|  |                     pixel = (red   << RShift) | | ||||||
|  |                             (green << GShift) | | ||||||
|  |                             (blue  << BShift); | ||||||
|  |                     /* recall that we set ximage->byte_order = MSBFirst above */ | ||||||
|  |                     /* GRR BUG:  this assumes bpp == 32, but may be 24: */ | ||||||
|  |                     *dest++ = (char)((pixel >> 24) & 0xff); | ||||||
|  |                     *dest++ = (char)((pixel >> 16) & 0xff); | ||||||
|  |                     *dest++ = (char)((pixel >>  8) & 0xff); | ||||||
|  |                     *dest++ = (char)( pixel        & 0xff); | ||||||
|  | #else | ||||||
|  |                     red   = (RShift < 0)? red   << (-RShift) : red   >> RShift; | ||||||
|  |                     green = (GShift < 0)? green << (-GShift) : green >> GShift; | ||||||
|  |                     blue  = (BShift < 0)? blue  << (-BShift) : blue  >> BShift; | ||||||
|  |                     pixel = (red & RMask) | (green & GMask) | (blue & BMask); | ||||||
|  |                     /* recall that we set ximage->byte_order = MSBFirst above */ | ||||||
|  |                     *dest++ = (char)((pixel >> 24) & 0xff); | ||||||
|  |                     *dest++ = (char)((pixel >> 16) & 0xff); | ||||||
|  |                     *dest++ = (char)((pixel >>  8) & 0xff); | ||||||
|  |                     *dest++ = (char)( pixel        & 0xff); | ||||||
|  | #endif | ||||||
|  |                 } | ||||||
|  |             } else /* if (image_channels == 4) */ { | ||||||
|  |                 for (i = image_width;  i > 0;  --i) { | ||||||
|  |                     r = *src++; | ||||||
|  |                     g = *src++; | ||||||
|  |                     b = *src++; | ||||||
|  |                     a = *src++; | ||||||
|  |                     if (a == 255) { | ||||||
|  |                         red   = r; | ||||||
|  |                         green = g; | ||||||
|  |                         blue  = b; | ||||||
|  |                     } else if (a == 0) { | ||||||
|  |                         red   = bg_red; | ||||||
|  |                         green = bg_green; | ||||||
|  |                         blue  = bg_blue; | ||||||
|  |                     } else { | ||||||
|  |                         /* this macro (from png.h) composites the foreground | ||||||
|  |                          * and background values and puts the result into the | ||||||
|  |                          * first argument */ | ||||||
|  |                         alpha_composite(red,   r, a, bg_red); | ||||||
|  |                         alpha_composite(green, g, a, bg_green); | ||||||
|  |                         alpha_composite(blue,  b, a, bg_blue); | ||||||
|  |                     } | ||||||
|  |                     pixel = (red   << RShift) | | ||||||
|  |                             (green << GShift) | | ||||||
|  |                             (blue  << BShift); | ||||||
|  |                     /* recall that we set ximage->byte_order = MSBFirst above */ | ||||||
|  |                     *dest++ = (char)((pixel >> 24) & 0xff); | ||||||
|  |                     *dest++ = (char)((pixel >> 16) & 0xff); | ||||||
|  |                     *dest++ = (char)((pixel >>  8) & 0xff); | ||||||
|  |                     *dest++ = (char)( pixel        & 0xff); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             /* display after every 16 lines */ | ||||||
|  |             if (((row+1) & 0xf) == 0) { | ||||||
|  |                 XPutImage(display, window, gc, ximage, 0, (int)lastrow, 0, | ||||||
|  |                   (int)lastrow, image_width, 16); | ||||||
|  |                 XFlush(display); | ||||||
|  |                 lastrow = row + 1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     } else if (depth == 16) { | ||||||
|  |         ush red, green, blue; | ||||||
|  |  | ||||||
|  |         for (lastrow = row = 0;  row < image_height;  ++row) { | ||||||
|  |             src = image_data + row*image_rowbytes; | ||||||
|  |             dest = ximage->data + row*ximage_rowbytes; | ||||||
|  |             if (image_channels == 3) { | ||||||
|  |                 for (i = image_width;  i > 0;  --i) { | ||||||
|  |                     red   = ((ush)(*src) << 8); | ||||||
|  |                     ++src; | ||||||
|  |                     green = ((ush)(*src) << 8); | ||||||
|  |                     ++src; | ||||||
|  |                     blue  = ((ush)(*src) << 8); | ||||||
|  |                     ++src; | ||||||
|  |                     pixel = ((red   >> RShift) & RMask) | | ||||||
|  |                             ((green >> GShift) & GMask) | | ||||||
|  |                             ((blue  >> BShift) & BMask); | ||||||
|  |                     /* recall that we set ximage->byte_order = MSBFirst above */ | ||||||
|  |                     *dest++ = (char)((pixel >>  8) & 0xff); | ||||||
|  |                     *dest++ = (char)( pixel        & 0xff); | ||||||
|  |                 } | ||||||
|  |             } else /* if (image_channels == 4) */ { | ||||||
|  |                 for (i = image_width;  i > 0;  --i) { | ||||||
|  |                     r = *src++; | ||||||
|  |                     g = *src++; | ||||||
|  |                     b = *src++; | ||||||
|  |                     a = *src++; | ||||||
|  |                     if (a == 255) { | ||||||
|  |                         red   = ((ush)r << 8); | ||||||
|  |                         green = ((ush)g << 8); | ||||||
|  |                         blue  = ((ush)b << 8); | ||||||
|  |                     } else if (a == 0) { | ||||||
|  |                         red   = ((ush)bg_red   << 8); | ||||||
|  |                         green = ((ush)bg_green << 8); | ||||||
|  |                         blue  = ((ush)bg_blue  << 8); | ||||||
|  |                     } else { | ||||||
|  |                         /* this macro (from png.h) composites the foreground | ||||||
|  |                          * and background values and puts the result back into | ||||||
|  |                          * the first argument (== fg byte here:  safe) */ | ||||||
|  |                         alpha_composite(r, r, a, bg_red); | ||||||
|  |                         alpha_composite(g, g, a, bg_green); | ||||||
|  |                         alpha_composite(b, b, a, bg_blue); | ||||||
|  |                         red   = ((ush)r << 8); | ||||||
|  |                         green = ((ush)g << 8); | ||||||
|  |                         blue  = ((ush)b << 8); | ||||||
|  |                     } | ||||||
|  |                     pixel = ((red   >> RShift) & RMask) | | ||||||
|  |                             ((green >> GShift) & GMask) | | ||||||
|  |                             ((blue  >> BShift) & BMask); | ||||||
|  |                     /* recall that we set ximage->byte_order = MSBFirst above */ | ||||||
|  |                     *dest++ = (char)((pixel >>  8) & 0xff); | ||||||
|  |                     *dest++ = (char)( pixel        & 0xff); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             /* display after every 16 lines */ | ||||||
|  |             if (((row+1) & 0xf) == 0) { | ||||||
|  |                 XPutImage(display, window, gc, ximage, 0, (int)lastrow, 0, | ||||||
|  |                   (int)lastrow, image_width, 16); | ||||||
|  |                 XFlush(display); | ||||||
|  |                 lastrow = row + 1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     } else /* depth == 8 */ { | ||||||
|  |  | ||||||
|  |         /* GRR:  add 8-bit support */ | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     Trace((stderr, "calling final XPutImage()\n")) | ||||||
|  |     if (lastrow < image_height) { | ||||||
|  |         XPutImage(display, window, gc, ximage, 0, (int)lastrow, 0, | ||||||
|  |           (int)lastrow, image_width, image_height-lastrow); | ||||||
|  |         XFlush(display); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static void rpng_x_cleanup(void) | ||||||
|  | { | ||||||
|  |     if (image_data) { | ||||||
|  |         free(image_data); | ||||||
|  |         image_data = NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (ximage) { | ||||||
|  |         if (ximage->data) { | ||||||
|  |             free(ximage->data);           /* we allocated it, so we free it */ | ||||||
|  |             ximage->data = (char *)NULL;  /*  instead of XDestroyImage() */ | ||||||
|  |         } | ||||||
|  |         XDestroyImage(ximage); | ||||||
|  |         ximage = NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (have_gc) | ||||||
|  |         XFreeGC(display, gc); | ||||||
|  |  | ||||||
|  |     if (have_window) | ||||||
|  |         XDestroyWindow(display, window); | ||||||
|  |  | ||||||
|  |     if (have_colormap) | ||||||
|  |         XFreeColormap(display, colormap); | ||||||
|  |  | ||||||
|  |     if (have_nondefault_visual) | ||||||
|  |         XFree(visual_list); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static int rpng_x_msb(ulg u32val) | ||||||
|  | { | ||||||
|  |     int i; | ||||||
|  |  | ||||||
|  |     for (i = 31;  i >= 0;  --i) { | ||||||
|  |         if (u32val & 0x80000000L) | ||||||
|  |             break; | ||||||
|  |         u32val <<= 1; | ||||||
|  |     } | ||||||
|  |     return i; | ||||||
|  | } | ||||||
							
								
								
									
										1166
									
								
								runtime/libpng/contrib/gregbook/rpng2-win.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1408
									
								
								runtime/libpng/contrib/gregbook/rpng2-x.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/gregbook/toucan.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 13 KiB | 
							
								
								
									
										816
									
								
								runtime/libpng/contrib/gregbook/wpng.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,816 @@ | |||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |    wpng - simple PNG-writing program                                 wpng.c | ||||||
|  |  | ||||||
|  |    This program converts certain NetPBM binary files (grayscale and RGB, | ||||||
|  |    maxval = 255) to PNG.  Non-interlaced PNGs are written progressively; | ||||||
|  |    interlaced PNGs are read and written in one memory-intensive blast. | ||||||
|  |    Thanks to Jean-loup Gailly for providing the necessary trick to read | ||||||
|  |    interactive text from the keyboard while stdin is redirected. | ||||||
|  |  | ||||||
|  |    NOTE:  includes provisional support for PNM type "8" (portable alphamap) | ||||||
|  |           images, presumed to be a 32-bit interleaved RGBA format; no pro- | ||||||
|  |           vision for possible interleaved grayscale+alpha (16-bit) format. | ||||||
|  |           THIS IS UNLIKELY TO BECOME AN OFFICIAL NETPBM ALPHA FORMAT! | ||||||
|  |  | ||||||
|  |    to do: | ||||||
|  |     - delete output file if quit before calling any writepng routines | ||||||
|  |     - process backspace with -text option under DOS/Win? (currently get ^H) | ||||||
|  |  | ||||||
|  |   --------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |    Changelog: | ||||||
|  |     - 1.01:  initial public release | ||||||
|  |     - 1.02:  modified to allow abbreviated options | ||||||
|  |     - 1.03:  removed extraneous character from usage screen; fixed bug in | ||||||
|  |               command-line parsing | ||||||
|  |  | ||||||
|  |   --------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |       Copyright (c) 1998-2000 Greg Roelofs.  All rights reserved. | ||||||
|  |  | ||||||
|  |       This software is provided "as is," without warranty of any kind, | ||||||
|  |       express or implied.  In no event shall the author or contributors | ||||||
|  |       be held liable for any damages arising in any way from the use of | ||||||
|  |       this software. | ||||||
|  |  | ||||||
|  |       Permission is granted to anyone to use this software for any purpose, | ||||||
|  |       including commercial applications, and to alter it and redistribute | ||||||
|  |       it freely, subject to the following restrictions: | ||||||
|  |  | ||||||
|  |       1. Redistributions of source code must retain the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions. | ||||||
|  |       2. Redistributions in binary form must reproduce the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions in the documenta- | ||||||
|  |          tion and/or other materials provided with the distribution. | ||||||
|  |       3. All advertising materials mentioning features or use of this | ||||||
|  |          software must display the following acknowledgment: | ||||||
|  |  | ||||||
|  |             This product includes software developed by Greg Roelofs | ||||||
|  |             and contributors for the book, "PNG: The Definitive Guide," | ||||||
|  |             published by O'Reilly and Associates. | ||||||
|  |  | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  | #define PROGNAME  "wpng" | ||||||
|  | #define VERSION   "1.03 of 19 March 2000" | ||||||
|  | #define APPNAME   "Simple PGM/PPM/PAM to PNG Converter" | ||||||
|  |  | ||||||
|  | #if defined(__MSDOS__) || defined(__OS2__) | ||||||
|  | #  define DOS_OS2_W32 | ||||||
|  | #elif defined(_WIN32) || defined(__WIN32__) | ||||||
|  | #  define DOS_OS2_W32 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <setjmp.h>     /* for jmpbuf declaration in writepng.h */ | ||||||
|  | #include <time.h> | ||||||
|  |  | ||||||
|  | #ifdef DOS_OS2_W32 | ||||||
|  | #  include <io.h>       /* for isatty(), setmode() prototypes */ | ||||||
|  | #  include <fcntl.h>    /* O_BINARY for fdopen() without text translation */ | ||||||
|  | #  ifdef __EMX__ | ||||||
|  | #    ifndef getch | ||||||
|  | #      define getch() _read_kbd(0, 1, 0)    /* need getche() */ | ||||||
|  | #    endif | ||||||
|  | #  else /* !__EMX__ */ | ||||||
|  | #    ifdef __GO32__ | ||||||
|  | #      include <pc.h> | ||||||
|  | #      define getch() getkey()  /* GRR:  need getche() */ | ||||||
|  | #    else | ||||||
|  | #      include <conio.h>        /* for getche() console input */ | ||||||
|  | #    endif | ||||||
|  | #  endif /* ?__EMX__ */ | ||||||
|  | #  define FGETS(buf,len,stream)  dos_kbd_gets(buf,len) | ||||||
|  | #else | ||||||
|  | #  include <unistd.h>           /* for isatty() prototype */ | ||||||
|  | #  define FGETS fgets | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* #define DEBUG  :  this enables the Trace() macros */ | ||||||
|  |  | ||||||
|  | /* #define FORBID_LATIN1_CTRL  :  this requires the user to re-enter any | ||||||
|  |    text that includes control characters discouraged by the PNG spec; text | ||||||
|  |    that includes an escape character (27) must be re-entered regardless */ | ||||||
|  |  | ||||||
|  | #include "writepng.h"   /* typedefs, common macros, writepng prototypes */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* local prototypes */ | ||||||
|  |  | ||||||
|  | static int  wpng_isvalid_latin1(uch *p, int len); | ||||||
|  | static void wpng_cleanup(void); | ||||||
|  |  | ||||||
|  | #ifdef DOS_OS2_W32 | ||||||
|  |    static char *dos_kbd_gets(char *buf, int len); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static mainprog_info wpng_info;   /* lone global */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int main(int argc, char **argv) | ||||||
|  | { | ||||||
|  | #ifndef DOS_OS2_W32 | ||||||
|  |     FILE *keybd; | ||||||
|  | #endif | ||||||
|  | #ifdef sgi | ||||||
|  |     FILE *tmpfile;      /* or we could just use keybd, since no overlap */ | ||||||
|  |     char tmpline[80]; | ||||||
|  | #endif | ||||||
|  |     char *inname = NULL, outname[256]; | ||||||
|  |     char *p, pnmchar, pnmline[256]; | ||||||
|  |     char *bgstr, *textbuf = NULL; | ||||||
|  |     ulg rowbytes; | ||||||
|  |     int rc, len = 0; | ||||||
|  |     int error = 0; | ||||||
|  |     int text = FALSE; | ||||||
|  |     int maxval; | ||||||
|  |     double LUT_exponent;                /* just the lookup table */ | ||||||
|  |     double CRT_exponent = 2.2;          /* just the monitor */ | ||||||
|  |     double default_display_exponent;    /* whole display system */ | ||||||
|  |     double default_gamma = 0.0; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     wpng_info.infile = NULL; | ||||||
|  |     wpng_info.outfile = NULL; | ||||||
|  |     wpng_info.image_data = NULL; | ||||||
|  |     wpng_info.row_pointers = NULL; | ||||||
|  |     wpng_info.filter = FALSE; | ||||||
|  |     wpng_info.interlaced = FALSE; | ||||||
|  |     wpng_info.have_bg = FALSE; | ||||||
|  |     wpng_info.have_time = FALSE; | ||||||
|  |     wpng_info.have_text = 0; | ||||||
|  |     wpng_info.gamma = 0.0; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* First get the default value for our display-system exponent, i.e., | ||||||
|  |      * the product of the CRT exponent and the exponent corresponding to | ||||||
|  |      * the frame-buffer's lookup table (LUT), if any.  If the PNM image | ||||||
|  |      * looks correct on the user's display system, its file gamma is the | ||||||
|  |      * inverse of this value.  (Note that this is not an exhaustive list | ||||||
|  |      * of LUT values--e.g., OpenStep has a lot of weird ones--but it should | ||||||
|  |      * cover 99% of the current possibilities.  This section must ensure | ||||||
|  |      * that default_display_exponent is positive.) */ | ||||||
|  |  | ||||||
|  | #if defined(NeXT) | ||||||
|  |     /* third-party utilities can modify the default LUT exponent */ | ||||||
|  |     LUT_exponent = 1.0 / 2.2; | ||||||
|  |     /* | ||||||
|  |     if (some_next_function_that_returns_gamma(&next_gamma)) | ||||||
|  |         LUT_exponent = 1.0 / next_gamma; | ||||||
|  |      */ | ||||||
|  | #elif defined(sgi) | ||||||
|  |     LUT_exponent = 1.0 / 1.7; | ||||||
|  |     /* there doesn't seem to be any documented function to | ||||||
|  |      * get the "gamma" value, so we do it the hard way */ | ||||||
|  |     tmpfile = fopen("/etc/config/system.glGammaVal", "r"); | ||||||
|  |     if (tmpfile) { | ||||||
|  |         double sgi_gamma; | ||||||
|  |  | ||||||
|  |         fgets(tmpline, 80, tmpfile); | ||||||
|  |         fclose(tmpfile); | ||||||
|  |         sgi_gamma = atof(tmpline); | ||||||
|  |         if (sgi_gamma > 0.0) | ||||||
|  |             LUT_exponent = 1.0 / sgi_gamma; | ||||||
|  |     } | ||||||
|  | #elif defined(Macintosh) | ||||||
|  |     LUT_exponent = 1.8 / 2.61; | ||||||
|  |     /* | ||||||
|  |     if (some_mac_function_that_returns_gamma(&mac_gamma)) | ||||||
|  |         LUT_exponent = mac_gamma / 2.61; | ||||||
|  |      */ | ||||||
|  | #else | ||||||
|  |     LUT_exponent = 1.0;   /* assume no LUT:  most PCs */ | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     /* the defaults above give 1.0, 1.3, 1.5 and 2.2, respectively: */ | ||||||
|  |     default_display_exponent = LUT_exponent * CRT_exponent; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* If the user has set the SCREEN_GAMMA environment variable as suggested | ||||||
|  |      * (somewhat imprecisely) in the libpng documentation, use that; otherwise | ||||||
|  |      * use the default value we just calculated.  Either way, the user may | ||||||
|  |      * override this via a command-line option. */ | ||||||
|  |  | ||||||
|  |     if ((p = getenv("SCREEN_GAMMA")) != NULL) { | ||||||
|  |         double exponent = atof(p); | ||||||
|  |  | ||||||
|  |         if (exponent > 0.0) | ||||||
|  |             default_gamma = 1.0 / exponent; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (default_gamma == 0.0) | ||||||
|  |         default_gamma = 1.0 / default_display_exponent; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* Now parse the command line for options and the PNM filename. */ | ||||||
|  |  | ||||||
|  |     while (*++argv && !error) { | ||||||
|  |         if (!strncmp(*argv, "-i", 2)) { | ||||||
|  |             wpng_info.interlaced = TRUE; | ||||||
|  |         } else if (!strncmp(*argv, "-time", 3)) { | ||||||
|  |             wpng_info.modtime = time(NULL); | ||||||
|  |             wpng_info.have_time = TRUE; | ||||||
|  |         } else if (!strncmp(*argv, "-text", 3)) { | ||||||
|  |             text = TRUE; | ||||||
|  |         } else if (!strncmp(*argv, "-gamma", 2)) { | ||||||
|  |             if (!*++argv) | ||||||
|  |                 ++error; | ||||||
|  |             else { | ||||||
|  |                 wpng_info.gamma = atof(*argv); | ||||||
|  |                 if (wpng_info.gamma <= 0.0) | ||||||
|  |                     ++error; | ||||||
|  |                 else if (wpng_info.gamma > 1.01) | ||||||
|  |                     fprintf(stderr, PROGNAME | ||||||
|  |                       " warning:  file gammas are usually less than 1.0\n"); | ||||||
|  |             } | ||||||
|  |         } else if (!strncmp(*argv, "-bgcolor", 4)) { | ||||||
|  |             if (!*++argv) | ||||||
|  |                 ++error; | ||||||
|  |             else { | ||||||
|  |                 bgstr = *argv; | ||||||
|  |                 if (strlen(bgstr) != 7 || bgstr[0] != '#') | ||||||
|  |                     ++error; | ||||||
|  |                 else { | ||||||
|  |                     unsigned r, g, b;  /* this way quiets compiler warnings */ | ||||||
|  |  | ||||||
|  |                     sscanf(bgstr+1, "%2x%2x%2x", &r, &g, &b); | ||||||
|  |                     wpng_info.bg_red   = (uch)r; | ||||||
|  |                     wpng_info.bg_green = (uch)g; | ||||||
|  |                     wpng_info.bg_blue  = (uch)b; | ||||||
|  |                     wpng_info.have_bg = TRUE; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             if (**argv != '-') { | ||||||
|  |                 inname = *argv; | ||||||
|  |                 if (argv[1])   /* shouldn't be any more args after filename */ | ||||||
|  |                     ++error; | ||||||
|  |             } else | ||||||
|  |                 ++error;   /* not expecting any other options */ | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* open the input and output files, or register an error and abort */ | ||||||
|  |  | ||||||
|  |     if (!inname) { | ||||||
|  |         if (isatty(0)) { | ||||||
|  |             fprintf(stderr, PROGNAME | ||||||
|  |               ":  must give input filename or provide image data via stdin\n"); | ||||||
|  |             ++error; | ||||||
|  |         } else { | ||||||
|  | #ifdef DOS_OS2_W32 | ||||||
|  |             /* some buggy C libraries require BOTH setmode() and fdopen(bin) */ | ||||||
|  |             setmode(fileno(stdin), O_BINARY); | ||||||
|  |             setmode(fileno(stdout), O_BINARY); | ||||||
|  | #endif | ||||||
|  |             if ((wpng_info.infile = fdopen(fileno(stdin), "rb")) == NULL) { | ||||||
|  |                 fprintf(stderr, PROGNAME | ||||||
|  |                   ":  unable to reopen stdin in binary mode\n"); | ||||||
|  |                 ++error; | ||||||
|  |             } else | ||||||
|  |             if ((wpng_info.outfile = fdopen(fileno(stdout), "wb")) == NULL) { | ||||||
|  |                 fprintf(stderr, PROGNAME | ||||||
|  |                   ":  unable to reopen stdout in binary mode\n"); | ||||||
|  |                 fclose(wpng_info.infile); | ||||||
|  |                 ++error; | ||||||
|  |             } else | ||||||
|  |                 wpng_info.filter = TRUE; | ||||||
|  |         } | ||||||
|  |     } else if ((len = strlen(inname)) > 250) { | ||||||
|  |         fprintf(stderr, PROGNAME ":  input filename is too long [%d chars]\n", | ||||||
|  |           len); | ||||||
|  |         ++error; | ||||||
|  |     } else if (!(wpng_info.infile = fopen(inname, "rb"))) { | ||||||
|  |         fprintf(stderr, PROGNAME ":  can't open input file [%s]\n", inname); | ||||||
|  |         ++error; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (!error) { | ||||||
|  |         fgets(pnmline, 256, wpng_info.infile); | ||||||
|  |         if (pnmline[0] != 'P' || ((pnmchar = pnmline[1]) != '5' && | ||||||
|  |             pnmchar != '6' && pnmchar != '8')) | ||||||
|  |         { | ||||||
|  |             fprintf(stderr, PROGNAME | ||||||
|  |               ":  input file [%s] is not a binary PGM, PPM or PAM file\n", | ||||||
|  |               inname); | ||||||
|  |             ++error; | ||||||
|  |         } else { | ||||||
|  |             wpng_info.pnmtype = (int)(pnmchar - '0'); | ||||||
|  |             if (wpng_info.pnmtype != 8) | ||||||
|  |                 wpng_info.have_bg = FALSE;  /* no need for bg if opaque */ | ||||||
|  |             do { | ||||||
|  |                 fgets(pnmline, 256, wpng_info.infile);  /* lose any comments */ | ||||||
|  |             } while (pnmline[0] == '#'); | ||||||
|  |             sscanf(pnmline, "%ld %ld", &wpng_info.width, &wpng_info.height); | ||||||
|  |             do { | ||||||
|  |                 fgets(pnmline, 256, wpng_info.infile);  /* more comment lines */ | ||||||
|  |             } while (pnmline[0] == '#'); | ||||||
|  |             sscanf(pnmline, "%d", &maxval); | ||||||
|  |             if (wpng_info.width <= 0L || wpng_info.height <= 0L || | ||||||
|  |                 maxval != 255) | ||||||
|  |             { | ||||||
|  |                 fprintf(stderr, PROGNAME | ||||||
|  |                   ":  only positive width/height, maxval == 255 allowed \n"); | ||||||
|  |                 ++error; | ||||||
|  |             } | ||||||
|  |             wpng_info.sample_depth = 8;  /* <==> maxval 255 */ | ||||||
|  |  | ||||||
|  |             if (!wpng_info.filter) { | ||||||
|  |                 /* make outname from inname */ | ||||||
|  |                 if ((p = strrchr(inname, '.')) == NULL || | ||||||
|  |                     (p - inname) != (len - 4)) | ||||||
|  |                 { | ||||||
|  |                     strcpy(outname, inname); | ||||||
|  |                     strcpy(outname+len, ".png"); | ||||||
|  |                 } else { | ||||||
|  |                     len -= 4; | ||||||
|  |                     strncpy(outname, inname, len); | ||||||
|  |                     strcpy(outname+len, ".png"); | ||||||
|  |                 } | ||||||
|  |                 /* check if outname already exists; if not, open */ | ||||||
|  |                 if ((wpng_info.outfile = fopen(outname, "rb")) != NULL) { | ||||||
|  |                     fprintf(stderr, PROGNAME ":  output file exists [%s]\n", | ||||||
|  |                       outname); | ||||||
|  |                     fclose(wpng_info.outfile); | ||||||
|  |                     ++error; | ||||||
|  |                 } else if (!(wpng_info.outfile = fopen(outname, "wb"))) { | ||||||
|  |                     fprintf(stderr, PROGNAME ":  can't open output file [%s]\n", | ||||||
|  |                       outname); | ||||||
|  |                     ++error; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         if (error) { | ||||||
|  |             fclose(wpng_info.infile); | ||||||
|  |             wpng_info.infile = NULL; | ||||||
|  |             if (wpng_info.filter) { | ||||||
|  |                 fclose(wpng_info.outfile); | ||||||
|  |                 wpng_info.outfile = NULL; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* if we had any errors, print usage and die horrible death...arrr! */ | ||||||
|  |  | ||||||
|  |     if (error) { | ||||||
|  |         fprintf(stderr, "\n%s %s:  %s\n", PROGNAME, VERSION, APPNAME); | ||||||
|  |         writepng_version_info(); | ||||||
|  |         fprintf(stderr, "\n" | ||||||
|  | "Usage:  %s [-gamma exp] [-bgcolor bg] [-text] [-time] [-interlace] pnmfile\n" | ||||||
|  | "or: ... | %s [-gamma exp] [-bgcolor bg] [-text] [-time] [-interlace] | ...\n" | ||||||
|  |          "    exp \ttransfer-function exponent (``gamma'') of the image in\n" | ||||||
|  |          "\t\t  floating-point format (e.g., ``%.5f''); if image looks\n" | ||||||
|  |          "\t\t  correct on given display system, image gamma is equal to\n" | ||||||
|  |          "\t\t  inverse of display-system exponent, i.e., 1 / (LUT * CRT)\n" | ||||||
|  |          "\t\t  (where LUT = lookup-table exponent and CRT = CRT exponent;\n" | ||||||
|  |          "\t\t  first varies, second is usually 2.2, all are positive)\n" | ||||||
|  |          "    bg  \tdesired background color for alpha-channel images, in\n" | ||||||
|  |          "\t\t  7-character hex RGB format (e.g., ``#ff7700'' for orange:\n" | ||||||
|  |          "\t\t  same as HTML colors)\n" | ||||||
|  |          "    -text\tprompt interactively for text info (tEXt chunks)\n" | ||||||
|  |          "    -time\tinclude a tIME chunk (last modification time)\n" | ||||||
|  |          "    -interlace\twrite interlaced PNG image\n" | ||||||
|  |          "\n" | ||||||
|  | "pnmfile or stdin must be a binary PGM (`P5'), PPM (`P6') or (extremely\n" | ||||||
|  | "unofficial and unsupported!) PAM (`P8') file.  Currently it is required\n" | ||||||
|  | "to have maxval == 255 (i.e., no scaling).  If pnmfile is specified, it\n" | ||||||
|  | "is converted to the corresponding PNG file with the same base name but a\n" | ||||||
|  | "``.png'' extension; files read from stdin are converted and sent to stdout.\n" | ||||||
|  | "The conversion is progressive (low memory usage) unless interlacing is\n" | ||||||
|  | "requested; in that case the whole image will be buffered in memory and\n" | ||||||
|  | "written in one call.\n" | ||||||
|  |          "\n", PROGNAME, PROGNAME, default_gamma); | ||||||
|  |         exit(1); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* prepare the text buffers for libpng's use; note that even though | ||||||
|  |      * PNG's png_text struct includes a length field, we don't have to fill | ||||||
|  |      * it out */ | ||||||
|  |  | ||||||
|  |     if (text && | ||||||
|  | #ifndef DOS_OS2_W32 | ||||||
|  |         (keybd = fdopen(fileno(stderr), "r")) != NULL && | ||||||
|  | #endif | ||||||
|  |         (textbuf = (char *)malloc((5 + 9)*75)) != NULL) | ||||||
|  |     { | ||||||
|  |         int i, valid, result; | ||||||
|  |  | ||||||
|  |         fprintf(stderr, | ||||||
|  |           "Enter text info (no more than 72 characters per line);\n"); | ||||||
|  |         fprintf(stderr, "to skip a field, hit the <Enter> key.\n"); | ||||||
|  |         /* note:  just <Enter> leaves len == 1 */ | ||||||
|  |  | ||||||
|  |         do { | ||||||
|  |             valid = TRUE; | ||||||
|  |             p = textbuf + TEXT_TITLE_OFFSET; | ||||||
|  |             fprintf(stderr, "  Title: "); | ||||||
|  |             fflush(stderr); | ||||||
|  |             if (FGETS(p, 74, keybd) && (len = strlen(p)) > 1) { | ||||||
|  |                 if (p[len-1] == '\n') | ||||||
|  |                     p[--len] = '\0'; | ||||||
|  |                 wpng_info.title = p; | ||||||
|  |                 wpng_info.have_text |= TEXT_TITLE; | ||||||
|  |                 if ((result = wpng_isvalid_latin1((uch *)p, len)) >= 0) { | ||||||
|  |                     fprintf(stderr, "    " PROGNAME " warning:  character code" | ||||||
|  |                       " %u is %sdiscouraged by the PNG\n    specification " | ||||||
|  |                       "[first occurrence was at character position #%d]\n", | ||||||
|  |                       (unsigned)p[result], (p[result] == 27)? "strongly " : "", | ||||||
|  |                       result+1); | ||||||
|  |                     fflush(stderr); | ||||||
|  | #ifdef FORBID_LATIN1_CTRL | ||||||
|  |                     wpng_info.have_text &= ~TEXT_TITLE; | ||||||
|  |                     valid = FALSE; | ||||||
|  | #else | ||||||
|  |                     if (p[result] == 27) {    /* escape character */ | ||||||
|  |                         wpng_info.have_text &= ~TEXT_TITLE; | ||||||
|  |                         valid = FALSE; | ||||||
|  |                     } | ||||||
|  | #endif | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } while (!valid); | ||||||
|  |  | ||||||
|  |         do { | ||||||
|  |             valid = TRUE; | ||||||
|  |             p = textbuf + TEXT_AUTHOR_OFFSET; | ||||||
|  |             fprintf(stderr, "  Author: "); | ||||||
|  |             fflush(stderr); | ||||||
|  |             if (FGETS(p, 74, keybd) && (len = strlen(p)) > 1) { | ||||||
|  |                 if (p[len-1] == '\n') | ||||||
|  |                     p[--len] = '\0'; | ||||||
|  |                 wpng_info.author = p; | ||||||
|  |                 wpng_info.have_text |= TEXT_AUTHOR; | ||||||
|  |                 if ((result = wpng_isvalid_latin1((uch *)p, len)) >= 0) { | ||||||
|  |                     fprintf(stderr, "    " PROGNAME " warning:  character code" | ||||||
|  |                       " %u is %sdiscouraged by the PNG\n    specification " | ||||||
|  |                       "[first occurrence was at character position #%d]\n", | ||||||
|  |                       (unsigned)p[result], (p[result] == 27)? "strongly " : "", | ||||||
|  |                       result+1); | ||||||
|  |                     fflush(stderr); | ||||||
|  | #ifdef FORBID_LATIN1_CTRL | ||||||
|  |                     wpng_info.have_text &= ~TEXT_AUTHOR; | ||||||
|  |                     valid = FALSE; | ||||||
|  | #else | ||||||
|  |                     if (p[result] == 27) {    /* escape character */ | ||||||
|  |                         wpng_info.have_text &= ~TEXT_AUTHOR; | ||||||
|  |                         valid = FALSE; | ||||||
|  |                     } | ||||||
|  | #endif | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } while (!valid); | ||||||
|  |  | ||||||
|  |         do { | ||||||
|  |             valid = TRUE; | ||||||
|  |             p = textbuf + TEXT_DESC_OFFSET; | ||||||
|  |             fprintf(stderr, "  Description (up to 9 lines):\n"); | ||||||
|  |             for (i = 1;  i < 10;  ++i) { | ||||||
|  |                 fprintf(stderr, "    [%d] ", i); | ||||||
|  |                 fflush(stderr); | ||||||
|  |                 if (FGETS(p, 74, keybd) && (len = strlen(p)) > 1) | ||||||
|  |                     p += len;   /* now points at NULL; char before is newline */ | ||||||
|  |                 else | ||||||
|  |                     break; | ||||||
|  |             } | ||||||
|  |             if ((len = p - (textbuf + TEXT_DESC_OFFSET)) > 1) { | ||||||
|  |                 if (p[-1] == '\n') { | ||||||
|  |                     p[-1] = '\0'; | ||||||
|  |                     --len; | ||||||
|  |                 } | ||||||
|  |                 wpng_info.desc = textbuf + TEXT_DESC_OFFSET; | ||||||
|  |                 wpng_info.have_text |= TEXT_DESC; | ||||||
|  |                 p = textbuf + TEXT_DESC_OFFSET; | ||||||
|  |                 if ((result = wpng_isvalid_latin1((uch *)p, len)) >= 0) { | ||||||
|  |                     fprintf(stderr, "    " PROGNAME " warning:  character code" | ||||||
|  |                       " %u is %sdiscouraged by the PNG\n    specification " | ||||||
|  |                       "[first occurrence was at character position #%d]\n", | ||||||
|  |                       (unsigned)p[result], (p[result] == 27)? "strongly " : "", | ||||||
|  |                       result+1); | ||||||
|  |                     fflush(stderr); | ||||||
|  | #ifdef FORBID_LATIN1_CTRL | ||||||
|  |                     wpng_info.have_text &= ~TEXT_DESC; | ||||||
|  |                     valid = FALSE; | ||||||
|  | #else | ||||||
|  |                     if (p[result] == 27) {    /* escape character */ | ||||||
|  |                         wpng_info.have_text &= ~TEXT_DESC; | ||||||
|  |                         valid = FALSE; | ||||||
|  |                     } | ||||||
|  | #endif | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } while (!valid); | ||||||
|  |  | ||||||
|  |         do { | ||||||
|  |             valid = TRUE; | ||||||
|  |             p = textbuf + TEXT_COPY_OFFSET; | ||||||
|  |             fprintf(stderr, "  Copyright: "); | ||||||
|  |             fflush(stderr); | ||||||
|  |             if (FGETS(p, 74, keybd) && (len = strlen(p)) > 1) { | ||||||
|  |                 if (p[len-1] == '\n') | ||||||
|  |                     p[--len] = '\0'; | ||||||
|  |                 wpng_info.copyright = p; | ||||||
|  |                 wpng_info.have_text |= TEXT_COPY; | ||||||
|  |                 if ((result = wpng_isvalid_latin1((uch *)p, len)) >= 0) { | ||||||
|  |                     fprintf(stderr, "    " PROGNAME " warning:  character code" | ||||||
|  |                       " %u is %sdiscouraged by the PNG\n    specification " | ||||||
|  |                       "[first occurrence was at character position #%d]\n", | ||||||
|  |                       (unsigned)p[result], (p[result] == 27)? "strongly " : "", | ||||||
|  |                       result+1); | ||||||
|  |                     fflush(stderr); | ||||||
|  | #ifdef FORBID_LATIN1_CTRL | ||||||
|  |                     wpng_info.have_text &= ~TEXT_COPY; | ||||||
|  |                     valid = FALSE; | ||||||
|  | #else | ||||||
|  |                     if (p[result] == 27) {    /* escape character */ | ||||||
|  |                         wpng_info.have_text &= ~TEXT_COPY; | ||||||
|  |                         valid = FALSE; | ||||||
|  |                     } | ||||||
|  | #endif | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } while (!valid); | ||||||
|  |  | ||||||
|  |         do { | ||||||
|  |             valid = TRUE; | ||||||
|  |             p = textbuf + TEXT_EMAIL_OFFSET; | ||||||
|  |             fprintf(stderr, "  E-mail: "); | ||||||
|  |             fflush(stderr); | ||||||
|  |             if (FGETS(p, 74, keybd) && (len = strlen(p)) > 1) { | ||||||
|  |                 if (p[len-1] == '\n') | ||||||
|  |                     p[--len] = '\0'; | ||||||
|  |                 wpng_info.email = p; | ||||||
|  |                 wpng_info.have_text |= TEXT_EMAIL; | ||||||
|  |                 if ((result = wpng_isvalid_latin1((uch *)p, len)) >= 0) { | ||||||
|  |                     fprintf(stderr, "    " PROGNAME " warning:  character code" | ||||||
|  |                       " %u is %sdiscouraged by the PNG\n    specification " | ||||||
|  |                       "[first occurrence was at character position #%d]\n", | ||||||
|  |                       (unsigned)p[result], (p[result] == 27)? "strongly " : "", | ||||||
|  |                       result+1); | ||||||
|  |                     fflush(stderr); | ||||||
|  | #ifdef FORBID_LATIN1_CTRL | ||||||
|  |                     wpng_info.have_text &= ~TEXT_EMAIL; | ||||||
|  |                     valid = FALSE; | ||||||
|  | #else | ||||||
|  |                     if (p[result] == 27) {    /* escape character */ | ||||||
|  |                         wpng_info.have_text &= ~TEXT_EMAIL; | ||||||
|  |                         valid = FALSE; | ||||||
|  |                     } | ||||||
|  | #endif | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } while (!valid); | ||||||
|  |  | ||||||
|  |         do { | ||||||
|  |             valid = TRUE; | ||||||
|  |             p = textbuf + TEXT_URL_OFFSET; | ||||||
|  |             fprintf(stderr, "  URL: "); | ||||||
|  |             fflush(stderr); | ||||||
|  |             if (FGETS(p, 74, keybd) && (len = strlen(p)) > 1) { | ||||||
|  |                 if (p[len-1] == '\n') | ||||||
|  |                     p[--len] = '\0'; | ||||||
|  |                 wpng_info.url = p; | ||||||
|  |                 wpng_info.have_text |= TEXT_URL; | ||||||
|  |                 if ((result = wpng_isvalid_latin1((uch *)p, len)) >= 0) { | ||||||
|  |                     fprintf(stderr, "    " PROGNAME " warning:  character code" | ||||||
|  |                       " %u is %sdiscouraged by the PNG\n    specification " | ||||||
|  |                       "[first occurrence was at character position #%d]\n", | ||||||
|  |                       (unsigned)p[result], (p[result] == 27)? "strongly " : "", | ||||||
|  |                       result+1); | ||||||
|  |                     fflush(stderr); | ||||||
|  | #ifdef FORBID_LATIN1_CTRL | ||||||
|  |                     wpng_info.have_text &= ~TEXT_URL; | ||||||
|  |                     valid = FALSE; | ||||||
|  | #else | ||||||
|  |                     if (p[result] == 27) {    /* escape character */ | ||||||
|  |                         wpng_info.have_text &= ~TEXT_URL; | ||||||
|  |                         valid = FALSE; | ||||||
|  |                     } | ||||||
|  | #endif | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } while (!valid); | ||||||
|  |  | ||||||
|  | #ifndef DOS_OS2_W32 | ||||||
|  |         fclose(keybd); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |     } else if (text) { | ||||||
|  |         fprintf(stderr, PROGNAME ":  unable to allocate memory for text\n"); | ||||||
|  |         text = FALSE; | ||||||
|  |         wpng_info.have_text = 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* allocate libpng stuff, initialize transformations, write pre-IDAT data */ | ||||||
|  |  | ||||||
|  |     if ((rc = writepng_init(&wpng_info)) != 0) { | ||||||
|  |         switch (rc) { | ||||||
|  |             case 2: | ||||||
|  |                 fprintf(stderr, PROGNAME | ||||||
|  |                   ":  libpng initialization problem (longjmp)\n"); | ||||||
|  |                 break; | ||||||
|  |             case 4: | ||||||
|  |                 fprintf(stderr, PROGNAME ":  insufficient memory\n"); | ||||||
|  |                 break; | ||||||
|  |             case 11: | ||||||
|  |                 fprintf(stderr, PROGNAME | ||||||
|  |                   ":  internal logic error (unexpected PNM type)\n"); | ||||||
|  |                 break; | ||||||
|  |             default: | ||||||
|  |                 fprintf(stderr, PROGNAME | ||||||
|  |                   ":  unknown writepng_init() error\n"); | ||||||
|  |                 break; | ||||||
|  |         } | ||||||
|  |         exit(rc); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* free textbuf, since it's a completely local variable and all text info | ||||||
|  |      * has just been written to the PNG file */ | ||||||
|  |  | ||||||
|  |     if (text && textbuf) { | ||||||
|  |         free(textbuf); | ||||||
|  |         textbuf = NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* calculate rowbytes on basis of image type; note that this becomes much | ||||||
|  |      * more complicated if we choose to support PBM type, ASCII PNM types, or | ||||||
|  |      * 16-bit-per-sample binary data [currently not an official NetPBM type] */ | ||||||
|  |  | ||||||
|  |     if (wpng_info.pnmtype == 5) | ||||||
|  |         rowbytes = wpng_info.width; | ||||||
|  |     else if (wpng_info.pnmtype == 6) | ||||||
|  |         rowbytes = wpng_info.width * 3; | ||||||
|  |     else /* if (wpng_info.pnmtype == 8) */ | ||||||
|  |         rowbytes = wpng_info.width * 4; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* read and write the image, either in its entirety (if writing interlaced | ||||||
|  |      * PNG) or row by row (if non-interlaced) */ | ||||||
|  |  | ||||||
|  |     fprintf(stderr, "Encoding image data...\n"); | ||||||
|  |     fflush(stderr); | ||||||
|  |  | ||||||
|  |     if (wpng_info.interlaced) { | ||||||
|  |         long i; | ||||||
|  |         ulg bytes; | ||||||
|  |         ulg image_bytes = rowbytes * wpng_info.height;   /* overflow? */ | ||||||
|  |  | ||||||
|  |         wpng_info.image_data = (uch *)malloc(image_bytes); | ||||||
|  |         wpng_info.row_pointers = (uch **)malloc(wpng_info.height*sizeof(uch *)); | ||||||
|  |         if (wpng_info.image_data == NULL || wpng_info.row_pointers == NULL) { | ||||||
|  |             fprintf(stderr, PROGNAME ":  insufficient memory for image data\n"); | ||||||
|  |             writepng_cleanup(&wpng_info); | ||||||
|  |             wpng_cleanup(); | ||||||
|  |             exit(5); | ||||||
|  |         } | ||||||
|  |         for (i = 0;  i < wpng_info.height;  ++i) | ||||||
|  |             wpng_info.row_pointers[i] = wpng_info.image_data + i*rowbytes; | ||||||
|  |         bytes = fread(wpng_info.image_data, 1, image_bytes, wpng_info.infile); | ||||||
|  |         if (bytes != image_bytes) { | ||||||
|  |             fprintf(stderr, PROGNAME ":  expected %lu bytes, got %lu bytes\n", | ||||||
|  |               image_bytes, bytes); | ||||||
|  |             fprintf(stderr, "  (continuing anyway)\n"); | ||||||
|  |         } | ||||||
|  |         if (writepng_encode_image(&wpng_info) != 0) { | ||||||
|  |             fprintf(stderr, PROGNAME | ||||||
|  |               ":  libpng problem (longjmp) while writing image data\n"); | ||||||
|  |             writepng_cleanup(&wpng_info); | ||||||
|  |             wpng_cleanup(); | ||||||
|  |             exit(2); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     } else /* not interlaced:  write progressively (row by row) */ { | ||||||
|  |         long j; | ||||||
|  |         ulg bytes; | ||||||
|  |  | ||||||
|  |         wpng_info.image_data = (uch *)malloc(rowbytes); | ||||||
|  |         if (wpng_info.image_data == NULL) { | ||||||
|  |             fprintf(stderr, PROGNAME ":  insufficient memory for row data\n"); | ||||||
|  |             writepng_cleanup(&wpng_info); | ||||||
|  |             wpng_cleanup(); | ||||||
|  |             exit(5); | ||||||
|  |         } | ||||||
|  |         error = 0; | ||||||
|  |         for (j = wpng_info.height;  j > 0L;  --j) { | ||||||
|  |             bytes = fread(wpng_info.image_data, 1, rowbytes, wpng_info.infile); | ||||||
|  |             if (bytes != rowbytes) { | ||||||
|  |                 fprintf(stderr, PROGNAME | ||||||
|  |                   ":  expected %lu bytes, got %lu bytes (row %ld)\n", rowbytes, | ||||||
|  |                   bytes, wpng_info.height-j); | ||||||
|  |                 ++error; | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |             if (writepng_encode_row(&wpng_info) != 0) { | ||||||
|  |                 fprintf(stderr, PROGNAME | ||||||
|  |                   ":  libpng problem (longjmp) while writing row %ld\n", | ||||||
|  |                   wpng_info.height-j); | ||||||
|  |                 ++error; | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         if (error) { | ||||||
|  |             writepng_cleanup(&wpng_info); | ||||||
|  |             wpng_cleanup(); | ||||||
|  |             exit(2); | ||||||
|  |         } | ||||||
|  |         if (writepng_encode_finish(&wpng_info) != 0) { | ||||||
|  |             fprintf(stderr, PROGNAME ":  error on final libpng call\n"); | ||||||
|  |             writepng_cleanup(&wpng_info); | ||||||
|  |             wpng_cleanup(); | ||||||
|  |             exit(2); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* OK, we're done (successfully):  clean up all resources and quit */ | ||||||
|  |  | ||||||
|  |     fprintf(stderr, "Done.\n"); | ||||||
|  |     fflush(stderr); | ||||||
|  |  | ||||||
|  |     writepng_cleanup(&wpng_info); | ||||||
|  |     wpng_cleanup(); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static int wpng_isvalid_latin1(uch *p, int len) | ||||||
|  | { | ||||||
|  |     int i, result = -1; | ||||||
|  |  | ||||||
|  |     for (i = 0;  i < len;  ++i) { | ||||||
|  |         if (p[i] == 10 || (p[i] > 31 && p[i] < 127) || p[i] > 160) | ||||||
|  |             continue;           /* character is completely OK */ | ||||||
|  |         if (result < 0 || (p[result] != 27 && p[i] == 27)) | ||||||
|  |             result = i;         /* mark location of first questionable one */ | ||||||
|  |     }                           /*  or of first escape character (bad) */ | ||||||
|  |  | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static void wpng_cleanup(void) | ||||||
|  | { | ||||||
|  |     if (wpng_info.outfile) { | ||||||
|  |         fclose(wpng_info.outfile); | ||||||
|  |         wpng_info.outfile = NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (wpng_info.infile) { | ||||||
|  |         fclose(wpng_info.infile); | ||||||
|  |         wpng_info.infile = NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (wpng_info.image_data) { | ||||||
|  |         free(wpng_info.image_data); | ||||||
|  |         wpng_info.image_data = NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (wpng_info.row_pointers) { | ||||||
|  |         free(wpng_info.row_pointers); | ||||||
|  |         wpng_info.row_pointers = NULL; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifdef DOS_OS2_W32 | ||||||
|  |  | ||||||
|  | static char *dos_kbd_gets(char *buf, int len) | ||||||
|  | { | ||||||
|  |     int ch, count=0; | ||||||
|  |  | ||||||
|  |     do { | ||||||
|  |         buf[count++] = ch = getche(); | ||||||
|  |     } while (ch != '\r' && count < len-1); | ||||||
|  |  | ||||||
|  |     buf[count--] = '\0';        /* terminate string */ | ||||||
|  |     if (buf[count] == '\r')     /* Enter key makes CR, so change to newline */ | ||||||
|  |         buf[count] = '\n'; | ||||||
|  |  | ||||||
|  |     fprintf(stderr, "\n");      /* Enter key does *not* cause a newline */ | ||||||
|  |     fflush(stderr); | ||||||
|  |  | ||||||
|  |     return buf; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif /* DOS_OS2_W32 */ | ||||||
							
								
								
									
										368
									
								
								runtime/libpng/contrib/gregbook/writepng.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,368 @@ | |||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |    wpng - simple PNG-writing program                             writepng.c | ||||||
|  |  | ||||||
|  |   --------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |       Copyright (c) 1998-2000 Greg Roelofs.  All rights reserved. | ||||||
|  |  | ||||||
|  |       This software is provided "as is," without warranty of any kind, | ||||||
|  |       express or implied.  In no event shall the author or contributors | ||||||
|  |       be held liable for any damages arising in any way from the use of | ||||||
|  |       this software. | ||||||
|  |  | ||||||
|  |       Permission is granted to anyone to use this software for any purpose, | ||||||
|  |       including commercial applications, and to alter it and redistribute | ||||||
|  |       it freely, subject to the following restrictions: | ||||||
|  |  | ||||||
|  |       1. Redistributions of source code must retain the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions. | ||||||
|  |       2. Redistributions in binary form must reproduce the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions in the documenta- | ||||||
|  |          tion and/or other materials provided with the distribution. | ||||||
|  |       3. All advertising materials mentioning features or use of this | ||||||
|  |          software must display the following acknowledgment: | ||||||
|  |  | ||||||
|  |             This product includes software developed by Greg Roelofs | ||||||
|  |             and contributors for the book, "PNG: The Definitive Guide," | ||||||
|  |             published by O'Reilly and Associates. | ||||||
|  |  | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #include <stdlib.h>     /* for exit() prototype */ | ||||||
|  |  | ||||||
|  | #include "png.h"        /* libpng header; includes zlib.h and setjmp.h */ | ||||||
|  | #include "writepng.h"   /* typedefs, common macros, public prototypes */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* local prototype */ | ||||||
|  |  | ||||||
|  | static void writepng_error_handler(png_structp png_ptr, png_const_charp msg); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void writepng_version_info(void) | ||||||
|  | { | ||||||
|  |   fprintf(stderr, "   Compiled with libpng %s; using libpng %s.\n", | ||||||
|  |     PNG_LIBPNG_VER_STRING, png_libpng_ver); | ||||||
|  |   fprintf(stderr, "   Compiled with zlib %s; using zlib %s.\n", | ||||||
|  |     ZLIB_VERSION, zlib_version); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* returns 0 for success, 2 for libpng problem, 4 for out of memory, 11 for | ||||||
|  |  *  unexpected pnmtype; note that outfile might be stdout */ | ||||||
|  |  | ||||||
|  | int writepng_init(mainprog_info *mainprog_ptr) | ||||||
|  | { | ||||||
|  |     png_structp  png_ptr;       /* note:  temporary variables! */ | ||||||
|  |     png_infop  info_ptr; | ||||||
|  |     int color_type, interlace_type; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* could also replace libpng warning-handler (final NULL), but no need: */ | ||||||
|  |  | ||||||
|  |     png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, mainprog_ptr, | ||||||
|  |       writepng_error_handler, NULL); | ||||||
|  |     if (!png_ptr) | ||||||
|  |         return 4;   /* out of memory */ | ||||||
|  |  | ||||||
|  |     info_ptr = png_create_info_struct(png_ptr); | ||||||
|  |     if (!info_ptr) { | ||||||
|  |         png_destroy_write_struct(&png_ptr, NULL); | ||||||
|  |         return 4;   /* out of memory */ | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* setjmp() must be called in every function that calls a PNG-writing | ||||||
|  |      * libpng function, unless an alternate error handler was installed-- | ||||||
|  |      * but compatible error handlers must either use longjmp() themselves | ||||||
|  |      * (as in this program) or exit immediately, so here we go: */ | ||||||
|  |  | ||||||
|  |     if (setjmp(mainprog_ptr->jmpbuf)) { | ||||||
|  |         png_destroy_write_struct(&png_ptr, &info_ptr); | ||||||
|  |         return 2; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* make sure outfile is (re)opened in BINARY mode */ | ||||||
|  |  | ||||||
|  |     png_init_io(png_ptr, mainprog_ptr->outfile); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* set the compression levels--in general, always want to leave filtering | ||||||
|  |      * turned on (except for palette images) and allow all of the filters, | ||||||
|  |      * which is the default; want 32K zlib window, unless entire image buffer | ||||||
|  |      * is 16K or smaller (unknown here)--also the default; usually want max | ||||||
|  |      * compression (NOT the default); and remaining compression flags should | ||||||
|  |      * be left alone */ | ||||||
|  |  | ||||||
|  |     png_set_compression_level(png_ptr, Z_BEST_COMPRESSION); | ||||||
|  | /* | ||||||
|  |     >> this is default for no filtering; Z_FILTERED is default otherwise: | ||||||
|  |     png_set_compression_strategy(png_ptr, Z_DEFAULT_STRATEGY); | ||||||
|  |     >> these are all defaults: | ||||||
|  |     png_set_compression_mem_level(png_ptr, 8); | ||||||
|  |     png_set_compression_window_bits(png_ptr, 15); | ||||||
|  |     png_set_compression_method(png_ptr, 8); | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* set the image parameters appropriately */ | ||||||
|  |  | ||||||
|  |     if (mainprog_ptr->pnmtype == 5) | ||||||
|  |         color_type = PNG_COLOR_TYPE_GRAY; | ||||||
|  |     else if (mainprog_ptr->pnmtype == 6) | ||||||
|  |         color_type = PNG_COLOR_TYPE_RGB; | ||||||
|  |     else if (mainprog_ptr->pnmtype == 8) | ||||||
|  |         color_type = PNG_COLOR_TYPE_RGB_ALPHA; | ||||||
|  |     else { | ||||||
|  |         png_destroy_write_struct(&png_ptr, &info_ptr); | ||||||
|  |         return 11; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     interlace_type = mainprog_ptr->interlaced? PNG_INTERLACE_ADAM7 : | ||||||
|  |                                                PNG_INTERLACE_NONE; | ||||||
|  |  | ||||||
|  |     png_set_IHDR(png_ptr, info_ptr, mainprog_ptr->width, mainprog_ptr->height, | ||||||
|  |       mainprog_ptr->sample_depth, color_type, interlace_type, | ||||||
|  |       PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); | ||||||
|  |  | ||||||
|  |     if (mainprog_ptr->gamma > 0.0) | ||||||
|  |         png_set_gAMA(png_ptr, info_ptr, mainprog_ptr->gamma); | ||||||
|  |  | ||||||
|  |     if (mainprog_ptr->have_bg) {   /* we know it's RGBA, not gray+alpha */ | ||||||
|  |         png_color_16  background; | ||||||
|  |  | ||||||
|  |         background.red = mainprog_ptr->bg_red; | ||||||
|  |         background.green = mainprog_ptr->bg_green; | ||||||
|  |         background.blue = mainprog_ptr->bg_blue; | ||||||
|  |         png_set_bKGD(png_ptr, info_ptr, &background); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (mainprog_ptr->have_time) { | ||||||
|  |         png_time  modtime; | ||||||
|  |  | ||||||
|  |         png_convert_from_time_t(&modtime, mainprog_ptr->modtime); | ||||||
|  |         png_set_tIME(png_ptr, info_ptr, &modtime); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (mainprog_ptr->have_text) { | ||||||
|  |         png_text  text[6]; | ||||||
|  |         int  num_text = 0; | ||||||
|  |  | ||||||
|  |         if (mainprog_ptr->have_text & TEXT_TITLE) { | ||||||
|  |             text[num_text].compression = PNG_TEXT_COMPRESSION_NONE; | ||||||
|  |             text[num_text].key = "Title"; | ||||||
|  |             text[num_text].text = mainprog_ptr->title; | ||||||
|  |             ++num_text; | ||||||
|  |         } | ||||||
|  |         if (mainprog_ptr->have_text & TEXT_AUTHOR) { | ||||||
|  |             text[num_text].compression = PNG_TEXT_COMPRESSION_NONE; | ||||||
|  |             text[num_text].key = "Author"; | ||||||
|  |             text[num_text].text = mainprog_ptr->author; | ||||||
|  |             ++num_text; | ||||||
|  |         } | ||||||
|  |         if (mainprog_ptr->have_text & TEXT_DESC) { | ||||||
|  |             text[num_text].compression = PNG_TEXT_COMPRESSION_NONE; | ||||||
|  |             text[num_text].key = "Description"; | ||||||
|  |             text[num_text].text = mainprog_ptr->desc; | ||||||
|  |             ++num_text; | ||||||
|  |         } | ||||||
|  |         if (mainprog_ptr->have_text & TEXT_COPY) { | ||||||
|  |             text[num_text].compression = PNG_TEXT_COMPRESSION_NONE; | ||||||
|  |             text[num_text].key = "Copyright"; | ||||||
|  |             text[num_text].text = mainprog_ptr->copyright; | ||||||
|  |             ++num_text; | ||||||
|  |         } | ||||||
|  |         if (mainprog_ptr->have_text & TEXT_EMAIL) { | ||||||
|  |             text[num_text].compression = PNG_TEXT_COMPRESSION_NONE; | ||||||
|  |             text[num_text].key = "E-mail"; | ||||||
|  |             text[num_text].text = mainprog_ptr->email; | ||||||
|  |             ++num_text; | ||||||
|  |         } | ||||||
|  |         if (mainprog_ptr->have_text & TEXT_URL) { | ||||||
|  |             text[num_text].compression = PNG_TEXT_COMPRESSION_NONE; | ||||||
|  |             text[num_text].key = "URL"; | ||||||
|  |             text[num_text].text = mainprog_ptr->url; | ||||||
|  |             ++num_text; | ||||||
|  |         } | ||||||
|  |         png_set_text(png_ptr, info_ptr, text, num_text); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* write all chunks up to (but not including) first IDAT */ | ||||||
|  |  | ||||||
|  |     png_write_info(png_ptr, info_ptr); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* if we wanted to write any more text info *after* the image data, we | ||||||
|  |      * would set up text struct(s) here and call png_set_text() again, with | ||||||
|  |      * just the new data; png_set_tIME() could also go here, but it would | ||||||
|  |      * have no effect since we already called it above (only one tIME chunk | ||||||
|  |      * allowed) */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* set up the transformations:  for now, just pack low-bit-depth pixels | ||||||
|  |      * into bytes (one, two or four pixels per byte) */ | ||||||
|  |  | ||||||
|  |     png_set_packing(png_ptr); | ||||||
|  | /*  png_set_shift(png_ptr, &sig_bit);  to scale low-bit-depth values */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* make sure we save our pointers for use in writepng_encode_image() */ | ||||||
|  |  | ||||||
|  |     mainprog_ptr->png_ptr = png_ptr; | ||||||
|  |     mainprog_ptr->info_ptr = info_ptr; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* OK, that's all we need to do for now; return happy */ | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* returns 0 for success, 2 for libpng (longjmp) problem */ | ||||||
|  |  | ||||||
|  | int writepng_encode_image(mainprog_info *mainprog_ptr) | ||||||
|  | { | ||||||
|  |     png_structp png_ptr = (png_structp)mainprog_ptr->png_ptr; | ||||||
|  |     png_infop info_ptr = (png_infop)mainprog_ptr->info_ptr; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* as always, setjmp() must be called in every function that calls a | ||||||
|  |      * PNG-writing libpng function */ | ||||||
|  |  | ||||||
|  |     if (setjmp(mainprog_ptr->jmpbuf)) { | ||||||
|  |         png_destroy_write_struct(&png_ptr, &info_ptr); | ||||||
|  |         mainprog_ptr->png_ptr = NULL; | ||||||
|  |         mainprog_ptr->info_ptr = NULL; | ||||||
|  |         return 2; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* and now we just write the whole image; libpng takes care of interlacing | ||||||
|  |      * for us */ | ||||||
|  |  | ||||||
|  |     png_write_image(png_ptr, mainprog_ptr->row_pointers); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* since that's it, we also close out the end of the PNG file now--if we | ||||||
|  |      * had any text or time info to write after the IDATs, second argument | ||||||
|  |      * would be info_ptr, but we optimize slightly by sending NULL pointer: */ | ||||||
|  |  | ||||||
|  |     png_write_end(png_ptr, NULL); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* returns 0 if succeeds, 2 if libpng problem */ | ||||||
|  |  | ||||||
|  | int writepng_encode_row(mainprog_info *mainprog_ptr)  /* NON-interlaced only! */ | ||||||
|  | { | ||||||
|  |     png_structp png_ptr = (png_structp)mainprog_ptr->png_ptr; | ||||||
|  |     png_infop info_ptr = (png_infop)mainprog_ptr->info_ptr; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* as always, setjmp() must be called in every function that calls a | ||||||
|  |      * PNG-writing libpng function */ | ||||||
|  |  | ||||||
|  |     if (setjmp(mainprog_ptr->jmpbuf)) { | ||||||
|  |         png_destroy_write_struct(&png_ptr, &info_ptr); | ||||||
|  |         mainprog_ptr->png_ptr = NULL; | ||||||
|  |         mainprog_ptr->info_ptr = NULL; | ||||||
|  |         return 2; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* image_data points at our one row of image data */ | ||||||
|  |  | ||||||
|  |     png_write_row(png_ptr, mainprog_ptr->image_data); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* returns 0 if succeeds, 2 if libpng problem */ | ||||||
|  |  | ||||||
|  | int writepng_encode_finish(mainprog_info *mainprog_ptr)   /* NON-interlaced! */ | ||||||
|  | { | ||||||
|  |     png_structp png_ptr = (png_structp)mainprog_ptr->png_ptr; | ||||||
|  |     png_infop info_ptr = (png_infop)mainprog_ptr->info_ptr; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* as always, setjmp() must be called in every function that calls a | ||||||
|  |      * PNG-writing libpng function */ | ||||||
|  |  | ||||||
|  |     if (setjmp(mainprog_ptr->jmpbuf)) { | ||||||
|  |         png_destroy_write_struct(&png_ptr, &info_ptr); | ||||||
|  |         mainprog_ptr->png_ptr = NULL; | ||||||
|  |         mainprog_ptr->info_ptr = NULL; | ||||||
|  |         return 2; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /* close out PNG file; if we had any text or time info to write after | ||||||
|  |      * the IDATs, second argument would be info_ptr: */ | ||||||
|  |  | ||||||
|  |     png_write_end(png_ptr, NULL); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void writepng_cleanup(mainprog_info *mainprog_ptr) | ||||||
|  | { | ||||||
|  |     png_structp png_ptr = (png_structp)mainprog_ptr->png_ptr; | ||||||
|  |     png_infop info_ptr = (png_infop)mainprog_ptr->info_ptr; | ||||||
|  |  | ||||||
|  |     if (png_ptr && info_ptr) | ||||||
|  |         png_destroy_write_struct(&png_ptr, &info_ptr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static void writepng_error_handler(png_structp png_ptr, png_const_charp msg) | ||||||
|  | { | ||||||
|  |     mainprog_info  *mainprog_ptr; | ||||||
|  |  | ||||||
|  |     /* This function, aside from the extra step of retrieving the "error | ||||||
|  |      * pointer" (below) and the fact that it exists within the application | ||||||
|  |      * rather than within libpng, is essentially identical to libpng's | ||||||
|  |      * default error handler.  The second point is critical:  since both | ||||||
|  |      * setjmp() and longjmp() are called from the same code, they are | ||||||
|  |      * guaranteed to have compatible notions of how big a jmp_buf is, | ||||||
|  |      * regardless of whether _BSD_SOURCE or anything else has (or has not) | ||||||
|  |      * been defined. */ | ||||||
|  |  | ||||||
|  |     fprintf(stderr, "writepng libpng error: %s\n", msg); | ||||||
|  |     fflush(stderr); | ||||||
|  |  | ||||||
|  |     mainprog_ptr = png_get_error_ptr(png_ptr); | ||||||
|  |     if (mainprog_ptr == NULL) {         /* we are completely hosed now */ | ||||||
|  |         fprintf(stderr, | ||||||
|  |           "writepng severe error:  jmpbuf not recoverable; terminating.\n"); | ||||||
|  |         fflush(stderr); | ||||||
|  |         exit(99); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     longjmp(mainprog_ptr->jmpbuf, 1); | ||||||
|  | } | ||||||
							
								
								
									
										109
									
								
								runtime/libpng/contrib/gregbook/writepng.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,109 @@ | |||||||
|  | /*--------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |    wpng - simple PNG-writing program                             writepng.h | ||||||
|  |  | ||||||
|  |   --------------------------------------------------------------------------- | ||||||
|  |  | ||||||
|  |       Copyright (c) 1998-2000 Greg Roelofs.  All rights reserved. | ||||||
|  |  | ||||||
|  |       This software is provided "as is," without warranty of any kind, | ||||||
|  |       express or implied.  In no event shall the author or contributors | ||||||
|  |       be held liable for any damages arising in any way from the use of | ||||||
|  |       this software. | ||||||
|  |  | ||||||
|  |       Permission is granted to anyone to use this software for any purpose, | ||||||
|  |       including commercial applications, and to alter it and redistribute | ||||||
|  |       it freely, subject to the following restrictions: | ||||||
|  |  | ||||||
|  |       1. Redistributions of source code must retain the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions. | ||||||
|  |       2. Redistributions in binary form must reproduce the above copyright | ||||||
|  |          notice, disclaimer, and this list of conditions in the documenta- | ||||||
|  |          tion and/or other materials provided with the distribution. | ||||||
|  |       3. All advertising materials mentioning features or use of this | ||||||
|  |          software must display the following acknowledgment: | ||||||
|  |  | ||||||
|  |             This product includes software developed by Greg Roelofs | ||||||
|  |             and contributors for the book, "PNG: The Definitive Guide," | ||||||
|  |             published by O'Reilly and Associates. | ||||||
|  |  | ||||||
|  |   ---------------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|  | #ifndef TRUE | ||||||
|  | #  define TRUE 1 | ||||||
|  | #  define FALSE 0 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef MAX | ||||||
|  | #  define MAX(a,b)  ((a) > (b)? (a) : (b)) | ||||||
|  | #  define MIN(a,b)  ((a) < (b)? (a) : (b)) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef DEBUG | ||||||
|  | #  define Trace(x)  {fprintf x ; fflush(stderr); fflush(stdout);} | ||||||
|  | #else | ||||||
|  | #  define Trace(x)  ; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define TEXT_TITLE    0x01 | ||||||
|  | #define TEXT_AUTHOR   0x02 | ||||||
|  | #define TEXT_DESC     0x04 | ||||||
|  | #define TEXT_COPY     0x08 | ||||||
|  | #define TEXT_EMAIL    0x10 | ||||||
|  | #define TEXT_URL      0x20 | ||||||
|  |  | ||||||
|  | #define TEXT_TITLE_OFFSET        0 | ||||||
|  | #define TEXT_AUTHOR_OFFSET      72 | ||||||
|  | #define TEXT_COPY_OFFSET     (2*72) | ||||||
|  | #define TEXT_EMAIL_OFFSET    (3*72) | ||||||
|  | #define TEXT_URL_OFFSET      (4*72) | ||||||
|  | #define TEXT_DESC_OFFSET     (5*72) | ||||||
|  |  | ||||||
|  | typedef unsigned char   uch; | ||||||
|  | typedef unsigned short  ush; | ||||||
|  | typedef unsigned long   ulg; | ||||||
|  |  | ||||||
|  | typedef struct _mainprog_info { | ||||||
|  |     double gamma; | ||||||
|  |     long width; | ||||||
|  |     long height; | ||||||
|  |     time_t modtime; | ||||||
|  |     FILE *infile; | ||||||
|  |     FILE *outfile; | ||||||
|  |     void *png_ptr; | ||||||
|  |     void *info_ptr; | ||||||
|  |     uch *image_data; | ||||||
|  |     uch **row_pointers; | ||||||
|  |     char *title; | ||||||
|  |     char *author; | ||||||
|  |     char *desc; | ||||||
|  |     char *copyright; | ||||||
|  |     char *email; | ||||||
|  |     char *url; | ||||||
|  |     int filter;    /* command-line-filter flag, not PNG row filter! */ | ||||||
|  |     int pnmtype; | ||||||
|  |     int sample_depth; | ||||||
|  |     int interlaced; | ||||||
|  |     int have_bg; | ||||||
|  |     int have_time; | ||||||
|  |     int have_text; | ||||||
|  |     jmp_buf jmpbuf; | ||||||
|  |     uch bg_red; | ||||||
|  |     uch bg_green; | ||||||
|  |     uch bg_blue; | ||||||
|  | } mainprog_info; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* prototypes for public functions in writepng.c */ | ||||||
|  |  | ||||||
|  | void writepng_version_info(void); | ||||||
|  |  | ||||||
|  | int writepng_init(mainprog_info *mainprog_ptr); | ||||||
|  |  | ||||||
|  | int writepng_encode_image(mainprog_info *mainprog_ptr); | ||||||
|  |  | ||||||
|  | int writepng_encode_row(mainprog_info *mainprog_ptr); | ||||||
|  |  | ||||||
|  | int writepng_encode_finish(mainprog_info *mainprog_ptr); | ||||||
|  |  | ||||||
|  | void writepng_cleanup(mainprog_info *mainprog_ptr); | ||||||
							
								
								
									
										22
									
								
								runtime/libpng/contrib/msvctest/README.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,22 @@ | |||||||
|  | Microsoft Developer Studio Build File, Format Version 6.00 for | ||||||
|  | msvctest | ||||||
|  |  | ||||||
|  | Assumes that libpng DLLs and LIBs are in ..\..\projects\msvc\win32\libpng | ||||||
|  | Assumes that zlib DLLs and LIBs are in ..\..\projects\msvc\win32\zlib | ||||||
|  |  | ||||||
|  | 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) The test results should appear in the "Build" pane of the Output Window. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Simon-Pierre Cadieux | ||||||
|  | Methodex Computer Systems Inc. | ||||||
							
								
								
									
										247
									
								
								runtime/libpng/contrib/msvctest/msvctest.dsp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,247 @@ | |||||||
|  | # Microsoft Developer Studio Project File - Name="msvctest" - Package Owner=<4> | ||||||
|  | # Microsoft Developer Studio Generated Build File, Format Version 6.00 | ||||||
|  | # ** DO NOT EDIT ** | ||||||
|  |  | ||||||
|  | # TARGTYPE "Win32 (x86) Console Application" 0x0103 | ||||||
|  |  | ||||||
|  | CFG=msvctest - Win32 Debug DLL | ||||||
|  | !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 "msvctest.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 "msvctest.mak" CFG="msvctest - Win32 Debug DLL" | ||||||
|  | !MESSAGE  | ||||||
|  | !MESSAGE Possible choices for configuration are: | ||||||
|  | !MESSAGE  | ||||||
|  | !MESSAGE "msvctest - Win32 DLL" (based on "Win32 (x86) Console Application") | ||||||
|  | !MESSAGE "msvctest - Win32 Debug DLL" (based on "Win32 (x86) Console Application") | ||||||
|  | !MESSAGE "msvctest - Win32 ASM DLL" (based on "Win32 (x86) Console Application") | ||||||
|  | !MESSAGE "msvctest - Win32 Debug ASM DLL" (based on "Win32 (x86) Console Application") | ||||||
|  | !MESSAGE "msvctest - Win32 LIB" (based on "Win32 (x86) Console Application") | ||||||
|  | !MESSAGE "msvctest - Win32 Debug LIB" (based on "Win32 (x86) Console Application") | ||||||
|  | !MESSAGE  | ||||||
|  |  | ||||||
|  | # Begin Project | ||||||
|  | # PROP AllowPerConfigDependencies 0 | ||||||
|  | # PROP Scc_ProjName "" | ||||||
|  | # PROP Scc_LocalPath "" | ||||||
|  | CPP=cl.exe | ||||||
|  | RSC=rc.exe | ||||||
|  |  | ||||||
|  | !IF  "$(CFG)" == "msvctest - Win32 DLL" | ||||||
|  |  | ||||||
|  | # PROP BASE Use_MFC 0 | ||||||
|  | # PROP BASE Use_Debug_Libraries 0 | ||||||
|  | # PROP BASE Output_Dir "dll" | ||||||
|  | # PROP BASE Intermediate_Dir "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 /O1 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /FD /c | ||||||
|  | # ADD CPP /nologo /MD /W3 /O1 /I "..\..\..\zlib" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "PNG_DLL" /D "PNG_NO_STDIO" /D "PNG_NO_GLOBAL_ARRAYS" /FD /c | ||||||
|  | # 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 /nologo /subsystem:console /machine:I386 | ||||||
|  | # ADD LINK32 ..\..\projects\msvc\win32\libpng\dll\libpng13.lib /nologo /subsystem:console /machine:I386 | ||||||
|  | # Begin Special Build Tool | ||||||
|  | OutDir=.\dll | ||||||
|  | SOURCE="$(InputPath)" | ||||||
|  | PostBuild_Desc=[Run Test] | ||||||
|  | PostBuild_Cmds=set path=..\..\projects\msvc\win32\libpng\dll;..\..\projects\msvc\win32\zlib\dll;	$(outdir)\msvctest.exe ..\..\pngtest.png | ||||||
|  | # End Special Build Tool | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "msvctest - Win32 Debug DLL" | ||||||
|  |  | ||||||
|  | # PROP BASE Use_MFC 0 | ||||||
|  | # PROP BASE Use_Debug_Libraries 1 | ||||||
|  | # PROP BASE Output_Dir "dll_dbg" | ||||||
|  | # PROP BASE Intermediate_Dir "dll_dbg" | ||||||
|  | # 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 /Zi /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c | ||||||
|  | # ADD CPP /nologo /MDd /W3 /Zi /Od /I "..\..\..\zlib" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "PNG_DLL" /D "PNG_NO_STDIO" /D "PNG_NO_GLOBAL_ARRAYS" /FD /GZ /c | ||||||
|  | # 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 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||||||
|  | # ADD LINK32 ..\..\projects\msvc\win32\libpng\dll_dbg\libpng13d.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||||||
|  | # Begin Special Build Tool | ||||||
|  | OutDir=.\dll_dbg | ||||||
|  | SOURCE="$(InputPath)" | ||||||
|  | PostBuild_Desc=[Run Test] | ||||||
|  | PostBuild_Cmds=set path=..\..\projects\msvc\win32\libpng\dll_dbg;..\..\projects\msvc\win32\zlib\dll_dbg;	$(outdir)\msvctest.exe ..\..\pngtest.png | ||||||
|  | # End Special Build Tool | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "msvctest - Win32 ASM DLL" | ||||||
|  |  | ||||||
|  | # PROP BASE Use_MFC 0 | ||||||
|  | # PROP BASE Use_Debug_Libraries 0 | ||||||
|  | # PROP BASE Output_Dir "dll_asm" | ||||||
|  | # PROP BASE Intermediate_Dir "dll_asm" | ||||||
|  | # PROP BASE Target_Dir "" | ||||||
|  | # PROP Use_MFC 0 | ||||||
|  | # PROP Use_Debug_Libraries 0 | ||||||
|  | # PROP Output_Dir "dll_asm" | ||||||
|  | # PROP Intermediate_Dir "dll_asm" | ||||||
|  | # PROP Ignore_Export_Lib 0 | ||||||
|  | # PROP Target_Dir "" | ||||||
|  | # ADD BASE CPP /nologo /W3 /O1 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /FD /c | ||||||
|  | # ADD CPP /nologo /MD /W3 /O1 /I "..\..\..\zlib" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "PNG_DLL" /D "PNG_NO_STDIO" /D "PNG_NO_GLOBAL_ARRAYS" /FD /c | ||||||
|  | # 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 /nologo /subsystem:console /machine:I386 | ||||||
|  | # ADD LINK32 ..\..\projects\msvc\win32\libpng\dll_asm\libpng13a.lib /nologo /subsystem:console /machine:I386 | ||||||
|  | # Begin Special Build Tool | ||||||
|  | OutDir=.\dll_asm | ||||||
|  | SOURCE="$(InputPath)" | ||||||
|  | PostBuild_Desc=[Run Test] | ||||||
|  | PostBuild_Cmds=set path=..\..\projects\msvc\win32\libpng\dll_asm;..\..\projects\msvc\win32\zlib\dll_asm;	$(outdir)\msvctest.exe ..\..\pngtest.png | ||||||
|  | # End Special Build Tool | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "msvctest - Win32 Debug ASM DLL" | ||||||
|  |  | ||||||
|  | # PROP BASE Use_MFC 0 | ||||||
|  | # PROP BASE Use_Debug_Libraries 1 | ||||||
|  | # PROP BASE Output_Dir "dll_dbga" | ||||||
|  | # PROP BASE Intermediate_Dir "dll_dbga" | ||||||
|  | # PROP BASE Target_Dir "" | ||||||
|  | # PROP Use_MFC 0 | ||||||
|  | # PROP Use_Debug_Libraries 1 | ||||||
|  | # PROP Output_Dir "dll_dbga" | ||||||
|  | # PROP Intermediate_Dir "dll_dbga" | ||||||
|  | # PROP Ignore_Export_Lib 0 | ||||||
|  | # PROP Target_Dir "" | ||||||
|  | # ADD BASE CPP /nologo /W3 /Zi /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c | ||||||
|  | # ADD CPP /nologo /MDd /W3 /Zi /Od /I "..\..\..\zlib" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "PNG_DLL" /D "PNG_NO_STDIO" /D "PNG_NO_GLOBAL_ARRAYS" /FD /GZ /c | ||||||
|  | # 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 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||||||
|  | # ADD LINK32 ..\..\projects\msvc\win32\libpng\dll_dbga\libpng13b.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||||||
|  | # Begin Special Build Tool | ||||||
|  | OutDir=.\dll_dbga | ||||||
|  | SOURCE="$(InputPath)" | ||||||
|  | PostBuild_Desc=[Run Test] | ||||||
|  | PostBuild_Cmds=set path=..\..\projects\msvc\win32\libpng\dll_dbga;..\..\projects\msvc\win32\zlib\dll_dbga;	$(outdir)\msvctest.exe ..\..\pngtest.png | ||||||
|  | # End Special Build Tool | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "msvctest - Win32 LIB" | ||||||
|  |  | ||||||
|  | # PROP BASE Use_MFC 0 | ||||||
|  | # PROP BASE Use_Debug_Libraries 0 | ||||||
|  | # PROP BASE Output_Dir "lib" | ||||||
|  | # PROP BASE Intermediate_Dir "lib" | ||||||
|  | # 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 /O1 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /FD /c | ||||||
|  | # ADD CPP /nologo /W3 /O1 /I "..\..\..\zlib" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /FD /c | ||||||
|  | # 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 /nologo /subsystem:console /machine:I386 | ||||||
|  | # ADD LINK32 ..\..\projects\msvc\win32\libpng\lib\libpng.lib /nologo /subsystem:console /machine:I386 | ||||||
|  | # Begin Special Build Tool | ||||||
|  | OutDir=.\lib | ||||||
|  | SOURCE="$(InputPath)" | ||||||
|  | PostBuild_Desc=[Run Test] | ||||||
|  | PostBuild_Cmds=$(outdir)\msvctest.exe ..\..\pngtest.png | ||||||
|  | # End Special Build Tool | ||||||
|  |  | ||||||
|  | !ELSEIF  "$(CFG)" == "msvctest - Win32 Debug LIB" | ||||||
|  |  | ||||||
|  | # PROP BASE Use_MFC 0 | ||||||
|  | # PROP BASE Use_Debug_Libraries 1 | ||||||
|  | # PROP BASE Output_Dir "lib_dbg" | ||||||
|  | # PROP BASE Intermediate_Dir "lib_dbg" | ||||||
|  | # 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 /Zi /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c | ||||||
|  | # ADD CPP /nologo /W3 /Zi /Od /I "..\..\..\zlib" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c | ||||||
|  | # 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 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||||||
|  | # ADD LINK32 ..\..\projects\msvc\win32\libpng\lib_dbg\libpng.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept | ||||||
|  | # Begin Special Build Tool | ||||||
|  | OutDir=.\lib_dbg | ||||||
|  | SOURCE="$(InputPath)" | ||||||
|  | PostBuild_Desc=[Run Test] | ||||||
|  | PostBuild_Cmds=$(outdir)\msvctest.exe ..\..\pngtest.png | ||||||
|  | # End Special Build Tool | ||||||
|  |  | ||||||
|  | !ENDIF  | ||||||
|  |  | ||||||
|  | # Begin Target | ||||||
|  |  | ||||||
|  | # Name "msvctest - Win32 DLL" | ||||||
|  | # Name "msvctest - Win32 Debug DLL" | ||||||
|  | # Name "msvctest - Win32 ASM DLL" | ||||||
|  | # Name "msvctest - Win32 Debug ASM DLL" | ||||||
|  | # Name "msvctest - Win32 LIB" | ||||||
|  | # Name "msvctest - Win32 Debug LIB" | ||||||
|  | # Begin Group "Source Files" | ||||||
|  |  | ||||||
|  | # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=..\..\pngtest.c | ||||||
|  | # End Source File | ||||||
|  | # Begin Source File | ||||||
|  |  | ||||||
|  | SOURCE=.\README.txt | ||||||
|  | # PROP Exclude_From_Build 1 | ||||||
|  | # End Source File | ||||||
|  | # End Group | ||||||
|  | # Begin Group "Header Files" | ||||||
|  |  | ||||||
|  | # PROP Default_Filter "h;hpp;hxx;hm;inl" | ||||||
|  | # End Group | ||||||
|  | # Begin Group "Resource Files" | ||||||
|  |  | ||||||
|  | # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" | ||||||
|  | # End Group | ||||||
|  | # End Target | ||||||
|  | # End Project | ||||||
							
								
								
									
										29
									
								
								runtime/libpng/contrib/msvctest/msvctest.dsw
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,29 @@ | |||||||
|  | Microsoft Developer Studio Workspace File, Format Version 6.00 | ||||||
|  | # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! | ||||||
|  |  | ||||||
|  | ############################################################################### | ||||||
|  |  | ||||||
|  | Project: "msvctest"=.\msvctest.dsp - Package Owner=<4> | ||||||
|  |  | ||||||
|  | Package=<5> | ||||||
|  | {{{ | ||||||
|  | }}} | ||||||
|  |  | ||||||
|  | Package=<4> | ||||||
|  | {{{ | ||||||
|  | }}} | ||||||
|  |  | ||||||
|  | ############################################################################### | ||||||
|  |  | ||||||
|  | Global: | ||||||
|  |  | ||||||
|  | Package=<5> | ||||||
|  | {{{ | ||||||
|  | }}} | ||||||
|  |  | ||||||
|  | Package=<3> | ||||||
|  | {{{ | ||||||
|  | }}} | ||||||
|  |  | ||||||
|  | ############################################################################### | ||||||
|  |  | ||||||
							
								
								
									
										153
									
								
								runtime/libpng/contrib/pngminus/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,153 @@ | |||||||
|  | PngMinus | ||||||
|  | -------- | ||||||
|  | (copyright Willem van Schaik, 1999) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | License | ||||||
|  | ------- | ||||||
|  |  | ||||||
|  | Permission to use, copy, modify, and distribute this software and | ||||||
|  | its documentation for any purpose and without fee is hereby granted, | ||||||
|  | provided that the above copyright notice appear in all copies and | ||||||
|  | that both that copyright notice and this permission notice appear in | ||||||
|  | supporting documentation. This software is provided "as is" without | ||||||
|  | express or implied warranty. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Some history | ||||||
|  | ------------ | ||||||
|  | Soon after the creation of PNG in 1995, the need was felt for a set of | ||||||
|  | pnmtopng / pngtopnm utilities. Independantly Alexander Lehmann and I | ||||||
|  | (Willem van Schaik) started such a project. Luckily we discovered this | ||||||
|  | and merged the two together into pnmtopng.tar.gz, which is available | ||||||
|  | from a/o ftp://swrinde.nde.swri.edu/pub/png/. | ||||||
|  |  | ||||||
|  | These two utilities have many, many options and make use of most of the | ||||||
|  | features of PNG, like gamma, alpha, sbit, text-chunks, etc. This makes | ||||||
|  | the utilities quite complex and by now not anymore very maintainable. | ||||||
|  | When we wrote these programs, libpng was still in an early stage. | ||||||
|  | Therefore, lots of the functionality that we put in our software can now | ||||||
|  | be done using transform-functions in libpng. | ||||||
|  |  | ||||||
|  | Finally, to compile these programs, you need to have installed and | ||||||
|  | compiled three libraries: libpng, zlib and netpbm. Especially the latter | ||||||
|  | makes the whole setup a bit bulky. But that's unavoidable given the many | ||||||
|  | features of pnmtopng. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | What now | ||||||
|  | -------- | ||||||
|  | At this moment libpng is in a very stable state and can do much of the | ||||||
|  | work done in pnmtopng. Also, pnmtopng needs to be upgraded to the new | ||||||
|  | interface of libpng. Hence, it is time for a rewrite from the ground up | ||||||
|  | of pnmtopng and pngtopnm. This will happen in the near future (stay | ||||||
|  | tuned). The new package will get a different name to distinguish it from | ||||||
|  | the old one: PngPlus. | ||||||
|  |  | ||||||
|  | To experiment a bit with the new interface of libpng, I started off with | ||||||
|  | a small prototype that contains only the basic functionality. It doesn't | ||||||
|  | have any of the options to read or write special chunks and it will do | ||||||
|  | no gamma correction. But this makes it also a simple program that is | ||||||
|  | quite easy to understand and can serve well as a template for other | ||||||
|  | software developments. (By now there are of course a couple of programs, | ||||||
|  | like Greg Roelofs' rpng/wpng, that can be used just as good.) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Can and can not | ||||||
|  | --------------- | ||||||
|  | As this is the small brother of the future PngPlus, I called this fellow | ||||||
|  | PngMinus. Because I started this development in good-old Turbo-C, I | ||||||
|  | avoided the use the netpbm library, which requires DOS extenders. Again, | ||||||
|  | another reason to call it PngMinus (minus netpbm :-). So, part of the | ||||||
|  | program are some elementary routines to read / write pgm- and ppm-files. | ||||||
|  | It does not read b&w pbm-files. | ||||||
|  |  | ||||||
|  | The downside of this approach is that you can not use them on images | ||||||
|  | that require blocks of memory bigger than 64k (the DOS version). For | ||||||
|  | larger images you will get an out-of-memory error. | ||||||
|  |  | ||||||
|  | As said before, PngMinus doesn't correct for gamma. When reading | ||||||
|  | png-files you can do this just as well by piping the output of png2pnm | ||||||
|  | to pnmgamma, one of the standard PbmPlus tools. This same scenario will | ||||||
|  | most probably also be followed in the full-blown future PngPlus, with | ||||||
|  | the addition of course of the possibility to create gamma-chunks when | ||||||
|  | writing png-files. | ||||||
|  |  | ||||||
|  | On the other hand it supports alpha-channels. When reading a png-image | ||||||
|  | you can write the alpha-channel into a pgm-file. And when creating an | ||||||
|  | RGB+A png-image, you just combine a ppm-file with a corresponding | ||||||
|  | pgm-file containing the alpha-channel. When reading, transparency chunks | ||||||
|  | are converted into an alpha-channel and from there on treated the same | ||||||
|  | way. | ||||||
|  |  | ||||||
|  | Finally you can opt for writing ascii or binary pgm- and ppm-files. When | ||||||
|  | the bit-depth is 16, the format will always be ascii. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Using it | ||||||
|  | -------- | ||||||
|  | To distinguish them from pnmtopng and PngPlus, the utilities are named | ||||||
|  | png2pnm and pnm2png (2 instead of to). The input- and output-files can | ||||||
|  | be given as parameters or through redirection. Therefore the programs | ||||||
|  | can be part of a pipe. | ||||||
|  |  | ||||||
|  | To list the options type "png2pnm -h" or "pnm2png -h". | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Just like Scandinavian furniture | ||||||
|  | -------------------------------- | ||||||
|  | You have to put it together yourself. I did test the software under | ||||||
|  | MS-DOS with Turbo-C 3.0 and under RedHat Linux 4.2 with gcc. In both | ||||||
|  | cases I used libpng-1.0.4 and zlib-1.1.3. Later versions should be OK, | ||||||
|  | however some older libpng versions have a bug in pngmem.c when using | ||||||
|  | Turbo-C 3.0 (see below). | ||||||
|  |  | ||||||
|  | You can build it using one of the two makefiles (make -f makefile.###) | ||||||
|  | or use the batch/script files pngminus.bat / pngminus.sh. This assumes | ||||||
|  | that you have built the libraries in ../libpng and ../zlib. Using Linux, | ||||||
|  | make sure that you have built libpng with makefile.std and not | ||||||
|  | makefile.linux (also called .lnx in earlier versions of libpng). The | ||||||
|  | latter creates a .so shared-library, while the PngMinus makefile assumes | ||||||
|  | a normal .a static library. | ||||||
|  |  | ||||||
|  | If you create a ../pngsuite directory and then store the basn####.png | ||||||
|  | files from PngSuite (http://www.schaik.com/pngsuite/) in there, you can | ||||||
|  | test in one go the proper functioning of PngMinus, see png2pnm.bat and | ||||||
|  | pnm2png.bat (or the .sh versions). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Warranty | ||||||
|  | ------- | ||||||
|  | Please, remember that this was just a small experiment to learn a few | ||||||
|  | things. It will have many unforeseen features <vbg>. Who said bugs? Use | ||||||
|  | it when you are in need for something simple or when you want to start | ||||||
|  | developing your own stuff. | ||||||
|  |  | ||||||
|  |  | ||||||
|  | The Turbo bug | ||||||
|  | ------------- | ||||||
|  | ** pngmem.old | ||||||
|  |           hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L); | ||||||
|  |           hptr += 16L; | ||||||
|  | ** pngmem.c | ||||||
|  |           hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L); | ||||||
|  |           hptr = hptr + 16L; | ||||||
|  | ** | ||||||
|  |  | ||||||
|  | ** pngmem.old | ||||||
|  |           png_ptr->offset_table_ptr[i] = (png_bytep)hptr; | ||||||
|  |           hptr += (png_uint_32)65536L; | ||||||
|  | ** pngmem.c | ||||||
|  |           png_ptr->offset_table_ptr[i] = (png_bytep)hptr; | ||||||
|  |           hptr = hptr + 65536L; | ||||||
|  | ** | ||||||
|  |  | ||||||
|  |  | ||||||
|  | The end | ||||||
|  | ------- | ||||||
|  | Willem van Schaik | ||||||
|  | mailto:willem@schaik.com | ||||||
|  | http://www.schaik.com/png/ | ||||||
|  | ------- | ||||||
|  | Oct 1999 | ||||||
|  |  | ||||||
							
								
								
									
										65
									
								
								runtime/libpng/contrib/pngminus/makefile.std
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,65 @@ | |||||||
|  | # Makefile for PngMinus (png2pnm and pnm2png) | ||||||
|  | # Linux / Unix | ||||||
|  |  | ||||||
|  | #CC=cc | ||||||
|  | CC=gcc | ||||||
|  | LD=$(CC) | ||||||
|  |  | ||||||
|  | RM=rm -f | ||||||
|  |  | ||||||
|  | #PNGPATH = /usr/local | ||||||
|  | #PNGINC = -I$(PNGPATH)/include/libpng12 | ||||||
|  | #PNGLIB = -L$(PNGPATH)/lib -lpng12 | ||||||
|  | #PNGLIBS = $(PNGPATH)/lib/libpng12.a | ||||||
|  | PNGINC = -I../.. | ||||||
|  | PNGLIB = -L../.. -lpng | ||||||
|  | PNGLIBS = ../../libpng.a | ||||||
|  |  | ||||||
|  | #ZPATH = /usr/local | ||||||
|  | #ZINC = -I$(ZPATH)/include | ||||||
|  | #ZLIB = -L$(ZPATH)/lib -lz | ||||||
|  | #ZLIBS = $(ZPATH)/lib/libz.a | ||||||
|  | ZINC = -I../../../zlib | ||||||
|  | ZLIB = -L../../../zlib -lz | ||||||
|  | ZLIBS = ../../../zlib/libz.a | ||||||
|  |  | ||||||
|  | CFLAGS=-O3 $(PNGINC) $(ZINC) | ||||||
|  | LDFLAGS=$(PNGLIB) $(ZLIB) | ||||||
|  | LDFLAGSS=$(PNGLIBS) $(ZLIBS) | ||||||
|  | C=.c | ||||||
|  | O=.o | ||||||
|  | L=.a | ||||||
|  | E= | ||||||
|  |  | ||||||
|  | # dependencies | ||||||
|  |  | ||||||
|  | #all: png2pnm$(E) pnm2png$(E) | ||||||
|  | all: png2pnm$(E) pnm2png$(E) png2pnm-static$(E) pnm2png-static$(E) | ||||||
|  |  | ||||||
|  | png2pnm$(O): png2pnm$(C) | ||||||
|  | 	$(CC) -c $(CFLAGS) png2pnm$(C) | ||||||
|  |  | ||||||
|  | png2pnm$(E): png2pnm$(O) | ||||||
|  | 	$(LD) -o png2pnm$(E) png2pnm$(O) $(LDFLAGS) -lm | ||||||
|  |  | ||||||
|  | png2pnm-static$(E): png2pnm$(O) | ||||||
|  | 	$(LD) -o png2pnm-static$(E) png2pnm$(O) $(LDFLAGSS) -lm | ||||||
|  |  | ||||||
|  | pnm2png$(O): pnm2png$(C) | ||||||
|  | 	$(CC) -c $(CFLAGS) pnm2png$(C) | ||||||
|  |  | ||||||
|  | pnm2png$(E): pnm2png$(O) | ||||||
|  | 	$(LD) -o pnm2png$(E) pnm2png$(O) $(LDFLAGS) -lm | ||||||
|  |  | ||||||
|  | pnm2png-static$(E): pnm2png$(O) | ||||||
|  | 	$(LD) -o pnm2png-static$(E) pnm2png$(O) $(LDFLAGSS) -lm | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	$(RM) png2pnm$(O) | ||||||
|  | 	$(RM) pnm2png$(O) | ||||||
|  | 	$(RM) png2pnm$(E) | ||||||
|  | 	$(RM) pnm2png$(E) | ||||||
|  | 	$(RM) png2pnm-static$(E) | ||||||
|  | 	$(RM) pnm2png-static$(E) | ||||||
|  |  | ||||||
|  | # End of makefile for png2pnm / pnm2png | ||||||
							
								
								
									
										38
									
								
								runtime/libpng/contrib/pngminus/makefile.tc3
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,38 @@ | |||||||
|  | # Makefile for PngMinus (png2pnm and pnm2png) | ||||||
|  | # TurboC++ 3.0 | ||||||
|  |  | ||||||
|  | CC=tcc -Ic:\tc3\inc | ||||||
|  | LD=tcc -Lc:\tc3\lib | ||||||
|  | LB=tlib | ||||||
|  | RM=del | ||||||
|  | CP=copy | ||||||
|  | MODEL=l | ||||||
|  | CCFLAGS=-O -m$(MODEL) -I..\libpng -I..\zlib | ||||||
|  | LDFLAGS=-m$(MODEL) -L..\libpng -L..\zlib | ||||||
|  | C=.c | ||||||
|  | O=.obj | ||||||
|  | L=.lib | ||||||
|  | E=.exe | ||||||
|  |  | ||||||
|  | # dependencies | ||||||
|  |  | ||||||
|  | all: png2pnm$(E) pnm2png$(E) | ||||||
|  |  | ||||||
|  | png2pnm$(O): png2pnm$(C) | ||||||
|  |         $(CC) -c $(CCFLAGS) png2pnm$(C) | ||||||
|  |  | ||||||
|  | png2pnm$(E): png2pnm$(O) | ||||||
|  |         $(LD) $(LDFLAGS) png2pnm$(O) libpng$(L) zlib$(L) | ||||||
|  |  | ||||||
|  | pnm2png$(O): pnm2png$(C) | ||||||
|  |         $(CC) -c $(CCFLAGS) pnm2png$(C) | ||||||
|  |  | ||||||
|  | pnm2png$(E): pnm2png$(O) | ||||||
|  |         $(LD) $(LDFLAGS) pnm2png$(O) libpng$(L) zlib$(L) | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  |         $(RM) *$(O) | ||||||
|  |         $(RM) *$(E) | ||||||
|  |  | ||||||
|  | # End of makefile for png2pnm / pnm2png | ||||||
|  |  | ||||||
							
								
								
									
										92
									
								
								runtime/libpng/contrib/pngminus/makevms.com
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,92 @@ | |||||||
|  | $!------------------------------------------------------------------------------ | ||||||
|  | $! make Contrib programs of libpng under OpenVMS | ||||||
|  | $! | ||||||
|  | $! | ||||||
|  | $! Look for the compiler used | ||||||
|  | $! | ||||||
|  | $ zlibsrc = "[---.zlib]" | ||||||
|  | $ ccopt="/include=(''zlibsrc',[--])" | ||||||
|  | $ if f$getsyi("HW_MODEL").ge.1024 | ||||||
|  | $ then | ||||||
|  | $  ccopt = "/prefix=all"+ccopt | ||||||
|  | $  comp  = "__decc__=1" | ||||||
|  | $  if f$trnlnm("SYS").eqs."" then define sys sys$library: | ||||||
|  | $ else | ||||||
|  | $  if f$search("SYS$SYSTEM:DECC$COMPILER.EXE").eqs."" | ||||||
|  | $   then | ||||||
|  | $    if f$trnlnm("SYS").eqs."" then define sys sys$library: | ||||||
|  | $    if f$search("SYS$SYSTEM:VAXC.EXE").eqs."" | ||||||
|  | $     then | ||||||
|  | $      comp  = "__gcc__=1" | ||||||
|  | $      CC :== GCC | ||||||
|  | $     else | ||||||
|  | $      comp = "__vaxc__=1" | ||||||
|  | $     endif | ||||||
|  | $   else | ||||||
|  | $    if f$trnlnm("SYS").eqs."" then define sys decc$library_include: | ||||||
|  | $    ccopt = "/decc/prefix=all"+ccopt | ||||||
|  | $    comp  = "__decc__=1" | ||||||
|  | $  endif | ||||||
|  | $ endif | ||||||
|  | $ open/write lopt lib.opt | ||||||
|  | $ write lopt "[--]libpng.olb/lib" | ||||||
|  | $ write lopt "''zlibsrc'libz.olb/lib" | ||||||
|  | $ close lopt | ||||||
|  | $ open/write xopt x11.opt | ||||||
|  | $ write xopt "sys$library:decw$xlibshr.exe/share" | ||||||
|  | $ close xopt | ||||||
|  | $ write sys$output "Compiling PNG contrib programs ..." | ||||||
|  | $   write sys$output "Building pnm2png..." | ||||||
|  | $   CALL MAKE pnm2png.OBJ "cc ''CCOPT' pnm2png" - | ||||||
|  | 	pnm2png.c | ||||||
|  | $   call make pnm2png.exe - | ||||||
|  | 	"LINK pnm2png,lib.opt/opt" - | ||||||
|  | 	pnm2png.obj | ||||||
|  | $   write sys$output "Building png2pnm..." | ||||||
|  | $   CALL MAKE png2pnm.OBJ "cc ''CCOPT' png2pnm" - | ||||||
|  | 	png2pnm.c | ||||||
|  | $   call make png2pnm.exe - | ||||||
|  | 	"LINK png2pnm,lib.opt/opt" - | ||||||
|  | 	png2pnm.obj | ||||||
|  | $ exit | ||||||
|  | $! | ||||||
|  | $! | ||||||
|  | $MAKE: SUBROUTINE   !SUBROUTINE TO CHECK DEPENDENCIES | ||||||
|  | $ V = 'F$Verify(0) | ||||||
|  | $! P1 = What we are trying to make | ||||||
|  | $! P2 = Command to make it | ||||||
|  | $! P3 - P8  What it depends on | ||||||
|  | $ | ||||||
|  | $ If F$Search(P1) .Eqs. "" Then Goto Makeit | ||||||
|  | $ Time = F$CvTime(F$File(P1,"RDT")) | ||||||
|  | $arg=3 | ||||||
|  | $Loop: | ||||||
|  | $       Argument = P'arg | ||||||
|  | $       If Argument .Eqs. "" Then Goto Exit | ||||||
|  | $       El=0 | ||||||
|  | $Loop2: | ||||||
|  | $       File = F$Element(El," ",Argument) | ||||||
|  | $       If File .Eqs. " " Then Goto Endl | ||||||
|  | $       AFile = "" | ||||||
|  | $Loop3: | ||||||
|  | $       OFile = AFile | ||||||
|  | $       AFile = F$Search(File) | ||||||
|  | $       If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl | ||||||
|  | $       If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit | ||||||
|  | $       Goto Loop3 | ||||||
|  | $NextEL: | ||||||
|  | $       El = El + 1 | ||||||
|  | $       Goto Loop2 | ||||||
|  | $EndL: | ||||||
|  | $ arg=arg+1 | ||||||
|  | $ If arg .Le. 8 Then Goto Loop | ||||||
|  | $ Goto Exit | ||||||
|  | $ | ||||||
|  | $Makeit: | ||||||
|  | $ VV=F$VERIFY(0) | ||||||
|  | $ write sys$output P2 | ||||||
|  | $ 'P2 | ||||||
|  | $ VV='F$Verify(VV) | ||||||
|  | $Exit: | ||||||
|  | $ If V Then Set Verify | ||||||
|  | $ENDSUBROUTINE | ||||||
							
								
								
									
										41
									
								
								runtime/libpng/contrib/pngminus/png2pnm.bat
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,41 @@ | |||||||
|  | REM -- grayscale | ||||||
|  | png2pnm.exe -noraw ..\pngsuite\basn0g01.png basn0g01.pgm | ||||||
|  | png2pnm.exe -noraw ..\pngsuite\basn0g02.png basn0g02.pgm | ||||||
|  | png2pnm.exe -noraw ..\pngsuite\basn0g04.png basn0g04.pgm | ||||||
|  | png2pnm.exe -noraw ..\pngsuite\basn0g08.png basn0g08.pgm | ||||||
|  | png2pnm.exe -noraw ..\pngsuite\basn0g16.png basn0g16.pgm | ||||||
|  | REM -- full-color | ||||||
|  | png2pnm.exe -noraw ..\pngsuite\basn2c08.png basn2c08.ppm | ||||||
|  | png2pnm.exe -noraw ..\pngsuite\basn2c16.png basn2c16.ppm | ||||||
|  | REM -- palletted | ||||||
|  | png2pnm.exe -noraw ..\pngsuite\basn3p01.png basn3p01.ppm | ||||||
|  | png2pnm.exe -noraw ..\pngsuite\basn3p02.png basn3p02.ppm | ||||||
|  | png2pnm.exe -noraw ..\pngsuite\basn3p04.png basn3p04.ppm | ||||||
|  | png2pnm.exe -noraw ..\pngsuite\basn3p08.png basn3p08.ppm | ||||||
|  | REM -- gray with alpha-channel | ||||||
|  | png2pnm.exe -noraw ..\pngsuite\basn4a08.png basn4a08.pgm | ||||||
|  | png2pnm.exe -noraw ..\pngsuite\basn4a16.png basn4a16.pgm | ||||||
|  | REM -- color with alpha-channel | ||||||
|  | png2pnm.exe -noraw -alpha basn6a08.pgm ..\pngsuite\basn6a08.png basn6a08.ppm | ||||||
|  | png2pnm.exe -noraw -alpha basn6a16.pgm ..\pngsuite\basn6a16.png basn6a16.ppm | ||||||
|  | REM -- grayscale | ||||||
|  | png2pnm.exe -raw ..\pngsuite\basn0g01.png rawn0g01.pgm | ||||||
|  | png2pnm.exe -raw ..\pngsuite\basn0g02.png rawn0g02.pgm | ||||||
|  | png2pnm.exe -raw ..\pngsuite\basn0g04.png rawn0g04.pgm | ||||||
|  | png2pnm.exe -raw ..\pngsuite\basn0g08.png rawn0g08.pgm | ||||||
|  | png2pnm.exe -raw ..\pngsuite\basn0g16.png rawn0g16.pgm | ||||||
|  | REM -- full-color | ||||||
|  | png2pnm.exe -raw ..\pngsuite\basn2c08.png rawn2c08.ppm | ||||||
|  | png2pnm.exe -raw ..\pngsuite\basn2c16.png rawn2c16.ppm | ||||||
|  | REM -- palletted | ||||||
|  | png2pnm.exe -raw ..\pngsuite\basn3p01.png rawn3p01.ppm | ||||||
|  | png2pnm.exe -raw ..\pngsuite\basn3p02.png rawn3p02.ppm | ||||||
|  | png2pnm.exe -raw ..\pngsuite\basn3p04.png rawn3p04.ppm | ||||||
|  | png2pnm.exe -raw ..\pngsuite\basn3p08.png rawn3p08.ppm | ||||||
|  | REM -- gray with alpha-channel | ||||||
|  | png2pnm.exe -raw ..\pngsuite\basn4a08.png rawn4a08.pgm | ||||||
|  | png2pnm.exe -raw ..\pngsuite\basn4a16.png rawn4a16.pgm | ||||||
|  | REM -- color with alpha-channel | ||||||
|  | png2pnm.exe -noraw -alpha rawn6a08.pgm ..\pngsuite\basn6a08.png rawn6a08.ppm | ||||||
|  | png2pnm.exe -noraw -alpha rawn6a16.pgm ..\pngsuite\basn6a16.png rawn6a16.ppm | ||||||
|  |  | ||||||
							
								
								
									
										430
									
								
								runtime/libpng/contrib/pngminus/png2pnm.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,430 @@ | |||||||
|  | /* | ||||||
|  |  *  png2pnm.c --- conversion from PNG-file to PGM/PPM-file | ||||||
|  |  *  copyright (C) 1999 by Willem van Schaik <willem@schaik.com> | ||||||
|  |  * | ||||||
|  |  *  version 1.0 - 1999.10.15 - First version. | ||||||
|  |  * | ||||||
|  |  *  Permission to use, copy, modify, and distribute this software and | ||||||
|  |  *  its documentation for any purpose and without fee is hereby granted, | ||||||
|  |  *  provided that the above copyright notice appear in all copies and | ||||||
|  |  *  that both that copyright notice and this permission notice appear in | ||||||
|  |  *  supporting documentation. This software is provided "as is" without | ||||||
|  |  *  express or implied warranty. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #ifdef __TURBOC__ | ||||||
|  | #include <mem.h> | ||||||
|  | #include <fcntl.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef BOOL | ||||||
|  | #define BOOL unsigned char | ||||||
|  | #endif | ||||||
|  | #ifndef TRUE | ||||||
|  | #define TRUE (BOOL) 1 | ||||||
|  | #endif | ||||||
|  | #ifndef FALSE | ||||||
|  | #define FALSE (BOOL) 0 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef __TURBOC__ | ||||||
|  | #define STDIN  0 | ||||||
|  | #define STDOUT 1 | ||||||
|  | #define STDERR 2 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* to make png2pnm verbose so we can find problems (needs to be before png.h) */ | ||||||
|  | #ifndef PNG_DEBUG | ||||||
|  | #define PNG_DEBUG 0 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include "png.h" | ||||||
|  |  | ||||||
|  | /* Define png_jmpbuf() in case we are using a pre-1.0.6 version of libpng */ | ||||||
|  | #ifndef png_jmpbuf | ||||||
|  | #  define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* function prototypes */ | ||||||
|  |  | ||||||
|  | int  main (int argc, char *argv[]); | ||||||
|  | void usage (); | ||||||
|  | BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file, BOOL raw, BOOL alpha); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  *  main | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | int main(int argc, char *argv[]) | ||||||
|  | { | ||||||
|  |   FILE *fp_rd = stdin; | ||||||
|  |   FILE *fp_wr = stdout; | ||||||
|  |   FILE *fp_al = NULL; | ||||||
|  |   BOOL raw = TRUE; | ||||||
|  |   BOOL alpha = FALSE; | ||||||
|  |   int argi; | ||||||
|  |  | ||||||
|  |   for (argi = 1; argi < argc; argi++) | ||||||
|  |   { | ||||||
|  |     if (argv[argi][0] == '-') | ||||||
|  |     { | ||||||
|  |       switch (argv[argi][1]) | ||||||
|  |       { | ||||||
|  |         case 'n': | ||||||
|  |           raw = FALSE; | ||||||
|  |           break; | ||||||
|  |         case 'r': | ||||||
|  |           raw = TRUE; | ||||||
|  |           break; | ||||||
|  |         case 'a': | ||||||
|  |           alpha = TRUE; | ||||||
|  |           argi++; | ||||||
|  |           if ((fp_al = fopen (argv[argi], "wb")) == NULL) | ||||||
|  |           { | ||||||
|  |             fprintf (stderr, "PNM2PNG\n"); | ||||||
|  |             fprintf (stderr, "Error:  can not create alpha-channel file %s\n", argv[argi]); | ||||||
|  |             exit (1); | ||||||
|  |           } | ||||||
|  |           break; | ||||||
|  |         case 'h': | ||||||
|  |         case '?': | ||||||
|  |           usage(); | ||||||
|  |           exit(0); | ||||||
|  |           break; | ||||||
|  |         default: | ||||||
|  |           fprintf (stderr, "PNG2PNM\n"); | ||||||
|  |           fprintf (stderr, "Error:  unknown option %s\n", argv[argi]); | ||||||
|  |           usage(); | ||||||
|  |           exit(1); | ||||||
|  |           break; | ||||||
|  |       } /* end switch */ | ||||||
|  |     } | ||||||
|  |     else if (fp_rd == stdin) | ||||||
|  |     { | ||||||
|  |       if ((fp_rd = fopen (argv[argi], "rb")) == NULL) | ||||||
|  |       { | ||||||
|  |              fprintf (stderr, "PNG2PNM\n"); | ||||||
|  |             fprintf (stderr, "Error:  file %s does not exist\n", argv[argi]); | ||||||
|  |             exit (1); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     else if (fp_wr == stdout) | ||||||
|  |     { | ||||||
|  |       if ((fp_wr = fopen (argv[argi], "wb")) == NULL) | ||||||
|  |       { | ||||||
|  |         fprintf (stderr, "PNG2PNM\n"); | ||||||
|  |         fprintf (stderr, "Error:  can not create file %s\n", argv[argi]); | ||||||
|  |         exit (1); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |       fprintf (stderr, "PNG2PNM\n"); | ||||||
|  |       fprintf (stderr, "Error:  too many parameters\n"); | ||||||
|  |       usage(); | ||||||
|  |       exit(1); | ||||||
|  |     } | ||||||
|  |   } /* end for */ | ||||||
|  |  | ||||||
|  | #ifdef __TURBOC__ | ||||||
|  |   /* set stdin/stdout if required to binary */ | ||||||
|  |   if (fp_rd == stdin) | ||||||
|  |   { | ||||||
|  |     setmode (STDIN, O_BINARY); | ||||||
|  |   } | ||||||
|  |   if ((raw) && (fp_wr == stdout)) | ||||||
|  |   { | ||||||
|  |     setmode (STDOUT, O_BINARY); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |   /* call the conversion program itself */ | ||||||
|  |   if (png2pnm (fp_rd, fp_wr, fp_al, raw, alpha) == FALSE) | ||||||
|  |   { | ||||||
|  |     fprintf (stderr, "PNG2PNM\n"); | ||||||
|  |     fprintf (stderr, "Error:  unsuccessful convertion of PNG-image\n"); | ||||||
|  |     exit(1); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* close input file */ | ||||||
|  |   fclose (fp_rd); | ||||||
|  |   /* close output file */ | ||||||
|  |   fclose (fp_wr); | ||||||
|  |   /* close alpha file */ | ||||||
|  |   if (alpha) | ||||||
|  |     fclose (fp_al); | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  *  usage | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | void usage() | ||||||
|  | { | ||||||
|  |   fprintf (stderr, "PNG2PNM\n"); | ||||||
|  |   fprintf (stderr, "   by Willem van Schaik, 1999\n"); | ||||||
|  | #ifdef __TURBOC__ | ||||||
|  |   fprintf (stderr, "   for Turbo-C and Borland-C compilers\n"); | ||||||
|  | #else | ||||||
|  |   fprintf (stderr, "   for Linux (and Unix) compilers\n"); | ||||||
|  | #endif | ||||||
|  |   fprintf (stderr, "Usage:  png2pnm [options] <file>.png [<file>.pnm]\n"); | ||||||
|  |   fprintf (stderr, "   or:  ... | png2pnm [options]\n"); | ||||||
|  |   fprintf (stderr, "Options:\n"); | ||||||
|  |   fprintf (stderr, "   -r[aw]   write pnm-file in binary format (P4/P5/P6) (default)\n"); | ||||||
|  |   fprintf (stderr, "   -n[oraw] write pnm-file in ascii format (P1/P2/P3)\n"); | ||||||
|  |   fprintf (stderr, "   -a[lpha] <file>.pgm write PNG alpha channel as pgm-file\n"); | ||||||
|  |   fprintf (stderr, "   -h | -?  print this help-information\n"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  *  png2pnm | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | BOOL png2pnm (FILE *png_file, FILE *pnm_file, FILE *alpha_file, BOOL raw, BOOL alpha) | ||||||
|  | { | ||||||
|  |   png_struct    *png_ptr = NULL; | ||||||
|  |   png_info	*info_ptr = NULL; | ||||||
|  |   png_byte      buf[8]; | ||||||
|  |   png_byte      *png_pixels = NULL; | ||||||
|  |   png_byte      **row_pointers = NULL; | ||||||
|  |   png_byte      *pix_ptr = NULL; | ||||||
|  |   png_uint_32   row_bytes; | ||||||
|  |  | ||||||
|  |   png_uint_32   width; | ||||||
|  |   png_uint_32   height; | ||||||
|  |   int           bit_depth; | ||||||
|  |   int           channels; | ||||||
|  |   int           color_type; | ||||||
|  |   int           alpha_present; | ||||||
|  |   int           row, col; | ||||||
|  |   int           ret; | ||||||
|  |   int           i; | ||||||
|  |   long          dep_16; | ||||||
|  |  | ||||||
|  |   /* read and check signature in PNG file */ | ||||||
|  |   ret = fread (buf, 1, 8, png_file); | ||||||
|  |   if (ret != 8) | ||||||
|  |     return FALSE; | ||||||
|  |  | ||||||
|  |   ret = png_check_sig (buf, 8); | ||||||
|  |   if (!ret) | ||||||
|  |     return FALSE; | ||||||
|  |  | ||||||
|  |   /* create png and info structures */ | ||||||
|  |  | ||||||
|  |   png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, | ||||||
|  |     NULL, NULL, NULL); | ||||||
|  |   if (!png_ptr) | ||||||
|  |     return FALSE;   /* out of memory */ | ||||||
|  |  | ||||||
|  |   info_ptr = png_create_info_struct (png_ptr); | ||||||
|  |   if (!info_ptr) | ||||||
|  |   { | ||||||
|  |     png_destroy_read_struct (&png_ptr, NULL, NULL); | ||||||
|  |     return FALSE;   /* out of memory */ | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if (setjmp (png_jmpbuf(png_ptr))) | ||||||
|  |   { | ||||||
|  |     png_destroy_read_struct (&png_ptr, &info_ptr, NULL); | ||||||
|  |     return FALSE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* set up the input control for C streams */ | ||||||
|  |   png_init_io (png_ptr, png_file); | ||||||
|  |   png_set_sig_bytes (png_ptr, 8);  /* we already read the 8 signature bytes */ | ||||||
|  |  | ||||||
|  |   /* read the file information */ | ||||||
|  |   png_read_info (png_ptr, info_ptr); | ||||||
|  |  | ||||||
|  |   /* get size and bit-depth of the PNG-image */ | ||||||
|  |   png_get_IHDR (png_ptr, info_ptr, | ||||||
|  |     &width, &height, &bit_depth, &color_type, | ||||||
|  |     NULL, NULL, NULL); | ||||||
|  |  | ||||||
|  |   /* set-up the transformations */ | ||||||
|  |  | ||||||
|  |   /* transform paletted images into full-color rgb */ | ||||||
|  |   if (color_type == PNG_COLOR_TYPE_PALETTE) | ||||||
|  |     png_set_expand (png_ptr); | ||||||
|  |   /* expand images to bit-depth 8 (only applicable for grayscale images) */ | ||||||
|  |   if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) | ||||||
|  |     png_set_expand (png_ptr); | ||||||
|  |   /* transform transparency maps into full alpha-channel */ | ||||||
|  |   if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS)) | ||||||
|  |     png_set_expand (png_ptr); | ||||||
|  |  | ||||||
|  | #ifdef NJET | ||||||
|  |   /* downgrade 16-bit images to 8 bit */ | ||||||
|  |   if (bit_depth == 16) | ||||||
|  |     png_set_strip_16 (png_ptr); | ||||||
|  |   /* transform grayscale images into full-color */ | ||||||
|  |   if (color_type == PNG_COLOR_TYPE_GRAY || | ||||||
|  |     color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | ||||||
|  |     png_set_gray_to_rgb (png_ptr); | ||||||
|  |   /* only if file has a file gamma, we do a correction */ | ||||||
|  |   if (png_get_gAMA (png_ptr, info_ptr, &file_gamma)) | ||||||
|  |     png_set_gamma (png_ptr, (double) 2.2, file_gamma); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |   /* all transformations have been registered; now update info_ptr data, | ||||||
|  |    * get rowbytes and channels, and allocate image memory */ | ||||||
|  |  | ||||||
|  |   png_read_update_info (png_ptr, info_ptr); | ||||||
|  |  | ||||||
|  |   /* get the new color-type and bit-depth (after expansion/stripping) */ | ||||||
|  |   png_get_IHDR (png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, | ||||||
|  |     NULL, NULL, NULL); | ||||||
|  |  | ||||||
|  |   /* check for 16-bit files */ | ||||||
|  |   if (bit_depth == 16) | ||||||
|  |   { | ||||||
|  |     raw = FALSE; | ||||||
|  | #ifdef __TURBOC__ | ||||||
|  |     pnm_file->flags &= ~((unsigned) _F_BIN); | ||||||
|  | #endif | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* calculate new number of channels and store alpha-presence */ | ||||||
|  |   if (color_type == PNG_COLOR_TYPE_GRAY) | ||||||
|  |     channels = 1; | ||||||
|  |   else if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | ||||||
|  |     channels = 2; | ||||||
|  |   else if (color_type == PNG_COLOR_TYPE_RGB) | ||||||
|  |     channels = 3; | ||||||
|  |   else if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||||||
|  |     channels = 4; | ||||||
|  |   else | ||||||
|  |     channels = 0; /* should never happen */ | ||||||
|  |   alpha_present = (channels - 1) % 2; | ||||||
|  |  | ||||||
|  |   /* check if alpha is expected to be present in file */ | ||||||
|  |   if (alpha && !alpha_present) | ||||||
|  |   { | ||||||
|  |     fprintf (stderr, "PNG2PNM\n"); | ||||||
|  |     fprintf (stderr, "Error:  PNG-file doesn't contain alpha channel\n"); | ||||||
|  |     exit (1); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* row_bytes is the width x number of channels x (bit-depth / 8) */ | ||||||
|  |   row_bytes = png_get_rowbytes (png_ptr, info_ptr); | ||||||
|  |  | ||||||
|  |   if ((png_pixels = (png_byte *) malloc (row_bytes * height * sizeof (png_byte))) == NULL) { | ||||||
|  |     png_destroy_read_struct (&png_ptr, &info_ptr, NULL); | ||||||
|  |     return FALSE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if ((row_pointers = (png_byte **) malloc (height * sizeof (png_bytep))) == NULL) | ||||||
|  |   { | ||||||
|  |     png_destroy_read_struct (&png_ptr, &info_ptr, NULL); | ||||||
|  |     free (png_pixels); | ||||||
|  |     png_pixels = NULL; | ||||||
|  |     return FALSE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* set the individual row_pointers to point at the correct offsets */ | ||||||
|  |   for (i = 0; i < (height); i++) | ||||||
|  |     row_pointers[i] = png_pixels + i * row_bytes; | ||||||
|  |  | ||||||
|  |   /* now we can go ahead and just read the whole image */ | ||||||
|  |   png_read_image (png_ptr, row_pointers); | ||||||
|  |  | ||||||
|  |   /* read rest of file, and get additional chunks in info_ptr - REQUIRED */ | ||||||
|  |   png_read_end (png_ptr, info_ptr); | ||||||
|  |  | ||||||
|  |   /* clean up after the read, and free any memory allocated - REQUIRED */ | ||||||
|  |   png_destroy_read_struct (&png_ptr, &info_ptr, (png_infopp) NULL); | ||||||
|  |  | ||||||
|  |   /* write header of PNM file */ | ||||||
|  |  | ||||||
|  |   if ((color_type == PNG_COLOR_TYPE_GRAY) || | ||||||
|  |       (color_type == PNG_COLOR_TYPE_GRAY_ALPHA)) | ||||||
|  |   { | ||||||
|  |     fprintf (pnm_file, "%s\n", (raw) ? "P5" : "P2"); | ||||||
|  |     fprintf (pnm_file, "%d %d\n", (int) width, (int) height); | ||||||
|  |     fprintf (pnm_file, "%ld\n", ((1L << (int) bit_depth) - 1L)); | ||||||
|  |   } | ||||||
|  |   else if ((color_type == PNG_COLOR_TYPE_RGB) || | ||||||
|  |            (color_type == PNG_COLOR_TYPE_RGB_ALPHA)) | ||||||
|  |   { | ||||||
|  |     fprintf (pnm_file, "%s\n", (raw) ? "P6" : "P3"); | ||||||
|  |     fprintf (pnm_file, "%d %d\n", (int) width, (int) height); | ||||||
|  |     fprintf (pnm_file, "%ld\n", ((1L << (int) bit_depth) - 1L)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* write header of PGM file with alpha channel */ | ||||||
|  |  | ||||||
|  |   if ((alpha) && | ||||||
|  |       ((color_type == PNG_COLOR_TYPE_GRAY_ALPHA) || | ||||||
|  |        (color_type == PNG_COLOR_TYPE_RGB_ALPHA))) | ||||||
|  |   { | ||||||
|  |     fprintf (alpha_file, "%s\n", (raw) ? "P5" : "P2"); | ||||||
|  |     fprintf (alpha_file, "%d %d\n", (int) width, (int) height); | ||||||
|  |     fprintf (alpha_file, "%ld\n", ((1L << (int) bit_depth) - 1L)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* write data to PNM file */ | ||||||
|  |   pix_ptr = png_pixels; | ||||||
|  |  | ||||||
|  |   for (row = 0; row < height; row++) | ||||||
|  |   { | ||||||
|  |     for (col = 0; col < width; col++) | ||||||
|  |     { | ||||||
|  |       for (i = 0; i < (channels - alpha_present); i++) | ||||||
|  |       { | ||||||
|  |         if (raw) | ||||||
|  |           fputc ((int) *pix_ptr++ , pnm_file); | ||||||
|  |         else | ||||||
|  |           if (bit_depth == 16){ | ||||||
|  | 	    dep_16 = (long) *pix_ptr++; | ||||||
|  |             fprintf (pnm_file, "%ld ", (dep_16 << 8) + ((long) *pix_ptr++)); | ||||||
|  |           } | ||||||
|  |           else | ||||||
|  |             fprintf (pnm_file, "%ld ", (long) *pix_ptr++); | ||||||
|  |       } | ||||||
|  |       if (alpha_present) | ||||||
|  |       { | ||||||
|  |         if (!alpha) | ||||||
|  |         { | ||||||
|  |           pix_ptr++; /* alpha */ | ||||||
|  |           if (bit_depth == 16) | ||||||
|  |             pix_ptr++; | ||||||
|  |         } | ||||||
|  |         else /* output alpha-channel as pgm file */ | ||||||
|  |         { | ||||||
|  |           if (raw) | ||||||
|  |             fputc ((int) *pix_ptr++ , alpha_file); | ||||||
|  |           else | ||||||
|  |             if (bit_depth == 16){ | ||||||
|  | 	      dep_16 = (long) *pix_ptr++; | ||||||
|  |               fprintf (alpha_file, "%ld ", (dep_16 << 8) + (long) *pix_ptr++); | ||||||
|  | 	    }   | ||||||
|  |             else | ||||||
|  |               fprintf (alpha_file, "%ld ", (long) *pix_ptr++); | ||||||
|  |         } | ||||||
|  |       } /* if alpha_present */ | ||||||
|  |  | ||||||
|  |       if (!raw) | ||||||
|  |         if (col % 4 == 3) | ||||||
|  |           fprintf (pnm_file, "\n"); | ||||||
|  |     } /* end for col */ | ||||||
|  |  | ||||||
|  |     if (!raw) | ||||||
|  |       if (col % 4 != 0) | ||||||
|  |         fprintf (pnm_file, "\n"); | ||||||
|  |   } /* end for row */ | ||||||
|  |  | ||||||
|  |   if (row_pointers != (unsigned char**) NULL) | ||||||
|  |     free (row_pointers); | ||||||
|  |   if (png_pixels != (unsigned char*) NULL) | ||||||
|  |     free (png_pixels); | ||||||
|  |  | ||||||
|  |   return TRUE; | ||||||
|  |  | ||||||
|  | } /* end of source */ | ||||||
|  |  | ||||||
							
								
								
									
										41
									
								
								runtime/libpng/contrib/pngminus/png2pnm.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,41 @@ | |||||||
|  | # -- grayscale | ||||||
|  | ./png2pnm -noraw ../pngsuite/basn0g01.png basn0g01.pgm | ||||||
|  | ./png2pnm -noraw ../pngsuite/basn0g02.png basn0g02.pgm | ||||||
|  | ./png2pnm -noraw ../pngsuite/basn0g04.png basn0g04.pgm | ||||||
|  | ./png2pnm -noraw ../pngsuite/basn0g08.png basn0g08.pgm | ||||||
|  | ./png2pnm -noraw ../pngsuite/basn0g16.png basn0g16.pgm | ||||||
|  | # -- full-color | ||||||
|  | ./png2pnm -noraw ../pngsuite/basn2c08.png basn2c08.ppm | ||||||
|  | ./png2pnm -noraw ../pngsuite/basn2c16.png basn2c16.ppm | ||||||
|  | # -- palletted | ||||||
|  | ./png2pnm -noraw ../pngsuite/basn3p01.png basn3p01.ppm | ||||||
|  | ./png2pnm -noraw ../pngsuite/basn3p02.png basn3p02.ppm | ||||||
|  | ./png2pnm -noraw ../pngsuite/basn3p04.png basn3p04.ppm | ||||||
|  | ./png2pnm -noraw ../pngsuite/basn3p08.png basn3p08.ppm | ||||||
|  | # -- gray with alpha-channel | ||||||
|  | ./png2pnm -noraw ../pngsuite/basn4a08.png basn4a08.pgm | ||||||
|  | ./png2pnm -noraw ../pngsuite/basn4a16.png basn4a16.pgm | ||||||
|  | # -- color with alpha-channel | ||||||
|  | ./png2pnm -noraw -alpha basn6a08.pgm ../pngsuite/basn6a08.png basn6a08.ppm | ||||||
|  | ./png2pnm -noraw -alpha basn6a16.pgm ../pngsuite/basn6a16.png basn6a16.ppm | ||||||
|  | # -- grayscale | ||||||
|  | ./png2pnm -raw ../pngsuite/basn0g01.png rawn0g01.pgm | ||||||
|  | ./png2pnm -raw ../pngsuite/basn0g02.png rawn0g02.pgm | ||||||
|  | ./png2pnm -raw ../pngsuite/basn0g04.png rawn0g04.pgm | ||||||
|  | ./png2pnm -raw ../pngsuite/basn0g08.png rawn0g08.pgm | ||||||
|  | ./png2pnm -raw ../pngsuite/basn0g16.png rawn0g16.pgm | ||||||
|  | # -- full-color | ||||||
|  | ./png2pnm -raw ../pngsuite/basn2c08.png rawn2c08.ppm | ||||||
|  | ./png2pnm -raw ../pngsuite/basn2c16.png rawn2c16.ppm | ||||||
|  | # -- palletted | ||||||
|  | ./png2pnm -raw ../pngsuite/basn3p01.png rawn3p01.ppm | ||||||
|  | ./png2pnm -raw ../pngsuite/basn3p02.png rawn3p02.ppm | ||||||
|  | ./png2pnm -raw ../pngsuite/basn3p04.png rawn3p04.ppm | ||||||
|  | ./png2pnm -raw ../pngsuite/basn3p08.png rawn3p08.ppm | ||||||
|  | # -- gray with alpha-channel | ||||||
|  | ./png2pnm -raw ../pngsuite/basn4a08.png rawn4a08.pgm | ||||||
|  | ./png2pnm -raw ../pngsuite/basn4a16.png rawn4a16.pgm | ||||||
|  | # -- color with alpha-channel | ||||||
|  | ./png2pnm -noraw -alpha rawn6a08.pgm ../pngsuite/basn6a08.png rawn6a08.ppm | ||||||
|  | ./png2pnm -noraw -alpha rawn6a16.pgm ../pngsuite/basn6a16.png rawn6a16.ppm | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								runtime/libpng/contrib/pngminus/pngminus.bat
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,4 @@ | |||||||
|  | make -f makefile.tc3 | ||||||
|  | call png2pnm.bat | ||||||
|  | call pnm2png.bat | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								runtime/libpng/contrib/pngminus/pngminus.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,4 @@ | |||||||
|  | make -f makefile.std | ||||||
|  | sh png2pnm.sh | ||||||
|  | sh pnm2png.sh | ||||||
|  |  | ||||||
							
								
								
									
										41
									
								
								runtime/libpng/contrib/pngminus/pnm2png.bat
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,41 @@ | |||||||
|  | REM -- grayscale | ||||||
|  | pnm2png.exe basn0g01.pgm basn0g01.png | ||||||
|  | pnm2png.exe basn0g02.pgm basn0g02.png | ||||||
|  | pnm2png.exe basn0g04.pgm basn0g04.png | ||||||
|  | pnm2png.exe basn0g08.pgm basn0g08.png | ||||||
|  | pnm2png.exe basn0g16.pgm basn0g16.png | ||||||
|  | REM -- full-color | ||||||
|  | pnm2png.exe basn2c08.ppm basn2c08.png | ||||||
|  | pnm2png.exe basn2c16.ppm basn2c16.png | ||||||
|  | REM -- palletted | ||||||
|  | pnm2png.exe basn3p01.ppm basn3p01.png | ||||||
|  | pnm2png.exe basn3p02.ppm basn3p02.png | ||||||
|  | pnm2png.exe basn3p04.ppm basn3p04.png | ||||||
|  | pnm2png.exe basn3p08.ppm basn3p08.png | ||||||
|  | REM -- gray with alpha-channel | ||||||
|  | pnm2png.exe -alpha basn6a08.pgm basn4a08.pgm basn4a08.png | ||||||
|  | pnm2png.exe -alpha basn6a16.pgm basn4a16.pgm basn4a16.png | ||||||
|  | REM -- color with alpha-channel | ||||||
|  | pnm2png.exe -alpha basn6a08.pgm basn6a08.ppm basn6a08.png | ||||||
|  | pnm2png.exe -alpha basn6a16.pgm basn6a16.ppm basn6a16.png | ||||||
|  | REM -- grayscale | ||||||
|  | pnm2png.exe rawn0g01.pgm rawn0g01.png | ||||||
|  | pnm2png.exe rawn0g02.pgm rawn0g02.png | ||||||
|  | pnm2png.exe rawn0g04.pgm rawn0g04.png | ||||||
|  | pnm2png.exe rawn0g08.pgm rawn0g08.png | ||||||
|  | pnm2png.exe rawn0g16.pgm rawn0g16.png | ||||||
|  | REM -- full-color | ||||||
|  | pnm2png.exe rawn2c08.ppm rawn2c08.png | ||||||
|  | pnm2png.exe rawn2c16.ppm rawn2c16.png | ||||||
|  | REM -- palletted | ||||||
|  | pnm2png.exe rawn3p01.ppm rawn3p01.png | ||||||
|  | pnm2png.exe rawn3p02.ppm rawn3p02.png | ||||||
|  | pnm2png.exe rawn3p04.ppm rawn3p04.png | ||||||
|  | pnm2png.exe rawn3p08.ppm rawn3p08.png | ||||||
|  | REM -- gray with alpha-channel | ||||||
|  | pnm2png.exe -alpha rawn6a08.pgm rawn4a08.pgm rawn4a08.png | ||||||
|  | pnm2png.exe -alpha rawn6a16.pgm rawn4a16.pgm rawn4a16.png | ||||||
|  | REM -- color with alpha-channel | ||||||
|  | pnm2png.exe -alpha rawn6a08.pgm rawn6a08.ppm rawn6a08.png | ||||||
|  | pnm2png.exe -alpha rawn6a16.pgm rawn6a16.ppm rawn6a16.png | ||||||
|  |  | ||||||
							
								
								
									
										533
									
								
								runtime/libpng/contrib/pngminus/pnm2png.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,533 @@ | |||||||
|  | /* | ||||||
|  |  *  pnm2png.c --- conversion from PBM/PGM/PPM-file to PNG-file | ||||||
|  |  *  copyright (C) 1999 by Willem van Schaik <willem@schaik.com> | ||||||
|  |  * | ||||||
|  |  *  version 1.0 - 1999.10.15 - First version. | ||||||
|  |  * | ||||||
|  |  *  Permission to use, copy, modify, and distribute this software and | ||||||
|  |  *  its documentation for any purpose and without fee is hereby granted, | ||||||
|  |  *  provided that the above copyright notice appear in all copies and | ||||||
|  |  *  that both that copyright notice and this permission notice appear in | ||||||
|  |  *  supporting documentation. This software is provided "as is" without | ||||||
|  |  *  express or implied warranty. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #ifdef __TURBOC__ | ||||||
|  | #include <mem.h> | ||||||
|  | #include <fcntl.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef BOOL | ||||||
|  | #define BOOL unsigned char | ||||||
|  | #endif | ||||||
|  | #ifndef TRUE | ||||||
|  | #define TRUE (BOOL) 1 | ||||||
|  | #endif | ||||||
|  | #ifndef FALSE | ||||||
|  | #define FALSE (BOOL) 0 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define STDIN  0 | ||||||
|  | #define STDOUT 1 | ||||||
|  | #define STDERR 2 | ||||||
|  |  | ||||||
|  | /* to make pnm2png verbose so we can find problems (needs to be before png.h) */ | ||||||
|  | #ifndef PNG_DEBUG | ||||||
|  | #define PNG_DEBUG 0 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #include "png.h" | ||||||
|  |  | ||||||
|  | /* Define png_jmpbuf() in case we are using a pre-1.0.6 version of libpng */ | ||||||
|  | #ifndef png_jmpbuf | ||||||
|  | #  define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* function prototypes */ | ||||||
|  |  | ||||||
|  | int  main (int argc, char *argv[]); | ||||||
|  | void usage (); | ||||||
|  | BOOL pnm2png (FILE *pnm_file, FILE *png_file, FILE *alpha_file, BOOL interlace, BOOL alpha); | ||||||
|  | void get_token(FILE *pnm_file, char *token); | ||||||
|  | png_uint_32 get_data (FILE *pnm_file, int depth); | ||||||
|  | png_uint_32 get_value (FILE *pnm_file, int depth); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  *  main | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | int main(int argc, char *argv[]) | ||||||
|  | { | ||||||
|  |   FILE *fp_rd = stdin; | ||||||
|  |   FILE *fp_al = NULL; | ||||||
|  |   FILE *fp_wr = stdout; | ||||||
|  |   BOOL interlace = FALSE; | ||||||
|  |   BOOL alpha = FALSE; | ||||||
|  |   int argi; | ||||||
|  |  | ||||||
|  |   for (argi = 1; argi < argc; argi++) | ||||||
|  |   { | ||||||
|  |     if (argv[argi][0] == '-') | ||||||
|  |     { | ||||||
|  |       switch (argv[argi][1]) | ||||||
|  |       { | ||||||
|  |         case 'i': | ||||||
|  |           interlace = TRUE; | ||||||
|  |           break; | ||||||
|  |         case 'a': | ||||||
|  |           alpha = TRUE; | ||||||
|  |           argi++; | ||||||
|  |           if ((fp_al = fopen (argv[argi], "rb")) == NULL) | ||||||
|  |           { | ||||||
|  |             fprintf (stderr, "PNM2PNG\n"); | ||||||
|  |             fprintf (stderr, "Error:  alpha-channel file %s does not exist\n", | ||||||
|  |                argv[argi]); | ||||||
|  |             exit (1); | ||||||
|  |           } | ||||||
|  |           break; | ||||||
|  |         case 'h': | ||||||
|  |         case '?': | ||||||
|  |           usage(); | ||||||
|  |           exit(0); | ||||||
|  |           break; | ||||||
|  |         default: | ||||||
|  |           fprintf (stderr, "PNM2PNG\n"); | ||||||
|  |           fprintf (stderr, "Error:  unknown option %s\n", argv[argi]); | ||||||
|  |           usage(); | ||||||
|  |           exit(1); | ||||||
|  |           break; | ||||||
|  |       } /* end switch */ | ||||||
|  |     } | ||||||
|  |     else if (fp_rd == stdin) | ||||||
|  |     { | ||||||
|  |       if ((fp_rd = fopen (argv[argi], "rb")) == NULL) | ||||||
|  |       { | ||||||
|  |         fprintf (stderr, "PNM2PNG\n"); | ||||||
|  |         fprintf (stderr, "Error:  file %s does not exist\n", argv[argi]); | ||||||
|  |         exit (1); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     else if (fp_wr == stdout) | ||||||
|  |     { | ||||||
|  |       if ((fp_wr = fopen (argv[argi], "wb")) == NULL) | ||||||
|  |       { | ||||||
|  |         fprintf (stderr, "PNM2PNG\n"); | ||||||
|  |         fprintf (stderr, "Error:  can not create PNG-file %s\n", argv[argi]); | ||||||
|  |         exit (1); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |       fprintf (stderr, "PNM2PNG\n"); | ||||||
|  |       fprintf (stderr, "Error:  too many parameters\n"); | ||||||
|  |       usage(); | ||||||
|  |       exit (1); | ||||||
|  |     } | ||||||
|  |   } /* end for */ | ||||||
|  |  | ||||||
|  | #ifdef __TURBOC__ | ||||||
|  |   /* set stdin/stdout to binary, we're reading the PNM always! in binary format */ | ||||||
|  |   if (fp_rd == stdin) | ||||||
|  |   { | ||||||
|  |     setmode (STDIN, O_BINARY); | ||||||
|  |   } | ||||||
|  |   if (fp_wr == stdout) | ||||||
|  |   { | ||||||
|  |     setmode (STDOUT, O_BINARY); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |   /* call the conversion program itself */ | ||||||
|  |   if (pnm2png (fp_rd, fp_wr, fp_al, interlace, alpha) == FALSE) | ||||||
|  |   { | ||||||
|  |     fprintf (stderr, "PNM2PNG\n"); | ||||||
|  |     fprintf (stderr, "Error:  unsuccessful converting to PNG-image\n"); | ||||||
|  |     exit (1); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* close input file */ | ||||||
|  |   fclose (fp_rd); | ||||||
|  |   /* close output file */ | ||||||
|  |   fclose (fp_wr); | ||||||
|  |   /* close alpha file */ | ||||||
|  |   if (alpha) | ||||||
|  |     fclose (fp_al); | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  *  usage | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | void usage() | ||||||
|  | { | ||||||
|  |   fprintf (stderr, "PNM2PNG\n"); | ||||||
|  |   fprintf (stderr, "   by Willem van Schaik, 1999\n"); | ||||||
|  | #ifdef __TURBOC__ | ||||||
|  |   fprintf (stderr, "   for Turbo-C and Borland-C compilers\n"); | ||||||
|  | #else | ||||||
|  |   fprintf (stderr, "   for Linux (and Unix) compilers\n"); | ||||||
|  | #endif | ||||||
|  |   fprintf (stderr, "Usage:  pnm2png [options] <file>.<pnm> [<file>.png]\n"); | ||||||
|  |   fprintf (stderr, "   or:  ... | pnm2png [options]\n"); | ||||||
|  |   fprintf (stderr, "Options:\n"); | ||||||
|  |   fprintf (stderr, "   -i[nterlace]   write png-file with interlacing on\n"); | ||||||
|  |   fprintf (stderr, "   -a[lpha] <file>.pgm read PNG alpha channel as pgm-file\n"); | ||||||
|  |   fprintf (stderr, "   -h | -?  print this help-information\n"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  *  pnm2png | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | BOOL pnm2png (FILE *pnm_file, FILE *png_file, FILE *alpha_file, BOOL interlace, BOOL alpha) | ||||||
|  | { | ||||||
|  |   png_struct    *png_ptr = NULL; | ||||||
|  |   png_info      *info_ptr = NULL; | ||||||
|  |   png_byte      *png_pixels = NULL; | ||||||
|  |   png_byte      **row_pointers = NULL; | ||||||
|  |   png_byte      *pix_ptr = NULL; | ||||||
|  |   png_uint_32   row_bytes; | ||||||
|  |  | ||||||
|  |   char          type_token[16]; | ||||||
|  |   char          width_token[16]; | ||||||
|  |   char          height_token[16]; | ||||||
|  |   char          maxval_token[16]; | ||||||
|  |   int           color_type; | ||||||
|  |   png_uint_32   width, alpha_width; | ||||||
|  |   png_uint_32   height, alpha_height; | ||||||
|  |   png_uint_32   maxval; | ||||||
|  |   int           bit_depth = 0; | ||||||
|  |   int           channels; | ||||||
|  |   int           alpha_depth = 0; | ||||||
|  |   int           alpha_present; | ||||||
|  |   int           row, col; | ||||||
|  |   BOOL          raw, alpha_raw = FALSE; | ||||||
|  |   png_uint_32   tmp16; | ||||||
|  |   int           i; | ||||||
|  |  | ||||||
|  |   /* read header of PNM file */ | ||||||
|  |  | ||||||
|  |   get_token(pnm_file, type_token); | ||||||
|  |   if (type_token[0] != 'P') | ||||||
|  |   { | ||||||
|  |     return FALSE; | ||||||
|  |   } | ||||||
|  |   else if ((type_token[1] == '1') || (type_token[1] == '4')) | ||||||
|  |   { | ||||||
|  |     raw = (type_token[1] == '4'); | ||||||
|  |     color_type = PNG_COLOR_TYPE_GRAY; | ||||||
|  |     bit_depth = 1; | ||||||
|  |   } | ||||||
|  |   else if ((type_token[1] == '2') || (type_token[1] == '5')) | ||||||
|  |   { | ||||||
|  |     raw = (type_token[1] == '5'); | ||||||
|  |     color_type = PNG_COLOR_TYPE_GRAY; | ||||||
|  |     get_token(pnm_file, width_token); | ||||||
|  |     sscanf (width_token, "%lu", &width); | ||||||
|  |     get_token(pnm_file, height_token); | ||||||
|  |     sscanf (height_token, "%lu", &height); | ||||||
|  |     get_token(pnm_file, maxval_token); | ||||||
|  |     sscanf (maxval_token, "%lu", &maxval); | ||||||
|  |     if (maxval <= 1) | ||||||
|  |       bit_depth = 1; | ||||||
|  |     else if (maxval <= 3) | ||||||
|  |       bit_depth = 2; | ||||||
|  |     else if (maxval <= 15) | ||||||
|  |       bit_depth = 4; | ||||||
|  |     else if (maxval <= 255) | ||||||
|  |       bit_depth = 8; | ||||||
|  |     else /* if (maxval <= 65535) */ | ||||||
|  |       bit_depth = 16; | ||||||
|  |   } | ||||||
|  |   else if ((type_token[1] == '3') || (type_token[1] == '6')) | ||||||
|  |   { | ||||||
|  |     raw = (type_token[1] == '6'); | ||||||
|  |     color_type = PNG_COLOR_TYPE_RGB; | ||||||
|  |     get_token(pnm_file, width_token); | ||||||
|  |     sscanf (width_token, "%lu", &width); | ||||||
|  |     get_token(pnm_file, height_token); | ||||||
|  |     sscanf (height_token, "%lu", &height); | ||||||
|  |     get_token(pnm_file, maxval_token); | ||||||
|  |     sscanf (maxval_token, "%lu", &maxval); | ||||||
|  |     if (maxval <= 1) | ||||||
|  |       bit_depth = 1; | ||||||
|  |     else if (maxval <= 3) | ||||||
|  |       bit_depth = 2; | ||||||
|  |     else if (maxval <= 15) | ||||||
|  |       bit_depth = 4; | ||||||
|  |     else if (maxval <= 255) | ||||||
|  |       bit_depth = 8; | ||||||
|  |     else /* if (maxval <= 65535) */ | ||||||
|  |       bit_depth = 16; | ||||||
|  |   } | ||||||
|  |   else | ||||||
|  |   { | ||||||
|  |     return FALSE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* read header of PGM file with alpha channel */ | ||||||
|  |  | ||||||
|  |   if (alpha) | ||||||
|  |   { | ||||||
|  |     if (color_type == PNG_COLOR_TYPE_GRAY) | ||||||
|  |       color_type = PNG_COLOR_TYPE_GRAY_ALPHA; | ||||||
|  |     if (color_type == PNG_COLOR_TYPE_RGB) | ||||||
|  |       color_type = PNG_COLOR_TYPE_RGB_ALPHA; | ||||||
|  |  | ||||||
|  |     get_token(alpha_file, type_token); | ||||||
|  |     if (type_token[0] != 'P') | ||||||
|  |     { | ||||||
|  |       return FALSE; | ||||||
|  |     } | ||||||
|  |     else if ((type_token[1] == '2') || (type_token[1] == '5')) | ||||||
|  |     { | ||||||
|  |       alpha_raw = (type_token[1] == '5'); | ||||||
|  |       get_token(alpha_file, width_token); | ||||||
|  |       sscanf (width_token, "%lu", &alpha_width); | ||||||
|  |       if (alpha_width != width) | ||||||
|  |         return FALSE; | ||||||
|  |       get_token(alpha_file, height_token); | ||||||
|  |       sscanf (height_token, "%lu", &alpha_height); | ||||||
|  |       if (alpha_height != height) | ||||||
|  |         return FALSE; | ||||||
|  |       get_token(alpha_file, maxval_token); | ||||||
|  |       sscanf (maxval_token, "%lu", &maxval); | ||||||
|  |       if (maxval <= 1) | ||||||
|  |         alpha_depth = 1; | ||||||
|  |       else if (maxval <= 3) | ||||||
|  |         alpha_depth = 2; | ||||||
|  |       else if (maxval <= 15) | ||||||
|  |         alpha_depth = 4; | ||||||
|  |       else if (maxval <= 255) | ||||||
|  |         alpha_depth = 8; | ||||||
|  |       else /* if (maxval <= 65535) */ | ||||||
|  |         alpha_depth = 16; | ||||||
|  |       if (alpha_depth != bit_depth) | ||||||
|  |         return FALSE; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |       return FALSE; | ||||||
|  |     } | ||||||
|  |   } /* end if alpha */ | ||||||
|  |  | ||||||
|  |   /* calculate the number of channels and store alpha-presence */ | ||||||
|  |   if (color_type == PNG_COLOR_TYPE_GRAY) | ||||||
|  |     channels = 1; | ||||||
|  |   else if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | ||||||
|  |     channels = 2; | ||||||
|  |   else if (color_type == PNG_COLOR_TYPE_RGB) | ||||||
|  |     channels = 3; | ||||||
|  |   else if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||||||
|  |     channels = 4; | ||||||
|  |   else | ||||||
|  |     channels = 0; /* should not happen */ | ||||||
|  |  | ||||||
|  |   alpha_present = (channels - 1) % 2; | ||||||
|  |  | ||||||
|  |   /* row_bytes is the width x number of channels x (bit-depth / 8) */ | ||||||
|  |   row_bytes = width * channels * ((bit_depth <= 8) ? 1 : 2); | ||||||
|  |  | ||||||
|  |   if ((png_pixels = (png_byte *) malloc (row_bytes * height * sizeof (png_byte))) == NULL) | ||||||
|  |     return FALSE; | ||||||
|  |  | ||||||
|  |   /* read data from PNM file */ | ||||||
|  |   pix_ptr = png_pixels; | ||||||
|  |  | ||||||
|  |   for (row = 0; row < height; row++) | ||||||
|  |   { | ||||||
|  |     for (col = 0; col < width; col++) | ||||||
|  |     { | ||||||
|  |       for (i = 0; i < (channels - alpha_present); i++) | ||||||
|  |       { | ||||||
|  |         if (raw) | ||||||
|  |           *pix_ptr++ = get_data (pnm_file, bit_depth); | ||||||
|  |         else | ||||||
|  |           if (bit_depth <= 8) | ||||||
|  |             *pix_ptr++ = get_value (pnm_file, bit_depth); | ||||||
|  |           else | ||||||
|  |           { | ||||||
|  |             tmp16 = get_value (pnm_file, bit_depth); | ||||||
|  |             *pix_ptr = (png_byte) ((tmp16 >> 8) & 0xFF); | ||||||
|  |             pix_ptr++; | ||||||
|  |             *pix_ptr = (png_byte) (tmp16 & 0xFF); | ||||||
|  |             pix_ptr++; | ||||||
|  |           } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       if (alpha) /* read alpha-channel from pgm file */ | ||||||
|  |       { | ||||||
|  |         if (alpha_raw) | ||||||
|  |           *pix_ptr++ = get_data (alpha_file, alpha_depth); | ||||||
|  |         else | ||||||
|  |           if (alpha_depth <= 8) | ||||||
|  |             *pix_ptr++ = get_value (alpha_file, bit_depth); | ||||||
|  |           else | ||||||
|  |           { | ||||||
|  |             tmp16 = get_value (alpha_file, bit_depth); | ||||||
|  |             *pix_ptr++ = (png_byte) ((tmp16 >> 8) & 0xFF); | ||||||
|  |             *pix_ptr++ = (png_byte) (tmp16 & 0xFF); | ||||||
|  |           } | ||||||
|  |       } /* if alpha */ | ||||||
|  |  | ||||||
|  |     } /* end for col */ | ||||||
|  |   } /* end for row */ | ||||||
|  |  | ||||||
|  |   /* prepare the standard PNG structures */ | ||||||
|  |   png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); | ||||||
|  |   if (!png_ptr) | ||||||
|  |   { | ||||||
|  |     return FALSE; | ||||||
|  |   } | ||||||
|  |   info_ptr = png_create_info_struct (png_ptr); | ||||||
|  |   if (!info_ptr) | ||||||
|  |   { | ||||||
|  |     png_destroy_write_struct (&png_ptr, (png_infopp) NULL); | ||||||
|  |     return FALSE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* setjmp() must be called in every function that calls a PNG-reading libpng function */ | ||||||
|  |   if (setjmp (png_jmpbuf(png_ptr))) | ||||||
|  |   { | ||||||
|  |     png_destroy_write_struct (&png_ptr, (png_infopp) NULL); | ||||||
|  |     return FALSE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* initialize the png structure */ | ||||||
|  |   png_init_io (png_ptr, png_file); | ||||||
|  |  | ||||||
|  |   /* we're going to write more or less the same PNG as the input file */ | ||||||
|  |   png_set_IHDR (png_ptr, info_ptr, width, height, bit_depth, color_type, | ||||||
|  |     (!interlace) ? PNG_INTERLACE_NONE : PNG_INTERLACE_ADAM7, | ||||||
|  |     PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); | ||||||
|  |  | ||||||
|  |   /* write the file header information */ | ||||||
|  |   png_write_info (png_ptr, info_ptr); | ||||||
|  |  | ||||||
|  |   /* if needed we will allocate memory for an new array of row-pointers */ | ||||||
|  |   if (row_pointers == (unsigned char**) NULL) | ||||||
|  |   { | ||||||
|  |     if ((row_pointers = (png_byte **) malloc (height * sizeof (png_bytep))) == NULL) | ||||||
|  |     { | ||||||
|  |       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 < (height); i++) | ||||||
|  |     row_pointers[i] = png_pixels + i * row_bytes; | ||||||
|  |  | ||||||
|  |   /* write out the entire image data in one call */ | ||||||
|  |   png_write_image (png_ptr, row_pointers); | ||||||
|  |  | ||||||
|  |   /* write the additional chuncks to the PNG file (not really needed) */ | ||||||
|  |   png_write_end (png_ptr, info_ptr); | ||||||
|  |  | ||||||
|  |   /* clean up after the write, and free any memory allocated */ | ||||||
|  |   png_destroy_write_struct (&png_ptr, (png_infopp) NULL); | ||||||
|  |  | ||||||
|  |   if (row_pointers != (unsigned char**) NULL) | ||||||
|  |     free (row_pointers); | ||||||
|  |   if (png_pixels != (unsigned char*) NULL) | ||||||
|  |     free (png_pixels); | ||||||
|  |  | ||||||
|  |   return TRUE; | ||||||
|  | } /* end of pnm2png */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * get_token() - gets the first string after whitespace | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | void get_token(FILE *pnm_file, char *token) | ||||||
|  | { | ||||||
|  |   int i = 0; | ||||||
|  |  | ||||||
|  |   /* remove white-space */ | ||||||
|  |   do | ||||||
|  |   { | ||||||
|  |     token[i] = (unsigned char) fgetc (pnm_file); | ||||||
|  |   } | ||||||
|  |   while ((token[i] == '\n') || (token[i] == '\r') || (token[i] == ' ')); | ||||||
|  |  | ||||||
|  |   /* read string */ | ||||||
|  |   do | ||||||
|  |   { | ||||||
|  |     i++; | ||||||
|  |     token[i] = (unsigned char) fgetc (pnm_file); | ||||||
|  |   } | ||||||
|  |   while ((token[i] != '\n') && (token[i] != '\r') && (token[i] != ' ')); | ||||||
|  |  | ||||||
|  |   token[i] = '\0'; | ||||||
|  |  | ||||||
|  |   return; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * get_data() - takes first byte and converts into next pixel value, | ||||||
|  |  *        taking as much bits as defined by bit-depth and | ||||||
|  |  *        using the bit-depth to fill up a byte (0Ah -> AAh) | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | png_uint_32 get_data (FILE *pnm_file, int depth) | ||||||
|  | { | ||||||
|  |   static int bits_left = 0; | ||||||
|  |   static int old_value = 0; | ||||||
|  |   static int mask = 0; | ||||||
|  |   int i; | ||||||
|  |   png_uint_32 ret_value; | ||||||
|  |  | ||||||
|  |   if (mask == 0) | ||||||
|  |     for (i = 0; i < depth; i++) | ||||||
|  |       mask = (mask >> 1) | 0x80; | ||||||
|  |  | ||||||
|  |   if (bits_left <= 0) | ||||||
|  |   { | ||||||
|  |     old_value = fgetc (pnm_file); | ||||||
|  |     bits_left = 8; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   ret_value = old_value & mask; | ||||||
|  |   for (i = 1; i < (8 / depth); i++) | ||||||
|  |     ret_value = ret_value || (ret_value >> depth); | ||||||
|  |  | ||||||
|  |   old_value = (old_value << depth) & 0xFF; | ||||||
|  |   bits_left -= depth; | ||||||
|  |  | ||||||
|  |   return ret_value; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * get_value() - takes first (numeric) string and converts into number, | ||||||
|  |  *         using the bit-depth to fill up a byte (0Ah -> AAh) | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | png_uint_32 get_value (FILE *pnm_file, int depth) | ||||||
|  | { | ||||||
|  |   static png_uint_32 mask = 0; | ||||||
|  |   png_byte token[16]; | ||||||
|  |   png_uint_32 ret_value; | ||||||
|  |   int i = 0; | ||||||
|  |  | ||||||
|  |   if (mask == 0) | ||||||
|  |     for (i = 0; i < depth; i++) | ||||||
|  |       mask = (mask << 1) | 0x01; | ||||||
|  |  | ||||||
|  |   get_token (pnm_file, (char *) token); | ||||||
|  |   sscanf ((const char *) token, "%lu", &ret_value); | ||||||
|  |  | ||||||
|  |   ret_value &= mask; | ||||||
|  |  | ||||||
|  |   if (depth < 8) | ||||||
|  |     for (i = 0; i < (8 / depth); i++) | ||||||
|  |       ret_value = (ret_value << depth) || ret_value; | ||||||
|  |  | ||||||
|  |   return ret_value; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* end of source */ | ||||||
|  |  | ||||||
							
								
								
									
										41
									
								
								runtime/libpng/contrib/pngminus/pnm2png.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,41 @@ | |||||||
|  | # -- grayscale | ||||||
|  | ./pnm2png basn0g01.pgm basn0g01.png | ||||||
|  | ./pnm2png basn0g02.pgm basn0g02.png | ||||||
|  | ./pnm2png basn0g04.pgm basn0g04.png | ||||||
|  | ./pnm2png basn0g08.pgm basn0g08.png | ||||||
|  | ./pnm2png basn0g16.pgm basn0g16.png | ||||||
|  | # -- full-color | ||||||
|  | ./pnm2png basn2c08.ppm basn2c08.png | ||||||
|  | ./pnm2png basn2c16.ppm basn2c16.png | ||||||
|  | # -- palletted | ||||||
|  | ./pnm2png basn3p01.ppm basn3p01.png | ||||||
|  | ./pnm2png basn3p02.ppm basn3p02.png | ||||||
|  | ./pnm2png basn3p04.ppm basn3p04.png | ||||||
|  | ./pnm2png basn3p08.ppm basn3p08.png | ||||||
|  | # -- gray with alpha-channel | ||||||
|  | ./pnm2png -alpha basn6a08.pgm basn4a08.pgm basn4a08.png | ||||||
|  | ./pnm2png -alpha basn6a16.pgm basn4a16.pgm basn4a16.png | ||||||
|  | # -- color with alpha-channel | ||||||
|  | ./pnm2png -alpha basn6a08.pgm basn6a08.ppm basn6a08.png | ||||||
|  | ./pnm2png -alpha basn6a16.pgm basn6a16.ppm basn6a16.png | ||||||
|  | # -- grayscale | ||||||
|  | ./pnm2png rawn0g01.pgm rawn0g01.png | ||||||
|  | ./pnm2png rawn0g02.pgm rawn0g02.png | ||||||
|  | ./pnm2png rawn0g04.pgm rawn0g04.png | ||||||
|  | ./pnm2png rawn0g08.pgm rawn0g08.png | ||||||
|  | ./pnm2png rawn0g16.pgm rawn0g16.png | ||||||
|  | # -- full-color | ||||||
|  | ./pnm2png rawn2c08.ppm rawn2c08.png | ||||||
|  | ./pnm2png rawn2c16.ppm rawn2c16.png | ||||||
|  | # -- palletted | ||||||
|  | ./pnm2png rawn3p01.ppm rawn3p01.png | ||||||
|  | ./pnm2png rawn3p02.ppm rawn3p02.png | ||||||
|  | ./pnm2png rawn3p04.ppm rawn3p04.png | ||||||
|  | ./pnm2png rawn3p08.ppm rawn3p08.png | ||||||
|  | # -- gray with alpha-channel | ||||||
|  | ./pnm2png -alpha rawn6a08.pgm rawn4a08.pgm rawn4a08.png | ||||||
|  | ./pnm2png -alpha rawn6a16.pgm rawn4a16.pgm rawn4a16.png | ||||||
|  | # -- color with alpha-channel | ||||||
|  | ./pnm2png -alpha rawn6a08.pgm rawn6a08.ppm rawn6a08.png | ||||||
|  | ./pnm2png -alpha rawn6a16.pgm rawn6a16.ppm rawn6a16.png | ||||||
|  |  | ||||||
							
								
								
									
										85
									
								
								runtime/libpng/contrib/pngsuite/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,85 @@ | |||||||
|  |  | ||||||
|  | pngsuite | ||||||
|  | -------- | ||||||
|  | (c) Willem van Schaik, 1999 | ||||||
|  |  | ||||||
|  | Permission to use, copy, and distribute these images for any purpose and | ||||||
|  | without fee is hereby granted. | ||||||
|  |  | ||||||
|  | These 15 images are part of the much larger PngSuite test-set of  | ||||||
|  | images, available for developers of PNG supporting software. The  | ||||||
|  | complete set, available at http:/www.schaik.com/pngsuite/, contains  | ||||||
|  | a variety of images to test interlacing, gamma settings, ancillary | ||||||
|  | chunks, etc. | ||||||
|  |  | ||||||
|  | The images in this directory represent the basic PNG color-types: | ||||||
|  | grayscale (1-16 bit deep), full color (8 or 16 bit), paletted | ||||||
|  | (1-8 bit) and grayscale or color images with alpha channel. You | ||||||
|  | can use them to test the proper functioning of PNG software. | ||||||
|  |  | ||||||
|  |     filename      depth type | ||||||
|  |     ------------ ------ -------------- | ||||||
|  |     basn0g01.png  1-bit grayscale | ||||||
|  |     basn0g02.png  2-bit grayscale | ||||||
|  |     basn0g04.png  4-bit grayscale | ||||||
|  |     basn0g08.png  8-bit grayscale | ||||||
|  |     basn0g16.png 16-bit grayscale | ||||||
|  |     basn2c08.png  8-bit truecolor | ||||||
|  |     basn2c16.png 16-bit truecolor | ||||||
|  |     basn3p01.png  1-bit paletted | ||||||
|  |     basn3p02.png  2-bit paletted | ||||||
|  |     basn3p04.png  4-bit paletted | ||||||
|  |     basn3p08.png  8-bit paletted | ||||||
|  |     basn4a08.png  8-bit gray with alpha | ||||||
|  |     basn4a16.png 16-bit gray with alpha | ||||||
|  |     basn6a08.png  8-bit RGBA | ||||||
|  |     basn6a16.png 16-bit RGBA | ||||||
|  |  | ||||||
|  | Here is the correct result of typing "pngtest -m *.png" in | ||||||
|  | this directory: | ||||||
|  |  | ||||||
|  | Testing basn0g01.png: PASS (524 zero samples) | ||||||
|  |  Filter 0 was used 32 times | ||||||
|  | Testing basn0g02.png: PASS (448 zero samples) | ||||||
|  |  Filter 0 was used 32 times | ||||||
|  | Testing basn0g04.png: PASS (520 zero samples) | ||||||
|  |  Filter 0 was used 32 times | ||||||
|  | Testing basn0g08.png: PASS (3 zero samples) | ||||||
|  |  Filter 1 was used 9 times | ||||||
|  |  Filter 4 was used 23 times | ||||||
|  | Testing basn0g16.png: PASS (1 zero samples) | ||||||
|  |  Filter 1 was used 1 times | ||||||
|  |  Filter 2 was used 31 times | ||||||
|  | Testing basn2c08.png: PASS (6 zero samples) | ||||||
|  |  Filter 1 was used 5 times | ||||||
|  |  Filter 4 was used 27 times | ||||||
|  | Testing basn2c16.png: PASS (592 zero samples) | ||||||
|  |  Filter 1 was used 1 times | ||||||
|  |  Filter 4 was used 31 times | ||||||
|  | Testing basn3p01.png: PASS (512 zero samples) | ||||||
|  |  Filter 0 was used 32 times | ||||||
|  | Testing basn3p02.png: PASS (448 zero samples) | ||||||
|  |  Filter 0 was used 32 times | ||||||
|  | Testing basn3p04.png: PASS (544 zero samples) | ||||||
|  |  Filter 0 was used 32 times | ||||||
|  | Testing basn3p08.png: PASS (4 zero samples) | ||||||
|  |  Filter 0 was used 32 times | ||||||
|  | Testing basn4a08.png: PASS (32 zero samples) | ||||||
|  |  Filter 1 was used 1 times | ||||||
|  |  Filter 4 was used 31 times | ||||||
|  | Testing basn4a16.png: PASS (64 zero samples) | ||||||
|  |  Filter 0 was used 1 times | ||||||
|  |  Filter 1 was used 2 times | ||||||
|  |  Filter 2 was used 1 times | ||||||
|  |  Filter 4 was used 28 times | ||||||
|  | Testing basn6a08.png: PASS (160 zero samples) | ||||||
|  |  Filter 1 was used 1 times | ||||||
|  |  Filter 4 was used 31 times | ||||||
|  | Testing basn6a16.png: PASS (1072 zero samples) | ||||||
|  |  Filter 1 was used 4 times | ||||||
|  |  Filter 4 was used 28 times | ||||||
|  | libpng passes test | ||||||
|  |  | ||||||
|  | Willem van Schaik | ||||||
|  | <willem@schaik.com> | ||||||
|  | October 1999 | ||||||
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/pngsuite/basn0g01.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 164 B | 
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/pngsuite/basn0g02.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 104 B | 
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/pngsuite/basn0g04.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 145 B | 
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/pngsuite/basn0g08.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 138 B | 
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/pngsuite/basn0g16.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 167 B | 
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/pngsuite/basn2c08.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 145 B | 
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/pngsuite/basn2c16.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 302 B | 
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/pngsuite/basn3p01.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 112 B | 
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/pngsuite/basn3p02.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 146 B | 
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/pngsuite/basn3p04.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 216 B | 
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/pngsuite/basn3p08.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/pngsuite/basn4a08.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 126 B | 
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/pngsuite/basn4a16.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/pngsuite/basn6a08.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 184 B | 
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/pngsuite/basn6a16.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.4 KiB | 
							
								
								
									
										439
									
								
								runtime/libpng/contrib/visupng/PngFile.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,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 | ||||||
|  | //----------------- | ||||||
							
								
								
									
										27
									
								
								runtime/libpng/contrib/visupng/PngFile.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -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 | ||||||
|  |  | ||||||
							
								
								
									
										58
									
								
								runtime/libpng/contrib/visupng/README.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -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 ..\..\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 | ||||||
|  |  | ||||||
							
								
								
									
										961
									
								
								runtime/libpng/contrib/visupng/VisualPng.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -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 | ||||||
|  | //----------------- | ||||||
							
								
								
									
										223
									
								
								runtime/libpng/contrib/visupng/VisualPng.dsp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -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 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 | ||||||
							
								
								
									
										29
									
								
								runtime/libpng/contrib/visupng/VisualPng.dsw
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -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> | ||||||
|  | {{{ | ||||||
|  | }}} | ||||||
|  |  | ||||||
|  | ############################################################################### | ||||||
|  |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/visupng/VisualPng.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 766 B | 
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/contrib/visupng/VisualPng.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 208 B | 
							
								
								
									
										152
									
								
								runtime/libpng/contrib/visupng/VisualPng.rc
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -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 | ||||||
|  |  | ||||||
							
								
								
									
										244
									
								
								runtime/libpng/contrib/visupng/cexcept.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -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 */ | ||||||
							
								
								
									
										23
									
								
								runtime/libpng/contrib/visupng/resource.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -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 | ||||||
							
								
								
									
										804
									
								
								runtime/libpng/example.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,804 @@ | |||||||
|  |  | ||||||
|  | #if 0 /* in case someone actually tries to compile this */ | ||||||
|  |  | ||||||
|  | /* example.c - an example of using libpng */ | ||||||
|  |  | ||||||
|  | /* This is an example of how to use libpng to read and write PNG files. | ||||||
|  |  * The file libpng.txt is much more verbose then this.  If you have not | ||||||
|  |  * read it, do so first.  This was designed to be a starting point of an | ||||||
|  |  * implementation.  This is not officially part of libpng, is hereby placed | ||||||
|  |  * in the public domain, and therefore does not require a copyright notice. | ||||||
|  |  * | ||||||
|  |  * This file does not currently compile, because it is missing certain | ||||||
|  |  * parts, like allocating memory to hold an image.  You will have to | ||||||
|  |  * supply these parts to get it to compile.  For an example of a minimal | ||||||
|  |  * working PNG reader/writer, see pngtest.c, included in this distribution; | ||||||
|  |  * see also the programs in the contrib directory. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "png.h" | ||||||
|  |  | ||||||
|  |  /* The png_jmpbuf() macro, used in error handling, became available in | ||||||
|  |   * libpng version 1.0.6.  If you want to be able to run your code with older | ||||||
|  |   * versions of libpng, you must define the macro yourself (but only if it | ||||||
|  |   * is not already defined by libpng!). | ||||||
|  |   */ | ||||||
|  |  | ||||||
|  | #ifndef png_jmpbuf | ||||||
|  | #  define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* Check to see if a file is a PNG file using png_sig_cmp().  png_sig_cmp() | ||||||
|  |  * returns zero if the image is a PNG and nonzero if it isn't a PNG. | ||||||
|  |  * | ||||||
|  |  * The function check_if_png() shown here, but not used, returns nonzero (true) | ||||||
|  |  * if the file can be opened and is a PNG, 0 (false) otherwise. | ||||||
|  |  * | ||||||
|  |  * If this call is successful, and you are going to keep the file open, | ||||||
|  |  * you should call png_set_sig_bytes(png_ptr, PNG_BYTES_TO_CHECK); once | ||||||
|  |  * you have created the png_ptr, so that libpng knows your application | ||||||
|  |  * has read that many bytes from the start of the file.  Make sure you | ||||||
|  |  * don't call png_set_sig_bytes() with more than 8 bytes read or give it | ||||||
|  |  * an incorrect number of bytes read, or you will either have read too | ||||||
|  |  * many bytes (your fault), or you are telling libpng to read the wrong | ||||||
|  |  * number of magic bytes (also your fault). | ||||||
|  |  * | ||||||
|  |  * Many applications already read the first 2 or 4 bytes from the start | ||||||
|  |  * of the image to determine the file type, so it would be easiest just | ||||||
|  |  * to pass the bytes to png_sig_cmp() or even skip that if you know | ||||||
|  |  * you have a PNG file, and call png_set_sig_bytes(). | ||||||
|  |  */ | ||||||
|  | #define PNG_BYTES_TO_CHECK 4 | ||||||
|  | int check_if_png(char *file_name, FILE **fp) | ||||||
|  | { | ||||||
|  |    char buf[PNG_BYTES_TO_CHECK]; | ||||||
|  |  | ||||||
|  |    /* Open the prospective PNG file. */ | ||||||
|  |    if ((*fp = fopen(file_name, "rb")) == NULL) | ||||||
|  |       return 0; | ||||||
|  |  | ||||||
|  |    /* Read in some of the signature bytes */ | ||||||
|  |    if (fread(buf, 1, PNG_BYTES_TO_CHECK, *fp) != PNG_BYTES_TO_CHECK) | ||||||
|  |       return 0; | ||||||
|  |  | ||||||
|  |    /* Compare the first PNG_BYTES_TO_CHECK bytes of the signature. | ||||||
|  |       Return nonzero (true) if they match */ | ||||||
|  |  | ||||||
|  |    return(!png_sig_cmp(buf, (png_size_t)0, PNG_BYTES_TO_CHECK)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Read a PNG file.  You may want to return an error code if the read | ||||||
|  |  * fails (depending upon the failure).  There are two "prototypes" given | ||||||
|  |  * here - one where we are given the filename, and we need to open the | ||||||
|  |  * file, and the other where we are given an open file (possibly with | ||||||
|  |  * some or all of the magic bytes read - see comments above). | ||||||
|  |  */ | ||||||
|  | #ifdef open_file /* prototype 1 */ | ||||||
|  | void read_png(char *file_name)  /* We need to open the file */ | ||||||
|  | { | ||||||
|  |    png_structp png_ptr; | ||||||
|  |    png_infop info_ptr; | ||||||
|  |    unsigned int sig_read = 0; | ||||||
|  |    png_uint_32 width, height; | ||||||
|  |    int bit_depth, color_type, interlace_type; | ||||||
|  |    FILE *fp; | ||||||
|  |  | ||||||
|  |    if ((fp = fopen(file_name, "rb")) == NULL) | ||||||
|  |       return (ERROR); | ||||||
|  | #else no_open_file /* prototype 2 */ | ||||||
|  | void read_png(FILE *fp, unsigned int sig_read)  /* file is already open */ | ||||||
|  | { | ||||||
|  |    png_structp png_ptr; | ||||||
|  |    png_infop info_ptr; | ||||||
|  |    png_uint_32 width, height; | ||||||
|  |    int bit_depth, color_type, interlace_type; | ||||||
|  | #endif no_open_file /* only use one prototype! */ | ||||||
|  |  | ||||||
|  |    /* Create and initialize the png_struct with the desired error handler | ||||||
|  |     * functions.  If you want to use the default stderr and longjump method, | ||||||
|  |     * you can supply NULL for the last three parameters.  We also supply the | ||||||
|  |     * the compiler header file version, so that we know if the application | ||||||
|  |     * was compiled with a compatible version of the library.  REQUIRED | ||||||
|  |     */ | ||||||
|  |    png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, | ||||||
|  |       png_voidp user_error_ptr, user_error_fn, user_warning_fn); | ||||||
|  |  | ||||||
|  |    if (png_ptr == NULL) | ||||||
|  |    { | ||||||
|  |       fclose(fp); | ||||||
|  |       return (ERROR); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    /* Allocate/initialize the memory for image information.  REQUIRED. */ | ||||||
|  |    info_ptr = png_create_info_struct(png_ptr); | ||||||
|  |    if (info_ptr == NULL) | ||||||
|  |    { | ||||||
|  |       fclose(fp); | ||||||
|  |       png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL); | ||||||
|  |       return (ERROR); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    /* Set error handling if you are using the setjmp/longjmp method (this is | ||||||
|  |     * the normal method of doing things with libpng).  REQUIRED unless you | ||||||
|  |     * set up your own error handlers in the png_create_read_struct() earlier. | ||||||
|  |     */ | ||||||
|  |  | ||||||
|  |    if (setjmp(png_jmpbuf(png_ptr))) | ||||||
|  |    { | ||||||
|  |       /* Free all of the memory associated with the png_ptr and info_ptr */ | ||||||
|  |       png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL); | ||||||
|  |       fclose(fp); | ||||||
|  |       /* If we get here, we had a problem reading the file */ | ||||||
|  |       return (ERROR); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    /* One of the following I/O initialization methods is REQUIRED */ | ||||||
|  | #ifdef streams /* PNG file I/O method 1 */ | ||||||
|  |    /* Set up the input control if you are using standard C streams */ | ||||||
|  |    png_init_io(png_ptr, fp); | ||||||
|  |  | ||||||
|  | #else no_streams /* PNG file I/O method 2 */ | ||||||
|  |    /* If you are using replacement read functions, instead of calling | ||||||
|  |     * png_init_io() here you would call: | ||||||
|  |     */ | ||||||
|  |    png_set_read_fn(png_ptr, (void *)user_io_ptr, user_read_fn); | ||||||
|  |    /* where user_io_ptr is a structure you want available to the callbacks */ | ||||||
|  | #endif no_streams /* Use only one I/O method! */ | ||||||
|  |  | ||||||
|  |    /* If we have already read some of the signature */ | ||||||
|  |    png_set_sig_bytes(png_ptr, sig_read); | ||||||
|  |  | ||||||
|  | #ifdef hilevel | ||||||
|  |    /* | ||||||
|  |     * If you have enough memory to read in the entire image at once, | ||||||
|  |     * and you need to specify only transforms that can be controlled | ||||||
|  |     * with one of the PNG_TRANSFORM_* bits (this presently excludes | ||||||
|  |     * dithering, filling, setting background, and doing gamma | ||||||
|  |     * adjustment), then you can read the entire image (including | ||||||
|  |     * pixels) into the info structure with this call: | ||||||
|  |     */ | ||||||
|  |    png_read_png(png_ptr, info_ptr, png_transforms, png_voidp_NULL); | ||||||
|  | #else | ||||||
|  |    /* OK, you're doing it the hard way, with the lower-level functions */ | ||||||
|  |  | ||||||
|  |    /* The call to png_read_info() gives us all of the information from the | ||||||
|  |     * PNG file before the first IDAT (image data chunk).  REQUIRED | ||||||
|  |     */ | ||||||
|  |    png_read_info(png_ptr, info_ptr); | ||||||
|  |  | ||||||
|  |    png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, | ||||||
|  |        &interlace_type, int_p_NULL, int_p_NULL); | ||||||
|  |  | ||||||
|  | /* Set up the data transformations you want.  Note that these are all | ||||||
|  |  * optional.  Only call them if you want/need them.  Many of the | ||||||
|  |  * transformations only work on specific types of images, and many | ||||||
|  |  * are mutually exclusive. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  |    /* tell libpng to strip 16 bit/color files down to 8 bits/color */ | ||||||
|  |    png_set_strip_16(png_ptr); | ||||||
|  |  | ||||||
|  |    /* Strip alpha bytes from the input data without combining with the | ||||||
|  |     * background (not recommended). | ||||||
|  |     */ | ||||||
|  |    png_set_strip_alpha(png_ptr); | ||||||
|  |  | ||||||
|  |    /* Extract multiple pixels with bit depths of 1, 2, and 4 from a single | ||||||
|  |     * byte into separate bytes (useful for paletted and grayscale images). | ||||||
|  |     */ | ||||||
|  |    png_set_packing(png_ptr); | ||||||
|  |  | ||||||
|  |    /* Change the order of packed pixels to least significant bit first | ||||||
|  |     * (not useful if you are using png_set_packing). */ | ||||||
|  |    png_set_packswap(png_ptr); | ||||||
|  |  | ||||||
|  |    /* Expand paletted colors into true RGB triplets */ | ||||||
|  |    if (color_type == PNG_COLOR_TYPE_PALETTE) | ||||||
|  |       png_set_palette_rgb(png_ptr); | ||||||
|  |  | ||||||
|  |    /* Expand grayscale images to the full 8 bits from 1, 2, or 4 bits/pixel */ | ||||||
|  |    if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) | ||||||
|  |       png_set_gray_1_2_4_to_8(png_ptr); | ||||||
|  |  | ||||||
|  |    /* Expand paletted or RGB images with transparency to full alpha channels | ||||||
|  |     * so the data will be available as RGBA quartets. | ||||||
|  |     */ | ||||||
|  |    if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) | ||||||
|  |       png_set_tRNS_to_alpha(png_ptr); | ||||||
|  |  | ||||||
|  |    /* Set the background color to draw transparent and alpha images over. | ||||||
|  |     * It is possible to set the red, green, and blue components directly | ||||||
|  |     * for paletted images instead of supplying a palette index.  Note that | ||||||
|  |     * even if the PNG file supplies a background, you are not required to | ||||||
|  |     * use it - you should use the (solid) application background if it has one. | ||||||
|  |     */ | ||||||
|  |  | ||||||
|  |    png_color_16 my_background, *image_background; | ||||||
|  |  | ||||||
|  |    if (png_get_bKGD(png_ptr, info_ptr, &image_background)) | ||||||
|  |       png_set_background(png_ptr, image_background, | ||||||
|  |                          PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); | ||||||
|  |    else | ||||||
|  |       png_set_background(png_ptr, &my_background, | ||||||
|  |                          PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); | ||||||
|  |  | ||||||
|  |    /* Some suggestions as to how to get a screen gamma value */ | ||||||
|  |  | ||||||
|  |    /* Note that screen gamma is the display_exponent, which includes | ||||||
|  |     * the CRT_exponent and any correction for viewing conditions */ | ||||||
|  |    if (/* We have a user-defined screen gamma value */) | ||||||
|  |    { | ||||||
|  |       screen_gamma = user-defined screen_gamma; | ||||||
|  |    } | ||||||
|  |    /* This is one way that applications share the same screen gamma value */ | ||||||
|  |    else if ((gamma_str = getenv("SCREEN_GAMMA")) != NULL) | ||||||
|  |    { | ||||||
|  |       screen_gamma = atof(gamma_str); | ||||||
|  |    } | ||||||
|  |    /* If we don't have another value */ | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       screen_gamma = 2.2;  /* A good guess for a PC monitors in a dimly | ||||||
|  |                               lit room */ | ||||||
|  |       screen_gamma = 1.7 or 1.0;  /* A good guess for Mac systems */ | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    /* Tell libpng to handle the gamma conversion for you.  The final call | ||||||
|  |     * is a good guess for PC generated images, but it should be configurable | ||||||
|  |     * by the user at run time by the user.  It is strongly suggested that | ||||||
|  |     * your application support gamma correction. | ||||||
|  |     */ | ||||||
|  |  | ||||||
|  |    int intent; | ||||||
|  |  | ||||||
|  |    if (png_get_sRGB(png_ptr, info_ptr, &intent)) | ||||||
|  |       png_set_gamma(png_ptr, screen_gamma, 0.45455); | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       double image_gamma; | ||||||
|  |       if (png_get_gAMA(png_ptr, info_ptr, &image_gamma)) | ||||||
|  |          png_set_gamma(png_ptr, screen_gamma, image_gamma); | ||||||
|  |       else | ||||||
|  |          png_set_gamma(png_ptr, screen_gamma, 0.45455); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    /* Dither RGB files down to 8 bit palette or reduce palettes | ||||||
|  |     * to the number of colors available on your screen. | ||||||
|  |     */ | ||||||
|  |    if (color_type & PNG_COLOR_MASK_COLOR) | ||||||
|  |    { | ||||||
|  |       int num_palette; | ||||||
|  |       png_colorp palette; | ||||||
|  |  | ||||||
|  |       /* This reduces the image to the application supplied palette */ | ||||||
|  |       if (/* we have our own palette */) | ||||||
|  |       { | ||||||
|  |          /* An array of colors to which the image should be dithered */ | ||||||
|  |          png_color std_color_cube[MAX_SCREEN_COLORS]; | ||||||
|  |  | ||||||
|  |          png_set_dither(png_ptr, std_color_cube, MAX_SCREEN_COLORS, | ||||||
|  |             MAX_SCREEN_COLORS, png_uint_16p_NULL, 0); | ||||||
|  |       } | ||||||
|  |       /* This reduces the image to the palette supplied in the file */ | ||||||
|  |       else if (png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette)) | ||||||
|  |       { | ||||||
|  |          png_uint_16p histogram = NULL; | ||||||
|  |  | ||||||
|  |          png_get_hIST(png_ptr, info_ptr, &histogram); | ||||||
|  |  | ||||||
|  |          png_set_dither(png_ptr, palette, num_palette, | ||||||
|  |                         max_screen_colors, histogram, 0); | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    /* invert monochrome files to have 0 as white and 1 as black */ | ||||||
|  |    png_set_invert_mono(png_ptr); | ||||||
|  |  | ||||||
|  |    /* If you want to shift the pixel values from the range [0,255] or | ||||||
|  |     * [0,65535] to the original [0,7] or [0,31], or whatever range the | ||||||
|  |     * colors were originally in: | ||||||
|  |     */ | ||||||
|  |    if (png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT)) | ||||||
|  |    { | ||||||
|  |       png_color_8p sig_bit; | ||||||
|  |  | ||||||
|  |       png_get_sBIT(png_ptr, info_ptr, &sig_bit); | ||||||
|  |       png_set_shift(png_ptr, sig_bit); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    /* flip the RGB pixels to BGR (or RGBA to BGRA) */ | ||||||
|  |    if (color_type & PNG_COLOR_MASK_COLOR) | ||||||
|  |       png_set_bgr(png_ptr); | ||||||
|  |  | ||||||
|  |    /* swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */ | ||||||
|  |    png_set_swap_alpha(png_ptr); | ||||||
|  |  | ||||||
|  |    /* swap bytes of 16 bit files to least significant byte first */ | ||||||
|  |    png_set_swap(png_ptr); | ||||||
|  |  | ||||||
|  |    /* Add filler (or alpha) byte (before/after each RGB triplet) */ | ||||||
|  |    png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER); | ||||||
|  |  | ||||||
|  |    /* Turn on interlace handling.  REQUIRED if you are not using | ||||||
|  |     * png_read_image().  To see how to handle interlacing passes, | ||||||
|  |     * see the png_read_row() method below: | ||||||
|  |     */ | ||||||
|  |    number_passes = png_set_interlace_handling(png_ptr); | ||||||
|  |  | ||||||
|  |    /* Optional call to gamma correct and add the background to the palette | ||||||
|  |     * and update info structure.  REQUIRED if you are expecting libpng to | ||||||
|  |     * update the palette for you (ie you selected such a transform above). | ||||||
|  |     */ | ||||||
|  |    png_read_update_info(png_ptr, info_ptr); | ||||||
|  |  | ||||||
|  |    /* Allocate the memory to hold the image using the fields of info_ptr. */ | ||||||
|  |  | ||||||
|  |    /* The easiest way to read the image: */ | ||||||
|  |    png_bytep row_pointers[height]; | ||||||
|  |  | ||||||
|  |    for (row = 0; row < height; row++) | ||||||
|  |    { | ||||||
|  |       row_pointers[row] = png_malloc(png_ptr, png_get_rowbytes(png_ptr, | ||||||
|  |          info_ptr)); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    /* Now it's time to read the image.  One of these methods is REQUIRED */ | ||||||
|  | #ifdef entire /* Read the entire image in one go */ | ||||||
|  |    png_read_image(png_ptr, row_pointers); | ||||||
|  |  | ||||||
|  | #else no_entire /* Read the image one or more scanlines at a time */ | ||||||
|  |    /* The other way to read images - deal with interlacing: */ | ||||||
|  |  | ||||||
|  |    for (pass = 0; pass < number_passes; pass++) | ||||||
|  |    { | ||||||
|  | #ifdef single /* Read the image a single row at a time */ | ||||||
|  |       for (y = 0; y < height; y++) | ||||||
|  |       { | ||||||
|  |          png_read_rows(png_ptr, &row_pointers[y], png_bytepp_NULL, 1); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  | #else no_single /* Read the image several rows at a time */ | ||||||
|  |       for (y = 0; y < height; y += number_of_rows) | ||||||
|  |       { | ||||||
|  | #ifdef sparkle /* Read the image using the "sparkle" effect. */ | ||||||
|  |          png_read_rows(png_ptr, &row_pointers[y], png_bytepp_NULL, | ||||||
|  |             number_of_rows); | ||||||
|  | #else no_sparkle /* Read the image using the "rectangle" effect */ | ||||||
|  |          png_read_rows(png_ptr, png_bytepp_NULL, &row_pointers[y], | ||||||
|  |             number_of_rows); | ||||||
|  | #endif no_sparkle /* use only one of these two methods */ | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       /* if you want to display the image after every pass, do | ||||||
|  |          so here */ | ||||||
|  | #endif no_single /* use only one of these two methods */ | ||||||
|  |    } | ||||||
|  | #endif no_entire /* use only one of these two methods */ | ||||||
|  |  | ||||||
|  |    /* read rest of file, and get additional chunks in info_ptr - REQUIRED */ | ||||||
|  |    png_read_end(png_ptr, info_ptr); | ||||||
|  | #endif hilevel | ||||||
|  |  | ||||||
|  |    /* At this point you have read the entire image */ | ||||||
|  |  | ||||||
|  |    /* clean up after the read, and free any memory allocated - REQUIRED */ | ||||||
|  |    png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL); | ||||||
|  |  | ||||||
|  |    /* close the file */ | ||||||
|  |    fclose(fp); | ||||||
|  |  | ||||||
|  |    /* that's it */ | ||||||
|  |    return (OK); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* progressively read a file */ | ||||||
|  |  | ||||||
|  | int | ||||||
|  | initialize_png_reader(png_structp *png_ptr, png_infop *info_ptr) | ||||||
|  | { | ||||||
|  |    /* Create and initialize the png_struct with the desired error handler | ||||||
|  |     * functions.  If you want to use the default stderr and longjump method, | ||||||
|  |     * you can supply NULL for the last three parameters.  We also check that | ||||||
|  |     * the library version is compatible in case we are using dynamically | ||||||
|  |     * linked libraries. | ||||||
|  |     */ | ||||||
|  |    *png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, | ||||||
|  |        png_voidp user_error_ptr, user_error_fn, user_warning_fn); | ||||||
|  |  | ||||||
|  |    if (*png_ptr == NULL) | ||||||
|  |    { | ||||||
|  |       *info_ptr = NULL; | ||||||
|  |       return (ERROR); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    *info_ptr = png_create_info_struct(png_ptr); | ||||||
|  |  | ||||||
|  |    if (*info_ptr == NULL) | ||||||
|  |    { | ||||||
|  |       png_destroy_read_struct(png_ptr, info_ptr, png_infopp_NULL); | ||||||
|  |       return (ERROR); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    if (setjmp(png_jmpbuf((*png_ptr)))) | ||||||
|  |    { | ||||||
|  |       png_destroy_read_struct(png_ptr, info_ptr, png_infopp_NULL); | ||||||
|  |       return (ERROR); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    /* This one's new.  You will need to provide all three | ||||||
|  |     * function callbacks, even if you aren't using them all. | ||||||
|  |     * If you aren't using all functions, you can specify NULL | ||||||
|  |     * parameters.  Even when all three functions are NULL, | ||||||
|  |     * you need to call png_set_progressive_read_fn(). | ||||||
|  |     * These functions shouldn't be dependent on global or | ||||||
|  |     * static variables if you are decoding several images | ||||||
|  |     * simultaneously.  You should store stream specific data | ||||||
|  |     * in a separate struct, given as the second parameter, | ||||||
|  |     * and retrieve the pointer from inside the callbacks using | ||||||
|  |     * the function png_get_progressive_ptr(png_ptr). | ||||||
|  |     */ | ||||||
|  |    png_set_progressive_read_fn(*png_ptr, (void *)stream_data, | ||||||
|  |       info_callback, row_callback, end_callback); | ||||||
|  |  | ||||||
|  |    return (OK); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int | ||||||
|  | process_data(png_structp *png_ptr, png_infop *info_ptr, | ||||||
|  |    png_bytep buffer, png_uint_32 length) | ||||||
|  | { | ||||||
|  |    if (setjmp(png_jmpbuf((*png_ptr)))) | ||||||
|  |    { | ||||||
|  |       /* Free the png_ptr and info_ptr memory on error */ | ||||||
|  |       png_destroy_read_struct(png_ptr, info_ptr, png_infopp_NULL); | ||||||
|  |       return (ERROR); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    /* This one's new also.  Simply give it chunks of data as | ||||||
|  |     * they arrive from the data stream (in order, of course). | ||||||
|  |     * On Segmented machines, don't give it any more than 64K. | ||||||
|  |     * The library seems to run fine with sizes of 4K, although | ||||||
|  |     * you can give it much less if necessary (I assume you can | ||||||
|  |     * give it chunks of 1 byte, but I haven't tried with less | ||||||
|  |     * than 256 bytes yet).  When this function returns, you may | ||||||
|  |     * want to display any rows that were generated in the row | ||||||
|  |     * callback, if you aren't already displaying them there. | ||||||
|  |     */ | ||||||
|  |    png_process_data(*png_ptr, *info_ptr, buffer, length); | ||||||
|  |    return (OK); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | info_callback(png_structp png_ptr, png_infop info) | ||||||
|  | { | ||||||
|  | /* do any setup here, including setting any of the transformations | ||||||
|  |  * mentioned in the Reading PNG files section.  For now, you _must_ | ||||||
|  |  * call either png_start_read_image() or png_read_update_info() | ||||||
|  |  * after all the transformations are set (even if you don't set | ||||||
|  |  * any).  You may start getting rows before png_process_data() | ||||||
|  |  * returns, so this is your last chance to prepare for that. | ||||||
|  |  */ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | row_callback(png_structp png_ptr, png_bytep new_row, | ||||||
|  |    png_uint_32 row_num, int pass) | ||||||
|  | { | ||||||
|  | /* | ||||||
|  |  * This function is called for every row in the image.  If the | ||||||
|  |  * image is interlaced, and you turned on the interlace handler, | ||||||
|  |  * this function will be called for every row in every pass. | ||||||
|  |  * | ||||||
|  |  * In this function you will receive a pointer to new row data from | ||||||
|  |  * libpng called new_row that is to replace a corresponding row (of | ||||||
|  |  * the same data format) in a buffer allocated by your application. | ||||||
|  |  *  | ||||||
|  |  * The new row data pointer new_row may be NULL, indicating there is | ||||||
|  |  * no new data to be replaced (in cases of interlace loading). | ||||||
|  |  *  | ||||||
|  |  * If new_row is not NULL then you need to call | ||||||
|  |  * png_progressive_combine_row() to replace the corresponding row as | ||||||
|  |  * shown below: | ||||||
|  |  */ | ||||||
|  |    /* Check if row_num is in bounds. */ | ||||||
|  |    if((row_num >= 0) && (row_num < height)) | ||||||
|  |    { | ||||||
|  |      /* Get pointer to corresponding row in our | ||||||
|  |       * PNG read buffer. | ||||||
|  |       */ | ||||||
|  |      png_bytep old_row = ((png_bytep *)our_data)[row_num]; | ||||||
|  |  | ||||||
|  |      /* If both rows are allocated then copy the new row | ||||||
|  |       * data to the corresponding row data. | ||||||
|  |       */ | ||||||
|  |      if((old_row != NULL) && (new_row != NULL)) | ||||||
|  |      png_progressive_combine_row(png_ptr, old_row, new_row); | ||||||
|  |    } | ||||||
|  | /* | ||||||
|  |  * The rows and passes are called in order, so you don't really | ||||||
|  |  * need the row_num and pass, but I'm supplying them because it | ||||||
|  |  * may make your life easier. | ||||||
|  |  * | ||||||
|  |  * For the non-NULL rows of interlaced images, you must call | ||||||
|  |  * png_progressive_combine_row() passing in the new row and the | ||||||
|  |  * old row, as demonstrated above.  You can call this function for | ||||||
|  |  * NULL rows (it will just return) and for non-interlaced images | ||||||
|  |  * (it just does the png_memcpy for you) if it will make the code | ||||||
|  |  * easier.  Thus, you can just do this for all cases: | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  |    png_progressive_combine_row(png_ptr, old_row, new_row); | ||||||
|  |  | ||||||
|  | /* where old_row is what was displayed for previous rows.  Note | ||||||
|  |  * that the first pass (pass == 0 really) will completely cover | ||||||
|  |  * the old row, so the rows do not have to be initialized.  After | ||||||
|  |  * the first pass (and only for interlaced images), you will have | ||||||
|  |  * to pass the current row as new_row, and the function will combine | ||||||
|  |  * the old row and the new row. | ||||||
|  |  */ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | end_callback(png_structp png_ptr, png_infop info) | ||||||
|  | { | ||||||
|  | /* this function is called when the whole image has been read, | ||||||
|  |  * including any chunks after the image (up to and including | ||||||
|  |  * the IEND).  You will usually have the same info chunk as you | ||||||
|  |  * had in the header, although some data may have been added | ||||||
|  |  * to the comments and time fields. | ||||||
|  |  * | ||||||
|  |  * Most people won't do much here, perhaps setting a flag that | ||||||
|  |  * marks the image as finished. | ||||||
|  |  */ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* write a png file */ | ||||||
|  | void write_png(char *file_name /* , ... other image information ... */) | ||||||
|  | { | ||||||
|  |    FILE *fp; | ||||||
|  |    png_structp png_ptr; | ||||||
|  |    png_infop info_ptr; | ||||||
|  |    png_colorp palette; | ||||||
|  |  | ||||||
|  |    /* open the file */ | ||||||
|  |    fp = fopen(file_name, "wb"); | ||||||
|  |    if (fp == NULL) | ||||||
|  |       return (ERROR); | ||||||
|  |  | ||||||
|  |    /* Create and initialize the png_struct with the desired error handler | ||||||
|  |     * functions.  If you want to use the default stderr and longjump method, | ||||||
|  |     * you can supply NULL for the last three parameters.  We also check that | ||||||
|  |     * the library version is compatible with the one used at compile time, | ||||||
|  |     * in case we are using dynamically linked libraries.  REQUIRED. | ||||||
|  |     */ | ||||||
|  |    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, | ||||||
|  |       png_voidp user_error_ptr, user_error_fn, user_warning_fn); | ||||||
|  |  | ||||||
|  |    if (png_ptr == NULL) | ||||||
|  |    { | ||||||
|  |       fclose(fp); | ||||||
|  |       return (ERROR); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    /* Allocate/initialize the image information data.  REQUIRED */ | ||||||
|  |    info_ptr = png_create_info_struct(png_ptr); | ||||||
|  |    if (info_ptr == NULL) | ||||||
|  |    { | ||||||
|  |       fclose(fp); | ||||||
|  |       png_destroy_write_struct(&png_ptr,  png_infopp_NULL); | ||||||
|  |       return (ERROR); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    /* Set error handling.  REQUIRED if you aren't supplying your own | ||||||
|  |     * error handling functions in the png_create_write_struct() call. | ||||||
|  |     */ | ||||||
|  |    if (setjmp(png_jmpbuf(png_ptr))) | ||||||
|  |    { | ||||||
|  |       /* If we get here, we had a problem reading the file */ | ||||||
|  |       fclose(fp); | ||||||
|  |       png_destroy_write_struct(&png_ptr, &info_ptr); | ||||||
|  |       return (ERROR); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    /* One of the following I/O initialization functions is REQUIRED */ | ||||||
|  | #ifdef streams /* I/O initialization method 1 */ | ||||||
|  |    /* set up the output control if you are using standard C streams */ | ||||||
|  |    png_init_io(png_ptr, fp); | ||||||
|  | #else no_streams /* I/O initialization method 2 */ | ||||||
|  |    /* If you are using replacement read functions, instead of calling | ||||||
|  |     * png_init_io() here you would call */ | ||||||
|  |    png_set_write_fn(png_ptr, (void *)user_io_ptr, user_write_fn, | ||||||
|  |       user_IO_flush_function); | ||||||
|  |    /* where user_io_ptr is a structure you want available to the callbacks */ | ||||||
|  | #endif no_streams /* only use one initialization method */ | ||||||
|  |  | ||||||
|  | #ifdef hilevel | ||||||
|  |    /* This is the easy way.  Use it if you already have all the | ||||||
|  |     * image info living info in the structure.  You could "|" many | ||||||
|  |     * PNG_TRANSFORM flags into the png_transforms integer here. | ||||||
|  |     */ | ||||||
|  |    png_write_png(png_ptr, info_ptr, png_transforms, png_voidp_NULL); | ||||||
|  | #else | ||||||
|  |    /* This is the hard way */ | ||||||
|  |  | ||||||
|  |    /* Set the image information here.  Width and height are up to 2^31, | ||||||
|  |     * bit_depth is one of 1, 2, 4, 8, or 16, but valid values also depend on | ||||||
|  |     * the color_type selected. color_type is one of PNG_COLOR_TYPE_GRAY, | ||||||
|  |     * PNG_COLOR_TYPE_GRAY_ALPHA, PNG_COLOR_TYPE_PALETTE, PNG_COLOR_TYPE_RGB, | ||||||
|  |     * or PNG_COLOR_TYPE_RGB_ALPHA.  interlace is either PNG_INTERLACE_NONE or | ||||||
|  |     * PNG_INTERLACE_ADAM7, and the compression_type and filter_type MUST | ||||||
|  |     * currently be PNG_COMPRESSION_TYPE_BASE and PNG_FILTER_TYPE_BASE. REQUIRED | ||||||
|  |     */ | ||||||
|  |    png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, PNG_COLOR_TYPE_???, | ||||||
|  |       PNG_INTERLACE_????, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); | ||||||
|  |  | ||||||
|  |    /* set the palette if there is one.  REQUIRED for indexed-color images */ | ||||||
|  |    palette = (png_colorp)png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH | ||||||
|  |              * sizeof (png_color)); | ||||||
|  |    /* ... set palette colors ... */ | ||||||
|  |    png_set_PLTE(png_ptr, info_ptr, palette, PNG_MAX_PALETTE_LENGTH); | ||||||
|  |    /* You must not free palette here, because png_set_PLTE only makes a link to | ||||||
|  |       the palette that you malloced.  Wait until you are about to destroy | ||||||
|  |       the png structure. */ | ||||||
|  |  | ||||||
|  |    /* optional significant bit chunk */ | ||||||
|  |    /* if we are dealing with a grayscale image then */ | ||||||
|  |    sig_bit.gray = true_bit_depth; | ||||||
|  |    /* otherwise, if we are dealing with a color image then */ | ||||||
|  |    sig_bit.red = true_red_bit_depth; | ||||||
|  |    sig_bit.green = true_green_bit_depth; | ||||||
|  |    sig_bit.blue = true_blue_bit_depth; | ||||||
|  |    /* if the image has an alpha channel then */ | ||||||
|  |    sig_bit.alpha = true_alpha_bit_depth; | ||||||
|  |    png_set_sBIT(png_ptr, info_ptr, sig_bit); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |    /* Optional gamma chunk is strongly suggested if you have any guess | ||||||
|  |     * as to the correct gamma of the image. | ||||||
|  |     */ | ||||||
|  |    png_set_gAMA(png_ptr, info_ptr, gamma); | ||||||
|  |  | ||||||
|  |    /* Optionally write comments into the image */ | ||||||
|  |    text_ptr[0].key = "Title"; | ||||||
|  |    text_ptr[0].text = "Mona Lisa"; | ||||||
|  |    text_ptr[0].compression = PNG_TEXT_COMPRESSION_NONE; | ||||||
|  |    text_ptr[1].key = "Author"; | ||||||
|  |    text_ptr[1].text = "Leonardo DaVinci"; | ||||||
|  |    text_ptr[1].compression = PNG_TEXT_COMPRESSION_NONE; | ||||||
|  |    text_ptr[2].key = "Description"; | ||||||
|  |    text_ptr[2].text = "<long text>"; | ||||||
|  |    text_ptr[2].compression = PNG_TEXT_COMPRESSION_zTXt; | ||||||
|  | #ifdef PNG_iTXt_SUPPORTED | ||||||
|  |    text_ptr[0].lang = NULL; | ||||||
|  |    text_ptr[1].lang = NULL; | ||||||
|  |    text_ptr[2].lang = NULL; | ||||||
|  | #endif | ||||||
|  |    png_set_text(png_ptr, info_ptr, text_ptr, 3); | ||||||
|  |  | ||||||
|  |    /* other optional chunks like cHRM, bKGD, tRNS, tIME, oFFs, pHYs, */ | ||||||
|  |    /* note that if sRGB is present the gAMA and cHRM chunks must be ignored | ||||||
|  |     * on read and must be written in accordance with the sRGB profile */ | ||||||
|  |  | ||||||
|  |    /* Write the file header information.  REQUIRED */ | ||||||
|  |    png_write_info(png_ptr, info_ptr); | ||||||
|  |  | ||||||
|  |    /* If you want, you can write the info in two steps, in case you need to | ||||||
|  |     * write your private chunk ahead of PLTE: | ||||||
|  |     * | ||||||
|  |     *   png_write_info_before_PLTE(write_ptr, write_info_ptr); | ||||||
|  |     *   write_my_chunk(); | ||||||
|  |     *   png_write_info(png_ptr, info_ptr); | ||||||
|  |     * | ||||||
|  |     * However, given the level of known- and unknown-chunk support in 1.1.0 | ||||||
|  |     * and up, this should no longer be necessary. | ||||||
|  |     */ | ||||||
|  |  | ||||||
|  |    /* Once we write out the header, the compression type on the text | ||||||
|  |     * chunks gets changed to PNG_TEXT_COMPRESSION_NONE_WR or | ||||||
|  |     * PNG_TEXT_COMPRESSION_zTXt_WR, so it doesn't get written out again | ||||||
|  |     * at the end. | ||||||
|  |     */ | ||||||
|  |  | ||||||
|  |    /* set up the transformations you want.  Note that these are | ||||||
|  |     * all optional.  Only call them if you want them. | ||||||
|  |     */ | ||||||
|  |  | ||||||
|  |    /* invert monochrome pixels */ | ||||||
|  |    png_set_invert_mono(png_ptr); | ||||||
|  |  | ||||||
|  |    /* Shift the pixels up to a legal bit depth and fill in | ||||||
|  |     * as appropriate to correctly scale the image. | ||||||
|  |     */ | ||||||
|  |    png_set_shift(png_ptr, &sig_bit); | ||||||
|  |  | ||||||
|  |    /* pack pixels into bytes */ | ||||||
|  |    png_set_packing(png_ptr); | ||||||
|  |  | ||||||
|  |    /* swap location of alpha bytes from ARGB to RGBA */ | ||||||
|  |    png_set_swap_alpha(png_ptr); | ||||||
|  |  | ||||||
|  |    /* Get rid of filler (OR ALPHA) bytes, pack XRGB/RGBX/ARGB/RGBA into | ||||||
|  |     * RGB (4 channels -> 3 channels). The second parameter is not used. | ||||||
|  |     */ | ||||||
|  |    png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); | ||||||
|  |  | ||||||
|  |    /* flip BGR pixels to RGB */ | ||||||
|  |    png_set_bgr(png_ptr); | ||||||
|  |  | ||||||
|  |    /* swap bytes of 16-bit files to most significant byte first */ | ||||||
|  |    png_set_swap(png_ptr); | ||||||
|  |  | ||||||
|  |    /* swap bits of 1, 2, 4 bit packed pixel formats */ | ||||||
|  |    png_set_packswap(png_ptr); | ||||||
|  |  | ||||||
|  |    /* turn on interlace handling if you are not using png_write_image() */ | ||||||
|  |    if (interlacing) | ||||||
|  |       number_passes = png_set_interlace_handling(png_ptr); | ||||||
|  |    else | ||||||
|  |       number_passes = 1; | ||||||
|  |  | ||||||
|  |    /* The easiest way to write the image (you may have a different memory | ||||||
|  |     * layout, however, so choose what fits your needs best).  You need to | ||||||
|  |     * use the first method if you aren't handling interlacing yourself. | ||||||
|  |     */ | ||||||
|  |    png_uint_32 k, height, width; | ||||||
|  |    png_byte image[height][width*bytes_per_pixel]; | ||||||
|  |    png_bytep row_pointers[height]; | ||||||
|  |    for (k = 0; k < height; k++) | ||||||
|  |      row_pointers[k] = image + k*width*bytes_per_pixel; | ||||||
|  |  | ||||||
|  |    /* One of the following output methods is REQUIRED */ | ||||||
|  | #ifdef entire /* write out the entire image data in one call */ | ||||||
|  |    png_write_image(png_ptr, row_pointers); | ||||||
|  |  | ||||||
|  |    /* the other way to write the image - deal with interlacing */ | ||||||
|  |  | ||||||
|  | #else no_entire /* write out the image data by one or more scanlines */ | ||||||
|  |    /* The number of passes is either 1 for non-interlaced images, | ||||||
|  |     * or 7 for interlaced images. | ||||||
|  |     */ | ||||||
|  |    for (pass = 0; pass < number_passes; pass++) | ||||||
|  |    { | ||||||
|  |       /* Write a few rows at a time. */ | ||||||
|  |       png_write_rows(png_ptr, &row_pointers[first_row], number_of_rows); | ||||||
|  |  | ||||||
|  |       /* If you are only writing one row at a time, this works */ | ||||||
|  |       for (y = 0; y < height; y++) | ||||||
|  |       { | ||||||
|  |          png_write_rows(png_ptr, &row_pointers[y], 1); | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | #endif no_entire /* use only one output method */ | ||||||
|  |  | ||||||
|  |    /* You can write optional chunks like tEXt, zTXt, and tIME at the end | ||||||
|  |     * as well.  Shouldn't be necessary in 1.1.0 and up as all the public | ||||||
|  |     * chunks are supported and you can use png_set_unknown_chunks() to | ||||||
|  |     * register unknown chunks into the info structure to be written out. | ||||||
|  |     */ | ||||||
|  |  | ||||||
|  |    /* It is REQUIRED to call this to finish writing the rest of the file */ | ||||||
|  |    png_write_end(png_ptr, info_ptr); | ||||||
|  | #endif hilevel | ||||||
|  |  | ||||||
|  |    /* If you png_malloced a palette, free it here (don't free info_ptr->palette, | ||||||
|  |       as recommended in versions 1.0.5m and earlier of this example; if | ||||||
|  |       libpng mallocs info_ptr->palette, libpng will free it).  If you | ||||||
|  |       allocated it with malloc() instead of png_malloc(), use free() instead | ||||||
|  |       of png_free(). */ | ||||||
|  |    png_free(png_ptr, palette); | ||||||
|  |    palette=NULL; | ||||||
|  |  | ||||||
|  |    /* Similarly, if you png_malloced any data that you passed in with | ||||||
|  |       png_set_something(), such as a hist or trans array, free it here, | ||||||
|  |       when you can be sure that libpng is through with it. */ | ||||||
|  |    png_free(png_ptr, trans); | ||||||
|  |    trans=NULL; | ||||||
|  |  | ||||||
|  |    /* clean up after the write, and free any memory allocated */ | ||||||
|  |    png_destroy_write_struct(&png_ptr, &info_ptr); | ||||||
|  |  | ||||||
|  |    /* close the file */ | ||||||
|  |    fclose(fp); | ||||||
|  |  | ||||||
|  |    /* that's it */ | ||||||
|  |    return (OK); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif /* if 0 */ | ||||||
							
								
								
									
										3958
									
								
								runtime/libpng/libpng.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										2905
									
								
								runtime/libpng/libpng.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										552
									
								
								runtime/libpng/libpngpf.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,552 @@ | |||||||
|  | .TH LIBPNGPF 3 "October 3, 2002" | ||||||
|  | .SH NAME | ||||||
|  | libpng \- Portable Network Graphics (PNG) Reference Library 1.2.5 | ||||||
|  | (private functions) | ||||||
|  | .SH SYNOPSIS | ||||||
|  | \fB#include <png.h>\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_build_gamma_table (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_build_grayscale_palette (int \fP\fIbit_depth\fP\fB, png_colorp \fIpalette\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_calculate_crc (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIptr\fP\fB, png_size_t \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_check_chunk_name (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIchunk_name\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBpng_size_t png_check_keyword (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIkey\fP\fB, png_charpp \fInew_key\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_combine_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIrow\fP\fB, int \fImask\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_correct_palette (png_structp \fP\fIpng_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, int \fInum_palette\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBint png_crc_error (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBint png_crc_finish (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIskip\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_crc_read (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIbuf\fP\fB, png_size_t \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBpng_voidp png_create_struct (int \fItype\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBpng_voidp png_create_struct_2 (int \fP\fItype\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_voidp \fImem_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBpng_charp png_decompress_chunk (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIcomp_type\fP\fB, png_charp \fP\fIchunkdata\fP\fB, png_size_t \fP\fIchunklength\fP\fB, png_size_t \fP\fIprefix_length\fP\fB, png_size_t \fI*data_length\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_destroy_struct (png_voidp \fIstruct_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_destroy_struct_2 (png_voidp \fP\fIstruct_ptr\fP\fB, png_free_ptr \fP\fIfree_fn\fP\fB, png_voidp \fImem_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_background (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_color_16p \fP\fItrans_values\fP\fB, png_color_16p \fP\fIbackground\fP\fB, png_color_16p \fP\fIbackground_1\fP\fB, png_bytep \fP\fIgamma_table\fP\fB, png_bytep \fP\fIgamma_from_1\fP\fB, png_bytep \fP\fIgamma_to_1\fP\fB, png_uint_16pp \fP\fIgamma_16\fP\fB, png_uint_16pp \fP\fIgamma_16_from_1\fP\fB, png_uint_16pp \fP\fIgamma_16_to_1\fP\fB, int \fIgamma_shift\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_bgr (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_chop (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_dither (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_bytep \fP\fIpalette_lookup\fP\fB, png_bytep \fIdither_lookup\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_expand (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_color_16p \fItrans_value\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_expand_palette (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_colorp \fP\fIpalette\fP\fB, png_bytep \fP\fItrans\fP\fB, int \fInum_trans\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_gamma (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_bytep \fP\fIgamma_table\fP\fB, png_uint_16pp \fP\fIgamma_16_table\fP\fB, int \fIgamma_shift\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_gray_to_rgb (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_invert (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_pack (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_uint_32 \fIbit_depth\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_packswap (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_read_filler (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_uint_32 \fP\fIfiller\fP\fB, png_uint_32 \fIflags\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_read_interlace (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, int \fP\fIpass\fP\fB, png_uint_32 \fItransformations\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_read_invert_alpha (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_read_swap_alpha (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_read_transformations (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBint png_do_rgb_to_gray (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_shift (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_color_8p \fIbit_depth\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_strip_filler (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_uint_32 \fIflags\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_swap (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_unpack (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_unshift (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_color_8p \fIsig_bits\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_write_interlace (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, int \fIpass\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_write_invert_alpha (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_write_swap_alpha (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_do_write_transformations (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid *png_far_to_near (png_structp png_ptr,png_voidp \fP\fIptr\fP\fB, int \fIcheck\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_flush (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBpng_int_32 png_get_int_32 (png_bytep \fIbuf\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBpng_uint_16 png_get_uint_16 (png_bytep \fIbuf\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBpng_uint_32 png_get_uint_32 (png_bytep \fIbuf\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_bKGD (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_gAMA (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_hIST (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_IEND (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_iCCP (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_iTXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_oFFs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_pCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_pHYs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_sBIT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_sCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_sPLT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_sRGB (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_tEXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_tIME (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_tRNS (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_unknown (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_handle_zTXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_info_destroy (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_init_mmx_flags (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_init_read_transformations (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_process_IDAT_data (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIbuffer\fP\fB, png_size_t \fIbuffer_length\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_process_some_data (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_check_crc (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_crc_finish (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_crc_skip (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_fill_buffer (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIbuffer\fP\fB, png_size_t \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_handle_tEXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_handle_unknown (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_handle_zTXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_have_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_have_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_have_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIrow\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_process_row (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_read_chunk (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_read_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_read_IDAT (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_read_sig (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_read_tEXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_read_zTXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_restore_buffer (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIbuffer\fP\fB, png_size_t \fIbuffer_length\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_push_save_buffer (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_read_data (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_read_filter_row (png_structp \fP\fIpng_ptr\fP\fB, png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_bytep \fP\fIprev_row\fP\fB, int \fIfilter\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_read_finish_row (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_read_push_finish_row (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_read_start_row (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_read_transform_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_reset_crc (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_save_int_32 (png_bytep \fP\fIbuf\fP\fB, png_int_32 \fIi\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_save_uint_16 (png_bytep \fP\fIbuf\fP\fB, unsigned int \fIi\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_save_uint_32 (png_bytep \fP\fIbuf\fP\fB, png_uint_32 \fIi\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBint png_set_text_2 (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_textp \fP\fItext_ptr\fP\fB, int \fInum_text)\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_cHRM (png_structp \fP\fIpng_ptr\fP\fB, double \fP\fIwhite_x\fP\fB, double \fP\fIwhite_y\fP\fB, double \fP\fIred_x\fP\fB, double \fP\fIred_y\fP\fB, double \fP\fIgreen_x\fP\fB, double \fP\fIgreen_y\fP\fB, double \fP\fIblue_x\fP\fB, double \fIblue_y\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_cHRM_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIwhite_x\fP\fB, png_uint_32 \fP\fIwhite_y\fP\fB, png_uint_32 \fP\fIred_x\fP\fB, png_uint_32 \fP\fIred_y\fP\fB, png_uint_32 \fP\fIgreen_x\fP\fB, png_uint_32 \fP\fIgreen_y\fP\fB, png_uint_32 \fP\fIblue_x\fP\fB, png_uint_32 \fIblue_y\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_data (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_filtered_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIfiltered_row\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_find_filter (png_structp \fP\fIpng_ptr\fP\fB, png_row_infop \fIrow_info\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_finish_row (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_gAMA (png_structp \fP\fIpng_ptr\fP\fB, double \fIfile_gamma\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_gAMA_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIint_file_gamma\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_hIST (png_structp \fP\fIpng_ptr\fP\fB, png_uint_16p \fP\fIhist\fP\fB, int \fInum_hist\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_iCCP (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIname\fP\fB, int \fP\fIcompression_type\fP\fB, png_charp \fP\fIprofile\fP\fB, int \fIproflen\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_IDAT (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_IEND (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIwidth\fP\fB, png_uint_32 \fP\fIheight\fP\fB, int \fP\fIbit_depth\fP\fB, int \fP\fIcolor_type\fP\fB, int \fP\fIcompression_type\fP\fB, int \fP\fIfilter_type\fP\fB, int \fIinterlace_type\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_iTXt (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIcompression\fP\fB, png_charp \fP\fIkey\fP\fB, png_charp \fP\fIlang\fP\fB, png_charp \fP\fItranslated_key\fP\fB, png_charp \fItext)\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_oFFs (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIx_offset\fP\fB, png_uint_32 \fP\fIy_offset\fP\fB, int \fIunit_type\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_pCAL (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIpurpose\fP\fB, png_int_32 \fP\fIX0\fP\fB, png_int_32 \fP\fIX1\fP\fB, int \fP\fItype\fP\fB, int \fP\fInparams\fP\fB, png_charp \fP\fIunits\fP\fB, png_charpp \fIparams\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_pHYs (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIx_pixels_per_unit\fP\fB, png_uint_32 \fP\fIy_pixels_per_unit\fP\fB, int \fIunit_type\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, png_uint_32 \fInum_pal\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_sBIT (png_structp \fP\fIpng_ptr\fP\fB, png_color_8p \fP\fIsbit\fP\fB, int \fIcolor_type\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_sCAL (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIunit\fP\fB, double \fP\fIwidth\fP\fB, double \fIheight\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_sCAL_s (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIunit\fP\fB, png_charp \fP\fIwidth\fP\fB, png_charp \fIheight\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_sig (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_sRGB (png_structp \fP\fIpng_ptr\fP\fB, int \fIintent\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_sPLT (png_structp \fP\fIpng_ptr\fP\fB, png_spalette_p \fIpalette\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_start_row (png_structp \fIpng_ptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_tEXt (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIkey\fP\fB, png_charp \fP\fItext\fP\fB, png_size_t \fItext_len\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_tIME (png_structp \fP\fIpng_ptr\fP\fB, png_timep \fImod_time\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_tRNS (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fItrans\fP\fB, png_color_16p \fP\fIvalues\fP\fB, int \fP\fInumber\fP\fB, int \fIcolor_type\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_write_zTXt (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIkey\fP\fB, png_charp \fP\fItext\fP\fB, png_size_t \fP\fItext_len\fP\fB, int \fIcompression\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoidpf png_zalloc (voidpf \fP\fIpng_ptr\fP\fB, uInt \fP\fIitems\fP\fB, uInt \fIsize\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | \fBvoid png_zfree (voidpf \fP\fIpng_ptr\fP\fB, voidpf \fIptr\fP\fB);\fP | ||||||
|  |  | ||||||
|  | \fI\fB | ||||||
|  |  | ||||||
|  | .SH DESCRIPTION | ||||||
|  | The functions listed above are used privately by libpng | ||||||
|  | and are not recommended for use by applications.  They are | ||||||
|  | not "exported" to applications using shared libraries.  They | ||||||
|  | are listed alphabetically here as an aid to libpng maintainers. | ||||||
|  | See png.h for more information on these functions. | ||||||
|  |  | ||||||
|  | .SH SEE ALSO | ||||||
|  | libpng(3), png(5) | ||||||
|  | .SH AUTHOR | ||||||
|  | Glenn Randers-Pehrson | ||||||
							
								
								
									
										60
									
								
								runtime/libpng/png.5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,60 @@ | |||||||
|  | .TH PNG 5 "October 3, 2002" | ||||||
|  | .SH NAME | ||||||
|  | png \- Portable Network Graphics (PNG) format | ||||||
|  | .SH DESCRIPTION | ||||||
|  | PNG (Portable Network Graphics) is an extensible file format for the | ||||||
|  | lossless, portable, well-compressed storage of raster images. PNG provides | ||||||
|  | a patent-free replacement for GIF and can also replace many | ||||||
|  | common uses of TIFF. Indexed-color, grayscale, and truecolor images are | ||||||
|  | supported, plus an optional alpha channel. Sample depths range from | ||||||
|  | 1 to 16 bits. | ||||||
|  | .br | ||||||
|  |  | ||||||
|  | PNG is designed to work well in online viewing applications, such as the | ||||||
|  | World Wide Web, so it is fully streamable with a progressive display | ||||||
|  | option. PNG is robust, providing both full file integrity checking and | ||||||
|  | fast, simple detection of common transmission errors. Also, PNG can store | ||||||
|  | gamma and chromaticity data for improved color matching on heterogeneous | ||||||
|  | platforms. | ||||||
|  |  | ||||||
|  | .SH "SEE ALSO" | ||||||
|  | .IR libpng(3), zlib(3), deflate(5), and zlib(5) | ||||||
|  | .LP | ||||||
|  | PNG 1.2 specification, July 1999: | ||||||
|  | .IP | ||||||
|  | .br | ||||||
|  | http://www.libpng.org/pub/png | ||||||
|  | .br | ||||||
|  | or ftp://ftp.uu.net/graphics/png/documents | ||||||
|  | .LP | ||||||
|  | PNG 1.0 specification, October 1996: | ||||||
|  | .IP | ||||||
|  | .br | ||||||
|  | RFC 2083 | ||||||
|  | .IP | ||||||
|  | .br | ||||||
|  | ftp://ds.internic.net/rfc/rfc2083.txt | ||||||
|  | .br | ||||||
|  | or (as a W3C Recommendation) at | ||||||
|  | .br | ||||||
|  | http://www.w3.org/TR/REC-png.html | ||||||
|  | .SH AUTHORS | ||||||
|  | This man page: Glenn Randers-Pehrson | ||||||
|  | .LP | ||||||
|  | Portable Network Graphics (PNG) Specification Version 1.2 (July 8, 1999): | ||||||
|  | Glenn Randers-Pehrson and others (png-list@ccrc.wustl.edu). | ||||||
|  | .LP | ||||||
|  | Portable Network Graphics (PNG) Specification Version 1.0 (October 1, 1996): | ||||||
|  | Thomas Boutell and others (png-list@ccrc.wustl.edu). | ||||||
|  | .LP | ||||||
|  |  | ||||||
|  |  | ||||||
|  | .SH COPYRIGHT NOTICE | ||||||
|  | The PNG-1.2 specification is copyright (c) 1999 Glenn Randers-Pehrson. | ||||||
|  | See the specification for conditions of use and distribution. | ||||||
|  | .LP | ||||||
|  | The PNG-1.0 specification is copyright (c) 1996 Massachusetts Institute of | ||||||
|  | Technology.  See the specification for conditions of use and distribution. | ||||||
|  | .LP | ||||||
|  | .\" end of man page | ||||||
|  |  | ||||||
							
								
								
									
										805
									
								
								runtime/libpng/png.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,805 @@ | |||||||
|  |  | ||||||
|  | /* png.c - location for general purpose libpng functions | ||||||
|  |  * | ||||||
|  |  * libpng version 1.2.5 - October 3, 2002 | ||||||
|  |  * Copyright (c) 1998-2002 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.) | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define PNG_INTERNAL | ||||||
|  | #define PNG_NO_EXTERN | ||||||
|  | #include "png.h" | ||||||
|  |  | ||||||
|  | /* Generate a compiler error if there is an old png.h in the search path. */ | ||||||
|  | typedef version_1_2_5 Your_png_h_is_not_version_1_2_5; | ||||||
|  |  | ||||||
|  | /* 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 */ | ||||||
|  | const char png_libpng_ver[18] = "1.2.5"; | ||||||
|  |  | ||||||
|  | /* png_sig was changed to a function in version 1.0.5c */ | ||||||
|  | /* Place to hold the signature string for a PNG file. */ | ||||||
|  | const png_byte FARDATA png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10}; | ||||||
|  |  | ||||||
|  | /* Invoke global declarations for constant strings for known chunk types */ | ||||||
|  | PNG_IHDR; | ||||||
|  | PNG_IDAT; | ||||||
|  | PNG_IEND; | ||||||
|  | PNG_PLTE; | ||||||
|  | PNG_bKGD; | ||||||
|  | PNG_cHRM; | ||||||
|  | PNG_gAMA; | ||||||
|  | PNG_hIST; | ||||||
|  | PNG_iCCP; | ||||||
|  | PNG_iTXt; | ||||||
|  | PNG_oFFs; | ||||||
|  | PNG_pCAL; | ||||||
|  | PNG_sCAL; | ||||||
|  | PNG_pHYs; | ||||||
|  | PNG_sBIT; | ||||||
|  | PNG_sPLT; | ||||||
|  | PNG_sRGB; | ||||||
|  | PNG_tEXt; | ||||||
|  | PNG_tIME; | ||||||
|  | PNG_tRNS; | ||||||
|  | PNG_zTXt; | ||||||
|  |  | ||||||
|  | /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ | ||||||
|  |  | ||||||
|  | /* start of interlace block */ | ||||||
|  | const int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; | ||||||
|  |  | ||||||
|  | /* offset to next interlace block */ | ||||||
|  | const int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; | ||||||
|  |  | ||||||
|  | /* start of interlace block in the y direction */ | ||||||
|  | const int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; | ||||||
|  |  | ||||||
|  | /* offset to next interlace block in the y direction */ | ||||||
|  | const int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; | ||||||
|  |  | ||||||
|  | /* width of interlace block (used in assembler routines only) */ | ||||||
|  | #ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW | ||||||
|  | const int FARDATA png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* Height of interlace block.  This is not currently used - if you need | ||||||
|  |  * it, uncomment it here and in png.h | ||||||
|  | const int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | /* Mask to determine which pixels are valid in a pass */ | ||||||
|  | const int FARDATA png_pass_mask[] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}; | ||||||
|  |  | ||||||
|  | /* Mask to determine which pixels to overwrite while displaying */ | ||||||
|  | const int FARDATA png_pass_dsp_mask[] | ||||||
|  |    = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* Tells libpng that we have already handled the first "num_bytes" bytes | ||||||
|  |  * of the PNG file signature.  If the PNG data is embedded into another | ||||||
|  |  * stream we can set num_bytes = 8 so that libpng will not attempt to read | ||||||
|  |  * or write any of the magic bytes before it starts on the IHDR. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | void PNGAPI | ||||||
|  | png_set_sig_bytes(png_structp png_ptr, int num_bytes) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_set_sig_bytes\n"); | ||||||
|  |    if (num_bytes > 8) | ||||||
|  |       png_error(png_ptr, "Too many bytes for PNG signature."); | ||||||
|  |  | ||||||
|  |    png_ptr->sig_bytes = (png_byte)(num_bytes < 0 ? 0 : num_bytes); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Checks whether the supplied bytes match the PNG signature.  We allow | ||||||
|  |  * checking less than the full 8-byte signature so that those apps that | ||||||
|  |  * already read the first few bytes of a file to determine the file type | ||||||
|  |  * can simply check the remaining bytes for extra assurance.  Returns | ||||||
|  |  * an integer less than, equal to, or greater than zero if sig is found, | ||||||
|  |  * respectively, to be less than, to match, or be greater than the correct | ||||||
|  |  * PNG signature (this is the same behaviour as strcmp, memcmp, etc). | ||||||
|  |  */ | ||||||
|  | int PNGAPI | ||||||
|  | png_sig_cmp(png_bytep sig, png_size_t start, png_size_t num_to_check) | ||||||
|  | { | ||||||
|  |    png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; | ||||||
|  |    if (num_to_check > 8) | ||||||
|  |       num_to_check = 8; | ||||||
|  |    else if (num_to_check < 1) | ||||||
|  |       return (0); | ||||||
|  |  | ||||||
|  |    if (start > 7) | ||||||
|  |       return (0); | ||||||
|  |  | ||||||
|  |    if (start + num_to_check > 8) | ||||||
|  |       num_to_check = 8 - start; | ||||||
|  |  | ||||||
|  |    return ((int)(png_memcmp(&sig[start], &png_signature[start], num_to_check))); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* (Obsolete) function to check signature bytes.  It does not allow one | ||||||
|  |  * to check a partial signature.  This function might be removed in the | ||||||
|  |  * future - use png_sig_cmp().  Returns true (nonzero) if the file is a PNG. | ||||||
|  |  */ | ||||||
|  | int PNGAPI | ||||||
|  | png_check_sig(png_bytep sig, int num) | ||||||
|  | { | ||||||
|  |   return ((int)!png_sig_cmp(sig, (png_size_t)0, (png_size_t)num)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Function to allocate memory for zlib and clear it to 0. */ | ||||||
|  | #ifdef PNG_1_0_X | ||||||
|  | voidpf PNGAPI | ||||||
|  | #else | ||||||
|  | voidpf /* private */ | ||||||
|  | #endif | ||||||
|  | png_zalloc(voidpf png_ptr, uInt items, uInt size) | ||||||
|  | { | ||||||
|  |    png_uint_32 num_bytes = (png_uint_32)items * size; | ||||||
|  |    png_voidp ptr; | ||||||
|  |    png_structp p=png_ptr; | ||||||
|  |    png_uint_32 save_flags=p->flags; | ||||||
|  |  | ||||||
|  |    p->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; | ||||||
|  |    ptr = (png_voidp)png_malloc((png_structp)png_ptr, num_bytes); | ||||||
|  |    p->flags=save_flags; | ||||||
|  |  | ||||||
|  | #ifndef PNG_NO_ZALLOC_ZERO | ||||||
|  |    if (ptr == NULL) | ||||||
|  |        return ((voidpf)ptr); | ||||||
|  |  | ||||||
|  |    if (num_bytes > (png_uint_32)0x8000L) | ||||||
|  |    { | ||||||
|  |       png_memset(ptr, 0, (png_size_t)0x8000L); | ||||||
|  |       png_memset((png_bytep)ptr + (png_size_t)0x8000L, 0, | ||||||
|  |          (png_size_t)(num_bytes - (png_uint_32)0x8000L)); | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       png_memset(ptr, 0, (png_size_t)num_bytes); | ||||||
|  |    } | ||||||
|  | #endif | ||||||
|  |    return ((voidpf)ptr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* function to free memory for zlib */ | ||||||
|  | #ifdef PNG_1_0_X | ||||||
|  | void PNGAPI | ||||||
|  | #else | ||||||
|  | void /* private */ | ||||||
|  | #endif | ||||||
|  | png_zfree(voidpf png_ptr, voidpf ptr) | ||||||
|  | { | ||||||
|  |    png_free((png_structp)png_ptr, (png_voidp)ptr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Reset the CRC variable to 32 bits of 1's.  Care must be taken | ||||||
|  |  * in case CRC is > 32 bits to leave the top bits 0. | ||||||
|  |  */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_reset_crc(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    png_ptr->crc = crc32(0, Z_NULL, 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Calculate the CRC over a section of data.  We can only pass as | ||||||
|  |  * much data to this routine as the largest single buffer size.  We | ||||||
|  |  * also check that this data will actually be used before going to the | ||||||
|  |  * trouble of calculating it. | ||||||
|  |  */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_calculate_crc(png_structp png_ptr, png_bytep ptr, png_size_t length) | ||||||
|  | { | ||||||
|  |    int need_crc = 1; | ||||||
|  |  | ||||||
|  |    if (png_ptr->chunk_name[0] & 0x20)                     /* ancillary */ | ||||||
|  |    { | ||||||
|  |       if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) == | ||||||
|  |           (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) | ||||||
|  |          need_crc = 0; | ||||||
|  |    } | ||||||
|  |    else                                                    /* critical */ | ||||||
|  |    { | ||||||
|  |       if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) | ||||||
|  |          need_crc = 0; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    if (need_crc) | ||||||
|  |       png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Allocate the memory for an info_struct for the application.  We don't | ||||||
|  |  * really need the png_ptr, but it could potentially be useful in the | ||||||
|  |  * future.  This should be used in favour of malloc(sizeof(png_info)) | ||||||
|  |  * and png_info_init() so that applications that want to use a shared | ||||||
|  |  * libpng don't have to be recompiled if png_info changes size. | ||||||
|  |  */ | ||||||
|  | png_infop PNGAPI | ||||||
|  | png_create_info_struct(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    png_infop info_ptr; | ||||||
|  |  | ||||||
|  |    png_debug(1, "in png_create_info_struct\n"); | ||||||
|  |    if(png_ptr == NULL) return (NULL); | ||||||
|  | #ifdef PNG_USER_MEM_SUPPORTED | ||||||
|  |    info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO, | ||||||
|  |       png_ptr->malloc_fn, png_ptr->mem_ptr); | ||||||
|  | #else | ||||||
|  |    info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); | ||||||
|  | #endif | ||||||
|  |    if (info_ptr != NULL) | ||||||
|  |       png_info_init_3(&info_ptr, sizeof(png_info)); | ||||||
|  |  | ||||||
|  |    return (info_ptr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* This function frees the memory associated with a single info struct. | ||||||
|  |  * Normally, one would use either png_destroy_read_struct() or | ||||||
|  |  * png_destroy_write_struct() to free an info struct, but this may be | ||||||
|  |  * useful for some applications. | ||||||
|  |  */ | ||||||
|  | void PNGAPI | ||||||
|  | png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr) | ||||||
|  | { | ||||||
|  |    png_infop info_ptr = NULL; | ||||||
|  |  | ||||||
|  |    png_debug(1, "in png_destroy_info_struct\n"); | ||||||
|  |    if (info_ptr_ptr != NULL) | ||||||
|  |       info_ptr = *info_ptr_ptr; | ||||||
|  |  | ||||||
|  |    if (info_ptr != NULL) | ||||||
|  |    { | ||||||
|  |       png_info_destroy(png_ptr, info_ptr); | ||||||
|  |  | ||||||
|  | #ifdef PNG_USER_MEM_SUPPORTED | ||||||
|  |       png_destroy_struct_2((png_voidp)info_ptr, png_ptr->free_fn, | ||||||
|  |           png_ptr->mem_ptr); | ||||||
|  | #else | ||||||
|  |       png_destroy_struct((png_voidp)info_ptr); | ||||||
|  | #endif | ||||||
|  |       *info_ptr_ptr = NULL; | ||||||
|  |    } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Initialize the info structure.  This is now an internal function (0.89) | ||||||
|  |  * and applications using it are urged to use png_create_info_struct() | ||||||
|  |  * instead. | ||||||
|  |  */ | ||||||
|  | #undef png_info_init | ||||||
|  | void PNGAPI | ||||||
|  | png_info_init(png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    /* We only come here via pre-1.0.12-compiled applications */ | ||||||
|  |    png_info_init_3(&info_ptr, 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void PNGAPI | ||||||
|  | png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size) | ||||||
|  | { | ||||||
|  |    png_infop info_ptr = *ptr_ptr; | ||||||
|  |  | ||||||
|  |    png_debug(1, "in png_info_init_3\n"); | ||||||
|  |  | ||||||
|  |    if(sizeof(png_info) > png_info_struct_size) | ||||||
|  |      { | ||||||
|  |        png_destroy_struct(info_ptr); | ||||||
|  |        info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); | ||||||
|  |        *ptr_ptr = info_ptr; | ||||||
|  |      } | ||||||
|  |  | ||||||
|  |    /* set everything to 0 */ | ||||||
|  |    png_memset(info_ptr, 0, sizeof (png_info)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #ifdef PNG_FREE_ME_SUPPORTED | ||||||
|  | void PNGAPI | ||||||
|  | png_data_freer(png_structp png_ptr, png_infop info_ptr, | ||||||
|  |    int freer, png_uint_32 mask) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_data_freer\n"); | ||||||
|  |    if (png_ptr == NULL || info_ptr == NULL) | ||||||
|  |       return; | ||||||
|  |    if(freer == PNG_DESTROY_WILL_FREE_DATA) | ||||||
|  |       info_ptr->free_me |= mask; | ||||||
|  |    else if(freer == PNG_USER_WILL_FREE_DATA) | ||||||
|  |       info_ptr->free_me &= ~mask; | ||||||
|  |    else | ||||||
|  |       png_warning(png_ptr, | ||||||
|  |          "Unknown freer parameter in png_data_freer."); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | void PNGAPI | ||||||
|  | png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, | ||||||
|  |    int num) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_free_data\n"); | ||||||
|  |    if (png_ptr == NULL || info_ptr == NULL) | ||||||
|  |       return; | ||||||
|  |  | ||||||
|  | #if defined(PNG_TEXT_SUPPORTED) | ||||||
|  | /* free text item num or (if num == -1) all text items */ | ||||||
|  | #ifdef PNG_FREE_ME_SUPPORTED | ||||||
|  | if ((mask & PNG_FREE_TEXT) & info_ptr->free_me) | ||||||
|  | #else | ||||||
|  | if (mask & PNG_FREE_TEXT) | ||||||
|  | #endif | ||||||
|  | { | ||||||
|  |    if (num != -1) | ||||||
|  |    { | ||||||
|  |      if (info_ptr->text && info_ptr->text[num].key) | ||||||
|  |      { | ||||||
|  |          png_free(png_ptr, info_ptr->text[num].key); | ||||||
|  |          info_ptr->text[num].key = NULL; | ||||||
|  |      } | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |        int i; | ||||||
|  |        for (i = 0; i < info_ptr->num_text; i++) | ||||||
|  |            png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i); | ||||||
|  |        png_free(png_ptr, info_ptr->text); | ||||||
|  |        info_ptr->text = NULL; | ||||||
|  |        info_ptr->num_text=0; | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_tRNS_SUPPORTED) | ||||||
|  | /* free any tRNS entry */ | ||||||
|  | #ifdef PNG_FREE_ME_SUPPORTED | ||||||
|  | if ((mask & PNG_FREE_TRNS) & info_ptr->free_me) | ||||||
|  | #else | ||||||
|  | if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS)) | ||||||
|  | #endif | ||||||
|  | { | ||||||
|  |     png_free(png_ptr, info_ptr->trans); | ||||||
|  |     info_ptr->valid &= ~PNG_INFO_tRNS; | ||||||
|  | #ifndef PNG_FREE_ME_SUPPORTED | ||||||
|  |     png_ptr->flags &= ~PNG_FLAG_FREE_TRNS; | ||||||
|  | #endif | ||||||
|  |     info_ptr->trans = NULL; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_sCAL_SUPPORTED) | ||||||
|  | /* free any sCAL entry */ | ||||||
|  | #ifdef PNG_FREE_ME_SUPPORTED | ||||||
|  | if ((mask & PNG_FREE_SCAL) & info_ptr->free_me) | ||||||
|  | #else | ||||||
|  | if (mask & PNG_FREE_SCAL) | ||||||
|  | #endif | ||||||
|  | { | ||||||
|  | #if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) | ||||||
|  |     png_free(png_ptr, info_ptr->scal_s_width); | ||||||
|  |     png_free(png_ptr, info_ptr->scal_s_height); | ||||||
|  |     info_ptr->scal_s_width = NULL; | ||||||
|  |     info_ptr->scal_s_height = NULL; | ||||||
|  | #endif | ||||||
|  |     info_ptr->valid &= ~PNG_INFO_sCAL; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_pCAL_SUPPORTED) | ||||||
|  | /* free any pCAL entry */ | ||||||
|  | #ifdef PNG_FREE_ME_SUPPORTED | ||||||
|  | if ((mask & PNG_FREE_PCAL) & info_ptr->free_me) | ||||||
|  | #else | ||||||
|  | if (mask & PNG_FREE_PCAL) | ||||||
|  | #endif | ||||||
|  | { | ||||||
|  |     png_free(png_ptr, info_ptr->pcal_purpose); | ||||||
|  |     png_free(png_ptr, info_ptr->pcal_units); | ||||||
|  |     info_ptr->pcal_purpose = NULL; | ||||||
|  |     info_ptr->pcal_units = NULL; | ||||||
|  |     if (info_ptr->pcal_params != NULL) | ||||||
|  |     { | ||||||
|  |         int i; | ||||||
|  |         for (i = 0; i < (int)info_ptr->pcal_nparams; i++) | ||||||
|  |         { | ||||||
|  |           png_free(png_ptr, info_ptr->pcal_params[i]); | ||||||
|  |           info_ptr->pcal_params[i]=NULL; | ||||||
|  |         } | ||||||
|  |         png_free(png_ptr, info_ptr->pcal_params); | ||||||
|  |         info_ptr->pcal_params = NULL; | ||||||
|  |     } | ||||||
|  |     info_ptr->valid &= ~PNG_INFO_pCAL; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_iCCP_SUPPORTED) | ||||||
|  | /* free any iCCP entry */ | ||||||
|  | #ifdef PNG_FREE_ME_SUPPORTED | ||||||
|  | if ((mask & PNG_FREE_ICCP) & info_ptr->free_me) | ||||||
|  | #else | ||||||
|  | if (mask & PNG_FREE_ICCP) | ||||||
|  | #endif | ||||||
|  | { | ||||||
|  |     png_free(png_ptr, info_ptr->iccp_name); | ||||||
|  |     png_free(png_ptr, info_ptr->iccp_profile); | ||||||
|  |     info_ptr->iccp_name = NULL; | ||||||
|  |     info_ptr->iccp_profile = NULL; | ||||||
|  |     info_ptr->valid &= ~PNG_INFO_iCCP; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_sPLT_SUPPORTED) | ||||||
|  | /* free a given sPLT entry, or (if num == -1) all sPLT entries */ | ||||||
|  | #ifdef PNG_FREE_ME_SUPPORTED | ||||||
|  | if ((mask & PNG_FREE_SPLT) & info_ptr->free_me) | ||||||
|  | #else | ||||||
|  | if (mask & PNG_FREE_SPLT) | ||||||
|  | #endif | ||||||
|  | { | ||||||
|  |    if (num != -1) | ||||||
|  |    { | ||||||
|  |       if(info_ptr->splt_palettes) | ||||||
|  |       { | ||||||
|  |           png_free(png_ptr, info_ptr->splt_palettes[num].name); | ||||||
|  |           png_free(png_ptr, info_ptr->splt_palettes[num].entries); | ||||||
|  |           info_ptr->splt_palettes[num].name = NULL; | ||||||
|  |           info_ptr->splt_palettes[num].entries = NULL; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |        if(info_ptr->splt_palettes_num) | ||||||
|  |        { | ||||||
|  |          int i; | ||||||
|  |          for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) | ||||||
|  |             png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i); | ||||||
|  |  | ||||||
|  |          png_free(png_ptr, info_ptr->splt_palettes); | ||||||
|  |          info_ptr->splt_palettes = NULL; | ||||||
|  |          info_ptr->splt_palettes_num = 0; | ||||||
|  |        } | ||||||
|  |        info_ptr->valid &= ~PNG_INFO_sPLT; | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) | ||||||
|  | #ifdef PNG_FREE_ME_SUPPORTED | ||||||
|  | if ((mask & PNG_FREE_UNKN) & info_ptr->free_me) | ||||||
|  | #else | ||||||
|  | if (mask & PNG_FREE_UNKN) | ||||||
|  | #endif | ||||||
|  | { | ||||||
|  |    if (num != -1) | ||||||
|  |    { | ||||||
|  |        if(info_ptr->unknown_chunks) | ||||||
|  |        { | ||||||
|  |           png_free(png_ptr, info_ptr->unknown_chunks[num].data); | ||||||
|  |           info_ptr->unknown_chunks[num].data = NULL; | ||||||
|  |        } | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |        int i; | ||||||
|  |  | ||||||
|  |        if(info_ptr->unknown_chunks_num) | ||||||
|  |        { | ||||||
|  |          for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++) | ||||||
|  |             png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i); | ||||||
|  |  | ||||||
|  |          png_free(png_ptr, info_ptr->unknown_chunks); | ||||||
|  |          info_ptr->unknown_chunks = NULL; | ||||||
|  |          info_ptr->unknown_chunks_num = 0; | ||||||
|  |        } | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_hIST_SUPPORTED) | ||||||
|  | /* free any hIST entry */ | ||||||
|  | #ifdef PNG_FREE_ME_SUPPORTED | ||||||
|  | if ((mask & PNG_FREE_HIST)  & info_ptr->free_me) | ||||||
|  | #else | ||||||
|  | if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST)) | ||||||
|  | #endif | ||||||
|  | { | ||||||
|  |     png_free(png_ptr, info_ptr->hist); | ||||||
|  |     info_ptr->hist = NULL; | ||||||
|  |     info_ptr->valid &= ~PNG_INFO_hIST; | ||||||
|  | #ifndef PNG_FREE_ME_SUPPORTED | ||||||
|  |     png_ptr->flags &= ~PNG_FLAG_FREE_HIST; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* free any PLTE entry that was internally allocated */ | ||||||
|  | #ifdef PNG_FREE_ME_SUPPORTED | ||||||
|  | if ((mask & PNG_FREE_PLTE) & info_ptr->free_me) | ||||||
|  | #else | ||||||
|  | if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE)) | ||||||
|  | #endif | ||||||
|  | { | ||||||
|  |     png_zfree(png_ptr, info_ptr->palette); | ||||||
|  |     info_ptr->palette = NULL; | ||||||
|  |     info_ptr->valid &= ~PNG_INFO_PLTE; | ||||||
|  | #ifndef PNG_FREE_ME_SUPPORTED | ||||||
|  |     png_ptr->flags &= ~PNG_FLAG_FREE_PLTE; | ||||||
|  | #endif | ||||||
|  |     info_ptr->num_palette = 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #if defined(PNG_INFO_IMAGE_SUPPORTED) | ||||||
|  | /* free any image bits attached to the info structure */ | ||||||
|  | #ifdef PNG_FREE_ME_SUPPORTED | ||||||
|  | if ((mask & PNG_FREE_ROWS) & info_ptr->free_me) | ||||||
|  | #else | ||||||
|  | if (mask & PNG_FREE_ROWS) | ||||||
|  | #endif | ||||||
|  | { | ||||||
|  |     if(info_ptr->row_pointers) | ||||||
|  |     { | ||||||
|  |        int row; | ||||||
|  |        for (row = 0; row < (int)info_ptr->height; row++) | ||||||
|  |        { | ||||||
|  |           png_free(png_ptr, info_ptr->row_pointers[row]); | ||||||
|  |           info_ptr->row_pointers[row]=NULL; | ||||||
|  |        } | ||||||
|  |        png_free(png_ptr, info_ptr->row_pointers); | ||||||
|  |        info_ptr->row_pointers=NULL; | ||||||
|  |     } | ||||||
|  |     info_ptr->valid &= ~PNG_INFO_IDAT; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef PNG_FREE_ME_SUPPORTED | ||||||
|  |    if(num == -1) | ||||||
|  |      info_ptr->free_me &= ~mask; | ||||||
|  |    else | ||||||
|  |      info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* This is an internal routine to free any memory that the info struct is | ||||||
|  |  * pointing to before re-using it or freeing the struct itself.  Recall | ||||||
|  |  * that png_free() checks for NULL pointers for us. | ||||||
|  |  */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_info_destroy(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_info_destroy\n"); | ||||||
|  |  | ||||||
|  |    png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); | ||||||
|  |  | ||||||
|  | #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) | ||||||
|  |    if (png_ptr->num_chunk_list) | ||||||
|  |    { | ||||||
|  |        png_free(png_ptr, png_ptr->chunk_list); | ||||||
|  |        png_ptr->chunk_list=NULL; | ||||||
|  |        png_ptr->num_chunk_list=0; | ||||||
|  |    } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |    png_info_init_3(&info_ptr, sizeof(png_info)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* This function returns a pointer to the io_ptr associated with the user | ||||||
|  |  * functions.  The application should free any memory associated with this | ||||||
|  |  * pointer before png_write_destroy() or png_read_destroy() are called. | ||||||
|  |  */ | ||||||
|  | png_voidp PNGAPI | ||||||
|  | png_get_io_ptr(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    return (png_ptr->io_ptr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #if !defined(PNG_NO_STDIO) | ||||||
|  | /* Initialize the default input/output functions for the PNG file.  If you | ||||||
|  |  * use your own read or write routines, you can call either png_set_read_fn() | ||||||
|  |  * or png_set_write_fn() instead of png_init_io().  If you have defined | ||||||
|  |  * PNG_NO_STDIO, you must use a function of your own because "FILE *" isn't | ||||||
|  |  * necessarily available. | ||||||
|  |  */ | ||||||
|  | void PNGAPI | ||||||
|  | png_init_io(png_structp png_ptr, png_FILE_p fp) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_init_io\n"); | ||||||
|  |    png_ptr->io_ptr = (png_voidp)fp; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_TIME_RFC1123_SUPPORTED) | ||||||
|  | /* Convert the supplied time into an RFC 1123 string suitable for use in | ||||||
|  |  * a "Creation Time" or other text-based time string. | ||||||
|  |  */ | ||||||
|  | png_charp PNGAPI | ||||||
|  | png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime) | ||||||
|  | { | ||||||
|  |    static PNG_CONST char short_months[12][4] = | ||||||
|  |         {"Jan", "Feb", "Mar", "Apr", "May", "Jun", | ||||||
|  |          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; | ||||||
|  |  | ||||||
|  |    if (png_ptr->time_buffer == NULL) | ||||||
|  |    { | ||||||
|  |       png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29* | ||||||
|  |          sizeof(char))); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  | #if defined(_WIN32_WCE) | ||||||
|  |    { | ||||||
|  |       wchar_t time_buf[29]; | ||||||
|  |       wsprintf(time_buf, TEXT("%d %S %d %02d:%02d:%02d +0000"), | ||||||
|  |           ptime->day % 32, short_months[(ptime->month - 1) % 12], | ||||||
|  |         ptime->year, ptime->hour % 24, ptime->minute % 60, | ||||||
|  |           ptime->second % 61); | ||||||
|  |       WideCharToMultiByte(CP_ACP, 0, time_buf, -1, png_ptr->time_buffer, 29, | ||||||
|  |           NULL, NULL); | ||||||
|  |    } | ||||||
|  | #else | ||||||
|  | #ifdef USE_FAR_KEYWORD | ||||||
|  |    { | ||||||
|  |       char near_time_buf[29]; | ||||||
|  |       sprintf(near_time_buf, "%d %s %d %02d:%02d:%02d +0000", | ||||||
|  |           ptime->day % 32, short_months[(ptime->month - 1) % 12], | ||||||
|  |           ptime->year, ptime->hour % 24, ptime->minute % 60, | ||||||
|  |           ptime->second % 61); | ||||||
|  |       png_memcpy(png_ptr->time_buffer, near_time_buf, | ||||||
|  |           29*sizeof(char)); | ||||||
|  |    } | ||||||
|  | #else | ||||||
|  |    sprintf(png_ptr->time_buffer, "%d %s %d %02d:%02d:%02d +0000", | ||||||
|  |        ptime->day % 32, short_months[(ptime->month - 1) % 12], | ||||||
|  |        ptime->year, ptime->hour % 24, ptime->minute % 60, | ||||||
|  |        ptime->second % 61); | ||||||
|  | #endif | ||||||
|  | #endif /* _WIN32_WCE */ | ||||||
|  |    return ((png_charp)png_ptr->time_buffer); | ||||||
|  | } | ||||||
|  | #endif /* PNG_TIME_RFC1123_SUPPORTED */ | ||||||
|  |  | ||||||
|  | #if 0 | ||||||
|  | /* Signature string for a PNG file. */ | ||||||
|  | png_bytep PNGAPI | ||||||
|  | png_sig_bytes(void) | ||||||
|  | { | ||||||
|  |    return ((png_bytep)"\211\120\116\107\015\012\032\012"); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | png_charp PNGAPI | ||||||
|  | png_get_copyright(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL || png_ptr == NULL)  /* silence compiler warning */ | ||||||
|  |    return ((png_charp) "\n libpng version 1.2.5 - October 3, 2002\n\ | ||||||
|  |    Copyright (c) 1998-2002 Glenn Randers-Pehrson\n\ | ||||||
|  |    Copyright (c) 1996-1997 Andreas Dilger\n\ | ||||||
|  |    Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\n"); | ||||||
|  |    return ((png_charp) ""); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* The following return the library version as a short string in the | ||||||
|  |  * format 1.0.0 through 99.99.99zz.  To get the version of *.h files used | ||||||
|  |  * with your application, print out PNG_LIBPNG_VER_STRING, which is defined | ||||||
|  |  * in png.h. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | png_charp PNGAPI | ||||||
|  | png_get_libpng_ver(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    /* Version of *.c files used when building libpng */ | ||||||
|  |    if(png_ptr != NULL) /* silence compiler warning about unused png_ptr */ | ||||||
|  |       return((png_charp) "1.2.5"); | ||||||
|  |    return((png_charp) "1.2.5"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_charp PNGAPI | ||||||
|  | png_get_header_ver(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    /* Version of *.h files used when building libpng */ | ||||||
|  |    if(png_ptr != NULL) /* silence compiler warning about unused png_ptr */ | ||||||
|  |       return((png_charp) PNG_LIBPNG_VER_STRING); | ||||||
|  |    return((png_charp) PNG_LIBPNG_VER_STRING); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_charp PNGAPI | ||||||
|  | png_get_header_version(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    /* Returns longer string containing both version and date */ | ||||||
|  |    if(png_ptr != NULL) /* silence compiler warning about unused png_ptr */ | ||||||
|  |       return((png_charp) PNG_HEADER_VERSION_STRING); | ||||||
|  |    return((png_charp) PNG_HEADER_VERSION_STRING); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED | ||||||
|  | int PNGAPI | ||||||
|  | png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name) | ||||||
|  | { | ||||||
|  |    /* check chunk_name and return "keep" value if it's on the list, else 0 */ | ||||||
|  |    int i; | ||||||
|  |    png_bytep p; | ||||||
|  |    if((png_ptr == NULL && chunk_name == NULL) || png_ptr->num_chunk_list<=0) | ||||||
|  |       return 0; | ||||||
|  |    p=png_ptr->chunk_list+png_ptr->num_chunk_list*5-5; | ||||||
|  |    for (i = png_ptr->num_chunk_list; i; i--, p-=5) | ||||||
|  |       if (!png_memcmp(chunk_name, p, 4)) | ||||||
|  |         return ((int)*(p+4)); | ||||||
|  |    return 0; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* This function, added to libpng-1.0.6g, is untested. */ | ||||||
|  | int PNGAPI | ||||||
|  | png_reset_zstream(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    return (inflateReset(&png_ptr->zstream)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* This function was added to libpng-1.0.7 */ | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_access_version_number(void) | ||||||
|  | { | ||||||
|  |    /* Version of *.c files used when building libpng */ | ||||||
|  |    return((png_uint_32) 10205L); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if !defined(PNG_1_0_X) | ||||||
|  | #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) | ||||||
|  |     /* GRR:  could add this:   && defined(PNG_MMX_CODE_SUPPORTED) */ | ||||||
|  | /* this INTERNAL function was added to libpng 1.2.0 */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_init_mmx_flags (png_structp png_ptr) | ||||||
|  | { | ||||||
|  |     png_ptr->mmx_rowbytes_threshold = 0; | ||||||
|  |     png_ptr->mmx_bitdepth_threshold = 0; | ||||||
|  |  | ||||||
|  | #  if (defined(PNG_USE_PNGVCRD) || defined(PNG_USE_PNGGCCRD)) | ||||||
|  |  | ||||||
|  |     png_ptr->asm_flags |= PNG_ASM_FLAG_MMX_SUPPORT_COMPILED; | ||||||
|  |  | ||||||
|  |     if (png_mmx_support() > 0) { | ||||||
|  |         png_ptr->asm_flags |= PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU | ||||||
|  | #    ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW | ||||||
|  |                               | PNG_ASM_FLAG_MMX_READ_COMBINE_ROW | ||||||
|  | #    endif | ||||||
|  | #    ifdef PNG_HAVE_ASSEMBLER_READ_INTERLACE | ||||||
|  |                               | PNG_ASM_FLAG_MMX_READ_INTERLACE | ||||||
|  | #    endif | ||||||
|  | #    ifndef PNG_HAVE_ASSEMBLER_READ_FILTER_ROW | ||||||
|  |                               ; | ||||||
|  | #    else | ||||||
|  |                               | PNG_ASM_FLAG_MMX_READ_FILTER_SUB | ||||||
|  |                               | PNG_ASM_FLAG_MMX_READ_FILTER_UP | ||||||
|  |                               | PNG_ASM_FLAG_MMX_READ_FILTER_AVG | ||||||
|  |                               | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ; | ||||||
|  |  | ||||||
|  |         png_ptr->mmx_rowbytes_threshold = PNG_MMX_ROWBYTES_THRESHOLD_DEFAULT; | ||||||
|  |         png_ptr->mmx_bitdepth_threshold = PNG_MMX_BITDEPTH_THRESHOLD_DEFAULT; | ||||||
|  | #    endif | ||||||
|  |     } else { | ||||||
|  |         png_ptr->asm_flags &= ~( PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU | ||||||
|  |                                | PNG_MMX_READ_FLAGS | ||||||
|  |                                | PNG_MMX_WRITE_FLAGS ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | #  else /* !((PNGVCRD || PNGGCCRD) && PNG_ASSEMBLER_CODE_SUPPORTED)) */ | ||||||
|  |  | ||||||
|  |     /* clear all MMX flags; no support is compiled in */ | ||||||
|  |     png_ptr->asm_flags &= ~( PNG_MMX_FLAGS ); | ||||||
|  |  | ||||||
|  | #  endif /* ?(PNGVCRD || PNGGCCRD) */ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif /* !(PNG_ASSEMBLER_CODE_SUPPORTED) */ | ||||||
|  |  | ||||||
|  | /* this function was added to libpng 1.2.0 */ | ||||||
|  | #if !defined(PNG_USE_PNGGCCRD) && \ | ||||||
|  |     !(defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_USE_PNGVCRD)) | ||||||
|  | int PNGAPI | ||||||
|  | png_mmx_support(void) | ||||||
|  | { | ||||||
|  |     return -1; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | #endif /* PNG_1_0_X */ | ||||||
							
								
								
									
										3283
									
								
								runtime/libpng/png.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										11
									
								
								runtime/libpng/pngasmrd.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,11 @@ | |||||||
|  | /* pngasmrd.h - assembler version of utilities to read a PNG file | ||||||
|  |  * | ||||||
|  |  * libpng 1.2.5 - October 3, 2002 | ||||||
|  |  * For conditions of distribution and use, see copyright notice in png.h | ||||||
|  |  * Copyright (c) 2002 Glenn Randers-Pehrson | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /* This file is obsolete in libpng-1.0.9 and later; its contents now appear | ||||||
|  |  * at the end of pngconf.h. | ||||||
|  |  */ | ||||||
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/pngbar.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/pngbar.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.3 KiB | 
							
								
								
									
										1348
									
								
								runtime/libpng/pngconf.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										291
									
								
								runtime/libpng/pngerror.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,291 @@ | |||||||
|  |  | ||||||
|  | /* pngerror.c - stub functions for i/o and memory allocation | ||||||
|  |  * | ||||||
|  |  * libpng 1.2.5 - October 3, 2002 | ||||||
|  |  * For conditions of distribution and use, see copyright notice in png.h | ||||||
|  |  * Copyright (c) 1998-2002 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.) | ||||||
|  |  * | ||||||
|  |  * This file provides a location for all error handling.  Users who | ||||||
|  |  * need special error handling are expected to write replacement functions | ||||||
|  |  * and use png_set_error_fn() to use those functions.  See the instructions | ||||||
|  |  * at each function. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define PNG_INTERNAL | ||||||
|  | #include "png.h" | ||||||
|  |  | ||||||
|  | static void /* PRIVATE */ | ||||||
|  | png_default_error PNGARG((png_structp png_ptr, | ||||||
|  |   png_const_charp error_message)); | ||||||
|  | static void /* PRIVATE */ | ||||||
|  | png_default_warning PNGARG((png_structp png_ptr, | ||||||
|  |   png_const_charp warning_message)); | ||||||
|  |  | ||||||
|  | /* This function is called whenever there is a fatal error.  This function | ||||||
|  |  * should not be changed.  If there is a need to handle errors differently, | ||||||
|  |  * you should supply a replacement error function and use png_set_error_fn() | ||||||
|  |  * to replace the error function at run-time. | ||||||
|  |  */ | ||||||
|  | void PNGAPI | ||||||
|  | png_error(png_structp png_ptr, png_const_charp error_message) | ||||||
|  | { | ||||||
|  | #ifdef PNG_ERROR_NUMBERS_SUPPORTED | ||||||
|  |    char msg[16]; | ||||||
|  |    if (png_ptr->flags&(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) | ||||||
|  |    { | ||||||
|  |      int offset = 0; | ||||||
|  |      if (*error_message == '#') | ||||||
|  |      { | ||||||
|  |          for (offset=1; offset<15; offset++) | ||||||
|  |             if (*(error_message+offset) == ' ') | ||||||
|  |                 break; | ||||||
|  |          if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) | ||||||
|  |          { | ||||||
|  |             int i; | ||||||
|  |             for (i=0; i<offset-1; i++) | ||||||
|  |                msg[i]=error_message[i+1]; | ||||||
|  |             msg[i]='\0'; | ||||||
|  |             error_message=msg; | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |             error_message+=offset; | ||||||
|  |      } | ||||||
|  |      else | ||||||
|  |      { | ||||||
|  |          if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) | ||||||
|  |          { | ||||||
|  |             msg[0]='0';         | ||||||
|  |             msg[1]='\0'; | ||||||
|  |             error_message=msg; | ||||||
|  |          } | ||||||
|  |      } | ||||||
|  |    } | ||||||
|  | #endif | ||||||
|  |    if (png_ptr->error_fn != NULL) | ||||||
|  |       (*(png_ptr->error_fn))(png_ptr, error_message); | ||||||
|  |  | ||||||
|  |    /* if the following returns or doesn't exist, use the default function, | ||||||
|  |       which will not return */ | ||||||
|  |    png_default_error(png_ptr, error_message); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* This function is called whenever there is a non-fatal error.  This function | ||||||
|  |  * should not be changed.  If there is a need to handle warnings differently, | ||||||
|  |  * you should supply a replacement warning function and use | ||||||
|  |  * png_set_error_fn() to replace the warning function at run-time. | ||||||
|  |  */ | ||||||
|  | void PNGAPI | ||||||
|  | png_warning(png_structp png_ptr, png_const_charp warning_message) | ||||||
|  | { | ||||||
|  |      int offset = 0; | ||||||
|  | #ifdef PNG_ERROR_NUMBERS_SUPPORTED | ||||||
|  |    if (png_ptr->flags&(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) | ||||||
|  | #endif | ||||||
|  |    { | ||||||
|  |      if (*warning_message == '#') | ||||||
|  |      { | ||||||
|  |          for (offset=1; offset<15; offset++) | ||||||
|  |             if (*(warning_message+offset) == ' ') | ||||||
|  |                 break; | ||||||
|  |      } | ||||||
|  |    } | ||||||
|  |    if (png_ptr->warning_fn != NULL) | ||||||
|  |       (*(png_ptr->warning_fn))(png_ptr, | ||||||
|  |          (png_const_charp)(warning_message+offset)); | ||||||
|  |    else | ||||||
|  |       png_default_warning(png_ptr, (png_const_charp)(warning_message+offset)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* These utilities are used internally to build an error message that relates | ||||||
|  |  * to the current chunk.  The chunk name comes from png_ptr->chunk_name, | ||||||
|  |  * this is used to prefix the message.  The message is limited in length | ||||||
|  |  * to 63 bytes, the name characters are output as hex digits wrapped in [] | ||||||
|  |  * if the character is invalid. | ||||||
|  |  */ | ||||||
|  | #define isnonalpha(c) ((c) < 41 || (c) > 122 || ((c) > 90 && (c) < 97)) | ||||||
|  | static PNG_CONST char png_digit[16] = { | ||||||
|  |    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', | ||||||
|  |    'F' }; | ||||||
|  |  | ||||||
|  | static void /* PRIVATE */ | ||||||
|  | png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp | ||||||
|  |    error_message) | ||||||
|  | { | ||||||
|  |    int iout = 0, iin = 0; | ||||||
|  |  | ||||||
|  |    while (iin < 4) | ||||||
|  |    { | ||||||
|  |       int c = png_ptr->chunk_name[iin++]; | ||||||
|  |       if (isnonalpha(c)) | ||||||
|  |       { | ||||||
|  |          buffer[iout++] = '['; | ||||||
|  |          buffer[iout++] = png_digit[(c & 0xf0) >> 4]; | ||||||
|  |          buffer[iout++] = png_digit[c & 0x0f]; | ||||||
|  |          buffer[iout++] = ']'; | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |          buffer[iout++] = (png_byte)c; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    if (error_message == NULL) | ||||||
|  |       buffer[iout] = 0; | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       buffer[iout++] = ':'; | ||||||
|  |       buffer[iout++] = ' '; | ||||||
|  |       png_memcpy(buffer+iout, error_message, 64); | ||||||
|  |       buffer[iout+63] = 0; | ||||||
|  |    } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void PNGAPI | ||||||
|  | png_chunk_error(png_structp png_ptr, png_const_charp error_message) | ||||||
|  | { | ||||||
|  |    char msg[18+64]; | ||||||
|  |    png_format_buffer(png_ptr, msg, error_message); | ||||||
|  |    png_error(png_ptr, msg); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void PNGAPI | ||||||
|  | png_chunk_warning(png_structp png_ptr, png_const_charp warning_message) | ||||||
|  | { | ||||||
|  |    char msg[18+64]; | ||||||
|  |    png_format_buffer(png_ptr, msg, warning_message); | ||||||
|  |    png_warning(png_ptr, msg); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* This is the default error handling function.  Note that replacements for | ||||||
|  |  * this function MUST NOT RETURN, or the program will likely crash.  This | ||||||
|  |  * function is used by default, or if the program supplies NULL for the | ||||||
|  |  * error function pointer in png_set_error_fn(). | ||||||
|  |  */ | ||||||
|  | static void /* PRIVATE */ | ||||||
|  | png_default_error(png_structp png_ptr, png_const_charp error_message) | ||||||
|  | { | ||||||
|  | #ifndef PNG_NO_CONSOLE_IO | ||||||
|  | #ifdef PNG_ERROR_NUMBERS_SUPPORTED | ||||||
|  |    if (*error_message == '#') | ||||||
|  |    { | ||||||
|  |      int offset; | ||||||
|  |      char error_number[16]; | ||||||
|  |      for (offset=0; offset<15; offset++) | ||||||
|  |      { | ||||||
|  |          error_number[offset] = *(error_message+offset+1); | ||||||
|  |          if (*(error_message+offset) == ' ') | ||||||
|  |              break; | ||||||
|  |      } | ||||||
|  |      if((offset > 1) && (offset < 15)) | ||||||
|  |      { | ||||||
|  |        error_number[offset-1]='\0'; | ||||||
|  |        fprintf(stderr, "libpng error no. %s: %s\n", error_number, | ||||||
|  |           error_message+offset); | ||||||
|  |      } | ||||||
|  |      else | ||||||
|  |        fprintf(stderr, "libpng error: %s, offset=%d\n", error_message,offset); | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  | #endif | ||||||
|  |    fprintf(stderr, "libpng error: %s\n", error_message); | ||||||
|  | #else | ||||||
|  |    if (error_message) | ||||||
|  |      /* make compiler happy */ ; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef PNG_SETJMP_SUPPORTED | ||||||
|  | #  ifdef USE_FAR_KEYWORD | ||||||
|  |    { | ||||||
|  |       jmp_buf jmpbuf; | ||||||
|  |       png_memcpy(jmpbuf,png_ptr->jmpbuf,sizeof(jmp_buf)); | ||||||
|  |       longjmp(jmpbuf, 1); | ||||||
|  |    } | ||||||
|  | #  else | ||||||
|  |    longjmp(png_ptr->jmpbuf, 1); | ||||||
|  | # endif | ||||||
|  | #else | ||||||
|  |    if (png_ptr) | ||||||
|  |      /* make compiler happy */ ; | ||||||
|  |    PNG_ABORT(); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* This function is called when there is a warning, but the library thinks | ||||||
|  |  * it can continue anyway.  Replacement functions don't have to do anything | ||||||
|  |  * here if you don't want them to.  In the default configuration, png_ptr is | ||||||
|  |  * not used, but it is passed in case it may be useful. | ||||||
|  |  */ | ||||||
|  | static void /* PRIVATE */ | ||||||
|  | png_default_warning(png_structp png_ptr, png_const_charp warning_message) | ||||||
|  | { | ||||||
|  | #ifndef PNG_NO_CONSOLE_IO | ||||||
|  | #  ifdef PNG_ERROR_NUMBERS_SUPPORTED | ||||||
|  |    if (*warning_message == '#') | ||||||
|  |    { | ||||||
|  |      int offset; | ||||||
|  |      char warning_number[16]; | ||||||
|  |      for (offset=0; offset<15; offset++) | ||||||
|  |      { | ||||||
|  |         warning_number[offset]=*(warning_message+offset+1); | ||||||
|  |         if (*(warning_message+offset) == ' ') | ||||||
|  |             break; | ||||||
|  |      } | ||||||
|  |      if((offset > 1) && (offset < 15)) | ||||||
|  |      { | ||||||
|  |        warning_number[offset-1]='\0'; | ||||||
|  |        fprintf(stderr, "libpng warning no. %s: %s\n", warning_number, | ||||||
|  |           warning_message+offset); | ||||||
|  |      } | ||||||
|  |      else | ||||||
|  |        fprintf(stderr, "libpng warning: %s\n", warning_message); | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  | #  endif | ||||||
|  |      fprintf(stderr, "libpng warning: %s\n", warning_message); | ||||||
|  | #else | ||||||
|  |    if (warning_message) | ||||||
|  |      /* appease compiler */ ; | ||||||
|  | #endif | ||||||
|  |    if (png_ptr) | ||||||
|  |       return; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* This function is called when the application wants to use another method | ||||||
|  |  * of handling errors and warnings.  Note that the error function MUST NOT | ||||||
|  |  * return to the calling routine or serious problems will occur.  The return | ||||||
|  |  * method used in the default routine calls longjmp(png_ptr->jmpbuf, 1) | ||||||
|  |  */ | ||||||
|  | void PNGAPI | ||||||
|  | png_set_error_fn(png_structp png_ptr, png_voidp error_ptr, | ||||||
|  |    png_error_ptr error_fn, png_error_ptr warning_fn) | ||||||
|  | { | ||||||
|  |    png_ptr->error_ptr = error_ptr; | ||||||
|  |    png_ptr->error_fn = error_fn; | ||||||
|  |    png_ptr->warning_fn = warning_fn; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* This function returns a pointer to the error_ptr associated with the user | ||||||
|  |  * functions.  The application should free any memory associated with this | ||||||
|  |  * pointer before png_write_destroy and png_read_destroy are called. | ||||||
|  |  */ | ||||||
|  | png_voidp PNGAPI | ||||||
|  | png_get_error_ptr(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    return ((png_voidp)png_ptr->error_ptr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifdef PNG_ERROR_NUMBERS_SUPPORTED | ||||||
|  | void PNGAPI | ||||||
|  | png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode) | ||||||
|  | { | ||||||
|  |    if(png_ptr != NULL) | ||||||
|  |    { | ||||||
|  |      png_ptr->flags &= | ||||||
|  |        ((~(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode); | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | #endif | ||||||
							
								
								
									
										5397
									
								
								runtime/libpng/pnggccrd.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										927
									
								
								runtime/libpng/pngget.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,927 @@ | |||||||
|  |  | ||||||
|  | /* pngget.c - retrieval of values from info struct | ||||||
|  |  * | ||||||
|  |  * libpng 1.2.5 - October 3, 2002 | ||||||
|  |  * For conditions of distribution and use, see copyright notice in png.h | ||||||
|  |  * Copyright (c) 1998-2002 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.) | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define PNG_INTERNAL | ||||||
|  | #include "png.h" | ||||||
|  |  | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_valid(png_structp png_ptr, png_infop info_ptr, png_uint_32 flag) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  |       return(info_ptr->valid & flag); | ||||||
|  |    else | ||||||
|  |       return(0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_rowbytes(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  |       return(info_ptr->rowbytes); | ||||||
|  |    else | ||||||
|  |       return(0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #if defined(PNG_INFO_IMAGE_SUPPORTED) | ||||||
|  | png_bytepp PNGAPI | ||||||
|  | png_get_rows(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  |       return(info_ptr->row_pointers); | ||||||
|  |    else | ||||||
|  |       return(0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef PNG_EASY_ACCESS_SUPPORTED | ||||||
|  | /* easy access to info, added in libpng-0.99 */ | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_image_width(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  |    { | ||||||
|  |       return info_ptr->width; | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_image_height(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  |    { | ||||||
|  |       return info_ptr->height; | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_byte PNGAPI | ||||||
|  | png_get_bit_depth(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  |    { | ||||||
|  |       return info_ptr->bit_depth; | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_byte PNGAPI | ||||||
|  | png_get_color_type(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  |    { | ||||||
|  |       return info_ptr->color_type; | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_byte PNGAPI | ||||||
|  | png_get_filter_type(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  |    { | ||||||
|  |       return info_ptr->filter_type; | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_byte PNGAPI | ||||||
|  | png_get_interlace_type(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  |    { | ||||||
|  |       return info_ptr->interlace_type; | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_byte PNGAPI | ||||||
|  | png_get_compression_type(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  |    { | ||||||
|  |       return info_ptr->compression_type; | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  | #if defined(PNG_pHYs_SUPPORTED) | ||||||
|  |    if (info_ptr->valid & PNG_INFO_pHYs) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "png_get_x_pixels_per_meter"); | ||||||
|  |       if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER) | ||||||
|  |           return (0); | ||||||
|  |       else return (info_ptr->x_pixels_per_unit); | ||||||
|  |    } | ||||||
|  | #else | ||||||
|  |    return (0); | ||||||
|  | #endif | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  | #if defined(PNG_pHYs_SUPPORTED) | ||||||
|  |    if (info_ptr->valid & PNG_INFO_pHYs) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "png_get_y_pixels_per_meter"); | ||||||
|  |       if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER) | ||||||
|  |           return (0); | ||||||
|  |       else return (info_ptr->y_pixels_per_unit); | ||||||
|  |    } | ||||||
|  | #else | ||||||
|  |    return (0); | ||||||
|  | #endif | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  | #if defined(PNG_pHYs_SUPPORTED) | ||||||
|  |    if (info_ptr->valid & PNG_INFO_pHYs) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "png_get_pixels_per_meter"); | ||||||
|  |       if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER || | ||||||
|  |          info_ptr->x_pixels_per_unit != info_ptr->y_pixels_per_unit) | ||||||
|  |           return (0); | ||||||
|  |       else return (info_ptr->x_pixels_per_unit); | ||||||
|  |    } | ||||||
|  | #else | ||||||
|  |    return (0); | ||||||
|  | #endif | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #ifdef PNG_FLOATING_POINT_SUPPORTED | ||||||
|  | float PNGAPI | ||||||
|  | png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr) | ||||||
|  |    { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  | #if defined(PNG_pHYs_SUPPORTED) | ||||||
|  |    if (info_ptr->valid & PNG_INFO_pHYs) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "png_get_aspect_ratio"); | ||||||
|  |       if (info_ptr->x_pixels_per_unit == 0) | ||||||
|  |          return ((float)0.0); | ||||||
|  |       else | ||||||
|  |          return ((float)((float)info_ptr->y_pixels_per_unit | ||||||
|  |             /(float)info_ptr->x_pixels_per_unit)); | ||||||
|  |    } | ||||||
|  | #else | ||||||
|  |    return (0.0); | ||||||
|  | #endif | ||||||
|  |    return ((float)0.0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | png_int_32 PNGAPI | ||||||
|  | png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  | #if defined(PNG_oFFs_SUPPORTED) | ||||||
|  |    if (info_ptr->valid & PNG_INFO_oFFs) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns"); | ||||||
|  |       if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) | ||||||
|  |           return (0); | ||||||
|  |       else return (info_ptr->x_offset); | ||||||
|  |    } | ||||||
|  | #else | ||||||
|  |    return (0); | ||||||
|  | #endif | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_int_32 PNGAPI | ||||||
|  | png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  | #if defined(PNG_oFFs_SUPPORTED) | ||||||
|  |    if (info_ptr->valid & PNG_INFO_oFFs) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns"); | ||||||
|  |       if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) | ||||||
|  |           return (0); | ||||||
|  |       else return (info_ptr->y_offset); | ||||||
|  |    } | ||||||
|  | #else | ||||||
|  |    return (0); | ||||||
|  | #endif | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_int_32 PNGAPI | ||||||
|  | png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  | #if defined(PNG_oFFs_SUPPORTED) | ||||||
|  |    if (info_ptr->valid & PNG_INFO_oFFs) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns"); | ||||||
|  |       if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) | ||||||
|  |           return (0); | ||||||
|  |       else return (info_ptr->x_offset); | ||||||
|  |    } | ||||||
|  | #else | ||||||
|  |    return (0); | ||||||
|  | #endif | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_int_32 PNGAPI | ||||||
|  | png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  | #if defined(PNG_oFFs_SUPPORTED) | ||||||
|  |    if (info_ptr->valid & PNG_INFO_oFFs) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns"); | ||||||
|  |       if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) | ||||||
|  |           return (0); | ||||||
|  |       else return (info_ptr->y_offset); | ||||||
|  |    } | ||||||
|  | #else | ||||||
|  |    return (0); | ||||||
|  | #endif | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    return ((png_uint_32)((float)png_get_pixels_per_meter(png_ptr, info_ptr) | ||||||
|  |      *.0254 +.5)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_x_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    return ((png_uint_32)((float)png_get_x_pixels_per_meter(png_ptr, info_ptr) | ||||||
|  |      *.0254 +.5)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_y_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    return ((png_uint_32)((float)png_get_y_pixels_per_meter(png_ptr, info_ptr) | ||||||
|  |      *.0254 +.5)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | float PNGAPI | ||||||
|  | png_get_x_offset_inches(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    return ((float)png_get_x_offset_microns(png_ptr, info_ptr) | ||||||
|  |      *.00003937); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | float PNGAPI | ||||||
|  | png_get_y_offset_inches(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    return ((float)png_get_y_offset_microns(png_ptr, info_ptr) | ||||||
|  |      *.00003937); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #if defined(PNG_pHYs_SUPPORTED) | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr, | ||||||
|  |    png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) | ||||||
|  | { | ||||||
|  |    png_uint_32 retval = 0; | ||||||
|  |  | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "pHYs"); | ||||||
|  |       if (res_x != NULL) | ||||||
|  |       { | ||||||
|  |          *res_x = info_ptr->x_pixels_per_unit; | ||||||
|  |          retval |= PNG_INFO_pHYs; | ||||||
|  |       } | ||||||
|  |       if (res_y != NULL) | ||||||
|  |       { | ||||||
|  |          *res_y = info_ptr->y_pixels_per_unit; | ||||||
|  |          retval |= PNG_INFO_pHYs; | ||||||
|  |       } | ||||||
|  |       if (unit_type != NULL) | ||||||
|  |       { | ||||||
|  |          *unit_type = (int)info_ptr->phys_unit_type; | ||||||
|  |          retval |= PNG_INFO_pHYs; | ||||||
|  |          if(*unit_type == 1) | ||||||
|  |          { | ||||||
|  |             if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50); | ||||||
|  |             if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50); | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |    return (retval); | ||||||
|  | } | ||||||
|  | #endif /* PNG_pHYs_SUPPORTED */ | ||||||
|  | #endif  /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ | ||||||
|  |  | ||||||
|  | /* png_get_channels really belongs in here, too, but it's been around longer */ | ||||||
|  |  | ||||||
|  | #endif  /* PNG_EASY_ACCESS_SUPPORTED */ | ||||||
|  |  | ||||||
|  | png_byte PNGAPI | ||||||
|  | png_get_channels(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  |       return(info_ptr->channels); | ||||||
|  |    else | ||||||
|  |       return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_bytep PNGAPI | ||||||
|  | png_get_signature(png_structp png_ptr, png_infop info_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL) | ||||||
|  |       return(info_ptr->signature); | ||||||
|  |    else | ||||||
|  |       return (NULL); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #if defined(PNG_bKGD_SUPPORTED) | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_bKGD(png_structp png_ptr, png_infop info_ptr, | ||||||
|  |    png_color_16p *background) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) | ||||||
|  |       && background != NULL) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "bKGD"); | ||||||
|  |       *background = &(info_ptr->background); | ||||||
|  |       return (PNG_INFO_bKGD); | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_cHRM_SUPPORTED) | ||||||
|  | #ifdef PNG_FLOATING_POINT_SUPPORTED | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_cHRM(png_structp png_ptr, png_infop info_ptr, | ||||||
|  |    double *white_x, double *white_y, double *red_x, double *red_y, | ||||||
|  |    double *green_x, double *green_y, double *blue_x, double *blue_y) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "cHRM"); | ||||||
|  |       if (white_x != NULL) | ||||||
|  |          *white_x = (double)info_ptr->x_white; | ||||||
|  |       if (white_y != NULL) | ||||||
|  |          *white_y = (double)info_ptr->y_white; | ||||||
|  |       if (red_x != NULL) | ||||||
|  |          *red_x = (double)info_ptr->x_red; | ||||||
|  |       if (red_y != NULL) | ||||||
|  |          *red_y = (double)info_ptr->y_red; | ||||||
|  |       if (green_x != NULL) | ||||||
|  |          *green_x = (double)info_ptr->x_green; | ||||||
|  |       if (green_y != NULL) | ||||||
|  |          *green_y = (double)info_ptr->y_green; | ||||||
|  |       if (blue_x != NULL) | ||||||
|  |          *blue_x = (double)info_ptr->x_blue; | ||||||
|  |       if (blue_y != NULL) | ||||||
|  |          *blue_y = (double)info_ptr->y_blue; | ||||||
|  |       return (PNG_INFO_cHRM); | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | #ifdef PNG_FIXED_POINT_SUPPORTED | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_cHRM_fixed(png_structp png_ptr, png_infop info_ptr, | ||||||
|  |    png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x, | ||||||
|  |    png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y, | ||||||
|  |    png_fixed_point *blue_x, png_fixed_point *blue_y) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "cHRM"); | ||||||
|  |       if (white_x != NULL) | ||||||
|  |          *white_x = info_ptr->int_x_white; | ||||||
|  |       if (white_y != NULL) | ||||||
|  |          *white_y = info_ptr->int_y_white; | ||||||
|  |       if (red_x != NULL) | ||||||
|  |          *red_x = info_ptr->int_x_red; | ||||||
|  |       if (red_y != NULL) | ||||||
|  |          *red_y = info_ptr->int_y_red; | ||||||
|  |       if (green_x != NULL) | ||||||
|  |          *green_x = info_ptr->int_x_green; | ||||||
|  |       if (green_y != NULL) | ||||||
|  |          *green_y = info_ptr->int_y_green; | ||||||
|  |       if (blue_x != NULL) | ||||||
|  |          *blue_x = info_ptr->int_x_blue; | ||||||
|  |       if (blue_y != NULL) | ||||||
|  |          *blue_y = info_ptr->int_y_blue; | ||||||
|  |       return (PNG_INFO_cHRM); | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_gAMA_SUPPORTED) | ||||||
|  | #ifdef PNG_FLOATING_POINT_SUPPORTED | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_gAMA(png_structp png_ptr, png_infop info_ptr, double *file_gamma) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) | ||||||
|  |       && file_gamma != NULL) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "gAMA"); | ||||||
|  |       *file_gamma = (double)info_ptr->gamma; | ||||||
|  |       return (PNG_INFO_gAMA); | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | #ifdef PNG_FIXED_POINT_SUPPORTED | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, | ||||||
|  |     png_fixed_point *int_file_gamma) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) | ||||||
|  |       && int_file_gamma != NULL) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "gAMA"); | ||||||
|  |       *int_file_gamma = info_ptr->int_gamma; | ||||||
|  |       return (PNG_INFO_gAMA); | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_sRGB_SUPPORTED) | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB) | ||||||
|  |       && file_srgb_intent != NULL) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "sRGB"); | ||||||
|  |       *file_srgb_intent = (int)info_ptr->srgb_intent; | ||||||
|  |       return (PNG_INFO_sRGB); | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_iCCP_SUPPORTED) | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_iCCP(png_structp png_ptr, png_infop info_ptr, | ||||||
|  |              png_charpp name, int *compression_type, | ||||||
|  |              png_charpp profile, png_uint_32 *proflen) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP) | ||||||
|  |       && name != NULL && profile != NULL && proflen != NULL) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "iCCP"); | ||||||
|  |       *name = info_ptr->iccp_name; | ||||||
|  |       *profile = info_ptr->iccp_profile; | ||||||
|  |       /* compression_type is a dummy so the API won't have to change | ||||||
|  |          if we introduce multiple compression types later. */ | ||||||
|  |       *proflen = (int)info_ptr->iccp_proflen; | ||||||
|  |       *compression_type = (int)info_ptr->iccp_compression; | ||||||
|  |       return (PNG_INFO_iCCP); | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_sPLT_SUPPORTED) | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_sPLT(png_structp png_ptr, png_infop info_ptr, | ||||||
|  |              png_sPLT_tpp spalettes) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL) | ||||||
|  |      *spalettes = info_ptr->splt_palettes; | ||||||
|  |    return ((png_uint_32)info_ptr->splt_palettes_num); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_hIST_SUPPORTED) | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) | ||||||
|  |       && hist != NULL) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "hIST"); | ||||||
|  |       *hist = info_ptr->hist; | ||||||
|  |       return (PNG_INFO_hIST); | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_IHDR(png_structp png_ptr, png_infop info_ptr, | ||||||
|  |    png_uint_32 *width, png_uint_32 *height, int *bit_depth, | ||||||
|  |    int *color_type, int *interlace_type, int *compression_type, | ||||||
|  |    int *filter_type) | ||||||
|  |  | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && width != NULL && height != NULL && | ||||||
|  |       bit_depth != NULL && color_type != NULL) | ||||||
|  |    { | ||||||
|  |       int pixel_depth, channels; | ||||||
|  |       png_uint_32 rowbytes_per_pixel; | ||||||
|  |  | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "IHDR"); | ||||||
|  |       *width = info_ptr->width; | ||||||
|  |       *height = info_ptr->height; | ||||||
|  |       *bit_depth = info_ptr->bit_depth; | ||||||
|  |       if (info_ptr->bit_depth < 1 || info_ptr->bit_depth > 16) | ||||||
|  |         png_error(png_ptr, "Invalid bit depth"); | ||||||
|  |       *color_type = info_ptr->color_type; | ||||||
|  |       if (info_ptr->color_type > 6) | ||||||
|  |         png_error(png_ptr, "Invalid color type"); | ||||||
|  |       if (compression_type != NULL) | ||||||
|  |          *compression_type = info_ptr->compression_type; | ||||||
|  |       if (filter_type != NULL) | ||||||
|  |          *filter_type = info_ptr->filter_type; | ||||||
|  |       if (interlace_type != NULL) | ||||||
|  |          *interlace_type = info_ptr->interlace_type; | ||||||
|  |  | ||||||
|  |       /* check for potential overflow of rowbytes */ | ||||||
|  |       if (*color_type == PNG_COLOR_TYPE_PALETTE) | ||||||
|  |          channels = 1; | ||||||
|  |       else if (*color_type & PNG_COLOR_MASK_COLOR) | ||||||
|  |          channels = 3; | ||||||
|  |       else | ||||||
|  |          channels = 1; | ||||||
|  |       if (*color_type & PNG_COLOR_MASK_ALPHA) | ||||||
|  |          channels++; | ||||||
|  |       pixel_depth = *bit_depth * channels; | ||||||
|  |       rowbytes_per_pixel = (pixel_depth + 7) >> 3; | ||||||
|  |       if (width == 0 || *width > PNG_MAX_UINT) | ||||||
|  |         png_error(png_ptr, "Invalid image width"); | ||||||
|  |       if (height == 0 || *height > PNG_MAX_UINT) | ||||||
|  |         png_error(png_ptr, "Invalid image height"); | ||||||
|  |       if (*width > PNG_MAX_UINT/rowbytes_per_pixel - 64) | ||||||
|  |       { | ||||||
|  |          png_error(png_ptr, | ||||||
|  |             "Width too large for libpng to process image data."); | ||||||
|  |       } | ||||||
|  |       return (1); | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #if defined(PNG_oFFs_SUPPORTED) | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_oFFs(png_structp png_ptr, png_infop info_ptr, | ||||||
|  |    png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs) | ||||||
|  |       && offset_x != NULL && offset_y != NULL && unit_type != NULL) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "oFFs"); | ||||||
|  |       *offset_x = info_ptr->x_offset; | ||||||
|  |       *offset_y = info_ptr->y_offset; | ||||||
|  |       *unit_type = (int)info_ptr->offset_unit_type; | ||||||
|  |       return (PNG_INFO_oFFs); | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_pCAL_SUPPORTED) | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_pCAL(png_structp png_ptr, png_infop info_ptr, | ||||||
|  |    png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams, | ||||||
|  |    png_charp *units, png_charpp *params) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL) | ||||||
|  |       && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL && | ||||||
|  |       nparams != NULL && units != NULL && params != NULL) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "pCAL"); | ||||||
|  |       *purpose = info_ptr->pcal_purpose; | ||||||
|  |       *X0 = info_ptr->pcal_X0; | ||||||
|  |       *X1 = info_ptr->pcal_X1; | ||||||
|  |       *type = (int)info_ptr->pcal_type; | ||||||
|  |       *nparams = (int)info_ptr->pcal_nparams; | ||||||
|  |       *units = info_ptr->pcal_units; | ||||||
|  |       *params = info_ptr->pcal_params; | ||||||
|  |       return (PNG_INFO_pCAL); | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_sCAL_SUPPORTED) | ||||||
|  | #ifdef PNG_FLOATING_POINT_SUPPORTED | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_sCAL(png_structp png_ptr, png_infop info_ptr, | ||||||
|  |              int *unit, double *width, double *height) | ||||||
|  | { | ||||||
|  |     if (png_ptr != NULL && info_ptr != NULL && | ||||||
|  |        (info_ptr->valid & PNG_INFO_sCAL)) | ||||||
|  |     { | ||||||
|  |         *unit = info_ptr->scal_unit; | ||||||
|  |         *width = info_ptr->scal_pixel_width; | ||||||
|  |         *height = info_ptr->scal_pixel_height; | ||||||
|  |         return (PNG_INFO_sCAL); | ||||||
|  |     } | ||||||
|  |     return(0); | ||||||
|  | } | ||||||
|  | #else | ||||||
|  | #ifdef PNG_FIXED_POINT_SUPPORTED | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_sCAL_s(png_structp png_ptr, png_infop info_ptr, | ||||||
|  |              int *unit, png_charpp width, png_charpp height) | ||||||
|  | { | ||||||
|  |     if (png_ptr != NULL && info_ptr != NULL && | ||||||
|  |        (info_ptr->valid & PNG_INFO_sCAL)) | ||||||
|  |     { | ||||||
|  |         *unit = info_ptr->scal_unit; | ||||||
|  |         *width = info_ptr->scal_s_width; | ||||||
|  |         *height = info_ptr->scal_s_height; | ||||||
|  |         return (PNG_INFO_sCAL); | ||||||
|  |     } | ||||||
|  |     return(0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_pHYs_SUPPORTED) | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_pHYs(png_structp png_ptr, png_infop info_ptr, | ||||||
|  |    png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) | ||||||
|  | { | ||||||
|  |    png_uint_32 retval = 0; | ||||||
|  |  | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && | ||||||
|  |       (info_ptr->valid & PNG_INFO_pHYs)) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "pHYs"); | ||||||
|  |       if (res_x != NULL) | ||||||
|  |       { | ||||||
|  |          *res_x = info_ptr->x_pixels_per_unit; | ||||||
|  |          retval |= PNG_INFO_pHYs; | ||||||
|  |       } | ||||||
|  |       if (res_y != NULL) | ||||||
|  |       { | ||||||
|  |          *res_y = info_ptr->y_pixels_per_unit; | ||||||
|  |          retval |= PNG_INFO_pHYs; | ||||||
|  |       } | ||||||
|  |       if (unit_type != NULL) | ||||||
|  |       { | ||||||
|  |          *unit_type = (int)info_ptr->phys_unit_type; | ||||||
|  |          retval |= PNG_INFO_pHYs; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |    return (retval); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette, | ||||||
|  |    int *num_palette) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE) | ||||||
|  |        && palette != NULL) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "PLTE"); | ||||||
|  |       *palette = info_ptr->palette; | ||||||
|  |       *num_palette = info_ptr->num_palette; | ||||||
|  |       png_debug1(3, "num_palette = %d\n", *num_palette); | ||||||
|  |       return (PNG_INFO_PLTE); | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #if defined(PNG_sBIT_SUPPORTED) | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT) | ||||||
|  |       && sig_bit != NULL) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "sBIT"); | ||||||
|  |       *sig_bit = &(info_ptr->sig_bit); | ||||||
|  |       return (PNG_INFO_sBIT); | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_TEXT_SUPPORTED) | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr, | ||||||
|  |    int *num_text) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", | ||||||
|  |          (png_ptr->chunk_name[0] == '\0' ? "text" | ||||||
|  |              : (png_const_charp)png_ptr->chunk_name)); | ||||||
|  |       if (text_ptr != NULL) | ||||||
|  |          *text_ptr = info_ptr->text; | ||||||
|  |       if (num_text != NULL) | ||||||
|  |          *num_text = info_ptr->num_text; | ||||||
|  |       return ((png_uint_32)info_ptr->num_text); | ||||||
|  |    } | ||||||
|  |    if (num_text != NULL) | ||||||
|  |      *num_text = 0; | ||||||
|  |    return(0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_tIME_SUPPORTED) | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME) | ||||||
|  |        && mod_time != NULL) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "tIME"); | ||||||
|  |       *mod_time = &(info_ptr->mod_time); | ||||||
|  |       return (PNG_INFO_tIME); | ||||||
|  |    } | ||||||
|  |    return (0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_tRNS_SUPPORTED) | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_tRNS(png_structp png_ptr, png_infop info_ptr, | ||||||
|  |    png_bytep *trans, int *num_trans, png_color_16p *trans_values) | ||||||
|  | { | ||||||
|  |    png_uint_32 retval = 0; | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) | ||||||
|  |    { | ||||||
|  |       png_debug1(1, "in %s retrieval function\n", "tRNS"); | ||||||
|  |       if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) | ||||||
|  |       { | ||||||
|  |           if (trans != NULL) | ||||||
|  |           { | ||||||
|  |              *trans = info_ptr->trans; | ||||||
|  |              retval |= PNG_INFO_tRNS; | ||||||
|  |           } | ||||||
|  |           if (trans_values != NULL) | ||||||
|  |              *trans_values = &(info_ptr->trans_values); | ||||||
|  |       } | ||||||
|  |       else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */ | ||||||
|  |       { | ||||||
|  |           if (trans_values != NULL) | ||||||
|  |           { | ||||||
|  |              *trans_values = &(info_ptr->trans_values); | ||||||
|  |              retval |= PNG_INFO_tRNS; | ||||||
|  |           } | ||||||
|  |           if(trans != NULL) | ||||||
|  |              *trans = NULL; | ||||||
|  |       } | ||||||
|  |       if(num_trans != NULL) | ||||||
|  |       { | ||||||
|  |          *num_trans = info_ptr->num_trans; | ||||||
|  |          retval |= PNG_INFO_tRNS; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |    return (retval); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_unknown_chunks(png_structp png_ptr, png_infop info_ptr, | ||||||
|  |              png_unknown_chunkpp unknowns) | ||||||
|  | { | ||||||
|  |    if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL) | ||||||
|  |      *unknowns = info_ptr->unknown_chunks; | ||||||
|  |    return ((png_uint_32)info_ptr->unknown_chunks_num); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) | ||||||
|  | png_byte PNGAPI | ||||||
|  | png_get_rgb_to_gray_status (png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    return (png_byte)(png_ptr? png_ptr->rgb_to_gray_status : 0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_USER_CHUNKS_SUPPORTED) | ||||||
|  | png_voidp PNGAPI | ||||||
|  | png_get_user_chunk_ptr(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    return (png_ptr? png_ptr->user_chunk_ptr : NULL); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_compression_buffer_size(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    return (png_uint_32)(png_ptr? png_ptr->zbuf_size : 0L); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifndef PNG_1_0_X | ||||||
|  | #ifdef PNG_ASSEMBLER_CODE_SUPPORTED | ||||||
|  | /* this function was added to libpng 1.2.0 and should exist by default */ | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_asm_flags (png_structp png_ptr) | ||||||
|  | { | ||||||
|  |     return (png_uint_32)(png_ptr? png_ptr->asm_flags : 0L); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* this function was added to libpng 1.2.0 and should exist by default */ | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_asm_flagmask (int flag_select) | ||||||
|  | { | ||||||
|  |     png_uint_32 settable_asm_flags = 0; | ||||||
|  |  | ||||||
|  |     if (flag_select & PNG_SELECT_READ) | ||||||
|  |         settable_asm_flags |= | ||||||
|  |           PNG_ASM_FLAG_MMX_READ_COMBINE_ROW  | | ||||||
|  |           PNG_ASM_FLAG_MMX_READ_INTERLACE    | | ||||||
|  |           PNG_ASM_FLAG_MMX_READ_FILTER_SUB   | | ||||||
|  |           PNG_ASM_FLAG_MMX_READ_FILTER_UP    | | ||||||
|  |           PNG_ASM_FLAG_MMX_READ_FILTER_AVG   | | ||||||
|  |           PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ; | ||||||
|  |           /* no non-MMX flags yet */ | ||||||
|  |  | ||||||
|  | #if 0 | ||||||
|  |     /* GRR:  no write-flags yet, either, but someday... */ | ||||||
|  |     if (flag_select & PNG_SELECT_WRITE) | ||||||
|  |         settable_asm_flags |= | ||||||
|  |           PNG_ASM_FLAG_MMX_WRITE_ [whatever] ; | ||||||
|  | #endif /* 0 */ | ||||||
|  |  | ||||||
|  |     return settable_asm_flags;  /* _theoretically_ settable capabilities only */ | ||||||
|  | } | ||||||
|  | #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) | ||||||
|  |     /* GRR:  could add this:   && defined(PNG_MMX_CODE_SUPPORTED) */ | ||||||
|  | /* this function was added to libpng 1.2.0 */ | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_mmx_flagmask (int flag_select, int *compilerID) | ||||||
|  | { | ||||||
|  |     png_uint_32 settable_mmx_flags = 0; | ||||||
|  |  | ||||||
|  |     if (flag_select & PNG_SELECT_READ) | ||||||
|  |         settable_mmx_flags |= | ||||||
|  |           PNG_ASM_FLAG_MMX_READ_COMBINE_ROW  | | ||||||
|  |           PNG_ASM_FLAG_MMX_READ_INTERLACE    | | ||||||
|  |           PNG_ASM_FLAG_MMX_READ_FILTER_SUB   | | ||||||
|  |           PNG_ASM_FLAG_MMX_READ_FILTER_UP    | | ||||||
|  |           PNG_ASM_FLAG_MMX_READ_FILTER_AVG   | | ||||||
|  |           PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ; | ||||||
|  | #if 0 | ||||||
|  |     /* GRR:  no MMX write support yet, but someday... */ | ||||||
|  |     if (flag_select & PNG_SELECT_WRITE) | ||||||
|  |         settable_mmx_flags |= | ||||||
|  |           PNG_ASM_FLAG_MMX_WRITE_ [whatever] ; | ||||||
|  | #endif /* 0 */ | ||||||
|  |  | ||||||
|  |     if (compilerID != NULL) { | ||||||
|  | #ifdef PNG_USE_PNGVCRD | ||||||
|  |         *compilerID = 1;    /* MSVC */ | ||||||
|  | #else | ||||||
|  | #ifdef PNG_USE_PNGGCCRD | ||||||
|  |         *compilerID = 2;    /* gcc/gas */ | ||||||
|  | #else | ||||||
|  |         *compilerID = -1;   /* unknown (i.e., no asm/MMX code compiled) */ | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return settable_mmx_flags;  /* _theoretically_ settable capabilities only */ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* this function was added to libpng 1.2.0 */ | ||||||
|  | png_byte PNGAPI | ||||||
|  | png_get_mmx_bitdepth_threshold (png_structp png_ptr) | ||||||
|  | { | ||||||
|  |     return (png_byte)(png_ptr? png_ptr->mmx_bitdepth_threshold : 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* this function was added to libpng 1.2.0 */ | ||||||
|  | png_uint_32 PNGAPI | ||||||
|  | png_get_mmx_rowbytes_threshold (png_structp png_ptr) | ||||||
|  | { | ||||||
|  |     return (png_uint_32)(png_ptr? png_ptr->mmx_rowbytes_threshold : 0L); | ||||||
|  | } | ||||||
|  | #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ | ||||||
|  | #endif /* PNG_1_0_X */ | ||||||
							
								
								
									
										566
									
								
								runtime/libpng/pngmem.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,566 @@ | |||||||
|  |  | ||||||
|  | /* pngmem.c - stub functions for memory allocation | ||||||
|  |  * | ||||||
|  |  * libpng 1.2.5 - October 3, 2002 | ||||||
|  |  * For conditions of distribution and use, see copyright notice in png.h | ||||||
|  |  * Copyright (c) 1998-2002 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.) | ||||||
|  |  * | ||||||
|  |  * This file provides a location for all memory allocation.  Users who | ||||||
|  |  * need special memory handling are expected to supply replacement | ||||||
|  |  * functions for png_malloc() and png_free(), and to use | ||||||
|  |  * png_create_read_struct_2() and png_create_write_struct_2() to | ||||||
|  |  * identify the replacement functions. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define PNG_INTERNAL | ||||||
|  | #include "png.h" | ||||||
|  |  | ||||||
|  | /* Borland DOS special memory handler */ | ||||||
|  | #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) | ||||||
|  | /* if you change this, be sure to change the one in png.h also */ | ||||||
|  |  | ||||||
|  | /* Allocate memory for a png_struct.  The malloc and memset can be replaced | ||||||
|  |    by a single call to calloc() if this is thought to improve performance. */ | ||||||
|  | png_voidp /* PRIVATE */ | ||||||
|  | png_create_struct(int type) | ||||||
|  | { | ||||||
|  | #ifdef PNG_USER_MEM_SUPPORTED | ||||||
|  |    return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Alternate version of png_create_struct, for use with user-defined malloc. */ | ||||||
|  | png_voidp /* PRIVATE */ | ||||||
|  | png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) | ||||||
|  | { | ||||||
|  | #endif /* PNG_USER_MEM_SUPPORTED */ | ||||||
|  |    png_size_t size; | ||||||
|  |    png_voidp struct_ptr; | ||||||
|  |  | ||||||
|  |    if (type == PNG_STRUCT_INFO) | ||||||
|  |      size = sizeof(png_info); | ||||||
|  |    else if (type == PNG_STRUCT_PNG) | ||||||
|  |      size = sizeof(png_struct); | ||||||
|  |    else | ||||||
|  |      return (png_get_copyright()); | ||||||
|  |  | ||||||
|  | #ifdef PNG_USER_MEM_SUPPORTED | ||||||
|  |    if(malloc_fn != NULL) | ||||||
|  |    { | ||||||
|  |       png_struct dummy_struct; | ||||||
|  |       png_structp png_ptr = &dummy_struct; | ||||||
|  |       png_ptr->mem_ptr=mem_ptr; | ||||||
|  |       struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size); | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  | #endif /* PNG_USER_MEM_SUPPORTED */ | ||||||
|  |       struct_ptr = (png_voidp)farmalloc(size)); | ||||||
|  |    if (struct_ptr != NULL) | ||||||
|  |       png_memset(struct_ptr, 0, size); | ||||||
|  |    return (struct_ptr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Free memory allocated by a png_create_struct() call */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_destroy_struct(png_voidp struct_ptr) | ||||||
|  | { | ||||||
|  | #ifdef PNG_USER_MEM_SUPPORTED | ||||||
|  |    png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Free memory allocated by a png_create_struct() call */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, | ||||||
|  |     png_voidp mem_ptr) | ||||||
|  | { | ||||||
|  | #endif | ||||||
|  |    if (struct_ptr != NULL) | ||||||
|  |    { | ||||||
|  | #ifdef PNG_USER_MEM_SUPPORTED | ||||||
|  |       if(free_fn != NULL) | ||||||
|  |       { | ||||||
|  |          png_struct dummy_struct; | ||||||
|  |          png_structp png_ptr = &dummy_struct; | ||||||
|  |          png_ptr->mem_ptr=mem_ptr; | ||||||
|  |          (*(free_fn))(png_ptr, struct_ptr); | ||||||
|  |          return; | ||||||
|  |       } | ||||||
|  | #endif /* PNG_USER_MEM_SUPPORTED */ | ||||||
|  |       farfree (struct_ptr); | ||||||
|  |    } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Allocate memory.  For reasonable files, size should never exceed | ||||||
|  |  * 64K.  However, zlib may allocate more then 64K if you don't tell | ||||||
|  |  * it not to.  See zconf.h and png.h for more information. zlib does | ||||||
|  |  * need to allocate exactly 64K, so whatever you call here must | ||||||
|  |  * have the ability to do that. | ||||||
|  |  * | ||||||
|  |  * Borland seems to have a problem in DOS mode for exactly 64K. | ||||||
|  |  * It gives you a segment with an offset of 8 (perhaps to store its | ||||||
|  |  * memory stuff).  zlib doesn't like this at all, so we have to | ||||||
|  |  * detect and deal with it.  This code should not be needed in | ||||||
|  |  * Windows or OS/2 modes, and only in 16 bit mode.  This code has | ||||||
|  |  * been updated by Alexander Lehmann for version 0.89 to waste less | ||||||
|  |  * memory. | ||||||
|  |  * | ||||||
|  |  * Note that we can't use png_size_t for the "size" declaration, | ||||||
|  |  * since on some systems a png_size_t is a 16-bit quantity, and as a | ||||||
|  |  * result, we would be truncating potentially larger memory requests | ||||||
|  |  * (which should cause a fatal error) and introducing major problems. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | png_voidp PNGAPI | ||||||
|  | png_malloc(png_structp png_ptr, png_uint_32 size) | ||||||
|  | { | ||||||
|  |    png_voidp ret; | ||||||
|  |  | ||||||
|  |    if (png_ptr == NULL || size == 0) | ||||||
|  |       return (NULL); | ||||||
|  |  | ||||||
|  | #ifdef PNG_USER_MEM_SUPPORTED | ||||||
|  |    if(png_ptr->malloc_fn != NULL) | ||||||
|  |    { | ||||||
|  |        ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); | ||||||
|  |        if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) | ||||||
|  |           png_error(png_ptr, "Out of memory!"); | ||||||
|  |        return (ret); | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |        return png_malloc_default(png_ptr, size); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_voidp PNGAPI | ||||||
|  | png_malloc_default(png_structp png_ptr, png_uint_32 size) | ||||||
|  | { | ||||||
|  |    png_voidp ret; | ||||||
|  | #endif /* PNG_USER_MEM_SUPPORTED */ | ||||||
|  |  | ||||||
|  | #ifdef PNG_MAX_MALLOC_64K | ||||||
|  |    if (size > (png_uint_32)65536L) | ||||||
|  |       png_error(png_ptr, "Cannot Allocate > 64K"); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |    if (size == (png_uint_32)65536L) | ||||||
|  |    { | ||||||
|  |       if (png_ptr->offset_table == NULL) | ||||||
|  |       { | ||||||
|  |          /* try to see if we need to do any of this fancy stuff */ | ||||||
|  |          ret = farmalloc(size); | ||||||
|  |          if (ret == NULL || ((png_size_t)ret & 0xffff)) | ||||||
|  |          { | ||||||
|  |             int num_blocks; | ||||||
|  |             png_uint_32 total_size; | ||||||
|  |             png_bytep table; | ||||||
|  |             int i; | ||||||
|  |             png_byte huge * hptr; | ||||||
|  |  | ||||||
|  |             if (ret != NULL) | ||||||
|  |             { | ||||||
|  |                farfree(ret); | ||||||
|  |                ret = NULL; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if(png_ptr->zlib_window_bits > 14) | ||||||
|  |                num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14)); | ||||||
|  |             else | ||||||
|  |                num_blocks = 1; | ||||||
|  |             if (png_ptr->zlib_mem_level >= 7) | ||||||
|  |                num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7)); | ||||||
|  |             else | ||||||
|  |                num_blocks++; | ||||||
|  |  | ||||||
|  |             total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16; | ||||||
|  |  | ||||||
|  |             table = farmalloc(total_size); | ||||||
|  |  | ||||||
|  |             if (table == NULL) | ||||||
|  |             { | ||||||
|  |                if (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) | ||||||
|  |                   png_error(png_ptr, "Out Of Memory."); /* Note "O" and "M" */ | ||||||
|  |                else | ||||||
|  |                   png_warning(png_ptr, "Out Of Memory."); | ||||||
|  |                return (NULL); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if ((png_size_t)table & 0xfff0) | ||||||
|  |             { | ||||||
|  |                if (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) | ||||||
|  |                   png_error(png_ptr, | ||||||
|  |                     "Farmalloc didn't return normalized pointer"); | ||||||
|  |                else | ||||||
|  |                   png_warning(png_ptr, | ||||||
|  |                     "Farmalloc didn't return normalized pointer"); | ||||||
|  |                return (NULL); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             png_ptr->offset_table = table; | ||||||
|  |             png_ptr->offset_table_ptr = farmalloc(num_blocks * | ||||||
|  |                sizeof (png_bytep)); | ||||||
|  |  | ||||||
|  |             if (png_ptr->offset_table_ptr == NULL) | ||||||
|  |             { | ||||||
|  |                if (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) | ||||||
|  |                   png_error(png_ptr, "Out Of memory."); /* Note "O" and "M" */ | ||||||
|  |                else | ||||||
|  |                   png_warning(png_ptr, "Out Of memory."); | ||||||
|  |                return (NULL); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             hptr = (png_byte huge *)table; | ||||||
|  |             if ((png_size_t)hptr & 0xf) | ||||||
|  |             { | ||||||
|  |                hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L); | ||||||
|  |                hptr = hptr + 16L;  /* "hptr += 16L" fails on Turbo C++ 3.0 */ | ||||||
|  |             } | ||||||
|  |             for (i = 0; i < num_blocks; i++) | ||||||
|  |             { | ||||||
|  |                png_ptr->offset_table_ptr[i] = (png_bytep)hptr; | ||||||
|  |                hptr = hptr + (png_uint_32)65536L;  /* "+=" fails on TC++3.0 */ | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             png_ptr->offset_table_number = num_blocks; | ||||||
|  |             png_ptr->offset_table_count = 0; | ||||||
|  |             png_ptr->offset_table_count_free = 0; | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       if (png_ptr->offset_table_count >= png_ptr->offset_table_number) | ||||||
|  |       { | ||||||
|  |          if (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) | ||||||
|  |             png_error(png_ptr, "Out of Memory."); /* Note "o" and "M" */ | ||||||
|  |          else | ||||||
|  |             png_warning(png_ptr, "Out of Memory."); | ||||||
|  |          return (NULL); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++]; | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |       ret = farmalloc(size); | ||||||
|  |  | ||||||
|  |    if (ret == NULL) | ||||||
|  |    { | ||||||
|  |       if (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) | ||||||
|  |          png_error(png_ptr, "Out of memory."); /* Note "o" and "m" */ | ||||||
|  |       else | ||||||
|  |          png_warning(png_ptr, "Out of memory."); /* Note "o" and "m" */ | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    return (ret); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* free a pointer allocated by png_malloc().  In the default | ||||||
|  |    configuration, png_ptr is not used, but is passed in case it | ||||||
|  |    is needed.  If ptr is NULL, return without taking any action. */ | ||||||
|  | void PNGAPI | ||||||
|  | png_free(png_structp png_ptr, png_voidp ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr == NULL || ptr == NULL) | ||||||
|  |       return; | ||||||
|  |  | ||||||
|  | #ifdef PNG_USER_MEM_SUPPORTED | ||||||
|  |    if (png_ptr->free_fn != NULL) | ||||||
|  |    { | ||||||
|  |       (*(png_ptr->free_fn))(png_ptr, ptr); | ||||||
|  |       return; | ||||||
|  |    } | ||||||
|  |    else png_free_default(png_ptr, ptr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void PNGAPI | ||||||
|  | png_free_default(png_structp png_ptr, png_voidp ptr) | ||||||
|  | { | ||||||
|  | #endif /* PNG_USER_MEM_SUPPORTED */ | ||||||
|  |  | ||||||
|  |    if (png_ptr->offset_table != NULL) | ||||||
|  |    { | ||||||
|  |       int i; | ||||||
|  |  | ||||||
|  |       for (i = 0; i < png_ptr->offset_table_count; i++) | ||||||
|  |       { | ||||||
|  |          if (ptr == png_ptr->offset_table_ptr[i]) | ||||||
|  |          { | ||||||
|  |             ptr = NULL; | ||||||
|  |             png_ptr->offset_table_count_free++; | ||||||
|  |             break; | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |       if (png_ptr->offset_table_count_free == png_ptr->offset_table_count) | ||||||
|  |       { | ||||||
|  |          farfree(png_ptr->offset_table); | ||||||
|  |          farfree(png_ptr->offset_table_ptr); | ||||||
|  |          png_ptr->offset_table = NULL; | ||||||
|  |          png_ptr->offset_table_ptr = NULL; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    if (ptr != NULL) | ||||||
|  |    { | ||||||
|  |       farfree(ptr); | ||||||
|  |    } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #else /* Not the Borland DOS special memory handler */ | ||||||
|  |  | ||||||
|  | /* Allocate memory for a png_struct or a png_info.  The malloc and | ||||||
|  |    memset can be replaced by a single call to calloc() if this is thought | ||||||
|  |    to improve performance noticably. */ | ||||||
|  | png_voidp /* PRIVATE */ | ||||||
|  | png_create_struct(int type) | ||||||
|  | { | ||||||
|  | #ifdef PNG_USER_MEM_SUPPORTED | ||||||
|  |    return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Allocate memory for a png_struct or a png_info.  The malloc and | ||||||
|  |    memset can be replaced by a single call to calloc() if this is thought | ||||||
|  |    to improve performance noticably. */ | ||||||
|  | png_voidp /* PRIVATE */ | ||||||
|  | png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) | ||||||
|  | { | ||||||
|  | #endif /* PNG_USER_MEM_SUPPORTED */ | ||||||
|  |    png_size_t size; | ||||||
|  |    png_voidp struct_ptr; | ||||||
|  |  | ||||||
|  |    if (type == PNG_STRUCT_INFO) | ||||||
|  |       size = sizeof(png_info); | ||||||
|  |    else if (type == PNG_STRUCT_PNG) | ||||||
|  |       size = sizeof(png_struct); | ||||||
|  |    else | ||||||
|  |       return (NULL); | ||||||
|  |  | ||||||
|  | #ifdef PNG_USER_MEM_SUPPORTED | ||||||
|  |    if(malloc_fn != NULL) | ||||||
|  |    { | ||||||
|  |       png_struct dummy_struct; | ||||||
|  |       png_structp png_ptr = &dummy_struct; | ||||||
|  |       png_ptr->mem_ptr=mem_ptr; | ||||||
|  |       struct_ptr = (*(malloc_fn))(png_ptr, size); | ||||||
|  |       if (struct_ptr != NULL) | ||||||
|  |          png_memset(struct_ptr, 0, size); | ||||||
|  |       return (struct_ptr); | ||||||
|  |    } | ||||||
|  | #endif /* PNG_USER_MEM_SUPPORTED */ | ||||||
|  |  | ||||||
|  | #if defined(__TURBOC__) && !defined(__FLAT__) | ||||||
|  |    if ((struct_ptr = (png_voidp)farmalloc(size)) != NULL) | ||||||
|  | #else | ||||||
|  | # if defined(_MSC_VER) && defined(MAXSEG_64K) | ||||||
|  |    if ((struct_ptr = (png_voidp)halloc(size,1)) != NULL) | ||||||
|  | # else | ||||||
|  |    if ((struct_ptr = (png_voidp)malloc(size)) != NULL) | ||||||
|  | # endif | ||||||
|  | #endif | ||||||
|  |    { | ||||||
|  |       png_memset(struct_ptr, 0, size); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    return (struct_ptr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* Free memory allocated by a png_create_struct() call */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_destroy_struct(png_voidp struct_ptr) | ||||||
|  | { | ||||||
|  | #ifdef PNG_USER_MEM_SUPPORTED | ||||||
|  |    png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Free memory allocated by a png_create_struct() call */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, | ||||||
|  |     png_voidp mem_ptr) | ||||||
|  | { | ||||||
|  | #endif /* PNG_USER_MEM_SUPPORTED */ | ||||||
|  |    if (struct_ptr != NULL) | ||||||
|  |    { | ||||||
|  | #ifdef PNG_USER_MEM_SUPPORTED | ||||||
|  |       if(free_fn != NULL) | ||||||
|  |       { | ||||||
|  |          png_struct dummy_struct; | ||||||
|  |          png_structp png_ptr = &dummy_struct; | ||||||
|  |          png_ptr->mem_ptr=mem_ptr; | ||||||
|  |          (*(free_fn))(png_ptr, struct_ptr); | ||||||
|  |          return; | ||||||
|  |       } | ||||||
|  | #endif /* PNG_USER_MEM_SUPPORTED */ | ||||||
|  | #if defined(__TURBOC__) && !defined(__FLAT__) | ||||||
|  |       farfree(struct_ptr); | ||||||
|  | #else | ||||||
|  | # if defined(_MSC_VER) && defined(MAXSEG_64K) | ||||||
|  |       hfree(struct_ptr); | ||||||
|  | # else | ||||||
|  |       free(struct_ptr); | ||||||
|  | # endif | ||||||
|  | #endif | ||||||
|  |    } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Allocate memory.  For reasonable files, size should never exceed | ||||||
|  |    64K.  However, zlib may allocate more then 64K if you don't tell | ||||||
|  |    it not to.  See zconf.h and png.h for more information.  zlib does | ||||||
|  |    need to allocate exactly 64K, so whatever you call here must | ||||||
|  |    have the ability to do that. */ | ||||||
|  |  | ||||||
|  | png_voidp PNGAPI | ||||||
|  | png_malloc(png_structp png_ptr, png_uint_32 size) | ||||||
|  | { | ||||||
|  |    png_voidp ret; | ||||||
|  |  | ||||||
|  |    if (png_ptr == NULL || size == 0) | ||||||
|  |       return (NULL); | ||||||
|  |  | ||||||
|  | #ifdef PNG_USER_MEM_SUPPORTED | ||||||
|  |    if(png_ptr->malloc_fn != NULL) | ||||||
|  |    { | ||||||
|  |        ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); | ||||||
|  |        if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) | ||||||
|  |           png_error(png_ptr, "Out of Memory!"); | ||||||
|  |        return (ret); | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |        return (png_malloc_default(png_ptr, size)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_voidp PNGAPI | ||||||
|  | png_malloc_default(png_structp png_ptr, png_uint_32 size) | ||||||
|  | { | ||||||
|  |    png_voidp ret; | ||||||
|  | #endif /* PNG_USER_MEM_SUPPORTED */ | ||||||
|  |  | ||||||
|  | #ifdef PNG_MAX_MALLOC_64K | ||||||
|  |    if (size > (png_uint_32)65536L) | ||||||
|  |    { | ||||||
|  |       if(png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) | ||||||
|  |          png_error(png_ptr, "Cannot Allocate > 64K"); | ||||||
|  |       else | ||||||
|  |          return NULL; | ||||||
|  |    } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(__TURBOC__) && !defined(__FLAT__) | ||||||
|  |    ret = farmalloc(size); | ||||||
|  | #else | ||||||
|  | # if defined(_MSC_VER) && defined(MAXSEG_64K) | ||||||
|  |    ret = halloc(size, 1); | ||||||
|  | # else | ||||||
|  |    ret = malloc((size_t)size); | ||||||
|  | # endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |    if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) | ||||||
|  |       png_error(png_ptr, "Out of Memory"); | ||||||
|  |  | ||||||
|  |    return (ret); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Free a pointer allocated by png_malloc().  If ptr is NULL, return | ||||||
|  |    without taking any action. */ | ||||||
|  | void PNGAPI | ||||||
|  | png_free(png_structp png_ptr, png_voidp ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr == NULL || ptr == NULL) | ||||||
|  |       return; | ||||||
|  |  | ||||||
|  | #ifdef PNG_USER_MEM_SUPPORTED | ||||||
|  |    if (png_ptr->free_fn != NULL) | ||||||
|  |    { | ||||||
|  |       (*(png_ptr->free_fn))(png_ptr, ptr); | ||||||
|  |       return; | ||||||
|  |    } | ||||||
|  |    else png_free_default(png_ptr, ptr); | ||||||
|  | } | ||||||
|  | void PNGAPI | ||||||
|  | png_free_default(png_structp png_ptr, png_voidp ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr == NULL || ptr == NULL) | ||||||
|  |       return; | ||||||
|  |  | ||||||
|  | #endif /* PNG_USER_MEM_SUPPORTED */ | ||||||
|  |  | ||||||
|  | #if defined(__TURBOC__) && !defined(__FLAT__) | ||||||
|  |    farfree(ptr); | ||||||
|  | #else | ||||||
|  | # if defined(_MSC_VER) && defined(MAXSEG_64K) | ||||||
|  |    hfree(ptr); | ||||||
|  | # else | ||||||
|  |    free(ptr); | ||||||
|  | # endif | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif /* Not Borland DOS special memory handler */ | ||||||
|  |  | ||||||
|  | #if defined(PNG_1_0_X) | ||||||
|  | #  define png_malloc_warn png_malloc | ||||||
|  | #else | ||||||
|  | /* This function was added at libpng version 1.2.3.  The png_malloc_warn() | ||||||
|  |  * function will issue a png_warning and return NULL instead of issuing a | ||||||
|  |  * png_error, if it fails to allocate the requested memory. | ||||||
|  |  */ | ||||||
|  | png_voidp PNGAPI | ||||||
|  | png_malloc_warn(png_structp png_ptr, png_uint_32 size) | ||||||
|  | { | ||||||
|  |    png_voidp ptr; | ||||||
|  |    png_uint_32 save_flags=png_ptr->flags; | ||||||
|  |  | ||||||
|  |    png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; | ||||||
|  |    ptr = (png_voidp)png_malloc((png_structp)png_ptr, size); | ||||||
|  |    png_ptr->flags=save_flags; | ||||||
|  |    return(ptr); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | png_voidp PNGAPI | ||||||
|  | png_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2, | ||||||
|  |    png_uint_32 length) | ||||||
|  | { | ||||||
|  |    png_size_t size; | ||||||
|  |  | ||||||
|  |    size = (png_size_t)length; | ||||||
|  |    if ((png_uint_32)size != length) | ||||||
|  |       png_error(png_ptr,"Overflow in png_memcpy_check."); | ||||||
|  |  | ||||||
|  |    return(png_memcpy (s1, s2, size)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | png_voidp PNGAPI | ||||||
|  | png_memset_check (png_structp png_ptr, png_voidp s1, int value, | ||||||
|  |    png_uint_32 length) | ||||||
|  | { | ||||||
|  |    png_size_t size; | ||||||
|  |  | ||||||
|  |    size = (png_size_t)length; | ||||||
|  |    if ((png_uint_32)size != length) | ||||||
|  |       png_error(png_ptr,"Overflow in png_memset_check."); | ||||||
|  |  | ||||||
|  |    return (png_memset (s1, value, size)); | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #ifdef PNG_USER_MEM_SUPPORTED | ||||||
|  | /* This function is called when the application wants to use another method | ||||||
|  |  * of allocating and freeing memory. | ||||||
|  |  */ | ||||||
|  | void PNGAPI | ||||||
|  | png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr | ||||||
|  |   malloc_fn, png_free_ptr free_fn) | ||||||
|  | { | ||||||
|  |    png_ptr->mem_ptr = mem_ptr; | ||||||
|  |    png_ptr->malloc_fn = malloc_fn; | ||||||
|  |    png_ptr->free_fn = free_fn; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* This function returns a pointer to the mem_ptr associated with the user | ||||||
|  |  * functions.  The application should free any memory associated with this | ||||||
|  |  * pointer before png_write_destroy and png_read_destroy are called. | ||||||
|  |  */ | ||||||
|  | png_voidp PNGAPI | ||||||
|  | png_get_mem_ptr(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    return ((png_voidp)png_ptr->mem_ptr); | ||||||
|  | } | ||||||
|  | #endif /* PNG_USER_MEM_SUPPORTED */ | ||||||
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/pngnow.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.0 KiB | 
							
								
								
									
										1543
									
								
								runtime/libpng/pngpread.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1424
									
								
								runtime/libpng/pngread.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										161
									
								
								runtime/libpng/pngrio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,161 @@ | |||||||
|  |  | ||||||
|  | /* pngrio.c - functions for data input | ||||||
|  |  * | ||||||
|  |  * libpng 1.2.5 - October 3, 2002 | ||||||
|  |  * For conditions of distribution and use, see copyright notice in png.h | ||||||
|  |  * Copyright (c) 1998-2002 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.) | ||||||
|  |  * | ||||||
|  |  * This file provides a location for all input.  Users who need | ||||||
|  |  * special handling are expected to write a function that has the same | ||||||
|  |  * arguments as this and performs a similar function, but that possibly | ||||||
|  |  * has a different input method.  Note that you shouldn't change this | ||||||
|  |  * function, but rather write a replacement function and then make | ||||||
|  |  * libpng use it at run time with png_set_read_fn(...). | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define PNG_INTERNAL | ||||||
|  | #include "png.h" | ||||||
|  |  | ||||||
|  | /* Read the data from whatever input you are using.  The default routine | ||||||
|  |    reads from a file pointer.  Note that this routine sometimes gets called | ||||||
|  |    with very small lengths, so you should implement some kind of simple | ||||||
|  |    buffering if you are using unbuffered reads.  This should never be asked | ||||||
|  |    to read more then 64K on a 16 bit machine. */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_read_data(png_structp png_ptr, png_bytep data, png_size_t length) | ||||||
|  | { | ||||||
|  |    png_debug1(4,"reading %d bytes\n", (int)length); | ||||||
|  |    if (png_ptr->read_data_fn != NULL) | ||||||
|  |       (*(png_ptr->read_data_fn))(png_ptr, data, length); | ||||||
|  |    else | ||||||
|  |       png_error(png_ptr, "Call to NULL read function"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #if !defined(PNG_NO_STDIO) | ||||||
|  | /* This is the function that does the actual reading of data.  If you are | ||||||
|  |    not reading from a standard C stream, you should create a replacement | ||||||
|  |    read_data function and use it at run time with png_set_read_fn(), rather | ||||||
|  |    than changing the library. */ | ||||||
|  | #ifndef USE_FAR_KEYWORD | ||||||
|  | void PNGAPI | ||||||
|  | png_default_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. | ||||||
|  |     */ | ||||||
|  | #if defined(_WIN32_WCE) | ||||||
|  |    if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) | ||||||
|  |       check = 0; | ||||||
|  | #else | ||||||
|  |    check = (png_size_t)fread(data, (png_size_t)1, length, | ||||||
|  |       (png_FILE_p)png_ptr->io_ptr); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |    if (check != length) | ||||||
|  |       png_error(png_ptr, "Read Error"); | ||||||
|  | } | ||||||
|  | #else | ||||||
|  | /* this is the model-independent version. Since the standard I/O library | ||||||
|  |    can't handle far buffers in the medium and small models, we have to copy | ||||||
|  |    the data. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | #define NEAR_BUF_SIZE 1024 | ||||||
|  | #define MIN(a,b) (a <= b ? a : b) | ||||||
|  |  | ||||||
|  | static void /* PRIVATE */ | ||||||
|  | png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) | ||||||
|  | { | ||||||
|  |    int check; | ||||||
|  |    png_byte *n_data; | ||||||
|  |    png_FILE_p io_ptr; | ||||||
|  |  | ||||||
|  |    /* Check if data really is near. If so, use usual code. */ | ||||||
|  |    n_data = (png_byte *)CVT_PTR_NOCHECK(data); | ||||||
|  |    io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); | ||||||
|  |    if ((png_bytep)n_data == data) | ||||||
|  |    { | ||||||
|  | #if defined(_WIN32_WCE) | ||||||
|  |       if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) | ||||||
|  |          check = 0; | ||||||
|  | #else | ||||||
|  |       check = fread(n_data, 1, length, io_ptr); | ||||||
|  | #endif | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       png_byte buf[NEAR_BUF_SIZE]; | ||||||
|  |       png_size_t read, remaining, err; | ||||||
|  |       check = 0; | ||||||
|  |       remaining = length; | ||||||
|  |       do | ||||||
|  |       { | ||||||
|  |          read = MIN(NEAR_BUF_SIZE, remaining); | ||||||
|  | #if defined(_WIN32_WCE) | ||||||
|  |          if ( !ReadFile((HANDLE)(io_ptr), buf, read, &err, NULL) ) | ||||||
|  |             err = 0; | ||||||
|  | #else | ||||||
|  |          err = fread(buf, (png_size_t)1, read, io_ptr); | ||||||
|  | #endif | ||||||
|  |          png_memcpy(data, buf, read); /* copy far buffer to near buffer */ | ||||||
|  |          if(err != read) | ||||||
|  |             break; | ||||||
|  |          else | ||||||
|  |             check += err; | ||||||
|  |          data += read; | ||||||
|  |          remaining -= read; | ||||||
|  |       } | ||||||
|  |       while (remaining != 0); | ||||||
|  |    } | ||||||
|  |    if ((png_uint_32)check != (png_uint_32)length) | ||||||
|  |       png_error(png_ptr, "read Error"); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* This function allows the application to supply a new input function | ||||||
|  |    for libpng if standard C streams aren't being used. | ||||||
|  |  | ||||||
|  |    This function takes as its arguments: | ||||||
|  |    png_ptr      - pointer to a png input data structure | ||||||
|  |    io_ptr       - pointer to user supplied structure containing info about | ||||||
|  |                   the input functions.  May be NULL. | ||||||
|  |    read_data_fn - pointer to a new input function that takes as its | ||||||
|  |                   arguments a pointer to a png_struct, a pointer to | ||||||
|  |                   a location where input data can be stored, and a 32-bit | ||||||
|  |                   unsigned int that is the number of bytes to be read. | ||||||
|  |                   To exit and output any fatal error messages the new write | ||||||
|  |                   function should call png_error(png_ptr, "Error msg"). */ | ||||||
|  | void PNGAPI | ||||||
|  | png_set_read_fn(png_structp png_ptr, png_voidp io_ptr, | ||||||
|  |    png_rw_ptr read_data_fn) | ||||||
|  | { | ||||||
|  |    png_ptr->io_ptr = io_ptr; | ||||||
|  |  | ||||||
|  | #if !defined(PNG_NO_STDIO) | ||||||
|  |    if (read_data_fn != NULL) | ||||||
|  |       png_ptr->read_data_fn = read_data_fn; | ||||||
|  |    else | ||||||
|  |       png_ptr->read_data_fn = png_default_read_data; | ||||||
|  | #else | ||||||
|  |    png_ptr->read_data_fn = read_data_fn; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |    /* It is an error to write to a read device */ | ||||||
|  |    if (png_ptr->write_data_fn != NULL) | ||||||
|  |    { | ||||||
|  |       png_ptr->write_data_fn = NULL; | ||||||
|  |       png_warning(png_ptr, | ||||||
|  |          "It's an error to set both read_data_fn and write_data_fn in the "); | ||||||
|  |       png_warning(png_ptr, | ||||||
|  |          "same structure.  Resetting write_data_fn to NULL."); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  | #if defined(PNG_WRITE_FLUSH_SUPPORTED) | ||||||
|  |    png_ptr->output_flush_fn = NULL; | ||||||
|  | #endif | ||||||
|  | } | ||||||
							
								
								
									
										4175
									
								
								runtime/libpng/pngrtran.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										3101
									
								
								runtime/libpng/pngrutil.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1160
									
								
								runtime/libpng/pngset.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1541
									
								
								runtime/libpng/pngtest.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								runtime/libpng/pngtest.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 8.4 KiB | 
							
								
								
									
										640
									
								
								runtime/libpng/pngtrans.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,640 @@ | |||||||
|  |  | ||||||
|  | /* pngtrans.c - transforms the data in a row (used by both readers and writers) | ||||||
|  |  * | ||||||
|  |  * libpng 1.2.5 - October 3, 2002 | ||||||
|  |  * For conditions of distribution and use, see copyright notice in png.h | ||||||
|  |  * Copyright (c) 1998-2002 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.) | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define PNG_INTERNAL | ||||||
|  | #include "png.h" | ||||||
|  |  | ||||||
|  | #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) | ||||||
|  | /* turn on BGR-to-RGB mapping */ | ||||||
|  | void PNGAPI | ||||||
|  | png_set_bgr(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_set_bgr\n"); | ||||||
|  |    png_ptr->transformations |= PNG_BGR; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) | ||||||
|  | /* turn on 16 bit byte swapping */ | ||||||
|  | void PNGAPI | ||||||
|  | png_set_swap(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_set_swap\n"); | ||||||
|  |    if (png_ptr->bit_depth == 16) | ||||||
|  |       png_ptr->transformations |= PNG_SWAP_BYTES; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) | ||||||
|  | /* turn on pixel packing */ | ||||||
|  | void PNGAPI | ||||||
|  | png_set_packing(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_set_packing\n"); | ||||||
|  |    if (png_ptr->bit_depth < 8) | ||||||
|  |    { | ||||||
|  |       png_ptr->transformations |= PNG_PACK; | ||||||
|  |       png_ptr->usr_bit_depth = 8; | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) | ||||||
|  | /* turn on packed pixel swapping */ | ||||||
|  | void PNGAPI | ||||||
|  | png_set_packswap(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_set_packswap\n"); | ||||||
|  |    if (png_ptr->bit_depth < 8) | ||||||
|  |       png_ptr->transformations |= PNG_PACKSWAP; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) | ||||||
|  | void PNGAPI | ||||||
|  | png_set_shift(png_structp png_ptr, png_color_8p true_bits) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_set_shift\n"); | ||||||
|  |    png_ptr->transformations |= PNG_SHIFT; | ||||||
|  |    png_ptr->shift = *true_bits; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_READ_INTERLACING_SUPPORTED) || \ | ||||||
|  |     defined(PNG_WRITE_INTERLACING_SUPPORTED) | ||||||
|  | int PNGAPI | ||||||
|  | png_set_interlace_handling(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_set_interlace handling\n"); | ||||||
|  |    if (png_ptr->interlaced) | ||||||
|  |    { | ||||||
|  |       png_ptr->transformations |= PNG_INTERLACE; | ||||||
|  |       return (7); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    return (1); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) | ||||||
|  | /* Add a filler byte on read, or remove a filler or alpha byte on write. | ||||||
|  |  * The filler type has changed in v0.95 to allow future 2-byte fillers | ||||||
|  |  * for 48-bit input data, as well as to avoid problems with some compilers | ||||||
|  |  * that don't like bytes as parameters. | ||||||
|  |  */ | ||||||
|  | void PNGAPI | ||||||
|  | png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_set_filler\n"); | ||||||
|  |    png_ptr->transformations |= PNG_FILLER; | ||||||
|  |    png_ptr->filler = (png_byte)filler; | ||||||
|  |    if (filler_loc == PNG_FILLER_AFTER) | ||||||
|  |       png_ptr->flags |= PNG_FLAG_FILLER_AFTER; | ||||||
|  |    else | ||||||
|  |       png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER; | ||||||
|  |  | ||||||
|  |    /* This should probably go in the "do_filler" routine. | ||||||
|  |     * I attempted to do that in libpng-1.0.1a but that caused problems | ||||||
|  |     * so I restored it in libpng-1.0.2a | ||||||
|  |    */ | ||||||
|  |  | ||||||
|  |    if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) | ||||||
|  |    { | ||||||
|  |       png_ptr->usr_channels = 4; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    /* Also I added this in libpng-1.0.2a (what happens when we expand | ||||||
|  |     * a less-than-8-bit grayscale to GA? */ | ||||||
|  |  | ||||||
|  |    if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8) | ||||||
|  |    { | ||||||
|  |       png_ptr->usr_channels = 2; | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ | ||||||
|  |     defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) | ||||||
|  | void PNGAPI | ||||||
|  | png_set_swap_alpha(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_set_swap_alpha\n"); | ||||||
|  |    png_ptr->transformations |= PNG_SWAP_ALPHA; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ | ||||||
|  |     defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) | ||||||
|  | void PNGAPI | ||||||
|  | png_set_invert_alpha(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_set_invert_alpha\n"); | ||||||
|  |    png_ptr->transformations |= PNG_INVERT_ALPHA; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) | ||||||
|  | void PNGAPI | ||||||
|  | png_set_invert_mono(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_set_invert_mono\n"); | ||||||
|  |    png_ptr->transformations |= PNG_INVERT_MONO; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* invert monochrome grayscale data */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_do_invert(png_row_infop row_info, png_bytep row) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_do_invert\n"); | ||||||
|  |   /* This test removed from libpng version 1.0.13 and 1.2.0: | ||||||
|  |    *   if (row_info->bit_depth == 1 && | ||||||
|  |    */ | ||||||
|  | #if defined(PNG_USELESS_TESTS_SUPPORTED) | ||||||
|  |    if (row == NULL || row_info == NULL) | ||||||
|  |      return; | ||||||
|  | #endif | ||||||
|  |    if (row_info->color_type == PNG_COLOR_TYPE_GRAY) | ||||||
|  |    { | ||||||
|  |       png_bytep rp = row; | ||||||
|  |       png_uint_32 i; | ||||||
|  |       png_uint_32 istop = row_info->rowbytes; | ||||||
|  |  | ||||||
|  |       for (i = 0; i < istop; i++) | ||||||
|  |       { | ||||||
|  |          *rp = (png_byte)(~(*rp)); | ||||||
|  |          rp++; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |    else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && | ||||||
|  |       row_info->bit_depth == 8) | ||||||
|  |    { | ||||||
|  |       png_bytep rp = row; | ||||||
|  |       png_uint_32 i; | ||||||
|  |       png_uint_32 istop = row_info->rowbytes; | ||||||
|  |  | ||||||
|  |       for (i = 0; i < istop; i+=2) | ||||||
|  |       { | ||||||
|  |          *rp = (png_byte)(~(*rp)); | ||||||
|  |          rp+=2; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |    else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && | ||||||
|  |       row_info->bit_depth == 16) | ||||||
|  |    { | ||||||
|  |       png_bytep rp = row; | ||||||
|  |       png_uint_32 i; | ||||||
|  |       png_uint_32 istop = row_info->rowbytes; | ||||||
|  |  | ||||||
|  |       for (i = 0; i < istop; i+=4) | ||||||
|  |       { | ||||||
|  |          *rp = (png_byte)(~(*rp)); | ||||||
|  |          *(rp+1) = (png_byte)(~(*(rp+1))); | ||||||
|  |          rp+=4; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) | ||||||
|  | /* swaps byte order on 16 bit depth images */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_do_swap(png_row_infop row_info, png_bytep row) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_do_swap\n"); | ||||||
|  |    if ( | ||||||
|  | #if defined(PNG_USELESS_TESTS_SUPPORTED) | ||||||
|  |        row != NULL && row_info != NULL && | ||||||
|  | #endif | ||||||
|  |        row_info->bit_depth == 16) | ||||||
|  |    { | ||||||
|  |       png_bytep rp = row; | ||||||
|  |       png_uint_32 i; | ||||||
|  |       png_uint_32 istop= row_info->width * row_info->channels; | ||||||
|  |  | ||||||
|  |       for (i = 0; i < istop; i++, rp += 2) | ||||||
|  |       { | ||||||
|  |          png_byte t = *rp; | ||||||
|  |          *rp = *(rp + 1); | ||||||
|  |          *(rp + 1) = t; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) | ||||||
|  | static png_byte onebppswaptable[256] = { | ||||||
|  |    0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, | ||||||
|  |    0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, | ||||||
|  |    0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, | ||||||
|  |    0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, | ||||||
|  |    0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, | ||||||
|  |    0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, | ||||||
|  |    0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, | ||||||
|  |    0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, | ||||||
|  |    0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, | ||||||
|  |    0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, | ||||||
|  |    0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, | ||||||
|  |    0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, | ||||||
|  |    0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, | ||||||
|  |    0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, | ||||||
|  |    0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, | ||||||
|  |    0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, | ||||||
|  |    0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, | ||||||
|  |    0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, | ||||||
|  |    0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, | ||||||
|  |    0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, | ||||||
|  |    0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, | ||||||
|  |    0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, | ||||||
|  |    0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, | ||||||
|  |    0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, | ||||||
|  |    0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, | ||||||
|  |    0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, | ||||||
|  |    0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, | ||||||
|  |    0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, | ||||||
|  |    0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, | ||||||
|  |    0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, | ||||||
|  |    0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, | ||||||
|  |    0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static png_byte twobppswaptable[256] = { | ||||||
|  |    0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0, | ||||||
|  |    0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0, | ||||||
|  |    0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4, | ||||||
|  |    0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4, | ||||||
|  |    0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8, | ||||||
|  |    0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8, | ||||||
|  |    0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC, | ||||||
|  |    0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC, | ||||||
|  |    0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1, | ||||||
|  |    0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1, | ||||||
|  |    0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5, | ||||||
|  |    0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5, | ||||||
|  |    0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9, | ||||||
|  |    0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9, | ||||||
|  |    0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD, | ||||||
|  |    0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD, | ||||||
|  |    0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2, | ||||||
|  |    0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2, | ||||||
|  |    0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6, | ||||||
|  |    0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6, | ||||||
|  |    0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA, | ||||||
|  |    0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA, | ||||||
|  |    0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE, | ||||||
|  |    0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE, | ||||||
|  |    0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3, | ||||||
|  |    0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3, | ||||||
|  |    0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7, | ||||||
|  |    0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7, | ||||||
|  |    0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB, | ||||||
|  |    0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB, | ||||||
|  |    0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF, | ||||||
|  |    0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static png_byte fourbppswaptable[256] = { | ||||||
|  |    0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, | ||||||
|  |    0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, | ||||||
|  |    0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, | ||||||
|  |    0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1, | ||||||
|  |    0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, | ||||||
|  |    0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2, | ||||||
|  |    0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73, | ||||||
|  |    0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3, | ||||||
|  |    0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74, | ||||||
|  |    0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4, | ||||||
|  |    0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, | ||||||
|  |    0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5, | ||||||
|  |    0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76, | ||||||
|  |    0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6, | ||||||
|  |    0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, | ||||||
|  |    0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7, | ||||||
|  |    0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, | ||||||
|  |    0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8, | ||||||
|  |    0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, | ||||||
|  |    0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9, | ||||||
|  |    0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, | ||||||
|  |    0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA, | ||||||
|  |    0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B, | ||||||
|  |    0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB, | ||||||
|  |    0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C, | ||||||
|  |    0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC, | ||||||
|  |    0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D, | ||||||
|  |    0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD, | ||||||
|  |    0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E, | ||||||
|  |    0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE, | ||||||
|  |    0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F, | ||||||
|  |    0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* swaps pixel packing order within bytes */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_do_packswap(png_row_infop row_info, png_bytep row) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_do_packswap\n"); | ||||||
|  |    if ( | ||||||
|  | #if defined(PNG_USELESS_TESTS_SUPPORTED) | ||||||
|  |        row != NULL && row_info != NULL && | ||||||
|  | #endif | ||||||
|  |        row_info->bit_depth < 8) | ||||||
|  |    { | ||||||
|  |       png_bytep rp, end, table; | ||||||
|  |  | ||||||
|  |       end = row + row_info->rowbytes; | ||||||
|  |  | ||||||
|  |       if (row_info->bit_depth == 1) | ||||||
|  |          table = onebppswaptable; | ||||||
|  |       else if (row_info->bit_depth == 2) | ||||||
|  |          table = twobppswaptable; | ||||||
|  |       else if (row_info->bit_depth == 4) | ||||||
|  |          table = fourbppswaptable; | ||||||
|  |       else | ||||||
|  |          return; | ||||||
|  |  | ||||||
|  |       for (rp = row; rp < end; rp++) | ||||||
|  |          *rp = table[*rp]; | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | #endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */ | ||||||
|  |  | ||||||
|  | #if defined(PNG_WRITE_FILLER_SUPPORTED) || \ | ||||||
|  |     defined(PNG_READ_STRIP_ALPHA_SUPPORTED) | ||||||
|  | /* remove filler or alpha byte(s) */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_do_strip_filler\n"); | ||||||
|  | #if defined(PNG_USELESS_TESTS_SUPPORTED) | ||||||
|  |    if (row != NULL && row_info != NULL) | ||||||
|  | #endif | ||||||
|  |    { | ||||||
|  | /* | ||||||
|  |       if (row_info->color_type == PNG_COLOR_TYPE_RGB || | ||||||
|  |           row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||||||
|  | */ | ||||||
|  |       png_bytep sp=row; | ||||||
|  |       png_bytep dp=row; | ||||||
|  |       png_uint_32 row_width=row_info->width; | ||||||
|  |       png_uint_32 i; | ||||||
|  |  | ||||||
|  |       if (row_info->channels == 4) | ||||||
|  |       { | ||||||
|  |          if (row_info->bit_depth == 8) | ||||||
|  |          { | ||||||
|  |             /* This converts from RGBX or RGBA to RGB */ | ||||||
|  |             if (flags & PNG_FLAG_FILLER_AFTER) | ||||||
|  |             { | ||||||
|  |                dp+=3; sp+=4; | ||||||
|  |                for (i = 1; i < row_width; i++) | ||||||
|  |                { | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   sp++; | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |             /* This converts from XRGB or ARGB to RGB */ | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                for (i = 0; i < row_width; i++) | ||||||
|  |                { | ||||||
|  |                   sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |             row_info->pixel_depth = 24; | ||||||
|  |             row_info->rowbytes = row_width * 3; | ||||||
|  |          } | ||||||
|  |          else /* if (row_info->bit_depth == 16) */ | ||||||
|  |          { | ||||||
|  |             if (flags & PNG_FLAG_FILLER_AFTER) | ||||||
|  |             { | ||||||
|  |                /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */ | ||||||
|  |                sp += 8; dp += 6; | ||||||
|  |                for (i = 1; i < row_width; i++) | ||||||
|  |                { | ||||||
|  |                   /* This could be (although png_memcpy is probably slower): | ||||||
|  |                   png_memcpy(dp, sp, 6); | ||||||
|  |                   sp += 8; | ||||||
|  |                   dp += 6; | ||||||
|  |                   */ | ||||||
|  |  | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   sp += 2; | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */ | ||||||
|  |                for (i = 0; i < row_width; i++) | ||||||
|  |                { | ||||||
|  |                   /* This could be (although png_memcpy is probably slower): | ||||||
|  |                   png_memcpy(dp, sp, 6); | ||||||
|  |                   sp += 8; | ||||||
|  |                   dp += 6; | ||||||
|  |                   */ | ||||||
|  |  | ||||||
|  |                   sp+=2; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |             row_info->pixel_depth = 48; | ||||||
|  |             row_info->rowbytes = row_width * 6; | ||||||
|  |          } | ||||||
|  |          row_info->channels = 3; | ||||||
|  |          row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; | ||||||
|  |       } | ||||||
|  | /* | ||||||
|  |       else if (row_info->color_type == PNG_COLOR_TYPE_GRAY || | ||||||
|  |                row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | ||||||
|  | */ | ||||||
|  |       else if (row_info->channels == 2) | ||||||
|  |       { | ||||||
|  |          if (row_info->bit_depth == 8) | ||||||
|  |          { | ||||||
|  |             /* This converts from GX or GA to G */ | ||||||
|  |             if (flags & PNG_FLAG_FILLER_AFTER) | ||||||
|  |             { | ||||||
|  |                for (i = 0; i < row_width; i++) | ||||||
|  |                { | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   sp++; | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |             /* This converts from XG or AG to G */ | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                for (i = 0; i < row_width; i++) | ||||||
|  |                { | ||||||
|  |                   sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |             row_info->pixel_depth = 8; | ||||||
|  |             row_info->rowbytes = row_width; | ||||||
|  |          } | ||||||
|  |          else /* if (row_info->bit_depth == 16) */ | ||||||
|  |          { | ||||||
|  |             if (flags & PNG_FLAG_FILLER_AFTER) | ||||||
|  |             { | ||||||
|  |                /* This converts from GGXX or GGAA to GG */ | ||||||
|  |                sp += 4; dp += 2; | ||||||
|  |                for (i = 1; i < row_width; i++) | ||||||
|  |                { | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   sp += 2; | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                /* This converts from XXGG or AAGG to GG */ | ||||||
|  |                for (i = 0; i < row_width; i++) | ||||||
|  |                { | ||||||
|  |                   sp += 2; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                   *dp++ = *sp++; | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |             row_info->pixel_depth = 16; | ||||||
|  |             row_info->rowbytes = row_width * 2; | ||||||
|  |          } | ||||||
|  |          row_info->channels = 1; | ||||||
|  |          row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) | ||||||
|  | /* swaps red and blue bytes within a pixel */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_do_bgr(png_row_infop row_info, png_bytep row) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_do_bgr\n"); | ||||||
|  |    if ( | ||||||
|  | #if defined(PNG_USELESS_TESTS_SUPPORTED) | ||||||
|  |        row != NULL && row_info != NULL && | ||||||
|  | #endif | ||||||
|  |        (row_info->color_type & PNG_COLOR_MASK_COLOR)) | ||||||
|  |    { | ||||||
|  |       png_uint_32 row_width = row_info->width; | ||||||
|  |       if (row_info->bit_depth == 8) | ||||||
|  |       { | ||||||
|  |          if (row_info->color_type == PNG_COLOR_TYPE_RGB) | ||||||
|  |          { | ||||||
|  |             png_bytep rp; | ||||||
|  |             png_uint_32 i; | ||||||
|  |  | ||||||
|  |             for (i = 0, rp = row; i < row_width; i++, rp += 3) | ||||||
|  |             { | ||||||
|  |                png_byte save = *rp; | ||||||
|  |                *rp = *(rp + 2); | ||||||
|  |                *(rp + 2) = save; | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |          else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||||||
|  |          { | ||||||
|  |             png_bytep rp; | ||||||
|  |             png_uint_32 i; | ||||||
|  |  | ||||||
|  |             for (i = 0, rp = row; i < row_width; i++, rp += 4) | ||||||
|  |             { | ||||||
|  |                png_byte save = *rp; | ||||||
|  |                *rp = *(rp + 2); | ||||||
|  |                *(rp + 2) = save; | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |       else if (row_info->bit_depth == 16) | ||||||
|  |       { | ||||||
|  |          if (row_info->color_type == PNG_COLOR_TYPE_RGB) | ||||||
|  |          { | ||||||
|  |             png_bytep rp; | ||||||
|  |             png_uint_32 i; | ||||||
|  |  | ||||||
|  |             for (i = 0, rp = row; i < row_width; i++, rp += 6) | ||||||
|  |             { | ||||||
|  |                png_byte save = *rp; | ||||||
|  |                *rp = *(rp + 4); | ||||||
|  |                *(rp + 4) = save; | ||||||
|  |                save = *(rp + 1); | ||||||
|  |                *(rp + 1) = *(rp + 5); | ||||||
|  |                *(rp + 5) = save; | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |          else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||||||
|  |          { | ||||||
|  |             png_bytep rp; | ||||||
|  |             png_uint_32 i; | ||||||
|  |  | ||||||
|  |             for (i = 0, rp = row; i < row_width; i++, rp += 8) | ||||||
|  |             { | ||||||
|  |                png_byte save = *rp; | ||||||
|  |                *rp = *(rp + 4); | ||||||
|  |                *(rp + 4) = save; | ||||||
|  |                save = *(rp + 1); | ||||||
|  |                *(rp + 1) = *(rp + 5); | ||||||
|  |                *(rp + 5) = save; | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | #endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ | ||||||
|  |  | ||||||
|  | #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ | ||||||
|  |     defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ | ||||||
|  |     defined(PNG_LEGACY_SUPPORTED) | ||||||
|  | void PNGAPI | ||||||
|  | png_set_user_transform_info(png_structp png_ptr, png_voidp | ||||||
|  |    user_transform_ptr, int user_transform_depth, int user_transform_channels) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_set_user_transform_info\n"); | ||||||
|  | #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) | ||||||
|  |    png_ptr->user_transform_ptr = user_transform_ptr; | ||||||
|  |    png_ptr->user_transform_depth = (png_byte)user_transform_depth; | ||||||
|  |    png_ptr->user_transform_channels = (png_byte)user_transform_channels; | ||||||
|  | #else | ||||||
|  |    if(user_transform_ptr || user_transform_depth || user_transform_channels) | ||||||
|  |       png_warning(png_ptr, | ||||||
|  |         "This version of libpng does not support user transform info"); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* This function returns a pointer to the user_transform_ptr associated with | ||||||
|  |  * the user transform functions.  The application should free any memory | ||||||
|  |  * associated with this pointer before png_write_destroy and png_read_destroy | ||||||
|  |  * are called. | ||||||
|  |  */ | ||||||
|  | png_voidp PNGAPI | ||||||
|  | png_get_user_transform_ptr(png_structp png_ptr) | ||||||
|  | { | ||||||
|  | #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) | ||||||
|  |    return ((png_voidp)png_ptr->user_transform_ptr); | ||||||
|  | #else | ||||||
|  |    if(png_ptr) | ||||||
|  |      return (NULL); | ||||||
|  |    return (NULL); | ||||||
|  | #endif | ||||||
|  | } | ||||||
							
								
								
									
										3845
									
								
								runtime/libpng/pngvcrd.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										228
									
								
								runtime/libpng/pngwio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,228 @@ | |||||||
|  |  | ||||||
|  | /* pngwio.c - functions for data output | ||||||
|  |  * | ||||||
|  |  * libpng 1.2.5 - October 3, 2002 | ||||||
|  |  * For conditions of distribution and use, see copyright notice in png.h | ||||||
|  |  * Copyright (c) 1998-2002 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.) | ||||||
|  |  * | ||||||
|  |  * This file provides a location for all output.  Users who need | ||||||
|  |  * special handling are expected to write functions that have the same | ||||||
|  |  * arguments as these and perform similar functions, but that possibly | ||||||
|  |  * use different output methods.  Note that you shouldn't change these | ||||||
|  |  * functions, but rather write replacement functions and then change | ||||||
|  |  * them at run time with png_set_write_fn(...). | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define PNG_INTERNAL | ||||||
|  | #include "png.h" | ||||||
|  | #ifdef PNG_WRITE_SUPPORTED | ||||||
|  |  | ||||||
|  | /* Write the data to whatever output you are using.  The default routine | ||||||
|  |    writes to a file pointer.  Note that this routine sometimes gets called | ||||||
|  |    with very small lengths, so you should implement some kind of simple | ||||||
|  |    buffering if you are using unbuffered writes.  This should never be asked | ||||||
|  |    to write more than 64K on a 16 bit machine.  */ | ||||||
|  |  | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_write_data(png_structp png_ptr, png_bytep data, png_size_t length) | ||||||
|  | { | ||||||
|  |    if (png_ptr->write_data_fn != NULL ) | ||||||
|  |       (*(png_ptr->write_data_fn))(png_ptr, data, length); | ||||||
|  |    else | ||||||
|  |       png_error(png_ptr, "Call to NULL write function"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #if !defined(PNG_NO_STDIO) | ||||||
|  | /* This is the function that does the actual writing of data.  If you are | ||||||
|  |    not writing to a standard C stream, you should create a replacement | ||||||
|  |    write_data function and use it at run time with png_set_write_fn(), rather | ||||||
|  |    than changing the library. */ | ||||||
|  | #ifndef USE_FAR_KEYWORD | ||||||
|  | void PNGAPI | ||||||
|  | png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) | ||||||
|  | { | ||||||
|  |    png_uint_32 check; | ||||||
|  |  | ||||||
|  | #if defined(_WIN32_WCE) | ||||||
|  |    if ( !WriteFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) | ||||||
|  |       check = 0; | ||||||
|  | #else | ||||||
|  |    check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr)); | ||||||
|  | #endif | ||||||
|  |    if (check != length) | ||||||
|  |       png_error(png_ptr, "Write Error"); | ||||||
|  | } | ||||||
|  | #else | ||||||
|  | /* this is the model-independent version. Since the standard I/O library | ||||||
|  |    can't handle far buffers in the medium and small models, we have to copy | ||||||
|  |    the data. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | #define NEAR_BUF_SIZE 1024 | ||||||
|  | #define MIN(a,b) (a <= b ? a : b) | ||||||
|  |  | ||||||
|  | void PNGAPI | ||||||
|  | png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) | ||||||
|  | { | ||||||
|  |    png_uint_32 check; | ||||||
|  |    png_byte *near_data;  /* Needs to be "png_byte *" instead of "png_bytep" */ | ||||||
|  |    png_FILE_p io_ptr; | ||||||
|  |  | ||||||
|  |    /* Check if data really is near. If so, use usual code. */ | ||||||
|  |    near_data = (png_byte *)CVT_PTR_NOCHECK(data); | ||||||
|  |    io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); | ||||||
|  |    if ((png_bytep)near_data == data) | ||||||
|  |    { | ||||||
|  | #if defined(_WIN32_WCE) | ||||||
|  |       if ( !WriteFile(io_ptr, near_data, length, &check, NULL) ) | ||||||
|  |          check = 0; | ||||||
|  | #else | ||||||
|  |       check = fwrite(near_data, 1, length, io_ptr); | ||||||
|  | #endif | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       png_byte buf[NEAR_BUF_SIZE]; | ||||||
|  |       png_size_t written, remaining, err; | ||||||
|  |       check = 0; | ||||||
|  |       remaining = length; | ||||||
|  |       do | ||||||
|  |       { | ||||||
|  |          written = MIN(NEAR_BUF_SIZE, remaining); | ||||||
|  |          png_memcpy(buf, data, written); /* copy far buffer to near buffer */ | ||||||
|  | #if defined(_WIN32_WCE) | ||||||
|  |          if ( !WriteFile(io_ptr, buf, written, &err, NULL) ) | ||||||
|  |             err = 0; | ||||||
|  | #else | ||||||
|  |          err = fwrite(buf, 1, written, io_ptr); | ||||||
|  | #endif | ||||||
|  |          if (err != written) | ||||||
|  |             break; | ||||||
|  |          else | ||||||
|  |             check += err; | ||||||
|  |          data += written; | ||||||
|  |          remaining -= written; | ||||||
|  |       } | ||||||
|  |       while (remaining != 0); | ||||||
|  |    } | ||||||
|  |    if (check != length) | ||||||
|  |       png_error(png_ptr, "Write Error"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* This function is called to output any data pending writing (normally | ||||||
|  |    to disk).  After png_flush is called, there should be no data pending | ||||||
|  |    writing in any buffers. */ | ||||||
|  | #if defined(PNG_WRITE_FLUSH_SUPPORTED) | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_flush(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    if (png_ptr->output_flush_fn != NULL) | ||||||
|  |       (*(png_ptr->output_flush_fn))(png_ptr); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #if !defined(PNG_NO_STDIO) | ||||||
|  | void PNGAPI | ||||||
|  | png_default_flush(png_structp png_ptr) | ||||||
|  | { | ||||||
|  | #if !defined(_WIN32_WCE) | ||||||
|  |    png_FILE_p io_ptr; | ||||||
|  |    io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr)); | ||||||
|  |    if (io_ptr != NULL) | ||||||
|  |       fflush(io_ptr); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* This function allows the application to supply new output functions for | ||||||
|  |    libpng if standard C streams aren't being used. | ||||||
|  |  | ||||||
|  |    This function takes as its arguments: | ||||||
|  |    png_ptr       - pointer to a png output data structure | ||||||
|  |    io_ptr        - pointer to user supplied structure containing info about | ||||||
|  |                    the output functions.  May be NULL. | ||||||
|  |    write_data_fn - pointer to a new output function that takes as its | ||||||
|  |                    arguments a pointer to a png_struct, a pointer to | ||||||
|  |                    data to be written, and a 32-bit unsigned int that is | ||||||
|  |                    the number of bytes to be written.  The new write | ||||||
|  |                    function should call png_error(png_ptr, "Error msg") | ||||||
|  |                    to exit and output any fatal error messages. | ||||||
|  |    flush_data_fn - pointer to a new flush function that takes as its | ||||||
|  |                    arguments a pointer to a png_struct.  After a call to | ||||||
|  |                    the flush function, there should be no data in any buffers | ||||||
|  |                    or pending transmission.  If the output method doesn't do | ||||||
|  |                    any buffering of ouput, a function prototype must still be | ||||||
|  |                    supplied although it doesn't have to do anything.  If | ||||||
|  |                    PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile | ||||||
|  |                    time, output_flush_fn will be ignored, although it must be | ||||||
|  |                    supplied for compatibility. */ | ||||||
|  | void PNGAPI | ||||||
|  | png_set_write_fn(png_structp png_ptr, png_voidp io_ptr, | ||||||
|  |    png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn) | ||||||
|  | { | ||||||
|  |    png_ptr->io_ptr = io_ptr; | ||||||
|  |  | ||||||
|  | #if !defined(PNG_NO_STDIO) | ||||||
|  |    if (write_data_fn != NULL) | ||||||
|  |       png_ptr->write_data_fn = write_data_fn; | ||||||
|  |    else | ||||||
|  |       png_ptr->write_data_fn = png_default_write_data; | ||||||
|  | #else | ||||||
|  |    png_ptr->write_data_fn = write_data_fn; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_WRITE_FLUSH_SUPPORTED) | ||||||
|  | #if !defined(PNG_NO_STDIO) | ||||||
|  |    if (output_flush_fn != NULL) | ||||||
|  |       png_ptr->output_flush_fn = output_flush_fn; | ||||||
|  |    else | ||||||
|  |       png_ptr->output_flush_fn = png_default_flush; | ||||||
|  | #else | ||||||
|  |    png_ptr->output_flush_fn = output_flush_fn; | ||||||
|  | #endif | ||||||
|  | #endif /* PNG_WRITE_FLUSH_SUPPORTED */ | ||||||
|  |  | ||||||
|  |    /* It is an error to read while writing a png file */ | ||||||
|  |    if (png_ptr->read_data_fn != NULL) | ||||||
|  |    { | ||||||
|  |       png_ptr->read_data_fn = NULL; | ||||||
|  |       png_warning(png_ptr, | ||||||
|  |          "Attempted to set both read_data_fn and write_data_fn in"); | ||||||
|  |       png_warning(png_ptr, | ||||||
|  |          "the same structure.  Resetting read_data_fn to NULL."); | ||||||
|  |    } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #if defined(USE_FAR_KEYWORD) | ||||||
|  | #if defined(_MSC_VER) | ||||||
|  | void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check) | ||||||
|  | { | ||||||
|  |    void *near_ptr; | ||||||
|  |    void FAR *far_ptr; | ||||||
|  |    FP_OFF(near_ptr) = FP_OFF(ptr); | ||||||
|  |    far_ptr = (void FAR *)near_ptr; | ||||||
|  |    if(check != 0) | ||||||
|  |       if(FP_SEG(ptr) != FP_SEG(far_ptr)) | ||||||
|  |          png_error(png_ptr,"segment lost in conversion"); | ||||||
|  |    return(near_ptr); | ||||||
|  | } | ||||||
|  | #  else | ||||||
|  | void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check) | ||||||
|  | { | ||||||
|  |    void *near_ptr; | ||||||
|  |    void FAR *far_ptr; | ||||||
|  |    near_ptr = (void FAR *)ptr; | ||||||
|  |    far_ptr = (void FAR *)near_ptr; | ||||||
|  |    if(check != 0) | ||||||
|  |       if(far_ptr != ptr) | ||||||
|  |          png_error(png_ptr,"segment lost in conversion"); | ||||||
|  |    return(near_ptr); | ||||||
|  | } | ||||||
|  | #   endif | ||||||
|  | #   endif | ||||||
|  | #endif /* PNG_WRITE_SUPPORTED */ | ||||||
							
								
								
									
										1450
									
								
								runtime/libpng/pngwrite.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										563
									
								
								runtime/libpng/pngwtran.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,563 @@ | |||||||
|  |  | ||||||
|  | /* pngwtran.c - transforms the data in a row for PNG writers | ||||||
|  |  * | ||||||
|  |  * libpng 1.2.5 - October 3, 2002 | ||||||
|  |  * For conditions of distribution and use, see copyright notice in png.h | ||||||
|  |  * Copyright (c) 1998-2002 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.) | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define PNG_INTERNAL | ||||||
|  | #include "png.h" | ||||||
|  | #ifdef PNG_WRITE_SUPPORTED | ||||||
|  |  | ||||||
|  | /* Transform the data according to the user's wishes.  The order of | ||||||
|  |  * transformations is significant. | ||||||
|  |  */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_do_write_transformations(png_structp png_ptr) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_do_write_transformations\n"); | ||||||
|  |  | ||||||
|  |    if (png_ptr == NULL) | ||||||
|  |       return; | ||||||
|  |  | ||||||
|  | #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) | ||||||
|  |    if (png_ptr->transformations & PNG_USER_TRANSFORM) | ||||||
|  |       if(png_ptr->write_user_transform_fn != NULL) | ||||||
|  |         (*(png_ptr->write_user_transform_fn)) /* user write transform function */ | ||||||
|  |           (png_ptr,                    /* png_ptr */ | ||||||
|  |            &(png_ptr->row_info),       /* row_info:     */ | ||||||
|  |              /*  png_uint_32 width;          width of row */ | ||||||
|  |              /*  png_uint_32 rowbytes;       number of bytes in row */ | ||||||
|  |              /*  png_byte color_type;        color type of pixels */ | ||||||
|  |              /*  png_byte bit_depth;         bit depth of samples */ | ||||||
|  |              /*  png_byte channels;          number of channels (1-4) */ | ||||||
|  |              /*  png_byte pixel_depth;       bits per pixel (depth*channels) */ | ||||||
|  |            png_ptr->row_buf + 1);      /* start of pixel data for row */ | ||||||
|  | #endif | ||||||
|  | #if defined(PNG_WRITE_FILLER_SUPPORTED) | ||||||
|  |    if (png_ptr->transformations & PNG_FILLER) | ||||||
|  |       png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, | ||||||
|  |          png_ptr->flags); | ||||||
|  | #endif | ||||||
|  | #if defined(PNG_WRITE_PACKSWAP_SUPPORTED) | ||||||
|  |    if (png_ptr->transformations & PNG_PACKSWAP) | ||||||
|  |       png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1); | ||||||
|  | #endif | ||||||
|  | #if defined(PNG_WRITE_PACK_SUPPORTED) | ||||||
|  |    if (png_ptr->transformations & PNG_PACK) | ||||||
|  |       png_do_pack(&(png_ptr->row_info), png_ptr->row_buf + 1, | ||||||
|  |          (png_uint_32)png_ptr->bit_depth); | ||||||
|  | #endif | ||||||
|  | #if defined(PNG_WRITE_SWAP_SUPPORTED) | ||||||
|  |    if (png_ptr->transformations & PNG_SWAP_BYTES) | ||||||
|  |       png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1); | ||||||
|  | #endif | ||||||
|  | #if defined(PNG_WRITE_SHIFT_SUPPORTED) | ||||||
|  |    if (png_ptr->transformations & PNG_SHIFT) | ||||||
|  |       png_do_shift(&(png_ptr->row_info), png_ptr->row_buf + 1, | ||||||
|  |          &(png_ptr->shift)); | ||||||
|  | #endif | ||||||
|  | #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) | ||||||
|  |    if (png_ptr->transformations & PNG_INVERT_ALPHA) | ||||||
|  |       png_do_write_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); | ||||||
|  | #endif | ||||||
|  | #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) | ||||||
|  |    if (png_ptr->transformations & PNG_SWAP_ALPHA) | ||||||
|  |       png_do_write_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); | ||||||
|  | #endif | ||||||
|  | #if defined(PNG_WRITE_BGR_SUPPORTED) | ||||||
|  |    if (png_ptr->transformations & PNG_BGR) | ||||||
|  |       png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1); | ||||||
|  | #endif | ||||||
|  | #if defined(PNG_WRITE_INVERT_SUPPORTED) | ||||||
|  |    if (png_ptr->transformations & PNG_INVERT_MONO) | ||||||
|  |       png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #if defined(PNG_WRITE_PACK_SUPPORTED) | ||||||
|  | /* Pack pixels into bytes.  Pass the true bit depth in bit_depth.  The | ||||||
|  |  * row_info bit depth should be 8 (one pixel per byte).  The channels | ||||||
|  |  * should be 1 (this only happens on grayscale and paletted images). | ||||||
|  |  */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_do_pack\n"); | ||||||
|  |    if (row_info->bit_depth == 8 && | ||||||
|  | #if defined(PNG_USELESS_TESTS_SUPPORTED) | ||||||
|  |        row != NULL && row_info != NULL && | ||||||
|  | #endif | ||||||
|  |       row_info->channels == 1) | ||||||
|  |    { | ||||||
|  |       switch ((int)bit_depth) | ||||||
|  |       { | ||||||
|  |          case 1: | ||||||
|  |          { | ||||||
|  |             png_bytep sp, dp; | ||||||
|  |             int mask, v; | ||||||
|  |             png_uint_32 i; | ||||||
|  |             png_uint_32 row_width = row_info->width; | ||||||
|  |  | ||||||
|  |             sp = row; | ||||||
|  |             dp = row; | ||||||
|  |             mask = 0x80; | ||||||
|  |             v = 0; | ||||||
|  |  | ||||||
|  |             for (i = 0; i < row_width; i++) | ||||||
|  |             { | ||||||
|  |                if (*sp != 0) | ||||||
|  |                   v |= mask; | ||||||
|  |                sp++; | ||||||
|  |                if (mask > 1) | ||||||
|  |                   mask >>= 1; | ||||||
|  |                else | ||||||
|  |                { | ||||||
|  |                   mask = 0x80; | ||||||
|  |                   *dp = (png_byte)v; | ||||||
|  |                   dp++; | ||||||
|  |                   v = 0; | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |             if (mask != 0x80) | ||||||
|  |                *dp = (png_byte)v; | ||||||
|  |             break; | ||||||
|  |          } | ||||||
|  |          case 2: | ||||||
|  |          { | ||||||
|  |             png_bytep sp, dp; | ||||||
|  |             int shift, v; | ||||||
|  |             png_uint_32 i; | ||||||
|  |             png_uint_32 row_width = row_info->width; | ||||||
|  |  | ||||||
|  |             sp = row; | ||||||
|  |             dp = row; | ||||||
|  |             shift = 6; | ||||||
|  |             v = 0; | ||||||
|  |             for (i = 0; i < row_width; i++) | ||||||
|  |             { | ||||||
|  |                png_byte value; | ||||||
|  |  | ||||||
|  |                value = (png_byte)(*sp & 0x03); | ||||||
|  |                v |= (value << shift); | ||||||
|  |                if (shift == 0) | ||||||
|  |                { | ||||||
|  |                   shift = 6; | ||||||
|  |                   *dp = (png_byte)v; | ||||||
|  |                   dp++; | ||||||
|  |                   v = 0; | ||||||
|  |                } | ||||||
|  |                else | ||||||
|  |                   shift -= 2; | ||||||
|  |                sp++; | ||||||
|  |             } | ||||||
|  |             if (shift != 6) | ||||||
|  |                *dp = (png_byte)v; | ||||||
|  |             break; | ||||||
|  |          } | ||||||
|  |          case 4: | ||||||
|  |          { | ||||||
|  |             png_bytep sp, dp; | ||||||
|  |             int shift, v; | ||||||
|  |             png_uint_32 i; | ||||||
|  |             png_uint_32 row_width = row_info->width; | ||||||
|  |  | ||||||
|  |             sp = row; | ||||||
|  |             dp = row; | ||||||
|  |             shift = 4; | ||||||
|  |             v = 0; | ||||||
|  |             for (i = 0; i < row_width; i++) | ||||||
|  |             { | ||||||
|  |                png_byte value; | ||||||
|  |  | ||||||
|  |                value = (png_byte)(*sp & 0x0f); | ||||||
|  |                v |= (value << shift); | ||||||
|  |  | ||||||
|  |                if (shift == 0) | ||||||
|  |                { | ||||||
|  |                   shift = 4; | ||||||
|  |                   *dp = (png_byte)v; | ||||||
|  |                   dp++; | ||||||
|  |                   v = 0; | ||||||
|  |                } | ||||||
|  |                else | ||||||
|  |                   shift -= 4; | ||||||
|  |  | ||||||
|  |                sp++; | ||||||
|  |             } | ||||||
|  |             if (shift != 4) | ||||||
|  |                *dp = (png_byte)v; | ||||||
|  |             break; | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |       row_info->bit_depth = (png_byte)bit_depth; | ||||||
|  |       row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels); | ||||||
|  |       row_info->rowbytes = | ||||||
|  |          ((row_info->width * row_info->pixel_depth + 7) >> 3); | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_WRITE_SHIFT_SUPPORTED) | ||||||
|  | /* Shift pixel values to take advantage of whole range.  Pass the | ||||||
|  |  * true number of bits in bit_depth.  The row should be packed | ||||||
|  |  * according to row_info->bit_depth.  Thus, if you had a row of | ||||||
|  |  * bit depth 4, but the pixels only had values from 0 to 7, you | ||||||
|  |  * would pass 3 as bit_depth, and this routine would translate the | ||||||
|  |  * data to 0 to 15. | ||||||
|  |  */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_do_shift\n"); | ||||||
|  | #if defined(PNG_USELESS_TESTS_SUPPORTED) | ||||||
|  |    if (row != NULL && row_info != NULL && | ||||||
|  | #else | ||||||
|  |    if ( | ||||||
|  | #endif | ||||||
|  |       row_info->color_type != PNG_COLOR_TYPE_PALETTE) | ||||||
|  |    { | ||||||
|  |       int shift_start[4], shift_dec[4]; | ||||||
|  |       int channels = 0; | ||||||
|  |  | ||||||
|  |       if (row_info->color_type & PNG_COLOR_MASK_COLOR) | ||||||
|  |       { | ||||||
|  |          shift_start[channels] = row_info->bit_depth - bit_depth->red; | ||||||
|  |          shift_dec[channels] = bit_depth->red; | ||||||
|  |          channels++; | ||||||
|  |          shift_start[channels] = row_info->bit_depth - bit_depth->green; | ||||||
|  |          shift_dec[channels] = bit_depth->green; | ||||||
|  |          channels++; | ||||||
|  |          shift_start[channels] = row_info->bit_depth - bit_depth->blue; | ||||||
|  |          shift_dec[channels] = bit_depth->blue; | ||||||
|  |          channels++; | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |          shift_start[channels] = row_info->bit_depth - bit_depth->gray; | ||||||
|  |          shift_dec[channels] = bit_depth->gray; | ||||||
|  |          channels++; | ||||||
|  |       } | ||||||
|  |       if (row_info->color_type & PNG_COLOR_MASK_ALPHA) | ||||||
|  |       { | ||||||
|  |          shift_start[channels] = row_info->bit_depth - bit_depth->alpha; | ||||||
|  |          shift_dec[channels] = bit_depth->alpha; | ||||||
|  |          channels++; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       /* with low row depths, could only be grayscale, so one channel */ | ||||||
|  |       if (row_info->bit_depth < 8) | ||||||
|  |       { | ||||||
|  |          png_bytep bp = row; | ||||||
|  |          png_uint_32 i; | ||||||
|  |          png_byte mask; | ||||||
|  |          png_uint_32 row_bytes = row_info->rowbytes; | ||||||
|  |  | ||||||
|  |          if (bit_depth->gray == 1 && row_info->bit_depth == 2) | ||||||
|  |             mask = 0x55; | ||||||
|  |          else if (row_info->bit_depth == 4 && bit_depth->gray == 3) | ||||||
|  |             mask = 0x11; | ||||||
|  |          else | ||||||
|  |             mask = 0xff; | ||||||
|  |  | ||||||
|  |          for (i = 0; i < row_bytes; i++, bp++) | ||||||
|  |          { | ||||||
|  |             png_uint_16 v; | ||||||
|  |             int j; | ||||||
|  |  | ||||||
|  |             v = *bp; | ||||||
|  |             *bp = 0; | ||||||
|  |             for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0]) | ||||||
|  |             { | ||||||
|  |                if (j > 0) | ||||||
|  |                   *bp |= (png_byte)((v << j) & 0xff); | ||||||
|  |                else | ||||||
|  |                   *bp |= (png_byte)((v >> (-j)) & mask); | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |       else if (row_info->bit_depth == 8) | ||||||
|  |       { | ||||||
|  |          png_bytep bp = row; | ||||||
|  |          png_uint_32 i; | ||||||
|  |          png_uint_32 istop = channels * row_info->width; | ||||||
|  |  | ||||||
|  |          for (i = 0; i < istop; i++, bp++) | ||||||
|  |          { | ||||||
|  |  | ||||||
|  |             png_uint_16 v; | ||||||
|  |             int j; | ||||||
|  |             int c = (int)(i%channels); | ||||||
|  |  | ||||||
|  |             v = *bp; | ||||||
|  |             *bp = 0; | ||||||
|  |             for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) | ||||||
|  |             { | ||||||
|  |                if (j > 0) | ||||||
|  |                   *bp |= (png_byte)((v << j) & 0xff); | ||||||
|  |                else | ||||||
|  |                   *bp |= (png_byte)((v >> (-j)) & 0xff); | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |          png_bytep bp; | ||||||
|  |          png_uint_32 i; | ||||||
|  |          png_uint_32 istop = channels * row_info->width; | ||||||
|  |  | ||||||
|  |          for (bp = row, i = 0; i < istop; i++) | ||||||
|  |          { | ||||||
|  |             int c = (int)(i%channels); | ||||||
|  |             png_uint_16 value, v; | ||||||
|  |             int j; | ||||||
|  |  | ||||||
|  |             v = (png_uint_16)(((png_uint_16)(*bp) << 8) + *(bp + 1)); | ||||||
|  |             value = 0; | ||||||
|  |             for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) | ||||||
|  |             { | ||||||
|  |                if (j > 0) | ||||||
|  |                   value |= (png_uint_16)((v << j) & (png_uint_16)0xffff); | ||||||
|  |                else | ||||||
|  |                   value |= (png_uint_16)((v >> (-j)) & (png_uint_16)0xffff); | ||||||
|  |             } | ||||||
|  |             *bp++ = (png_byte)(value >> 8); | ||||||
|  |             *bp++ = (png_byte)(value & 0xff); | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_do_write_swap_alpha\n"); | ||||||
|  | #if defined(PNG_USELESS_TESTS_SUPPORTED) | ||||||
|  |    if (row != NULL && row_info != NULL) | ||||||
|  | #endif | ||||||
|  |    { | ||||||
|  |       if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||||||
|  |       { | ||||||
|  |          /* This converts from ARGB to RGBA */ | ||||||
|  |          if (row_info->bit_depth == 8) | ||||||
|  |          { | ||||||
|  |             png_bytep sp, dp; | ||||||
|  |             png_uint_32 i; | ||||||
|  |             png_uint_32 row_width = row_info->width; | ||||||
|  |             for (i = 0, sp = dp = row; i < row_width; i++) | ||||||
|  |             { | ||||||
|  |                png_byte save = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = save; | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |          /* This converts from AARRGGBB to RRGGBBAA */ | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             png_bytep sp, dp; | ||||||
|  |             png_uint_32 i; | ||||||
|  |             png_uint_32 row_width = row_info->width; | ||||||
|  |  | ||||||
|  |             for (i = 0, sp = dp = row; i < row_width; i++) | ||||||
|  |             { | ||||||
|  |                png_byte save[2]; | ||||||
|  |                save[0] = *(sp++); | ||||||
|  |                save[1] = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = save[0]; | ||||||
|  |                *(dp++) = save[1]; | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |       else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | ||||||
|  |       { | ||||||
|  |          /* This converts from AG to GA */ | ||||||
|  |          if (row_info->bit_depth == 8) | ||||||
|  |          { | ||||||
|  |             png_bytep sp, dp; | ||||||
|  |             png_uint_32 i; | ||||||
|  |             png_uint_32 row_width = row_info->width; | ||||||
|  |  | ||||||
|  |             for (i = 0, sp = dp = row; i < row_width; i++) | ||||||
|  |             { | ||||||
|  |                png_byte save = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = save; | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |          /* This converts from AAGG to GGAA */ | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             png_bytep sp, dp; | ||||||
|  |             png_uint_32 i; | ||||||
|  |             png_uint_32 row_width = row_info->width; | ||||||
|  |  | ||||||
|  |             for (i = 0, sp = dp = row; i < row_width; i++) | ||||||
|  |             { | ||||||
|  |                png_byte save[2]; | ||||||
|  |                save[0] = *(sp++); | ||||||
|  |                save[1] = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = save[0]; | ||||||
|  |                *(dp++) = save[1]; | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_do_write_invert_alpha(png_row_infop row_info, png_bytep row) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_do_write_invert_alpha\n"); | ||||||
|  | #if defined(PNG_USELESS_TESTS_SUPPORTED) | ||||||
|  |    if (row != NULL && row_info != NULL) | ||||||
|  | #endif | ||||||
|  |    { | ||||||
|  |       if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||||||
|  |       { | ||||||
|  |          /* This inverts the alpha channel in RGBA */ | ||||||
|  |          if (row_info->bit_depth == 8) | ||||||
|  |          { | ||||||
|  |             png_bytep sp, dp; | ||||||
|  |             png_uint_32 i; | ||||||
|  |             png_uint_32 row_width = row_info->width; | ||||||
|  |             for (i = 0, sp = dp = row; i < row_width; i++) | ||||||
|  |             { | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = (png_byte)(255 - *(sp++)); | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |          /* This inverts the alpha channel in RRGGBBAA */ | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             png_bytep sp, dp; | ||||||
|  |             png_uint_32 i; | ||||||
|  |             png_uint_32 row_width = row_info->width; | ||||||
|  |  | ||||||
|  |             for (i = 0, sp = dp = row; i < row_width; i++) | ||||||
|  |             { | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = (png_byte)(255 - *(sp++)); | ||||||
|  |                *(dp++) = (png_byte)(255 - *(sp++)); | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |       else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | ||||||
|  |       { | ||||||
|  |          /* This inverts the alpha channel in GA */ | ||||||
|  |          if (row_info->bit_depth == 8) | ||||||
|  |          { | ||||||
|  |             png_bytep sp, dp; | ||||||
|  |             png_uint_32 i; | ||||||
|  |             png_uint_32 row_width = row_info->width; | ||||||
|  |  | ||||||
|  |             for (i = 0, sp = dp = row; i < row_width; i++) | ||||||
|  |             { | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = (png_byte)(255 - *(sp++)); | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |          /* This inverts the alpha channel in GGAA */ | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             png_bytep sp, dp; | ||||||
|  |             png_uint_32 i; | ||||||
|  |             png_uint_32 row_width = row_info->width; | ||||||
|  |  | ||||||
|  |             for (i = 0, sp = dp = row; i < row_width; i++) | ||||||
|  |             { | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = *(sp++); | ||||||
|  |                *(dp++) = (png_byte)(255 - *(sp++)); | ||||||
|  |                *(dp++) = (png_byte)(255 - *(sp++)); | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(PNG_MNG_FEATURES_SUPPORTED) | ||||||
|  | /* undoes intrapixel differencing  */ | ||||||
|  | void /* PRIVATE */ | ||||||
|  | png_do_write_intrapixel(png_row_infop row_info, png_bytep row) | ||||||
|  | { | ||||||
|  |    png_debug(1, "in png_do_write_intrapixel\n"); | ||||||
|  |    if ( | ||||||
|  | #if defined(PNG_USELESS_TESTS_SUPPORTED) | ||||||
|  |        row != NULL && row_info != NULL && | ||||||
|  | #endif | ||||||
|  |        (row_info->color_type & PNG_COLOR_MASK_COLOR)) | ||||||
|  |    { | ||||||
|  |       int bytes_per_pixel; | ||||||
|  |       png_uint_32 row_width = row_info->width; | ||||||
|  |       if (row_info->bit_depth == 8) | ||||||
|  |       { | ||||||
|  |          png_bytep rp; | ||||||
|  |          png_uint_32 i; | ||||||
|  |  | ||||||
|  |          if (row_info->color_type == PNG_COLOR_TYPE_RGB) | ||||||
|  |             bytes_per_pixel = 3; | ||||||
|  |          else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||||||
|  |             bytes_per_pixel = 4; | ||||||
|  |          else | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |          for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) | ||||||
|  |          { | ||||||
|  |             *(rp)   = (png_byte)((*rp     - *(rp+1))&0xff); | ||||||
|  |             *(rp+2) = (png_byte)((*(rp+2) - *(rp+1))&0xff); | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |       else if (row_info->bit_depth == 16) | ||||||
|  |       { | ||||||
|  |          png_bytep rp; | ||||||
|  |          png_uint_32 i; | ||||||
|  |  | ||||||
|  |          if (row_info->color_type == PNG_COLOR_TYPE_RGB) | ||||||
|  |             bytes_per_pixel = 6; | ||||||
|  |          else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||||||
|  |             bytes_per_pixel = 8; | ||||||
|  |          else | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |          for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) | ||||||
|  |          { | ||||||
|  |             png_uint_32 s0=*(rp  )<<8 | *(rp+1); | ||||||
|  |             png_uint_32 s1=*(rp+2)<<8 | *(rp+3); | ||||||
|  |             png_uint_32 s2=*(rp+4)<<8 | *(rp+5); | ||||||
|  |             png_uint_32 red=(s0-s1)&0xffff; | ||||||
|  |             png_uint_32 blue=(s2-s1)&0xffff; | ||||||
|  |             *(rp  ) = (png_byte)((red>>8)&0xff); | ||||||
|  |             *(rp+1) = (png_byte)(red&0xff); | ||||||
|  |             *(rp+4) = (png_byte)((blue>>8)&0xff); | ||||||
|  |             *(rp+5) = (png_byte)(blue&0xff); | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | #endif /* PNG_MNG_FEATURES_SUPPORTED */ | ||||||
|  | #endif /* PNG_WRITE_SUPPORTED */ | ||||||