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 */ | ||||