jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpriv.h
changeset 29913 95258013e132
parent 25859 3317bb8137f4
child 35296 659e92aaf7f4
equal deleted inserted replaced
29912:4478c08657e0 29913:95258013e132
    28  * License version 2 only, as published by the Free Software Foundation.
    28  * License version 2 only, as published by the Free Software Foundation.
    29  * However, the following notice accompanied the original version of this
    29  * However, the following notice accompanied the original version of this
    30  * file and, per its terms, should not be removed:
    30  * file and, per its terms, should not be removed:
    31  *
    31  *
    32  * For conditions of distribution and use, see copyright notice in png.h
    32  * For conditions of distribution and use, see copyright notice in png.h
    33  * Copyright (c) 1998-2011 Glenn Randers-Pehrson
    33  * Copyright (c) 1998-2014 Glenn Randers-Pehrson
    34  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
    34  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
    35  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
    35  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
    36  *
    36  *
    37  * Last changed in libpng 1.5.4 [July 7, 2011]
    37  * Last changed in libpng 1.6.10 [March 6, 1014]]
    38  *
    38  *
    39  * This code is released under the libpng license.
    39  * This code is released under the libpng license.
    40  * For conditions of distribution and use, see the disclaimer
    40  * For conditions of distribution and use, see the disclaimer
    41  * and license in png.h
    41  * and license in png.h
    42  */
    42  */
    43 
    43 
    44 /* The symbols declared in this file (including the functions declared
    44 /* The symbols declared in this file (including the functions declared
    45  * as PNG_EXTERN) are PRIVATE.  They are not part of the libpng public
    45  * as extern) are PRIVATE.  They are not part of the libpng public
    46  * interface, and are not recommended for use by regular applications.
    46  * interface, and are not recommended for use by regular applications.
    47  * Some of them may become public in the future; others may stay private,
    47  * Some of them may become public in the future; others may stay private,
    48  * change in an incompatible way, or even disappear.
    48  * change in an incompatible way, or even disappear.
    49  * Although the libpng users are not forbidden to include this header,
    49  * Although the libpng users are not forbidden to include this header,
    50  * they should be well aware of the issues that may arise from doing so.
    50  * they should be well aware of the issues that may arise from doing so.
    65  * Windows/Visual Studio) there is no effect; the OS specific tests below are
    65  * Windows/Visual Studio) there is no effect; the OS specific tests below are
    66  * still required (as of 2011-05-02.)
    66  * still required (as of 2011-05-02.)
    67  */
    67  */
    68 #define _POSIX_SOURCE 1 /* Just the POSIX 1003.1 and C89 APIs */
    68 #define _POSIX_SOURCE 1 /* Just the POSIX 1003.1 and C89 APIs */
    69 
    69 
    70 /* This is required for the definition of abort(), used as a last ditch
    70 #ifndef PNG_VERSION_INFO_ONLY
    71  * error handler when all else fails.
    71 /* Standard library headers not required by png.h: */
    72  */
    72 #  include <stdlib.h>
    73 #include <stdlib.h>
    73 #  include <string.h>
    74 
    74 #endif
    75 #define PNGLIB_BUILD
    75 
       
    76 #define PNGLIB_BUILD /*libpng is being built, not used*/
       
    77 
       
    78 /* If HAVE_CONFIG_H is defined during the build then the build system must
       
    79  * provide an appropriate "config.h" file on the include path.  The header file
       
    80  * must provide definitions as required below (search for "HAVE_CONFIG_H");
       
    81  * see configure.ac for more details of the requirements.  The macro
       
    82  * "PNG_NO_CONFIG_H" is provided for maintainers to test for dependencies on
       
    83  * 'configure'; define this macro to prevent the configure build including the
       
    84  * configure generated config.h.  Libpng is expected to compile without *any*
       
    85  * special build system support on a reasonably ANSI-C compliant system.
       
    86  */
       
    87 #if defined(HAVE_CONFIG_H) && !defined(PNG_NO_CONFIG_H)
       
    88 #  include <config.h>
       
    89 
       
    90    /* Pick up the definition of 'restrict' from config.h if it was read: */
       
    91 #  define PNG_RESTRICT restrict
       
    92 #endif
       
    93 
       
    94 /* To support symbol prefixing it is necessary to know *before* including png.h
       
    95  * whether the fixed point (and maybe other) APIs are exported, because if they
       
    96  * are not internal definitions may be required.  This is handled below just
       
    97  * before png.h is included, but load the configuration now if it is available.
       
    98  */
       
    99 #ifndef PNGLCONF_H
       
   100 #  include "pnglibconf.h"
       
   101 #endif
       
   102 
       
   103 /* Local renames may change non-exported API functions from png.h */
       
   104 #if defined(PNG_PREFIX) && !defined(PNGPREFIX_H)
       
   105 #  include "pngprefix.h"
       
   106 #endif
       
   107 
    76 #ifdef PNG_USER_CONFIG
   108 #ifdef PNG_USER_CONFIG
    77 #  include "pngusr.h"
   109 #  include "pngusr.h"
    78    /* These should have been defined in pngusr.h */
   110    /* These should have been defined in pngusr.h */
    79 #  ifndef PNG_USER_PRIVATEBUILD
   111 #  ifndef PNG_USER_PRIVATEBUILD
    80 #    define PNG_USER_PRIVATEBUILD "Custom libpng build"
   112 #    define PNG_USER_PRIVATEBUILD "Custom libpng build"
    81 #  endif
   113 #  endif
    82 #  ifndef PNG_USER_DLLFNAME_POSTFIX
   114 #  ifndef PNG_USER_DLLFNAME_POSTFIX
    83 #    define PNG_USER_DLLFNAME_POSTFIX "Cb"
   115 #    define PNG_USER_DLLFNAME_POSTFIX "Cb"
    84 #  endif
   116 #  endif
    85 #endif
   117 #endif
       
   118 
       
   119 /* Compile time options.
       
   120  * =====================
       
   121  * In a multi-arch build the compiler may compile the code several times for the
       
   122  * same object module, producing different binaries for different architectures.
       
   123  * When this happens configure-time setting of the target host options cannot be
       
   124  * done and this interferes with the handling of the ARM NEON optimizations, and
       
   125  * possibly other similar optimizations.  Put additional tests here; in general
       
   126  * this is needed when the same option can be changed at both compile time and
       
   127  * run time depending on the target OS (i.e. iOS vs Android.)
       
   128  *
       
   129  * NOTE: symbol prefixing does not pass $(CFLAGS) to the preprocessor, because
       
   130  * this is not possible with certain compilers (Oracle SUN OS CC), as a result
       
   131  * it is necessary to ensure that all extern functions that *might* be used
       
   132  * regardless of $(CFLAGS) get declared in this file.  The test on __ARM_NEON__
       
   133  * below is one example of this behavior because it is controlled by the
       
   134  * presence or not of -mfpu=neon on the GCC command line, it is possible to do
       
   135  * this in $(CC), e.g. "CC=gcc -mfpu=neon", but people who build libpng rarely
       
   136  * do this.
       
   137  */
       
   138 #ifndef PNG_ARM_NEON_OPT
       
   139    /* ARM NEON optimizations are being controlled by the compiler settings,
       
   140     * typically the target FPU.  If the FPU has been set to NEON (-mfpu=neon
       
   141     * with GCC) then the compiler will define __ARM_NEON__ and we can rely
       
   142     * unconditionally on NEON instructions not crashing, otherwise we must
       
   143     * disable use of NEON instructions.
       
   144     *
       
   145     * NOTE: at present these optimizations depend on 'ALIGNED_MEMORY', so they
       
   146     * can only be turned on automatically if that is supported too.  If
       
   147     * PNG_ARM_NEON_OPT is set in CPPFLAGS (to >0) then arm/arm_init.c will fail
       
   148     * to compile with an appropriate #error if ALIGNED_MEMORY has been turned
       
   149     * off.
       
   150     *
       
   151     * Note that gcc-4.9 defines __ARM_NEON instead of __ARM_NEON__, so we
       
   152     * check both variants.
       
   153     */
       
   154 #  if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
       
   155    defined(PNG_ALIGNED_MEMORY_SUPPORTED)
       
   156 #     define PNG_ARM_NEON_OPT 2
       
   157 #  else
       
   158 #     define PNG_ARM_NEON_OPT 0
       
   159 #  endif
       
   160 #endif
       
   161 
       
   162 #if PNG_ARM_NEON_OPT > 0
       
   163    /* NEON optimizations are to be at least considered by libpng, so enable the
       
   164     * callbacks to do this.
       
   165     */
       
   166 #  define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_neon
       
   167 
       
   168    /* By default the 'intrinsics' code in arm/filter_neon_intrinsics.c is used
       
   169     * if possible - if __ARM_NEON__ is set and the compiler version is not known
       
   170     * to be broken.  This is controlled by PNG_ARM_NEON_IMPLEMENTATION which can
       
   171     * be:
       
   172     *
       
   173     *    1  The intrinsics code (the default with __ARM_NEON__)
       
   174     *    2  The hand coded assembler (the default without __ARM_NEON__)
       
   175     *
       
   176     * It is possible to set PNG_ARM_NEON_IMPLEMENTATION in CPPFLAGS, however
       
   177     * this is *NOT* supported and may cease to work even after a minor revision
       
   178     * to libpng.  It *is* valid to do this for testing purposes, e.g. speed
       
   179     * testing or a new compiler, but the results should be communicated to the
       
   180     * libpng implementation list for incorporation in the next minor release.
       
   181     */
       
   182 #  ifndef PNG_ARM_NEON_IMPLEMENTATION
       
   183 #     if defined(__ARM_NEON__) || defined(__ARM_NEON)
       
   184 #        if defined(__clang__)
       
   185             /* At present it is unknown by the libpng developers which versions
       
   186              * of clang support the intrinsics, however some or perhaps all
       
   187              * versions do not work with the assembler so this may be
       
   188              * irrelevant, so just use the default (do nothing here.)
       
   189              */
       
   190 #        elif defined(__GNUC__)
       
   191             /* GCC 4.5.4 NEON support is known to be broken.  4.6.3 is known to
       
   192              * work, so if this *is* GCC, or G++, look for a version >4.5
       
   193              */
       
   194 #           if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6)
       
   195 #              define PNG_ARM_NEON_IMPLEMENTATION 2
       
   196 #           endif /* no GNUC support */
       
   197 #        endif /* __GNUC__ */
       
   198 #     else /* !defined __ARM_NEON__ */
       
   199          /* The 'intrinsics' code simply won't compile without this -mfpu=neon:
       
   200           */
       
   201 #        define PNG_ARM_NEON_IMPLEMENTATION 2
       
   202 #     endif /* __ARM_NEON__ */
       
   203 #  endif /* !PNG_ARM_NEON_IMPLEMENTATION */
       
   204 
       
   205 #  ifndef PNG_ARM_NEON_IMPLEMENTATION
       
   206       /* Use the intrinsics code by default. */
       
   207 #     define PNG_ARM_NEON_IMPLEMENTATION 1
       
   208 #  endif
       
   209 #endif /* PNG_ARM_NEON_OPT > 0 */
       
   210 
       
   211 /* Is this a build of a DLL where compilation of the object modules requires
       
   212  * different preprocessor settings to those required for a simple library?  If
       
   213  * so PNG_BUILD_DLL must be set.
       
   214  *
       
   215  * If libpng is used inside a DLL but that DLL does not export the libpng APIs
       
   216  * PNG_BUILD_DLL must not be set.  To avoid the code below kicking in build a
       
   217  * static library of libpng then link the DLL against that.
       
   218  */
       
   219 #ifndef PNG_BUILD_DLL
       
   220 #  ifdef DLL_EXPORT
       
   221       /* This is set by libtool when files are compiled for a DLL; libtool
       
   222        * always compiles twice, even on systems where it isn't necessary.  Set
       
   223        * PNG_BUILD_DLL in case it is necessary:
       
   224        */
       
   225 #     define PNG_BUILD_DLL
       
   226 #  else
       
   227 #     ifdef _WINDLL
       
   228          /* This is set by the Microsoft Visual Studio IDE in projects that
       
   229           * build a DLL.  It can't easily be removed from those projects (it
       
   230           * isn't visible in the Visual Studio UI) so it is a fairly reliable
       
   231           * indication that PNG_IMPEXP needs to be set to the DLL export
       
   232           * attributes.
       
   233           */
       
   234 #        define PNG_BUILD_DLL
       
   235 #     else
       
   236 #        ifdef __DLL__
       
   237             /* This is set by the Borland C system when compiling for a DLL
       
   238              * (as above.)
       
   239              */
       
   240 #           define PNG_BUILD_DLL
       
   241 #        else
       
   242             /* Add additional compiler cases here. */
       
   243 #        endif
       
   244 #     endif
       
   245 #  endif
       
   246 #endif /* Setting PNG_BUILD_DLL if required */
       
   247 
       
   248 /* See pngconf.h for more details: the builder of the library may set this on
       
   249  * the command line to the right thing for the specific compilation system or it
       
   250  * may be automagically set above (at present we know of no system where it does
       
   251  * need to be set on the command line.)
       
   252  *
       
   253  * PNG_IMPEXP must be set here when building the library to prevent pngconf.h
       
   254  * setting it to the "import" setting for a DLL build.
       
   255  */
       
   256 #ifndef PNG_IMPEXP
       
   257 #  ifdef PNG_BUILD_DLL
       
   258 #     define PNG_IMPEXP PNG_DLL_EXPORT
       
   259 #  else
       
   260       /* Not building a DLL, or the DLL doesn't require specific export
       
   261        * definitions.
       
   262        */
       
   263 #     define PNG_IMPEXP
       
   264 #  endif
       
   265 #endif
       
   266 
       
   267 /* No warnings for private or deprecated functions in the build: */
       
   268 #ifndef PNG_DEPRECATED
       
   269 #  define PNG_DEPRECATED
       
   270 #endif
       
   271 #ifndef PNG_PRIVATE
       
   272 #  define PNG_PRIVATE
       
   273 #endif
       
   274 
       
   275 /* Symbol preprocessing support.
       
   276  *
       
   277  * To enable listing global, but internal, symbols the following macros should
       
   278  * always be used to declare an extern data or function object in this file.
       
   279  */
       
   280 #ifndef PNG_INTERNAL_DATA
       
   281 #  define PNG_INTERNAL_DATA(type, name, array) extern type name array
       
   282 #endif
       
   283 
       
   284 #ifndef PNG_INTERNAL_FUNCTION
       
   285 #  define PNG_INTERNAL_FUNCTION(type, name, args, attributes)\
       
   286       extern PNG_FUNCTION(type, name, args, PNG_EMPTY attributes)
       
   287 #endif
       
   288 
       
   289 #ifndef PNG_INTERNAL_CALLBACK
       
   290 #  define PNG_INTERNAL_CALLBACK(type, name, args, attributes)\
       
   291       extern PNG_FUNCTION(type, (PNGCBAPI name), args, PNG_EMPTY attributes)
       
   292 #endif
       
   293 
       
   294 /* If floating or fixed point APIs are disabled they may still be compiled
       
   295  * internally.  To handle this make sure they are declared as the appropriate
       
   296  * internal extern function (otherwise the symbol prefixing stuff won't work and
       
   297  * the functions will be used without definitions.)
       
   298  *
       
   299  * NOTE: although all the API functions are declared here they are not all
       
   300  * actually built!  Because the declarations are still made it is necessary to
       
   301  * fake out types that they depend on.
       
   302  */
       
   303 #ifndef PNG_FP_EXPORT
       
   304 #  ifndef PNG_FLOATING_POINT_SUPPORTED
       
   305 #     define PNG_FP_EXPORT(ordinal, type, name, args)\
       
   306          PNG_INTERNAL_FUNCTION(type, name, args, PNG_EMPTY);
       
   307 #     ifndef PNG_VERSION_INFO_ONLY
       
   308          typedef struct png_incomplete png_double;
       
   309          typedef png_double*           png_doublep;
       
   310          typedef const png_double*     png_const_doublep;
       
   311          typedef png_double**          png_doublepp;
       
   312 #     endif
       
   313 #  endif
       
   314 #endif
       
   315 #ifndef PNG_FIXED_EXPORT
       
   316 #  ifndef PNG_FIXED_POINT_SUPPORTED
       
   317 #     define PNG_FIXED_EXPORT(ordinal, type, name, args)\
       
   318          PNG_INTERNAL_FUNCTION(type, name, args, PNG_EMPTY);
       
   319 #  endif
       
   320 #endif
       
   321 
    86 #include "png.h"
   322 #include "png.h"
    87 #include "pnginfo.h"
   323 
    88 #include "pngstruct.h"
   324 /* pngconf.h does not set PNG_DLL_EXPORT unless it is required, so: */
    89 
   325 #ifndef PNG_DLL_EXPORT
    90 /* This is used for 16 bit gamma tables - only the top level pointers are const,
   326 #  define PNG_DLL_EXPORT
    91  * this could be changed:
   327 #endif
    92  */
   328 
    93 typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
   329 /* SECURITY and SAFETY:
    94 
   330  *
    95 /* Added at libpng-1.2.9 */
   331  * By default libpng is built without any internal limits on image size,
    96 /* Moved to pngpriv.h at libpng-1.5.0 */
   332  * individual heap (png_malloc) allocations or the total amount of memory used.
    97 
   333  * If PNG_SAFE_LIMITS_SUPPORTED is defined, however, the limits below are used
    98 /* config.h is created by and PNG_CONFIGURE_LIBPNG is set by the "configure"
   334  * (unless individually overridden).  These limits are believed to be fairly
    99  * script.  We may need it here to get the correct configuration on things
   335  * safe, but builders of secure systems should verify the values against the
   100  * like limits.
   336  * real system capabilities.
   101  */
   337  */
   102 #ifdef PNG_CONFIGURE_LIBPNG
   338 #ifdef PNG_SAFE_LIMITS_SUPPORTED
   103 #  ifdef HAVE_CONFIG_H
   339    /* 'safe' limits */
   104 #    include "config.h"
   340 #  ifndef PNG_USER_WIDTH_MAX
       
   341 #     define PNG_USER_WIDTH_MAX 1000000
       
   342 #  endif
       
   343 #  ifndef PNG_USER_HEIGHT_MAX
       
   344 #     define PNG_USER_HEIGHT_MAX 1000000
       
   345 #  endif
       
   346 #  ifndef PNG_USER_CHUNK_CACHE_MAX
       
   347 #     define PNG_USER_CHUNK_CACHE_MAX 128
       
   348 #  endif
       
   349 #  ifndef PNG_USER_CHUNK_MALLOC_MAX
       
   350 #     define PNG_USER_CHUNK_MALLOC_MAX 8000000
       
   351 #  endif
       
   352 #else
       
   353    /* values for no limits */
       
   354 #  ifndef PNG_USER_WIDTH_MAX
       
   355 #     define PNG_USER_WIDTH_MAX 0x7fffffff
       
   356 #  endif
       
   357 #  ifndef PNG_USER_HEIGHT_MAX
       
   358 #     define PNG_USER_HEIGHT_MAX 0x7fffffff
       
   359 #  endif
       
   360 #  ifndef PNG_USER_CHUNK_CACHE_MAX
       
   361 #     define PNG_USER_CHUNK_CACHE_MAX 0
       
   362 #  endif
       
   363 #  ifndef PNG_USER_CHUNK_MALLOC_MAX
       
   364 #     define PNG_USER_CHUNK_MALLOC_MAX 0
   105 #  endif
   365 #  endif
   106 #endif
   366 #endif
   107 
   367 
   108 /* Moved to pngpriv.h at libpng-1.5.0 */
   368 /* Moved to pngpriv.h at libpng-1.5.0 */
   109 /* NOTE: some of these may have been used in external applications as
   369 /* NOTE: some of these may have been used in external applications as
   141 #if (PNG_ZBUF_SIZE > 65536L) && defined(PNG_MAX_MALLOC_64K)
   401 #if (PNG_ZBUF_SIZE > 65536L) && defined(PNG_MAX_MALLOC_64K)
   142 #  undef PNG_ZBUF_SIZE
   402 #  undef PNG_ZBUF_SIZE
   143 #  define PNG_ZBUF_SIZE 65536L
   403 #  define PNG_ZBUF_SIZE 65536L
   144 #endif
   404 #endif
   145 
   405 
   146 /* PNG_STATIC is used to mark internal file scope functions if they need to be
       
   147  * accessed for implementation tests (see the code in tests/?*).
       
   148  */
       
   149 #ifndef PNG_STATIC
       
   150 #   define PNG_STATIC static
       
   151 #endif
       
   152 
       
   153 /* If warnings or errors are turned off the code is disabled or redirected here.
   406 /* If warnings or errors are turned off the code is disabled or redirected here.
   154  * From 1.5.4 functions have been added to allow very limited formatting of
   407  * From 1.5.4 functions have been added to allow very limited formatting of
   155  * error and warning messages - this code will also be disabled here.
   408  * error and warning messages - this code will also be disabled here.
   156  */
   409  */
   157 #ifdef PNG_WARNINGS_SUPPORTED
   410 #ifdef PNG_WARNINGS_SUPPORTED
   158 #  define PNG_WARNING_PARAMETERS(p) png_warning_parameters p;
   411 #  define PNG_WARNING_PARAMETERS(p) png_warning_parameters p;
   159 #else
   412 #else
   160 #  define png_warning(s1,s2) ((void)(s1))
       
   161 #  define png_chunk_warning(s1,s2) ((void)(s1))
       
   162 #  define png_warning_parameter(p,number,string) ((void)0)
   413 #  define png_warning_parameter(p,number,string) ((void)0)
   163 #  define png_warning_parameter_unsigned(p,number,format,value) ((void)0)
   414 #  define png_warning_parameter_unsigned(p,number,format,value) ((void)0)
   164 #  define png_warning_parameter_signed(p,number,format,value) ((void)0)
   415 #  define png_warning_parameter_signed(p,number,format,value) ((void)0)
   165 #  define png_formatted_warning(pp,p,message) ((void)(pp))
   416 #  define png_formatted_warning(pp,p,message) ((void)(pp))
   166 #  define PNG_WARNING_PARAMETERS(p)
   417 #  define PNG_WARNING_PARAMETERS(p)
   167 #endif
   418 #endif
   168 #ifndef PNG_ERROR_TEXT_SUPPORTED
   419 #ifndef PNG_ERROR_TEXT_SUPPORTED
   169 #  define png_error(s1,s2) png_err(s1)
       
   170 #  define png_chunk_error(s1,s2) png_err(s1)
       
   171 #  define png_fixed_error(s1,s2) png_err(s1)
   420 #  define png_fixed_error(s1,s2) png_err(s1)
   172 #endif
   421 #endif
   173 
   422 
   174 #ifndef PNG_EXTERN
   423 /* C allows up-casts from (void*) to any pointer and (const void*) to any
   175 /* The functions exported by PNG_EXTERN are internal functions, which
   424  * pointer to a const object.  C++ regards this as a type error and requires an
   176  * aren't usually used outside the library (as far as I know), so it is
   425  * explicit, static, cast and provides the static_cast<> rune to ensure that
   177  * debatable if they should be exported at all.  In the future, when it
   426  * const is not cast away.
   178  * is possible to have run-time registry of chunk-handling functions,
   427  */
   179  * some of these might be made available again.
   428 #ifdef __cplusplus
   180 #  define PNG_EXTERN extern
   429 #  define png_voidcast(type, value) static_cast<type>(value)
   181  */
   430 #  define png_constcast(type, value) const_cast<type>(value)
   182 #  define PNG_EXTERN
   431 #  define png_aligncast(type, value) \
   183 #endif
   432    static_cast<type>(static_cast<void*>(value))
       
   433 #  define png_aligncastconst(type, value) \
       
   434    static_cast<type>(static_cast<const void*>(value))
       
   435 #else
       
   436 #  define png_voidcast(type, value) (value)
       
   437 #  define png_constcast(type, value) ((type)(value))
       
   438 #  define png_aligncast(type, value) ((void*)(value))
       
   439 #  define png_aligncastconst(type, value) ((const void*)(value))
       
   440 #endif /* __cplusplus */
   184 
   441 
   185 /* Some fixed point APIs are still required even if not exported because
   442 /* Some fixed point APIs are still required even if not exported because
   186  * they get used by the corresponding floating point APIs.  This magic
   443  * they get used by the corresponding floating point APIs.  This magic
   187  * deals with this:
   444  * deals with this:
   188  */
   445  */
   190 #  define PNGFAPI PNGAPI
   447 #  define PNGFAPI PNGAPI
   191 #else
   448 #else
   192 #  define PNGFAPI /* PRIVATE */
   449 #  define PNGFAPI /* PRIVATE */
   193 #endif
   450 #endif
   194 
   451 
       
   452 #ifndef PNG_VERSION_INFO_ONLY
   195 /* Other defines specific to compilers can go here.  Try to keep
   453 /* Other defines specific to compilers can go here.  Try to keep
   196  * them inside an appropriate ifdef/endif pair for portability.
   454  * them inside an appropriate ifdef/endif pair for portability.
   197  */
   455  */
   198 #if defined(PNG_FLOATING_POINT_SUPPORTED) ||\
   456 #if defined(PNG_FLOATING_POINT_SUPPORTED) ||\
   199     defined(PNG_FLOATING_ARITHMETIC_SUPPORTED)
   457     defined(PNG_FLOATING_ARITHMETIC_SUPPORTED)
   234 
   492 
   235 #if defined(WIN32) || defined(_Windows) || defined(_WINDOWS) || \
   493 #if defined(WIN32) || defined(_Windows) || defined(_WINDOWS) || \
   236     defined(_WIN32) || defined(__WIN32__)
   494     defined(_WIN32) || defined(__WIN32__)
   237 #  include <windows.h>  /* defines _WINDOWS_ macro */
   495 #  include <windows.h>  /* defines _WINDOWS_ macro */
   238 #endif
   496 #endif
       
   497 #endif /* PNG_VERSION_INFO_ONLY */
   239 
   498 
   240 /* Moved here around 1.5.0beta36 from pngconf.h */
   499 /* Moved here around 1.5.0beta36 from pngconf.h */
   241 /* Users may want to use these so they are not private.  Any library
   500 /* Users may want to use these so they are not private.  Any library
   242  * functions that are passed far data must be model-independent.
   501  * functions that are passed far data must be model-independent.
   243  */
   502  */
   249 #  else
   508 #  else
   250 #    define PNG_ABORT() abort()
   509 #    define PNG_ABORT() abort()
   251 #  endif
   510 #  endif
   252 #endif
   511 #endif
   253 
   512 
   254 #ifdef USE_FAR_KEYWORD
   513 /* These macros may need to be architecture dependent. */
   255 /* Use this to make far-to-near assignments */
   514 #define PNG_ALIGN_NONE   0 /* do not use data alignment */
   256 #  define CHECK   1
   515 #define PNG_ALIGN_ALWAYS 1 /* assume unaligned accesses are OK */
   257 #  define NOCHECK 0
   516 #ifdef offsetof
   258 #  define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK))
   517 #  define PNG_ALIGN_OFFSET 2 /* use offsetof to determine alignment */
   259 #  define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK))
       
   260 #  define png_strlen  _fstrlen
       
   261 #  define png_memcmp  _fmemcmp    /* SJT: added */
       
   262 #  define png_memcpy  _fmemcpy
       
   263 #  define png_memset  _fmemset
       
   264 #else
   518 #else
   265 #  ifdef _WINDOWS_  /* Favor Windows over C runtime fns */
   519 #  define PNG_ALIGN_OFFSET -1 /* prevent the use of this */
   266 #    define CVT_PTR(ptr)         (ptr)
   520 #endif
   267 #    define CVT_PTR_NOCHECK(ptr) (ptr)
   521 #define PNG_ALIGN_SIZE   3 /* use sizeof to determine alignment */
   268 #    define png_strlen  lstrlenA
   522 
   269 #    define png_memcmp  memcmp
   523 #ifndef PNG_ALIGN_TYPE
   270 #    define png_memcpy  CopyMemory
   524    /* Default to using aligned access optimizations and requiring alignment to a
   271 #    define png_memset  memset
   525     * multiple of the data type size.  Override in a compiler specific fashion
       
   526     * if necessary by inserting tests here:
       
   527     */
       
   528 #  define PNG_ALIGN_TYPE PNG_ALIGN_SIZE
       
   529 #endif
       
   530 
       
   531 #if PNG_ALIGN_TYPE == PNG_ALIGN_SIZE
       
   532    /* This is used because in some compiler implementations non-aligned
       
   533     * structure members are supported, so the offsetof approach below fails.
       
   534     * Set PNG_ALIGN_SIZE=0 for compiler combinations where unaligned access
       
   535     * is good for performance.  Do not do this unless you have tested the result
       
   536     * and understand it.
       
   537     */
       
   538 #  define png_alignof(type) (sizeof (type))
       
   539 #else
       
   540 #  if PNG_ALIGN_TYPE == PNG_ALIGN_OFFSET
       
   541 #     define png_alignof(type) offsetof(struct{char c; type t;}, t)
   272 #  else
   542 #  else
   273 #    define CVT_PTR(ptr)         (ptr)
   543 #     if PNG_ALIGN_TYPE == PNG_ALIGN_ALWAYS
   274 #    define CVT_PTR_NOCHECK(ptr) (ptr)
   544 #        define png_alignof(type) (1)
   275 #    define png_strlen  strlen
   545 #     endif
   276 #    define png_memcmp  memcmp      /* SJT: added */
   546       /* Else leave png_alignof undefined to prevent use thereof */
   277 #    define png_memcpy  memcpy
   547 #  endif
   278 #    define png_memset  memset
   548 #endif
   279 #  endif
   549 
   280 #endif
   550 /* This implicitly assumes alignment is always to a power of 2. */
       
   551 #ifdef png_alignof
       
   552 #  define png_isaligned(ptr, type)\
       
   553    ((((const char*)ptr-(const char*)0) & (png_alignof(type)-1)) == 0)
       
   554 #else
       
   555 #  define png_isaligned(ptr, type) 0
       
   556 #endif
       
   557 
   281 /* End of memory model/platform independent support */
   558 /* End of memory model/platform independent support */
   282 /* End of 1.5.0beta36 move from pngconf.h */
   559 /* End of 1.5.0beta36 move from pngconf.h */
   283 
   560 
   284 /* CONSTANTS and UTILITY MACROS
   561 /* CONSTANTS and UTILITY MACROS
   285  * These are used internally by libpng and not exposed in the API
   562  * These are used internally by libpng and not exposed in the API
   293 /* #define PNG_HAVE_IHDR            0x01 (defined in png.h) */
   570 /* #define PNG_HAVE_IHDR            0x01 (defined in png.h) */
   294 /* #define PNG_HAVE_PLTE            0x02 (defined in png.h) */
   571 /* #define PNG_HAVE_PLTE            0x02 (defined in png.h) */
   295 #define PNG_HAVE_IDAT               0x04
   572 #define PNG_HAVE_IDAT               0x04
   296 /* #define PNG_AFTER_IDAT           0x08 (defined in png.h) */
   573 /* #define PNG_AFTER_IDAT           0x08 (defined in png.h) */
   297 #define PNG_HAVE_IEND               0x10
   574 #define PNG_HAVE_IEND               0x10
   298 #define PNG_HAVE_gAMA               0x20
   575                    /*               0x20 (unused) */
   299 #define PNG_HAVE_cHRM               0x40
   576                    /*               0x40 (unused) */
   300 #define PNG_HAVE_sRGB               0x80
   577                    /*               0x80 (unused) */
   301 #define PNG_HAVE_CHUNK_HEADER      0x100
   578 #define PNG_HAVE_CHUNK_HEADER      0x100
   302 #define PNG_WROTE_tIME             0x200
   579 #define PNG_WROTE_tIME             0x200
   303 #define PNG_WROTE_INFO_BEFORE_PLTE 0x400
   580 #define PNG_WROTE_INFO_BEFORE_PLTE 0x400
   304 #define PNG_BACKGROUND_IS_GRAY     0x800
   581 #define PNG_BACKGROUND_IS_GRAY     0x800
   305 #define PNG_HAVE_PNG_SIGNATURE    0x1000
   582 #define PNG_HAVE_PNG_SIGNATURE    0x1000
   306 #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */
   583 #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */
       
   584                    /*             0x4000 (unused) */
       
   585 #define PNG_IS_READ_STRUCT        0x8000 /* Else is a write struct */
   307 
   586 
   308 /* Flags for the transformations the PNG library does on the image data */
   587 /* Flags for the transformations the PNG library does on the image data */
   309 #define PNG_BGR                 0x0001
   588 #define PNG_BGR                 0x0001
   310 #define PNG_INTERLACE           0x0002
   589 #define PNG_INTERLACE           0x0002
   311 #define PNG_PACK                0x0004
   590 #define PNG_PACK                0x0004
   319 #define PNG_16_TO_8             0x0400     /* Becomes 'chop' in 1.5.4 */
   598 #define PNG_16_TO_8             0x0400     /* Becomes 'chop' in 1.5.4 */
   320 #define PNG_RGBA                0x0800
   599 #define PNG_RGBA                0x0800
   321 #define PNG_EXPAND              0x1000
   600 #define PNG_EXPAND              0x1000
   322 #define PNG_GAMMA               0x2000
   601 #define PNG_GAMMA               0x2000
   323 #define PNG_GRAY_TO_RGB         0x4000
   602 #define PNG_GRAY_TO_RGB         0x4000
   324 #define PNG_FILLER              0x8000L
   603 #define PNG_FILLER              0x8000
   325 #define PNG_PACKSWAP           0x10000L
   604 #define PNG_PACKSWAP           0x10000
   326 #define PNG_SWAP_ALPHA         0x20000L
   605 #define PNG_SWAP_ALPHA         0x20000
   327 #define PNG_STRIP_ALPHA        0x40000L
   606 #define PNG_STRIP_ALPHA        0x40000
   328 #define PNG_INVERT_ALPHA       0x80000L
   607 #define PNG_INVERT_ALPHA       0x80000
   329 #define PNG_USER_TRANSFORM    0x100000L
   608 #define PNG_USER_TRANSFORM    0x100000
   330 #define PNG_RGB_TO_GRAY_ERR   0x200000L
   609 #define PNG_RGB_TO_GRAY_ERR   0x200000
   331 #define PNG_RGB_TO_GRAY_WARN  0x400000L
   610 #define PNG_RGB_TO_GRAY_WARN  0x400000
   332 #define PNG_RGB_TO_GRAY       0x600000L  /* two bits, RGB_TO_GRAY_ERR|WARN */
   611 #define PNG_RGB_TO_GRAY       0x600000 /* two bits, RGB_TO_GRAY_ERR|WARN */
   333 #define PNG_ENCODE_ALPHA      0x800000L  /* Added to libpng-1.5.4 */
   612 #define PNG_ENCODE_ALPHA      0x800000 /* Added to libpng-1.5.4 */
   334 #define PNG_ADD_ALPHA         0x1000000L  /* Added to libpng-1.2.7 */
   613 #define PNG_ADD_ALPHA         0x1000000 /* Added to libpng-1.2.7 */
   335 #define PNG_EXPAND_tRNS       0x2000000L  /* Added to libpng-1.2.9 */
   614 #define PNG_EXPAND_tRNS       0x2000000 /* Added to libpng-1.2.9 */
   336 #define PNG_SCALE_16_TO_8     0x4000000L  /* Added to libpng-1.5.4 */
   615 #define PNG_SCALE_16_TO_8     0x4000000 /* Added to libpng-1.5.4 */
   337                        /*   0x8000000L  unused */
   616                        /*   0x8000000 unused */
   338                        /*  0x10000000L  unused */
   617                        /*  0x10000000 unused */
   339                        /*  0x20000000L  unused */
   618                        /*  0x20000000 unused */
   340                        /*  0x40000000L  unused */
   619                        /*  0x40000000 unused */
   341 
       
   342 /* Flags for png_create_struct */
   620 /* Flags for png_create_struct */
   343 #define PNG_STRUCT_PNG   0x0001
   621 #define PNG_STRUCT_PNG   0x0001
   344 #define PNG_STRUCT_INFO  0x0002
   622 #define PNG_STRUCT_INFO  0x0002
   345 
   623 
   346 /* Scaling factor for filter heuristic weighting calculations */
   624 /* Scaling factor for filter heuristic weighting calculations */
   347 #define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT))
   625 #define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT))
   348 #define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT))
   626 #define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT))
   349 
   627 
   350 /* Flags for the png_ptr->flags rather than declaring a byte for each one */
   628 /* Flags for the png_ptr->flags rather than declaring a byte for each one */
   351 #define PNG_FLAG_ZLIB_CUSTOM_STRATEGY     0x0001
   629 #define PNG_FLAG_ZLIB_CUSTOM_STRATEGY     0x0001
   352 #define PNG_FLAG_ZLIB_CUSTOM_LEVEL        0x0002
   630 #define PNG_FLAG_ZSTREAM_INITIALIZED      0x0002 /* Added to libpng-1.6.0 */
   353 #define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL    0x0004
   631                                   /*      0x0004    unused */
   354 #define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS  0x0008
   632 #define PNG_FLAG_ZSTREAM_ENDED            0x0008 /* Added to libpng-1.6.0 */
   355 #define PNG_FLAG_ZLIB_CUSTOM_METHOD       0x0010
   633                                   /*      0x0010    unused */
   356 #define PNG_FLAG_ZLIB_FINISHED            0x0020
   634                                   /*      0x0020    unused */
   357 #define PNG_FLAG_ROW_INIT                 0x0040
   635 #define PNG_FLAG_ROW_INIT                 0x0040
   358 #define PNG_FLAG_FILLER_AFTER             0x0080
   636 #define PNG_FLAG_FILLER_AFTER             0x0080
   359 #define PNG_FLAG_CRC_ANCILLARY_USE        0x0100
   637 #define PNG_FLAG_CRC_ANCILLARY_USE        0x0100
   360 #define PNG_FLAG_CRC_ANCILLARY_NOWARN     0x0200
   638 #define PNG_FLAG_CRC_ANCILLARY_NOWARN     0x0200
   361 #define PNG_FLAG_CRC_CRITICAL_USE         0x0400
   639 #define PNG_FLAG_CRC_CRITICAL_USE         0x0400
   362 #define PNG_FLAG_CRC_CRITICAL_IGNORE      0x0800
   640 #define PNG_FLAG_CRC_CRITICAL_IGNORE      0x0800
   363 #define PNG_FLAG_ASSUME_sRGB              0x1000  /* Added to libpng-1.5.4 */
   641 #define PNG_FLAG_ASSUME_sRGB              0x1000 /* Added to libpng-1.5.4 */
   364 #define PNG_FLAG_OPTIMIZE_ALPHA           0x2000  /* Added to libpng-1.5.4 */
   642 #define PNG_FLAG_OPTIMIZE_ALPHA           0x2000 /* Added to libpng-1.5.4 */
   365 #define PNG_FLAG_DETECT_UNINITIALIZED     0x4000  /* Added to libpng-1.5.4 */
   643 #define PNG_FLAG_DETECT_UNINITIALIZED     0x4000 /* Added to libpng-1.5.4 */
   366 #define PNG_FLAG_KEEP_UNKNOWN_CHUNKS      0x8000L
   644 /* #define PNG_FLAG_KEEP_UNKNOWN_CHUNKS      0x8000 */
   367 #define PNG_FLAG_KEEP_UNSAFE_CHUNKS       0x10000L
   645 /* #define PNG_FLAG_KEEP_UNSAFE_CHUNKS      0x10000 */
   368 #define PNG_FLAG_LIBRARY_MISMATCH         0x20000L
   646 #define PNG_FLAG_LIBRARY_MISMATCH        0x20000
   369 #define PNG_FLAG_STRIP_ERROR_NUMBERS      0x40000L
   647 #define PNG_FLAG_STRIP_ERROR_NUMBERS     0x40000
   370 #define PNG_FLAG_STRIP_ERROR_TEXT         0x80000L
   648 #define PNG_FLAG_STRIP_ERROR_TEXT        0x80000
   371 #define PNG_FLAG_MALLOC_NULL_MEM_OK       0x100000L
   649 #define PNG_FLAG_BENIGN_ERRORS_WARN     0x100000 /* Added to libpng-1.4.0 */
   372                                   /*      0x200000L  unused */
   650 #define PNG_FLAG_APP_WARNINGS_WARN      0x200000 /* Added to libpng-1.6.0 */
   373                                   /*      0x400000L  unused */
   651 #define PNG_FLAG_APP_ERRORS_WARN        0x400000 /* Added to libpng-1.6.0 */
   374 #define PNG_FLAG_BENIGN_ERRORS_WARN       0x800000L  /* Added to libpng-1.4.0 */
   652                                   /*    0x800000    unused */
   375 #define PNG_FLAG_ZTXT_CUSTOM_STRATEGY    0x1000000L  /* 5 lines added */
   653                                   /*   0x1000000    unused */
   376 #define PNG_FLAG_ZTXT_CUSTOM_LEVEL       0x2000000L  /* to libpng-1.5.4 */
   654                                   /*   0x2000000    unused */
   377 #define PNG_FLAG_ZTXT_CUSTOM_MEM_LEVEL   0x4000000L
   655                                   /*   0x4000000    unused */
   378 #define PNG_FLAG_ZTXT_CUSTOM_WINDOW_BITS 0x8000000L
   656                                   /*   0x8000000    unused */
   379 #define PNG_FLAG_ZTXT_CUSTOM_METHOD      0x10000000L
   657                                   /*  0x10000000    unused */
   380                                   /*     0x20000000L  unused */
   658                                   /*  0x20000000    unused */
   381                                   /*     0x40000000L  unused */
   659                                   /*  0x40000000    unused */
   382 
   660 
   383 #define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \
   661 #define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \
   384                                      PNG_FLAG_CRC_ANCILLARY_NOWARN)
   662                                      PNG_FLAG_CRC_ANCILLARY_NOWARN)
   385 
   663 
   386 #define PNG_FLAG_CRC_CRITICAL_MASK  (PNG_FLAG_CRC_CRITICAL_USE | \
   664 #define PNG_FLAG_CRC_CRITICAL_MASK  (PNG_FLAG_CRC_CRITICAL_USE | \
   387                                      PNG_FLAG_CRC_CRITICAL_IGNORE)
   665                                      PNG_FLAG_CRC_CRITICAL_IGNORE)
   388 
   666 
   389 #define PNG_FLAG_CRC_MASK           (PNG_FLAG_CRC_ANCILLARY_MASK | \
   667 #define PNG_FLAG_CRC_MASK           (PNG_FLAG_CRC_ANCILLARY_MASK | \
   390                                      PNG_FLAG_CRC_CRITICAL_MASK)
   668                                      PNG_FLAG_CRC_CRITICAL_MASK)
   391 
       
   392 /* zlib.h declares a magic type 'uInt' that limits the amount of data that zlib
       
   393  * can handle at once.  This type need be no larger than 16 bits (so maximum of
       
   394  * 65535), this define allows us to discover how big it is, but limited by the
       
   395  * maximuum for png_size_t.  The value can be overriden in a library build
       
   396  * (pngusr.h, or set it in CPPFLAGS) and it works to set it to a considerably
       
   397  * lower value (e.g. 255 works).  A lower value may help memory usage (slightly)
       
   398  * and may even improve performance on some systems (and degrade it on others.)
       
   399  */
       
   400 #ifndef ZLIB_IO_MAX
       
   401 #  define ZLIB_IO_MAX ((uInt)-1)
       
   402 #endif
       
   403 
   669 
   404 /* Save typing and make code easier to understand */
   670 /* Save typing and make code easier to understand */
   405 
   671 
   406 #define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \
   672 #define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \
   407    abs((int)((c1).green) - (int)((c2).green)) + \
   673    abs((int)((c1).green) - (int)((c2).green)) + \
   408    abs((int)((c1).blue) - (int)((c2).blue)))
   674    abs((int)((c1).blue) - (int)((c2).blue)))
       
   675 
       
   676 /* Added to libpng-1.6.0: scale a 16-bit value in the range 0..65535 to 0..255
       
   677  * by dividing by 257 *with rounding*.  This macro is exact for the given range.
       
   678  * See the discourse in pngrtran.c png_do_scale_16_to_8.  The values in the
       
   679  * macro were established by experiment (modifying the added value).  The macro
       
   680  * has a second variant that takes a value already scaled by 255 and divides by
       
   681  * 65535 - this has a maximum error of .502.  Over the range 0..65535*65535 it
       
   682  * only gives off-by-one errors and only for 0.5% (1 in 200) of the values.
       
   683  */
       
   684 #define PNG_DIV65535(v24) (((v24) + 32895) >> 16)
       
   685 #define PNG_DIV257(v16) PNG_DIV65535((png_uint_32)(v16) * 255)
   409 
   686 
   410 /* Added to libpng-1.2.6 JB */
   687 /* Added to libpng-1.2.6 JB */
   411 #define PNG_ROWBYTES(pixel_bits, width) \
   688 #define PNG_ROWBYTES(pixel_bits, width) \
   412     ((pixel_bits) >= 8 ? \
   689     ((pixel_bits) >= 8 ? \
   413     ((png_size_t)(width) * (((png_size_t)(pixel_bits)) >> 3)) : \
   690     ((png_size_t)(width) * (((png_size_t)(pixel_bits)) >> 3)) : \
   452  * function call saves a lot of code.
   729  * function call saves a lot of code.
   453  */
   730  */
   454 #ifdef PNG_FIXED_POINT_MACRO_SUPPORTED
   731 #ifdef PNG_FIXED_POINT_MACRO_SUPPORTED
   455 #define png_fixed(png_ptr, fp, s) ((fp) <= 21474 && (fp) >= -21474 ?\
   732 #define png_fixed(png_ptr, fp, s) ((fp) <= 21474 && (fp) >= -21474 ?\
   456     ((png_fixed_point)(100000 * (fp))) : (png_fixed_error(png_ptr, s),0))
   733     ((png_fixed_point)(100000 * (fp))) : (png_fixed_error(png_ptr, s),0))
   457 #else
   734 #endif
   458 PNG_EXTERN png_fixed_point png_fixed PNGARG((png_structp png_ptr, double fp,
   735 /* else the corresponding function is defined below, inside the scope of the
   459    png_const_charp text));
   736  * cplusplus test.
   460 #endif
   737  */
   461 #endif
   738 #endif
   462 
   739 
   463 /* Constant strings for known chunk types.  If you need to add a chunk,
   740 /* Constants for known chunk types.  If you need to add a chunk, define the name
   464  * define the name here, and add an invocation of the macro wherever it's
   741  * here.  For historical reasons these constants have the form png_<name>; i.e.
   465  * needed.
   742  * the prefix is lower case.  Please use decimal values as the parameters to
   466  */
   743  * match the ISO PNG specification and to avoid relying on the C locale
   467 #define PNG_IHDR PNG_CONST png_byte png_IHDR[5] = { 73,  72,  68,  82, '\0'}
   744  * interpretation of character values.
   468 #define PNG_IDAT PNG_CONST png_byte png_IDAT[5] = { 73,  68,  65,  84, '\0'}
   745  *
   469 #define PNG_IEND PNG_CONST png_byte png_IEND[5] = { 73,  69,  78,  68, '\0'}
   746  * Prior to 1.5.6 these constants were strings, as of 1.5.6 png_uint_32 values
   470 #define PNG_PLTE PNG_CONST png_byte png_PLTE[5] = { 80,  76,  84,  69, '\0'}
   747  * are computed and a new macro (PNG_STRING_FROM_CHUNK) added to allow a string
   471 #define PNG_bKGD PNG_CONST png_byte png_bKGD[5] = { 98,  75,  71,  68, '\0'}
   748  * to be generated if required.
   472 #define PNG_cHRM PNG_CONST png_byte png_cHRM[5] = { 99,  72,  82,  77, '\0'}
   749  *
   473 #define PNG_gAMA PNG_CONST png_byte png_gAMA[5] = {103,  65,  77,  65, '\0'}
   750  * PNG_32b correctly produces a value shifted by up to 24 bits, even on
   474 #define PNG_hIST PNG_CONST png_byte png_hIST[5] = {104,  73,  83,  84, '\0'}
   751  * architectures where (int) is only 16 bits.
   475 #define PNG_iCCP PNG_CONST png_byte png_iCCP[5] = {105,  67,  67,  80, '\0'}
   752  */
   476 #define PNG_iTXt PNG_CONST png_byte png_iTXt[5] = {105,  84,  88, 116, '\0'}
   753 #define PNG_32b(b,s) ((png_uint_32)(b) << (s))
   477 #define PNG_oFFs PNG_CONST png_byte png_oFFs[5] = {111,  70,  70, 115, '\0'}
   754 #define PNG_U32(b1,b2,b3,b4) \
   478 #define PNG_pCAL PNG_CONST png_byte png_pCAL[5] = {112,  67,  65,  76, '\0'}
   755    (PNG_32b(b1,24) | PNG_32b(b2,16) | PNG_32b(b3,8) | PNG_32b(b4,0))
   479 #define PNG_sCAL PNG_CONST png_byte png_sCAL[5] = {115,  67,  65,  76, '\0'}
   756 
   480 #define PNG_pHYs PNG_CONST png_byte png_pHYs[5] = {112,  72,  89, 115, '\0'}
   757 /* Constants for known chunk types.
   481 #define PNG_sBIT PNG_CONST png_byte png_sBIT[5] = {115,  66,  73,  84, '\0'}
   758  *
   482 #define PNG_sPLT PNG_CONST png_byte png_sPLT[5] = {115,  80,  76,  84, '\0'}
   759  * MAINTAINERS: If you need to add a chunk, define the name here.
   483 #define PNG_sRGB PNG_CONST png_byte png_sRGB[5] = {115,  82,  71,  66, '\0'}
   760  * For historical reasons these constants have the form png_<name>; i.e.
   484 #define PNG_sTER PNG_CONST png_byte png_sTER[5] = {115,  84,  69,  82, '\0'}
   761  * the prefix is lower case.  Please use decimal values as the parameters to
   485 #define PNG_tEXt PNG_CONST png_byte png_tEXt[5] = {116,  69,  88, 116, '\0'}
   762  * match the ISO PNG specification and to avoid relying on the C locale
   486 #define PNG_tIME PNG_CONST png_byte png_tIME[5] = {116,  73,  77,  69, '\0'}
   763  * interpretation of character values.  Please keep the list sorted.
   487 #define PNG_tRNS PNG_CONST png_byte png_tRNS[5] = {116,  82,  78,  83, '\0'}
   764  *
   488 #define PNG_zTXt PNG_CONST png_byte png_zTXt[5] = {122,  84,  88, 116, '\0'}
   765  * Notice that PNG_U32 is used to define a 32-bit value for the 4 byte chunk
       
   766  * type.  In fact the specification does not express chunk types this way,
       
   767  * however using a 32-bit value means that the chunk type can be read from the
       
   768  * stream using exactly the same code as used for a 32-bit unsigned value and
       
   769  * can be examined far more efficiently (using one arithmetic compare).
       
   770  *
       
   771  * Prior to 1.5.6 the chunk type constants were expressed as C strings.  The
       
   772  * libpng API still uses strings for 'unknown' chunks and a macro,
       
   773  * PNG_STRING_FROM_CHUNK, allows a string to be generated if required.  Notice
       
   774  * that for portable code numeric values must still be used; the string "IHDR"
       
   775  * is not portable and neither is PNG_U32('I', 'H', 'D', 'R').
       
   776  *
       
   777  * In 1.7.0 the definitions will be made public in png.h to avoid having to
       
   778  * duplicate the same definitions in application code.
       
   779  */
       
   780 #define png_IDAT PNG_U32( 73,  68,  65,  84)
       
   781 #define png_IEND PNG_U32( 73,  69,  78,  68)
       
   782 #define png_IHDR PNG_U32( 73,  72,  68,  82)
       
   783 #define png_PLTE PNG_U32( 80,  76,  84,  69)
       
   784 #define png_bKGD PNG_U32( 98,  75,  71,  68)
       
   785 #define png_cHRM PNG_U32( 99,  72,  82,  77)
       
   786 #define png_fRAc PNG_U32(102,  82,  65,  99) /* registered, not defined */
       
   787 #define png_gAMA PNG_U32(103,  65,  77,  65)
       
   788 #define png_gIFg PNG_U32(103,  73,  70, 103)
       
   789 #define png_gIFt PNG_U32(103,  73,  70, 116) /* deprecated */
       
   790 #define png_gIFx PNG_U32(103,  73,  70, 120)
       
   791 #define png_hIST PNG_U32(104,  73,  83,  84)
       
   792 #define png_iCCP PNG_U32(105,  67,  67,  80)
       
   793 #define png_iTXt PNG_U32(105,  84,  88, 116)
       
   794 #define png_oFFs PNG_U32(111,  70,  70, 115)
       
   795 #define png_pCAL PNG_U32(112,  67,  65,  76)
       
   796 #define png_pHYs PNG_U32(112,  72,  89, 115)
       
   797 #define png_sBIT PNG_U32(115,  66,  73,  84)
       
   798 #define png_sCAL PNG_U32(115,  67,  65,  76)
       
   799 #define png_sPLT PNG_U32(115,  80,  76,  84)
       
   800 #define png_sRGB PNG_U32(115,  82,  71,  66)
       
   801 #define png_sTER PNG_U32(115,  84,  69,  82)
       
   802 #define png_tEXt PNG_U32(116,  69,  88, 116)
       
   803 #define png_tIME PNG_U32(116,  73,  77,  69)
       
   804 #define png_tRNS PNG_U32(116,  82,  78,  83)
       
   805 #define png_zTXt PNG_U32(122,  84,  88, 116)
       
   806 
       
   807 /* The following will work on (signed char*) strings, whereas the get_uint_32
       
   808  * macro will fail on top-bit-set values because of the sign extension.
       
   809  */
       
   810 #define PNG_CHUNK_FROM_STRING(s)\
       
   811    PNG_U32(0xff&(s)[0], 0xff&(s)[1], 0xff&(s)[2], 0xff&(s)[3])
       
   812 
       
   813 /* This uses (char), not (png_byte) to avoid warnings on systems where (char) is
       
   814  * signed and the argument is a (char[])  This macro will fail miserably on
       
   815  * systems where (char) is more than 8 bits.
       
   816  */
       
   817 #define PNG_STRING_FROM_CHUNK(s,c)\
       
   818    (void)(((char*)(s))[0]=(char)((c)>>24), ((char*)(s))[1]=(char)((c)>>16),\
       
   819    ((char*)(s))[2]=(char)((c)>>8), ((char*)(s))[3]=(char)((c)))
       
   820 
       
   821 /* Do the same but terminate with a null character. */
       
   822 #define PNG_CSTRING_FROM_CHUNK(s,c)\
       
   823    (void)(PNG_STRING_FROM_CHUNK(s,c), ((char*)(s))[4] = 0)
       
   824 
       
   825 /* Test on flag values as defined in the spec (section 5.4): */
       
   826 #define PNG_CHUNK_ANCILLARY(c)   (1 & ((c) >> 29))
       
   827 #define PNG_CHUNK_CRITICAL(c)     (!PNG_CHUNK_ANCILLARY(c))
       
   828 #define PNG_CHUNK_PRIVATE(c)      (1 & ((c) >> 21))
       
   829 #define PNG_CHUNK_RESERVED(c)     (1 & ((c) >> 13))
       
   830 #define PNG_CHUNK_SAFE_TO_COPY(c) (1 & ((c) >>  5))
   489 
   831 
   490 /* Gamma values (new at libpng-1.5.4): */
   832 /* Gamma values (new at libpng-1.5.4): */
   491 #define PNG_GAMMA_MAC_OLD 151724  /* Assume '1.8' is really 2.2/1.45! */
   833 #define PNG_GAMMA_MAC_OLD 151724  /* Assume '1.8' is really 2.2/1.45! */
   492 #define PNG_GAMMA_MAC_INVERSE 65909
   834 #define PNG_GAMMA_MAC_INVERSE 65909
   493 #define PNG_GAMMA_sRGB_INVERSE 45455
   835 #define PNG_GAMMA_sRGB_INVERSE 45455
   494 
   836 
       
   837 /* Almost everything below is C specific; the #defines above can be used in
       
   838  * non-C code (so long as it is C-preprocessed) the rest of this stuff cannot.
       
   839  */
       
   840 #ifndef PNG_VERSION_INFO_ONLY
       
   841 
       
   842 #include "pngstruct.h"
       
   843 #include "pnginfo.h"
       
   844 
       
   845 /* Validate the include paths - the include path used to generate pnglibconf.h
       
   846  * must match that used in the build, or we must be using pnglibconf.h.prebuilt:
       
   847  */
       
   848 #if PNG_ZLIB_VERNUM != 0 && PNG_ZLIB_VERNUM != ZLIB_VERNUM
       
   849 #  error ZLIB_VERNUM != PNG_ZLIB_VERNUM \
       
   850       "-I (include path) error: see the notes in pngpriv.h"
       
   851    /* This means that when pnglibconf.h was built the copy of zlib.h that it
       
   852     * used is not the same as the one being used here.  Because the build of
       
   853     * libpng makes decisions to use inflateInit2 and inflateReset2 based on the
       
   854     * zlib version number and because this affects handling of certain broken
       
   855     * PNG files the -I directives must match.
       
   856     *
       
   857     * The most likely explanation is that you passed a -I in CFLAGS. This will
       
   858     * not work; all the preprocessor directories and in particular all the -I
       
   859     * directives must be in CPPFLAGS.
       
   860     */
       
   861 #endif
       
   862 
       
   863 /* This is used for 16 bit gamma tables -- only the top level pointers are
       
   864  * const; this could be changed:
       
   865  */
       
   866 typedef const png_uint_16p * png_const_uint_16pp;
       
   867 
       
   868 /* Added to libpng-1.5.7: sRGB conversion tables */
       
   869 #if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\
       
   870    defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
       
   871 #ifdef PNG_SIMPLIFIED_READ_SUPPORTED
       
   872 PNG_INTERNAL_DATA(const png_uint_16, png_sRGB_table, [256]);
       
   873    /* Convert from an sRGB encoded value 0..255 to a 16-bit linear value,
       
   874     * 0..65535.  This table gives the closest 16-bit answers (no errors).
       
   875     */
       
   876 #endif
       
   877 
       
   878 PNG_INTERNAL_DATA(const png_uint_16, png_sRGB_base, [512]);
       
   879 PNG_INTERNAL_DATA(const png_byte, png_sRGB_delta, [512]);
       
   880 
       
   881 #define PNG_sRGB_FROM_LINEAR(linear) ((png_byte)((png_sRGB_base[(linear)>>15] +\
       
   882    ((((linear)&0x7fff)*png_sRGB_delta[(linear)>>15])>>12)) >> 8))
       
   883    /* Given a value 'linear' in the range 0..255*65535 calculate the 8-bit sRGB
       
   884     * encoded value with maximum error 0.646365.  Note that the input is not a
       
   885     * 16-bit value; it has been multiplied by 255! */
       
   886 #endif /* SIMPLIFIED_READ/WRITE */
       
   887 
   495 
   888 
   496 /* Inhibit C++ name-mangling for libpng functions but not for system calls. */
   889 /* Inhibit C++ name-mangling for libpng functions but not for system calls. */
   497 #ifdef __cplusplus
   890 #ifdef __cplusplus
   498 extern "C" {
   891 extern "C" {
   499 #endif /* __cplusplus */
   892 #endif /* __cplusplus */
   500 
   893 
   501 /* These functions are used internally in the code.  They generally
   894 /* Internal functions; these are not exported from a DLL however because they
   502  * shouldn't be used unless you are writing code to add or replace some
   895  * are used within several of the C source files they have to be C extern.
   503  * functionality in libpng.  More information about most functions can
   896  *
   504  * be found in the files where the functions are located.
   897  * All of these functions must be declared with PNG_INTERNAL_FUNCTION.
   505  */
   898  */
       
   899 
       
   900 /* Zlib support */
       
   901 #define PNG_UNEXPECTED_ZLIB_RETURN (-7)
       
   902 PNG_INTERNAL_FUNCTION(void, png_zstream_error,(png_structrp png_ptr, int ret),
       
   903    PNG_EMPTY);
       
   904    /* Used by the zlib handling functions to ensure that z_stream::msg is always
       
   905     * set before they return.
       
   906     */
       
   907 
       
   908 #ifdef PNG_WRITE_SUPPORTED
       
   909 PNG_INTERNAL_FUNCTION(void,png_free_buffer_list,(png_structrp png_ptr,
       
   910    png_compression_bufferp *list),PNG_EMPTY);
       
   911    /* Free the buffer list used by the compressed write code. */
       
   912 #endif
       
   913 
       
   914 #if defined(PNG_FLOATING_POINT_SUPPORTED) && \
       
   915    !defined(PNG_FIXED_POINT_MACRO_SUPPORTED) && \
       
   916    (defined(PNG_gAMA_SUPPORTED) || defined(PNG_cHRM_SUPPORTED) || \
       
   917    defined(PNG_sCAL_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) || \
       
   918    defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)) || \
       
   919    (defined(PNG_sCAL_SUPPORTED) && \
       
   920    defined(PNG_FLOATING_ARITHMETIC_SUPPORTED))
       
   921 PNG_INTERNAL_FUNCTION(png_fixed_point,png_fixed,(png_const_structrp png_ptr,
       
   922    double fp, png_const_charp text),PNG_EMPTY);
       
   923 #endif
   506 
   924 
   507 /* Check the user version string for compatibility, returns false if the version
   925 /* Check the user version string for compatibility, returns false if the version
   508  * numbers aren't compatible.
   926  * numbers aren't compatible.
   509  */
   927  */
   510 PNG_EXTERN int png_user_version_check(png_structp png_ptr,
   928 PNG_INTERNAL_FUNCTION(int,png_user_version_check,(png_structrp png_ptr,
   511    png_const_charp user_png_ver);
   929    png_const_charp user_png_ver),PNG_EMPTY);
   512 
   930 
   513 /* Allocate memory for an internal libpng struct */
   931 /* Internal base allocator - no messages, NULL on failure to allocate.  This
   514 PNG_EXTERN PNG_FUNCTION(png_voidp,png_create_struct,PNGARG((int type)),
   932  * does, however, call the application provided allocator and that could call
       
   933  * png_error (although that would be a bug in the application implementation.)
       
   934  */
       
   935 PNG_INTERNAL_FUNCTION(png_voidp,png_malloc_base,(png_const_structrp png_ptr,
       
   936    png_alloc_size_t size),PNG_ALLOCATED);
       
   937 
       
   938 #if defined(PNG_TEXT_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) ||\
       
   939    defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED)
       
   940 /* Internal array allocator, outputs no error or warning messages on failure,
       
   941  * just returns NULL.
       
   942  */
       
   943 PNG_INTERNAL_FUNCTION(png_voidp,png_malloc_array,(png_const_structrp png_ptr,
       
   944    int nelements, size_t element_size),PNG_ALLOCATED);
       
   945 
       
   946 /* The same but an existing array is extended by add_elements.  This function
       
   947  * also memsets the new elements to 0 and copies the old elements.  The old
       
   948  * array is not freed or altered.
       
   949  */
       
   950 PNG_INTERNAL_FUNCTION(png_voidp,png_realloc_array,(png_const_structrp png_ptr,
       
   951    png_const_voidp array, int old_elements, int add_elements,
       
   952    size_t element_size),PNG_ALLOCATED);
       
   953 #endif /* text, sPLT or unknown chunks */
       
   954 
       
   955 /* Magic to create a struct when there is no struct to call the user supplied
       
   956  * memory allocators.  Because error handling has not been set up the memory
       
   957  * handlers can't safely call png_error, but this is an obscure and undocumented
       
   958  * restriction so libpng has to assume that the 'free' handler, at least, might
       
   959  * call png_error.
       
   960  */
       
   961 PNG_INTERNAL_FUNCTION(png_structp,png_create_png_struct,
       
   962    (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn,
       
   963     png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn,
       
   964     png_free_ptr free_fn),PNG_ALLOCATED);
       
   965 
       
   966 /* Free memory from internal libpng struct */
       
   967 PNG_INTERNAL_FUNCTION(void,png_destroy_png_struct,(png_structrp png_ptr),
       
   968    PNG_EMPTY);
       
   969 
       
   970 /* Free an allocated jmp_buf (always succeeds) */
       
   971 PNG_INTERNAL_FUNCTION(void,png_free_jmpbuf,(png_structrp png_ptr),PNG_EMPTY);
       
   972 
       
   973 /* Function to allocate memory for zlib.  PNGAPI is disallowed. */
       
   974 PNG_INTERNAL_FUNCTION(voidpf,png_zalloc,(voidpf png_ptr, uInt items, uInt size),
   515    PNG_ALLOCATED);
   975    PNG_ALLOCATED);
   516 
   976 
   517 /* Free memory from internal libpng struct */
       
   518 PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr));
       
   519 
       
   520 PNG_EXTERN PNG_FUNCTION(png_voidp,png_create_struct_2,
       
   521    PNGARG((int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)),
       
   522    PNG_ALLOCATED);
       
   523 PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr,
       
   524     png_free_ptr free_fn, png_voidp mem_ptr));
       
   525 
       
   526 /* Free any memory that info_ptr points to and reset struct. */
       
   527 PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr,
       
   528     png_infop info_ptr));
       
   529 
       
   530 /* Function to allocate memory for zlib.  PNGAPI is disallowed. */
       
   531 PNG_EXTERN PNG_FUNCTION(voidpf,png_zalloc,PNGARG((voidpf png_ptr, uInt items,
       
   532    uInt size)),PNG_ALLOCATED);
       
   533 
       
   534 /* Function to free memory for zlib.  PNGAPI is disallowed. */
   977 /* Function to free memory for zlib.  PNGAPI is disallowed. */
   535 PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr));
   978 PNG_INTERNAL_FUNCTION(void,png_zfree,(voidpf png_ptr, voidpf ptr),PNG_EMPTY);
   536 
   979 
   537 /* Next four functions are used internally as callbacks.  PNGCBAPI is required
   980 /* Next four functions are used internally as callbacks.  PNGCBAPI is required
   538  * but not PNG_EXPORT.  PNGAPI added at libpng version 1.2.3, changed to
   981  * but not PNG_EXPORT.  PNGAPI added at libpng version 1.2.3, changed to
   539  * PNGCBAPI at 1.5.0
   982  * PNGCBAPI at 1.5.0
   540  */
   983  */
   541 
   984 
   542 PNG_EXTERN void PNGCBAPI png_default_read_data PNGARG((png_structp png_ptr,
   985 PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_read_data,(png_structp png_ptr,
   543     png_bytep data, png_size_t length));
   986     png_bytep data, png_size_t length),PNG_EMPTY);
   544 
   987 
   545 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED
   988 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED
   546 PNG_EXTERN void PNGCBAPI png_push_fill_buffer PNGARG((png_structp png_ptr,
   989 PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_push_fill_buffer,(png_structp png_ptr,
   547     png_bytep buffer, png_size_t length));
   990     png_bytep buffer, png_size_t length),PNG_EMPTY);
   548 #endif
   991 #endif
   549 
   992 
   550 PNG_EXTERN void PNGCBAPI png_default_write_data PNGARG((png_structp png_ptr,
   993 PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_write_data,(png_structp png_ptr,
   551     png_bytep data, png_size_t length));
   994     png_bytep data, png_size_t length),PNG_EMPTY);
   552 
   995 
   553 #ifdef PNG_WRITE_FLUSH_SUPPORTED
   996 #ifdef PNG_WRITE_FLUSH_SUPPORTED
   554 #  ifdef PNG_STDIO_SUPPORTED
   997 #  ifdef PNG_STDIO_SUPPORTED
   555 PNG_EXTERN void PNGCBAPI png_default_flush PNGARG((png_structp png_ptr));
   998 PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_flush,(png_structp png_ptr),
       
   999    PNG_EMPTY);
   556 #  endif
  1000 #  endif
   557 #endif
  1001 #endif
   558 
  1002 
   559 /* Reset the CRC variable */
  1003 /* Reset the CRC variable */
   560 PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr));
  1004 PNG_INTERNAL_FUNCTION(void,png_reset_crc,(png_structrp png_ptr),PNG_EMPTY);
   561 
  1005 
   562 /* Write the "data" buffer to whatever output you are using */
  1006 /* Write the "data" buffer to whatever output you are using */
   563 PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr,
  1007 PNG_INTERNAL_FUNCTION(void,png_write_data,(png_structrp png_ptr,
   564     png_const_bytep data, png_size_t length));
  1008     png_const_bytep data, png_size_t length),PNG_EMPTY);
   565 
  1009 
   566 /* Read and check the PNG file signature */
  1010 /* Read and check the PNG file signature */
   567 PNG_EXTERN void png_read_sig PNGARG((png_structp png_ptr, png_infop info_ptr));
  1011 PNG_INTERNAL_FUNCTION(void,png_read_sig,(png_structrp png_ptr,
       
  1012    png_inforp info_ptr),PNG_EMPTY);
   568 
  1013 
   569 /* Read the chunk header (length + type name) */
  1014 /* Read the chunk header (length + type name) */
   570 PNG_EXTERN png_uint_32 png_read_chunk_header PNGARG((png_structp png_ptr));
  1015 PNG_INTERNAL_FUNCTION(png_uint_32,png_read_chunk_header,(png_structrp png_ptr),
       
  1016    PNG_EMPTY);
   571 
  1017 
   572 /* Read data from whatever input you are using into the "data" buffer */
  1018 /* Read data from whatever input you are using into the "data" buffer */
   573 PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data,
  1019 PNG_INTERNAL_FUNCTION(void,png_read_data,(png_structrp png_ptr, png_bytep data,
   574     png_size_t length));
  1020     png_size_t length),PNG_EMPTY);
   575 
  1021 
   576 /* Read bytes into buf, and update png_ptr->crc */
  1022 /* Read bytes into buf, and update png_ptr->crc */
   577 PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf,
  1023 PNG_INTERNAL_FUNCTION(void,png_crc_read,(png_structrp png_ptr, png_bytep buf,
   578     png_size_t length));
  1024     png_uint_32 length),PNG_EMPTY);
   579 
       
   580 /* Decompress data in a chunk that uses compression */
       
   581 #if defined(PNG_READ_COMPRESSED_TEXT_SUPPORTED)
       
   582 PNG_EXTERN void png_decompress_chunk PNGARG((png_structp png_ptr,
       
   583     int comp_type, png_size_t chunklength, png_size_t prefix_length,
       
   584     png_size_t *data_length));
       
   585 #endif
       
   586 
  1025 
   587 /* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */
  1026 /* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */
   588 PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip));
  1027 PNG_INTERNAL_FUNCTION(int,png_crc_finish,(png_structrp png_ptr,
       
  1028    png_uint_32 skip),PNG_EMPTY);
   589 
  1029 
   590 /* Read the CRC from the file and compare it to the libpng calculated CRC */
  1030 /* Read the CRC from the file and compare it to the libpng calculated CRC */
   591 PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr));
  1031 PNG_INTERNAL_FUNCTION(int,png_crc_error,(png_structrp png_ptr),PNG_EMPTY);
   592 
  1032 
   593 /* Calculate the CRC over a section of data.  Note that we are only
  1033 /* Calculate the CRC over a section of data.  Note that we are only
   594  * passing a maximum of 64K on systems that have this as a memory limit,
  1034  * passing a maximum of 64K on systems that have this as a memory limit,
   595  * since this is the maximum buffer size we can specify.
  1035  * since this is the maximum buffer size we can specify.
   596  */
  1036  */
   597 PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr,
  1037 PNG_INTERNAL_FUNCTION(void,png_calculate_crc,(png_structrp png_ptr,
   598     png_const_bytep ptr, png_size_t length));
  1038    png_const_bytep ptr, png_size_t length),PNG_EMPTY);
   599 
  1039 
   600 #ifdef PNG_WRITE_FLUSH_SUPPORTED
  1040 #ifdef PNG_WRITE_FLUSH_SUPPORTED
   601 PNG_EXTERN void png_flush PNGARG((png_structp png_ptr));
  1041 PNG_INTERNAL_FUNCTION(void,png_flush,(png_structrp png_ptr),PNG_EMPTY);
   602 #endif
  1042 #endif
   603 
  1043 
   604 /* Write various chunks */
  1044 /* Write various chunks */
   605 
  1045 
   606 /* Write the IHDR chunk, and update the png_struct with the necessary
  1046 /* Write the IHDR chunk, and update the png_struct with the necessary
   607  * information.
  1047  * information.
   608  */
  1048  */
   609 PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width,
  1049 PNG_INTERNAL_FUNCTION(void,png_write_IHDR,(png_structrp png_ptr,
   610     png_uint_32 height,
  1050    png_uint_32 width, png_uint_32 height, int bit_depth, int color_type,
   611     int bit_depth, int color_type, int compression_method, int filter_method,
  1051    int compression_method, int filter_method, int interlace_method),PNG_EMPTY);
   612     int interlace_method));
  1052 
   613 
  1053 PNG_INTERNAL_FUNCTION(void,png_write_PLTE,(png_structrp png_ptr,
   614 PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr,
  1054    png_const_colorp palette, png_uint_32 num_pal),PNG_EMPTY);
   615     png_const_colorp palette, png_uint_32 num_pal));
  1055 
   616 
  1056 PNG_INTERNAL_FUNCTION(void,png_compress_IDAT,(png_structrp png_ptr,
   617 PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data,
  1057    png_const_bytep row_data, png_alloc_size_t row_data_length, int flush),
   618     png_size_t length));
  1058    PNG_EMPTY);
   619 
  1059 
   620 PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr));
  1060 PNG_INTERNAL_FUNCTION(void,png_write_IEND,(png_structrp png_ptr),PNG_EMPTY);
   621 
  1061 
   622 #ifdef PNG_WRITE_gAMA_SUPPORTED
  1062 #ifdef PNG_WRITE_gAMA_SUPPORTED
   623 #  ifdef PNG_FLOATING_POINT_SUPPORTED
  1063 PNG_INTERNAL_FUNCTION(void,png_write_gAMA_fixed,(png_structrp png_ptr,
   624 PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma));
  1064     png_fixed_point file_gamma),PNG_EMPTY);
   625 #  endif
       
   626 #  ifdef PNG_FIXED_POINT_SUPPORTED
       
   627 PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr,
       
   628     png_fixed_point file_gamma));
       
   629 #  endif
       
   630 #endif
  1065 #endif
   631 
  1066 
   632 #ifdef PNG_WRITE_sBIT_SUPPORTED
  1067 #ifdef PNG_WRITE_sBIT_SUPPORTED
   633 PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr,
  1068 PNG_INTERNAL_FUNCTION(void,png_write_sBIT,(png_structrp png_ptr,
   634     png_const_color_8p sbit, int color_type));
  1069     png_const_color_8p sbit, int color_type),PNG_EMPTY);
   635 #endif
  1070 #endif
   636 
  1071 
   637 #ifdef PNG_WRITE_cHRM_SUPPORTED
  1072 #ifdef PNG_WRITE_cHRM_SUPPORTED
   638 #  ifdef PNG_FLOATING_POINT_SUPPORTED
  1073 PNG_INTERNAL_FUNCTION(void,png_write_cHRM_fixed,(png_structrp png_ptr,
   639 PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr,
  1074     const png_xy *xy), PNG_EMPTY);
   640     double white_x, double white_y,
  1075     /* The xy value must have been previously validated */
   641     double red_x, double red_y, double green_x, double green_y,
       
   642     double blue_x, double blue_y));
       
   643 #  endif
       
   644 PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr,
       
   645     png_fixed_point int_white_x, png_fixed_point int_white_y,
       
   646     png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point
       
   647     int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x,
       
   648     png_fixed_point int_blue_y));
       
   649 #endif
  1076 #endif
   650 
  1077 
   651 #ifdef PNG_WRITE_sRGB_SUPPORTED
  1078 #ifdef PNG_WRITE_sRGB_SUPPORTED
   652 PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr,
  1079 PNG_INTERNAL_FUNCTION(void,png_write_sRGB,(png_structrp png_ptr,
   653     int intent));
  1080     int intent),PNG_EMPTY);
   654 #endif
  1081 #endif
   655 
  1082 
   656 #ifdef PNG_WRITE_iCCP_SUPPORTED
  1083 #ifdef PNG_WRITE_iCCP_SUPPORTED
   657 PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr,
  1084 PNG_INTERNAL_FUNCTION(void,png_write_iCCP,(png_structrp png_ptr,
   658     png_const_charp name, int compression_type,
  1085    png_const_charp name, png_const_bytep profile), PNG_EMPTY);
   659     png_const_charp profile, int proflen));
  1086    /* The profile must have been previously validated for correctness, the
   660    /* Note to maintainer: profile should be png_bytep */
  1087     * length comes from the first four bytes.  Only the base, deflate,
       
  1088     * compression is supported.
       
  1089     */
   661 #endif
  1090 #endif
   662 
  1091 
   663 #ifdef PNG_WRITE_sPLT_SUPPORTED
  1092 #ifdef PNG_WRITE_sPLT_SUPPORTED
   664 PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr,
  1093 PNG_INTERNAL_FUNCTION(void,png_write_sPLT,(png_structrp png_ptr,
   665     png_const_sPLT_tp palette));
  1094     png_const_sPLT_tp palette),PNG_EMPTY);
   666 #endif
  1095 #endif
   667 
  1096 
   668 #ifdef PNG_WRITE_tRNS_SUPPORTED
  1097 #ifdef PNG_WRITE_tRNS_SUPPORTED
   669 PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr,
  1098 PNG_INTERNAL_FUNCTION(void,png_write_tRNS,(png_structrp png_ptr,
   670     png_const_bytep trans, png_const_color_16p values, int number,
  1099     png_const_bytep trans, png_const_color_16p values, int number,
   671     int color_type));
  1100     int color_type),PNG_EMPTY);
   672 #endif
  1101 #endif
   673 
  1102 
   674 #ifdef PNG_WRITE_bKGD_SUPPORTED
  1103 #ifdef PNG_WRITE_bKGD_SUPPORTED
   675 PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr,
  1104 PNG_INTERNAL_FUNCTION(void,png_write_bKGD,(png_structrp png_ptr,
   676     png_const_color_16p values, int color_type));
  1105     png_const_color_16p values, int color_type),PNG_EMPTY);
   677 #endif
  1106 #endif
   678 
  1107 
   679 #ifdef PNG_WRITE_hIST_SUPPORTED
  1108 #ifdef PNG_WRITE_hIST_SUPPORTED
   680 PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr,
  1109 PNG_INTERNAL_FUNCTION(void,png_write_hIST,(png_structrp png_ptr,
   681     png_const_uint_16p hist, int num_hist));
  1110     png_const_uint_16p hist, int num_hist),PNG_EMPTY);
   682 #endif
  1111 #endif
   683 
  1112 
   684 /* Chunks that have keywords */
  1113 /* Chunks that have keywords */
   685 #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \
       
   686     defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
       
   687 PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr,
       
   688     png_const_charp key, png_charpp new_key));
       
   689 #endif
       
   690 
       
   691 #ifdef PNG_WRITE_tEXt_SUPPORTED
  1114 #ifdef PNG_WRITE_tEXt_SUPPORTED
   692 PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_const_charp key,
  1115 PNG_INTERNAL_FUNCTION(void,png_write_tEXt,(png_structrp png_ptr,
   693     png_const_charp text, png_size_t text_len));
  1116    png_const_charp key, png_const_charp text, png_size_t text_len),PNG_EMPTY);
   694 #endif
  1117 #endif
   695 
  1118 
   696 #ifdef PNG_WRITE_zTXt_SUPPORTED
  1119 #ifdef PNG_WRITE_zTXt_SUPPORTED
   697 PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_const_charp key,
  1120 PNG_INTERNAL_FUNCTION(void,png_write_zTXt,(png_structrp png_ptr, png_const_charp
   698     png_const_charp text, png_size_t text_len, int compression));
  1121     key, png_const_charp text, int compression),PNG_EMPTY);
   699 #endif
  1122 #endif
   700 
  1123 
   701 #ifdef PNG_WRITE_iTXt_SUPPORTED
  1124 #ifdef PNG_WRITE_iTXt_SUPPORTED
   702 PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr,
  1125 PNG_INTERNAL_FUNCTION(void,png_write_iTXt,(png_structrp png_ptr,
   703     int compression, png_const_charp key, png_const_charp lang,
  1126     int compression, png_const_charp key, png_const_charp lang,
   704     png_const_charp lang_key, png_const_charp text));
  1127     png_const_charp lang_key, png_const_charp text),PNG_EMPTY);
   705 #endif
  1128 #endif
   706 
  1129 
   707 #ifdef PNG_TEXT_SUPPORTED  /* Added at version 1.0.14 and 1.2.4 */
  1130 #ifdef PNG_TEXT_SUPPORTED  /* Added at version 1.0.14 and 1.2.4 */
   708 PNG_EXTERN int png_set_text_2 PNGARG((png_structp png_ptr,
  1131 PNG_INTERNAL_FUNCTION(int,png_set_text_2,(png_const_structrp png_ptr,
   709     png_infop info_ptr, png_const_textp text_ptr, int num_text));
  1132     png_inforp info_ptr, png_const_textp text_ptr, int num_text),PNG_EMPTY);
   710 #endif
  1133 #endif
   711 
  1134 
   712 #ifdef PNG_WRITE_oFFs_SUPPORTED
  1135 #ifdef PNG_WRITE_oFFs_SUPPORTED
   713 PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr,
  1136 PNG_INTERNAL_FUNCTION(void,png_write_oFFs,(png_structrp png_ptr,
   714     png_int_32 x_offset, png_int_32 y_offset, int unit_type));
  1137     png_int_32 x_offset, png_int_32 y_offset, int unit_type),PNG_EMPTY);
   715 #endif
  1138 #endif
   716 
  1139 
   717 #ifdef PNG_WRITE_pCAL_SUPPORTED
  1140 #ifdef PNG_WRITE_pCAL_SUPPORTED
   718 PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose,
  1141 PNG_INTERNAL_FUNCTION(void,png_write_pCAL,(png_structrp png_ptr,
   719     png_int_32 X0, png_int_32 X1, int type, int nparams,
  1142     png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams,
   720     png_const_charp units, png_charpp params));
  1143     png_const_charp units, png_charpp params),PNG_EMPTY);
   721 #endif
  1144 #endif
   722 
  1145 
   723 #ifdef PNG_WRITE_pHYs_SUPPORTED
  1146 #ifdef PNG_WRITE_pHYs_SUPPORTED
   724 PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr,
  1147 PNG_INTERNAL_FUNCTION(void,png_write_pHYs,(png_structrp png_ptr,
   725     png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit,
  1148     png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit,
   726     int unit_type));
  1149     int unit_type),PNG_EMPTY);
   727 #endif
  1150 #endif
   728 
  1151 
   729 #ifdef PNG_WRITE_tIME_SUPPORTED
  1152 #ifdef PNG_WRITE_tIME_SUPPORTED
   730 PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr,
  1153 PNG_INTERNAL_FUNCTION(void,png_write_tIME,(png_structrp png_ptr,
   731     png_const_timep mod_time));
  1154     png_const_timep mod_time),PNG_EMPTY);
   732 #endif
  1155 #endif
   733 
  1156 
   734 #ifdef PNG_WRITE_sCAL_SUPPORTED
  1157 #ifdef PNG_WRITE_sCAL_SUPPORTED
   735 PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr,
  1158 PNG_INTERNAL_FUNCTION(void,png_write_sCAL_s,(png_structrp png_ptr,
   736     int unit, png_const_charp width, png_const_charp height));
  1159     int unit, png_const_charp width, png_const_charp height),PNG_EMPTY);
   737 #endif
  1160 #endif
   738 
  1161 
   739 /* Called when finished processing a row of data */
  1162 /* Called when finished processing a row of data */
   740 PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr));
  1163 PNG_INTERNAL_FUNCTION(void,png_write_finish_row,(png_structrp png_ptr),
       
  1164     PNG_EMPTY);
   741 
  1165 
   742 /* Internal use only.   Called before first row of data */
  1166 /* Internal use only.   Called before first row of data */
   743 PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr));
  1167 PNG_INTERNAL_FUNCTION(void,png_write_start_row,(png_structrp png_ptr),
   744 
  1168     PNG_EMPTY);
   745 /* Combine a row of data, dealing with alpha, etc. if requested */
  1169 
   746 PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row,
  1170 /* Combine a row of data, dealing with alpha, etc. if requested.  'row' is an
   747     int mask));
  1171  * array of png_ptr->width pixels.  If the image is not interlaced or this
       
  1172  * is the final pass this just does a memcpy, otherwise the "display" flag
       
  1173  * is used to determine whether to copy pixels that are not in the current pass.
       
  1174  *
       
  1175  * Because 'png_do_read_interlace' (below) replicates pixels this allows this
       
  1176  * function to achieve the documented 'blocky' appearance during interlaced read
       
  1177  * if display is 1 and the 'sparkle' appearance, where existing pixels in 'row'
       
  1178  * are not changed if they are not in the current pass, when display is 0.
       
  1179  *
       
  1180  * 'display' must be 0 or 1, otherwise the memcpy will be done regardless.
       
  1181  *
       
  1182  * The API always reads from the png_struct row buffer and always assumes that
       
  1183  * it is full width (png_do_read_interlace has already been called.)
       
  1184  *
       
  1185  * This function is only ever used to write to row buffers provided by the
       
  1186  * caller of the relevant libpng API and the row must have already been
       
  1187  * transformed by the read transformations.
       
  1188  *
       
  1189  * The PNG_USE_COMPILE_TIME_MASKS option causes generation of pre-computed
       
  1190  * bitmasks for use within the code, otherwise runtime generated masks are used.
       
  1191  * The default is compile time masks.
       
  1192  */
       
  1193 #ifndef PNG_USE_COMPILE_TIME_MASKS
       
  1194 #  define PNG_USE_COMPILE_TIME_MASKS 1
       
  1195 #endif
       
  1196 PNG_INTERNAL_FUNCTION(void,png_combine_row,(png_const_structrp png_ptr,
       
  1197     png_bytep row, int display),PNG_EMPTY);
   748 
  1198 
   749 #ifdef PNG_READ_INTERLACING_SUPPORTED
  1199 #ifdef PNG_READ_INTERLACING_SUPPORTED
   750 /* Expand an interlaced row */
  1200 /* Expand an interlaced row: the 'row_info' describes the pass data that has
   751 /* OLD pre-1.0.9 interface:
  1201  * been read in and must correspond to the pixels in 'row', the pixels are
   752 PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info,
  1202  * expanded (moved apart) in 'row' to match the final layout, when doing this
   753     png_bytep row, int pass, png_uint_32 transformations));
  1203  * the pixels are *replicated* to the intervening space.  This is essential for
   754  */
  1204  * the correct operation of png_combine_row, above.
   755 PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr));
  1205  */
       
  1206 PNG_INTERNAL_FUNCTION(void,png_do_read_interlace,(png_row_infop row_info,
       
  1207     png_bytep row, int pass, png_uint_32 transformations),PNG_EMPTY);
   756 #endif
  1208 #endif
   757 
  1209 
   758 /* GRR TO DO (2.0 or whenever):  simplify other internal calling interfaces */
  1210 /* GRR TO DO (2.0 or whenever):  simplify other internal calling interfaces */
   759 
  1211 
   760 #ifdef PNG_WRITE_INTERLACING_SUPPORTED
  1212 #ifdef PNG_WRITE_INTERLACING_SUPPORTED
   761 /* Grab pixels out of a row for an interlaced pass */
  1213 /* Grab pixels out of a row for an interlaced pass */
   762 PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info,
  1214 PNG_INTERNAL_FUNCTION(void,png_do_write_interlace,(png_row_infop row_info,
   763     png_bytep row, int pass));
  1215     png_bytep row, int pass),PNG_EMPTY);
   764 #endif
  1216 #endif
   765 
  1217 
   766 /* Unfilter a row */
  1218 /* Unfilter a row: check the filter value before calling this, there is no point
   767 PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr,
  1219  * calling it for PNG_FILTER_VALUE_NONE.
   768     png_row_infop row_info, png_bytep row, png_const_bytep prev_row,
  1220  */
   769     int filter));
  1221 PNG_INTERNAL_FUNCTION(void,png_read_filter_row,(png_structrp pp, png_row_infop
       
  1222     row_info, png_bytep row, png_const_bytep prev_row, int filter),PNG_EMPTY);
       
  1223 
       
  1224 PNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_neon,(png_row_infop row_info,
       
  1225     png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
       
  1226 PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_neon,(png_row_infop
       
  1227     row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
       
  1228 PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub4_neon,(png_row_infop
       
  1229     row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
       
  1230 PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg3_neon,(png_row_infop
       
  1231     row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
       
  1232 PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg4_neon,(png_row_infop
       
  1233     row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
       
  1234 PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth3_neon,(png_row_infop
       
  1235     row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
       
  1236 PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_neon,(png_row_infop
       
  1237     row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
   770 
  1238 
   771 /* Choose the best filter to use and filter the row data */
  1239 /* Choose the best filter to use and filter the row data */
   772 PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr,
  1240 PNG_INTERNAL_FUNCTION(void,png_write_find_filter,(png_structrp png_ptr,
   773     png_row_infop row_info));
  1241     png_row_infop row_info),PNG_EMPTY);
   774 
  1242 
   775 /* Finish a row while reading, dealing with interlacing passes, etc. */
  1243 #ifdef PNG_SEQUENTIAL_READ_SUPPORTED
   776 PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr));
  1244 PNG_INTERNAL_FUNCTION(void,png_read_IDAT_data,(png_structrp png_ptr,
       
  1245    png_bytep output, png_alloc_size_t avail_out),PNG_EMPTY);
       
  1246    /* Read 'avail_out' bytes of data from the IDAT stream.  If the output buffer
       
  1247     * is NULL the function checks, instead, for the end of the stream.  In this
       
  1248     * case a benign error will be issued if the stream end is not found or if
       
  1249     * extra data has to be consumed.
       
  1250     */
       
  1251 PNG_INTERNAL_FUNCTION(void,png_read_finish_IDAT,(png_structrp png_ptr),
       
  1252    PNG_EMPTY);
       
  1253    /* This cleans up when the IDAT LZ stream does not end when the last image
       
  1254     * byte is read; there is still some pending input.
       
  1255     */
       
  1256 
       
  1257 PNG_INTERNAL_FUNCTION(void,png_read_finish_row,(png_structrp png_ptr),
       
  1258    PNG_EMPTY);
       
  1259    /* Finish a row while reading, dealing with interlacing passes, etc. */
       
  1260 #endif /* SEQUENTIAL_READ */
   777 
  1261 
   778 /* Initialize the row buffers, etc. */
  1262 /* Initialize the row buffers, etc. */
   779 PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr));
  1263 PNG_INTERNAL_FUNCTION(void,png_read_start_row,(png_structrp png_ptr),PNG_EMPTY);
   780 
  1264 
   781 #ifdef PNG_READ_TRANSFORMS_SUPPORTED
  1265 #ifdef PNG_READ_TRANSFORMS_SUPPORTED
   782 /* Optional call to update the users info structure */
  1266 /* Optional call to update the users info structure */
   783 PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr,
  1267 PNG_INTERNAL_FUNCTION(void,png_read_transform_info,(png_structrp png_ptr,
   784     png_infop info_ptr));
  1268     png_inforp info_ptr),PNG_EMPTY);
   785 #endif
  1269 #endif
   786 
  1270 
   787 /* These are the functions that do the transformations */
  1271 /* Shared transform functions, defined in pngtran.c */
   788 #ifdef PNG_READ_FILLER_SUPPORTED
       
   789 PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info,
       
   790     png_bytep row, png_uint_32 filler, png_uint_32 flags));
       
   791 #endif
       
   792 
       
   793 #ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
       
   794 PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info,
       
   795     png_bytep row));
       
   796 #endif
       
   797 
       
   798 #ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
       
   799 PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info,
       
   800     png_bytep row));
       
   801 #endif
       
   802 
       
   803 #ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
       
   804 PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info,
       
   805     png_bytep row));
       
   806 #endif
       
   807 
       
   808 #ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
       
   809 PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info,
       
   810     png_bytep row));
       
   811 #endif
       
   812 
       
   813 #if defined(PNG_WRITE_FILLER_SUPPORTED) || \
  1272 #if defined(PNG_WRITE_FILLER_SUPPORTED) || \
   814     defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
  1273     defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
   815 PNG_EXTERN void png_do_strip_channel PNGARG((png_row_infop row_info,
  1274 PNG_INTERNAL_FUNCTION(void,png_do_strip_channel,(png_row_infop row_info,
   816     png_bytep row, int at_start));
  1275     png_bytep row, int at_start),PNG_EMPTY);
   817 #endif
  1276 #endif
   818 
  1277 
   819 #ifdef PNG_16BIT_SUPPORTED
  1278 #ifdef PNG_16BIT_SUPPORTED
   820 #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
  1279 #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
   821 PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info,
  1280 PNG_INTERNAL_FUNCTION(void,png_do_swap,(png_row_infop row_info,
   822     png_bytep row));
  1281     png_bytep row),PNG_EMPTY);
   823 #endif
  1282 #endif
   824 #endif
  1283 #endif
   825 
  1284 
   826 #if defined(PNG_READ_PACKSWAP_SUPPORTED) || \
  1285 #if defined(PNG_READ_PACKSWAP_SUPPORTED) || \
   827     defined(PNG_WRITE_PACKSWAP_SUPPORTED)
  1286     defined(PNG_WRITE_PACKSWAP_SUPPORTED)
   828 PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info,
  1287 PNG_INTERNAL_FUNCTION(void,png_do_packswap,(png_row_infop row_info,
   829     png_bytep row));
  1288     png_bytep row),PNG_EMPTY);
   830 #endif
       
   831 
       
   832 #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
       
   833 PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr,
       
   834     png_row_infop row_info, png_bytep row));
       
   835 #endif
       
   836 
       
   837 #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
       
   838 PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info,
       
   839     png_bytep row));
       
   840 #endif
       
   841 
       
   842 #ifdef PNG_READ_PACK_SUPPORTED
       
   843 PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info,
       
   844     png_bytep row));
       
   845 #endif
       
   846 
       
   847 #ifdef PNG_READ_SHIFT_SUPPORTED
       
   848 PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info,
       
   849     png_bytep row, png_const_color_8p sig_bits));
       
   850 #endif
  1289 #endif
   851 
  1290 
   852 #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
  1291 #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
   853 PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info,
  1292 PNG_INTERNAL_FUNCTION(void,png_do_invert,(png_row_infop row_info,
   854     png_bytep row));
  1293     png_bytep row),PNG_EMPTY);
   855 #endif
       
   856 
       
   857 #ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
       
   858 PNG_EXTERN void png_do_scale_16_to_8 PNGARG((png_row_infop row_info,
       
   859     png_bytep row));
       
   860 #endif
       
   861 
       
   862 #ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
       
   863 PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info,
       
   864     png_bytep row));
       
   865 #endif
       
   866 
       
   867 #ifdef PNG_READ_QUANTIZE_SUPPORTED
       
   868 PNG_EXTERN void png_do_quantize PNGARG((png_row_infop row_info,
       
   869     png_bytep row, png_const_bytep palette_lookup,
       
   870     png_const_bytep quantize_lookup));
       
   871 
       
   872 #  ifdef PNG_CORRECT_PALETTE_SUPPORTED
       
   873 PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr,
       
   874     png_colorp palette, int num_palette));
       
   875 #  endif
       
   876 #endif
  1294 #endif
   877 
  1295 
   878 #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
  1296 #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
   879 PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info,
  1297 PNG_INTERNAL_FUNCTION(void,png_do_bgr,(png_row_infop row_info,
   880     png_bytep row));
  1298     png_bytep row),PNG_EMPTY);
   881 #endif
       
   882 
       
   883 #ifdef PNG_WRITE_PACK_SUPPORTED
       
   884 PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info,
       
   885    png_bytep row, png_uint_32 bit_depth));
       
   886 #endif
       
   887 
       
   888 #ifdef PNG_WRITE_SHIFT_SUPPORTED
       
   889 PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info,
       
   890     png_bytep row, png_const_color_8p bit_depth));
       
   891 #endif
       
   892 
       
   893 #if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\
       
   894     defined(PNG_READ_ALPHA_MODE_SUPPORTED)
       
   895 PNG_EXTERN void png_do_compose PNGARG((png_row_infop row_info,
       
   896     png_bytep row, png_structp png_ptr));
       
   897 #endif
       
   898 
       
   899 #ifdef PNG_READ_GAMMA_SUPPORTED
       
   900 PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info,
       
   901     png_bytep row, png_structp png_ptr));
       
   902 #endif
       
   903 
       
   904 #ifdef PNG_READ_ALPHA_MODE_SUPPORTED
       
   905 PNG_EXTERN void png_do_encode_alpha PNGARG((png_row_infop row_info,
       
   906    png_bytep row, png_structp png_ptr));
       
   907 #endif
       
   908 
       
   909 #ifdef PNG_READ_EXPAND_SUPPORTED
       
   910 PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info,
       
   911     png_bytep row, png_const_colorp palette, png_const_bytep trans,
       
   912     int num_trans));
       
   913 PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info,
       
   914     png_bytep row, png_const_color_16p trans_color));
       
   915 #endif
       
   916 
       
   917 #ifdef PNG_READ_EXPAND_16_SUPPORTED
       
   918 PNG_EXTERN void png_do_expand_16 PNGARG((png_row_infop row_info,
       
   919     png_bytep row));
       
   920 #endif
  1299 #endif
   921 
  1300 
   922 /* The following decodes the appropriate chunks, and does error correction,
  1301 /* The following decodes the appropriate chunks, and does error correction,
   923  * then calls the appropriate callback for the chunk if it is valid.
  1302  * then calls the appropriate callback for the chunk if it is valid.
   924  */
  1303  */
   925 
  1304 
   926 /* Decode the IHDR chunk */
  1305 /* Decode the IHDR chunk */
   927 PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr,
  1306 PNG_INTERNAL_FUNCTION(void,png_handle_IHDR,(png_structrp png_ptr,
   928     png_uint_32 length));
  1307     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
   929 PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr,
  1308 PNG_INTERNAL_FUNCTION(void,png_handle_PLTE,(png_structrp png_ptr,
   930     png_uint_32 length));
  1309     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
   931 PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr,
  1310 PNG_INTERNAL_FUNCTION(void,png_handle_IEND,(png_structrp png_ptr,
   932     png_uint_32 length));
  1311     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
   933 
  1312 
   934 #ifdef PNG_READ_bKGD_SUPPORTED
  1313 #ifdef PNG_READ_bKGD_SUPPORTED
   935 PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr,
  1314 PNG_INTERNAL_FUNCTION(void,png_handle_bKGD,(png_structrp png_ptr,
   936     png_uint_32 length));
  1315     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
   937 #endif
  1316 #endif
   938 
  1317 
   939 #ifdef PNG_READ_cHRM_SUPPORTED
  1318 #ifdef PNG_READ_cHRM_SUPPORTED
   940 PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr,
  1319 PNG_INTERNAL_FUNCTION(void,png_handle_cHRM,(png_structrp png_ptr,
   941     png_uint_32 length));
  1320     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
   942 #endif
  1321 #endif
   943 
  1322 
   944 #ifdef PNG_READ_gAMA_SUPPORTED
  1323 #ifdef PNG_READ_gAMA_SUPPORTED
   945 PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr,
  1324 PNG_INTERNAL_FUNCTION(void,png_handle_gAMA,(png_structrp png_ptr,
   946     png_uint_32 length));
  1325     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
   947 #endif
  1326 #endif
   948 
  1327 
   949 #ifdef PNG_READ_hIST_SUPPORTED
  1328 #ifdef PNG_READ_hIST_SUPPORTED
   950 PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr,
  1329 PNG_INTERNAL_FUNCTION(void,png_handle_hIST,(png_structrp png_ptr,
   951     png_uint_32 length));
  1330     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
   952 #endif
  1331 #endif
   953 
  1332 
   954 #ifdef PNG_READ_iCCP_SUPPORTED
  1333 #ifdef PNG_READ_iCCP_SUPPORTED
   955 PNG_EXTERN void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr,
  1334 PNG_INTERNAL_FUNCTION(void,png_handle_iCCP,(png_structrp png_ptr,
   956     png_uint_32 length));
  1335     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
   957 #endif /* PNG_READ_iCCP_SUPPORTED */
  1336 #endif /* READ_iCCP */
   958 
  1337 
   959 #ifdef PNG_READ_iTXt_SUPPORTED
  1338 #ifdef PNG_READ_iTXt_SUPPORTED
   960 PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr,
  1339 PNG_INTERNAL_FUNCTION(void,png_handle_iTXt,(png_structrp png_ptr,
   961     png_uint_32 length));
  1340     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
   962 #endif
  1341 #endif
   963 
  1342 
   964 #ifdef PNG_READ_oFFs_SUPPORTED
  1343 #ifdef PNG_READ_oFFs_SUPPORTED
   965 PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr,
  1344 PNG_INTERNAL_FUNCTION(void,png_handle_oFFs,(png_structrp png_ptr,
   966     png_uint_32 length));
  1345     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
   967 #endif
  1346 #endif
   968 
  1347 
   969 #ifdef PNG_READ_pCAL_SUPPORTED
  1348 #ifdef PNG_READ_pCAL_SUPPORTED
   970 PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr,
  1349 PNG_INTERNAL_FUNCTION(void,png_handle_pCAL,(png_structrp png_ptr,
   971     png_uint_32 length));
  1350     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
   972 #endif
  1351 #endif
   973 
  1352 
   974 #ifdef PNG_READ_pHYs_SUPPORTED
  1353 #ifdef PNG_READ_pHYs_SUPPORTED
   975 PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr,
  1354 PNG_INTERNAL_FUNCTION(void,png_handle_pHYs,(png_structrp png_ptr,
   976     png_uint_32 length));
  1355     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
   977 #endif
  1356 #endif
   978 
  1357 
   979 #ifdef PNG_READ_sBIT_SUPPORTED
  1358 #ifdef PNG_READ_sBIT_SUPPORTED
   980 PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr,
  1359 PNG_INTERNAL_FUNCTION(void,png_handle_sBIT,(png_structrp png_ptr,
   981     png_uint_32 length));
  1360     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
   982 #endif
  1361 #endif
   983 
  1362 
   984 #ifdef PNG_READ_sCAL_SUPPORTED
  1363 #ifdef PNG_READ_sCAL_SUPPORTED
   985 PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr,
  1364 PNG_INTERNAL_FUNCTION(void,png_handle_sCAL,(png_structrp png_ptr,
   986     png_uint_32 length));
  1365     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
   987 #endif
  1366 #endif
   988 
  1367 
   989 #ifdef PNG_READ_sPLT_SUPPORTED
  1368 #ifdef PNG_READ_sPLT_SUPPORTED
   990 PNG_EXTERN void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr,
  1369 PNG_INTERNAL_FUNCTION(void,png_handle_sPLT,(png_structrp png_ptr,
   991     png_uint_32 length));
  1370     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
   992 #endif /* PNG_READ_sPLT_SUPPORTED */
  1371 #endif /* READ_sPLT */
   993 
  1372 
   994 #ifdef PNG_READ_sRGB_SUPPORTED
  1373 #ifdef PNG_READ_sRGB_SUPPORTED
   995 PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr,
  1374 PNG_INTERNAL_FUNCTION(void,png_handle_sRGB,(png_structrp png_ptr,
   996     png_uint_32 length));
  1375     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
   997 #endif
  1376 #endif
   998 
  1377 
   999 #ifdef PNG_READ_tEXt_SUPPORTED
  1378 #ifdef PNG_READ_tEXt_SUPPORTED
  1000 PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr,
  1379 PNG_INTERNAL_FUNCTION(void,png_handle_tEXt,(png_structrp png_ptr,
  1001     png_uint_32 length));
  1380     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
  1002 #endif
  1381 #endif
  1003 
  1382 
  1004 #ifdef PNG_READ_tIME_SUPPORTED
  1383 #ifdef PNG_READ_tIME_SUPPORTED
  1005 PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr,
  1384 PNG_INTERNAL_FUNCTION(void,png_handle_tIME,(png_structrp png_ptr,
  1006     png_uint_32 length));
  1385     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
  1007 #endif
  1386 #endif
  1008 
  1387 
  1009 #ifdef PNG_READ_tRNS_SUPPORTED
  1388 #ifdef PNG_READ_tRNS_SUPPORTED
  1010 PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr,
  1389 PNG_INTERNAL_FUNCTION(void,png_handle_tRNS,(png_structrp png_ptr,
  1011     png_uint_32 length));
  1390     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
  1012 #endif
  1391 #endif
  1013 
  1392 
  1014 #ifdef PNG_READ_zTXt_SUPPORTED
  1393 #ifdef PNG_READ_zTXt_SUPPORTED
  1015 PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr,
  1394 PNG_INTERNAL_FUNCTION(void,png_handle_zTXt,(png_structrp png_ptr,
  1016     png_uint_32 length));
  1395     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
  1017 #endif
  1396 #endif
  1018 
  1397 
  1019 PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr,
  1398 PNG_INTERNAL_FUNCTION(void,png_check_chunk_name,(png_structrp png_ptr,
  1020     png_infop info_ptr, png_uint_32 length));
  1399     png_uint_32 chunk_name),PNG_EMPTY);
  1021 
  1400 
  1022 PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr,
  1401 PNG_INTERNAL_FUNCTION(void,png_handle_unknown,(png_structrp png_ptr,
  1023     png_const_bytep chunk_name));
  1402     png_inforp info_ptr, png_uint_32 length, int keep),PNG_EMPTY);
       
  1403    /* This is the function that gets called for unknown chunks.  The 'keep'
       
  1404     * argument is either non-zero for a known chunk that has been set to be
       
  1405     * handled as unknown or zero for an unknown chunk.  By default the function
       
  1406     * just skips the chunk or errors out if it is critical.
       
  1407     */
       
  1408 
       
  1409 #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) ||\
       
  1410     defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED)
       
  1411 PNG_INTERNAL_FUNCTION(int,png_chunk_unknown_handling,
       
  1412     (png_const_structrp png_ptr, png_uint_32 chunk_name),PNG_EMPTY);
       
  1413    /* Exactly as the API png_handle_as_unknown() except that the argument is a
       
  1414     * 32-bit chunk name, not a string.
       
  1415     */
       
  1416 #endif /* READ_UNKNOWN_CHUNKS || HANDLE_AS_UNKNOWN */
  1024 
  1417 
  1025 /* Handle the transformations for reading and writing */
  1418 /* Handle the transformations for reading and writing */
  1026 #ifdef PNG_READ_TRANSFORMS_SUPPORTED
  1419 #ifdef PNG_READ_TRANSFORMS_SUPPORTED
  1027 PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr));
  1420 PNG_INTERNAL_FUNCTION(void,png_do_read_transformations,(png_structrp png_ptr,
       
  1421    png_row_infop row_info),PNG_EMPTY);
  1028 #endif
  1422 #endif
  1029 #ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
  1423 #ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
  1030 PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr));
  1424 PNG_INTERNAL_FUNCTION(void,png_do_write_transformations,(png_structrp png_ptr,
       
  1425    png_row_infop row_info),PNG_EMPTY);
  1031 #endif
  1426 #endif
  1032 
  1427 
  1033 #ifdef PNG_READ_TRANSFORMS_SUPPORTED
  1428 #ifdef PNG_READ_TRANSFORMS_SUPPORTED
  1034 PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr));
  1429 PNG_INTERNAL_FUNCTION(void,png_init_read_transformations,(png_structrp png_ptr),
       
  1430     PNG_EMPTY);
  1035 #endif
  1431 #endif
  1036 
  1432 
  1037 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED
  1433 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED
  1038 PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr,
  1434 PNG_INTERNAL_FUNCTION(void,png_push_read_chunk,(png_structrp png_ptr,
  1039     png_infop info_ptr));
  1435     png_inforp info_ptr),PNG_EMPTY);
  1040 PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr,
  1436 PNG_INTERNAL_FUNCTION(void,png_push_read_sig,(png_structrp png_ptr,
  1041     png_infop info_ptr));
  1437     png_inforp info_ptr),PNG_EMPTY);
  1042 PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr));
  1438 PNG_INTERNAL_FUNCTION(void,png_push_check_crc,(png_structrp png_ptr),PNG_EMPTY);
  1043 PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr,
  1439 PNG_INTERNAL_FUNCTION(void,png_push_crc_skip,(png_structrp png_ptr,
  1044     png_uint_32 length));
  1440     png_uint_32 length),PNG_EMPTY);
  1045 PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr));
  1441 PNG_INTERNAL_FUNCTION(void,png_push_crc_finish,(png_structrp png_ptr),
  1046 PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr));
  1442     PNG_EMPTY);
  1047 PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr,
  1443 PNG_INTERNAL_FUNCTION(void,png_push_save_buffer,(png_structrp png_ptr),
  1048     png_bytep buffer, png_size_t buffer_length));
  1444     PNG_EMPTY);
  1049 PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr));
  1445 PNG_INTERNAL_FUNCTION(void,png_push_restore_buffer,(png_structrp png_ptr,
  1050 PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr,
  1446     png_bytep buffer, png_size_t buffer_length),PNG_EMPTY);
  1051     png_bytep buffer, png_size_t buffer_length));
  1447 PNG_INTERNAL_FUNCTION(void,png_push_read_IDAT,(png_structrp png_ptr),PNG_EMPTY);
  1052 PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr));
  1448 PNG_INTERNAL_FUNCTION(void,png_process_IDAT_data,(png_structrp png_ptr,
  1053 PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr,
  1449     png_bytep buffer, png_size_t buffer_length),PNG_EMPTY);
  1054    png_infop info_ptr, png_uint_32 length));
  1450 PNG_INTERNAL_FUNCTION(void,png_push_process_row,(png_structrp png_ptr),
  1055 PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr,
  1451     PNG_EMPTY);
  1056    png_infop info_ptr));
  1452 PNG_INTERNAL_FUNCTION(void,png_push_handle_unknown,(png_structrp png_ptr,
  1057 PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr,
  1453    png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
  1058    png_infop info_ptr));
  1454 PNG_INTERNAL_FUNCTION(void,png_push_have_info,(png_structrp png_ptr,
  1059 PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row));
  1455    png_inforp info_ptr),PNG_EMPTY);
  1060 PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr,
  1456 PNG_INTERNAL_FUNCTION(void,png_push_have_end,(png_structrp png_ptr,
  1061     png_infop info_ptr));
  1457    png_inforp info_ptr),PNG_EMPTY);
  1062 PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr,
  1458 PNG_INTERNAL_FUNCTION(void,png_push_have_row,(png_structrp png_ptr,
  1063     png_infop info_ptr));
  1459      png_bytep row),PNG_EMPTY);
  1064 PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr));
  1460 PNG_INTERNAL_FUNCTION(void,png_push_read_end,(png_structrp png_ptr,
       
  1461     png_inforp info_ptr),PNG_EMPTY);
       
  1462 PNG_INTERNAL_FUNCTION(void,png_process_some_data,(png_structrp png_ptr,
       
  1463     png_inforp info_ptr),PNG_EMPTY);
       
  1464 PNG_INTERNAL_FUNCTION(void,png_read_push_finish_row,(png_structrp png_ptr),
       
  1465     PNG_EMPTY);
  1065 #  ifdef PNG_READ_tEXt_SUPPORTED
  1466 #  ifdef PNG_READ_tEXt_SUPPORTED
  1066 PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr,
  1467 PNG_INTERNAL_FUNCTION(void,png_push_handle_tEXt,(png_structrp png_ptr,
  1067     png_infop info_ptr, png_uint_32 length));
  1468     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
  1068 PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr,
  1469 PNG_INTERNAL_FUNCTION(void,png_push_read_tEXt,(png_structrp png_ptr,
  1069     png_infop info_ptr));
  1470     png_inforp info_ptr),PNG_EMPTY);
  1070 #  endif
  1471 #  endif
  1071 #  ifdef PNG_READ_zTXt_SUPPORTED
  1472 #  ifdef PNG_READ_zTXt_SUPPORTED
  1072 PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr,
  1473 PNG_INTERNAL_FUNCTION(void,png_push_handle_zTXt,(png_structrp png_ptr,
  1073     png_infop info_ptr, png_uint_32 length));
  1474     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
  1074 PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr,
  1475 PNG_INTERNAL_FUNCTION(void,png_push_read_zTXt,(png_structrp png_ptr,
  1075     png_infop info_ptr));
  1476     png_inforp info_ptr),PNG_EMPTY);
  1076 #  endif
  1477 #  endif
  1077 #  ifdef PNG_READ_iTXt_SUPPORTED
  1478 #  ifdef PNG_READ_iTXt_SUPPORTED
  1078 PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr,
  1479 PNG_INTERNAL_FUNCTION(void,png_push_handle_iTXt,(png_structrp png_ptr,
  1079     png_infop info_ptr, png_uint_32 length));
  1480     png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
  1080 PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr,
  1481 PNG_INTERNAL_FUNCTION(void,png_push_read_iTXt,(png_structrp png_ptr,
  1081     png_infop info_ptr));
  1482     png_inforp info_ptr),PNG_EMPTY);
  1082 #  endif
  1483 #  endif
  1083 
  1484 
  1084 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
  1485 #endif /* PROGRESSIVE_READ */
  1085 
  1486 
  1086 #ifdef PNG_MNG_FEATURES_SUPPORTED
  1487 /* Added at libpng version 1.6.0 */
  1087 PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info,
  1488 #ifdef PNG_GAMMA_SUPPORTED
  1088     png_bytep row));
  1489 PNG_INTERNAL_FUNCTION(void,png_colorspace_set_gamma,(png_const_structrp png_ptr,
  1089 PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info,
  1490     png_colorspacerp colorspace, png_fixed_point gAMA), PNG_EMPTY);
  1090     png_bytep row));
  1491    /* Set the colorspace gamma with a value provided by the application or by
       
  1492     * the gAMA chunk on read.  The value will override anything set by an ICC
       
  1493     * profile.
       
  1494     */
       
  1495 
       
  1496 PNG_INTERNAL_FUNCTION(void,png_colorspace_sync_info,(png_const_structrp png_ptr,
       
  1497     png_inforp info_ptr), PNG_EMPTY);
       
  1498     /* Synchronize the info 'valid' flags with the colorspace */
       
  1499 
       
  1500 PNG_INTERNAL_FUNCTION(void,png_colorspace_sync,(png_const_structrp png_ptr,
       
  1501     png_inforp info_ptr), PNG_EMPTY);
       
  1502     /* Copy the png_struct colorspace to the info_struct and call the above to
       
  1503      * synchronize the flags.  Checks for NULL info_ptr and does nothing.
       
  1504      */
  1091 #endif
  1505 #endif
  1092 
  1506 
  1093 /* Added at libpng version 1.4.0 */
  1507 /* Added at libpng version 1.4.0 */
  1094 #ifdef PNG_CHECK_cHRM_SUPPORTED
  1508 #ifdef PNG_COLORSPACE_SUPPORTED
  1095 PNG_EXTERN int png_check_cHRM_fixed PNGARG((png_structp png_ptr,
  1509 /* These internal functions are for maintaining the colorspace structure within
  1096     png_fixed_point int_white_x, png_fixed_point int_white_y,
  1510  * a png_info or png_struct (or, indeed, both).
  1097     png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point
  1511  */
  1098     int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x,
  1512 PNG_INTERNAL_FUNCTION(int,png_colorspace_set_chromaticities,
  1099     png_fixed_point int_blue_y));
  1513    (png_const_structrp png_ptr, png_colorspacerp colorspace, const png_xy *xy,
  1100 #endif
  1514     int preferred), PNG_EMPTY);
  1101 
  1515 
  1102 #ifdef PNG_CHECK_cHRM_SUPPORTED
  1516 PNG_INTERNAL_FUNCTION(int,png_colorspace_set_endpoints,
  1103 /* Added at libpng version 1.2.34 and 1.4.0 */
  1517    (png_const_structrp png_ptr, png_colorspacerp colorspace, const png_XYZ *XYZ,
  1104 /* Currently only used by png_check_cHRM_fixed */
  1518     int preferred), PNG_EMPTY);
  1105 PNG_EXTERN void png_64bit_product PNGARG((long v1, long v2,
  1519 
  1106     unsigned long *hi_product, unsigned long *lo_product));
  1520 #ifdef PNG_sRGB_SUPPORTED
  1107 #endif
  1521 PNG_INTERNAL_FUNCTION(int,png_colorspace_set_sRGB,(png_const_structrp png_ptr,
       
  1522    png_colorspacerp colorspace, int intent), PNG_EMPTY);
       
  1523    /* This does set the colorspace gAMA and cHRM values too, but doesn't set the
       
  1524     * flags to write them, if it returns false there was a problem and an error
       
  1525     * message has already been output (but the colorspace may still need to be
       
  1526     * synced to record the invalid flag).
       
  1527     */
       
  1528 #endif /* sRGB */
       
  1529 
       
  1530 #ifdef PNG_iCCP_SUPPORTED
       
  1531 PNG_INTERNAL_FUNCTION(int,png_colorspace_set_ICC,(png_const_structrp png_ptr,
       
  1532    png_colorspacerp colorspace, png_const_charp name,
       
  1533    png_uint_32 profile_length, png_const_bytep profile, int color_type),
       
  1534    PNG_EMPTY);
       
  1535    /* The 'name' is used for information only */
       
  1536 
       
  1537 /* Routines for checking parts of an ICC profile. */
       
  1538 PNG_INTERNAL_FUNCTION(int,png_icc_check_length,(png_const_structrp png_ptr,
       
  1539    png_colorspacerp colorspace, png_const_charp name,
       
  1540    png_uint_32 profile_length), PNG_EMPTY);
       
  1541 PNG_INTERNAL_FUNCTION(int,png_icc_check_header,(png_const_structrp png_ptr,
       
  1542    png_colorspacerp colorspace, png_const_charp name,
       
  1543    png_uint_32 profile_length,
       
  1544    png_const_bytep profile /* first 132 bytes only */, int color_type),
       
  1545    PNG_EMPTY);
       
  1546 PNG_INTERNAL_FUNCTION(int,png_icc_check_tag_table,(png_const_structrp png_ptr,
       
  1547    png_colorspacerp colorspace, png_const_charp name,
       
  1548    png_uint_32 profile_length,
       
  1549    png_const_bytep profile /* header plus whole tag table */), PNG_EMPTY);
       
  1550 #ifdef PNG_sRGB_SUPPORTED
       
  1551 PNG_INTERNAL_FUNCTION(void,png_icc_set_sRGB,(
       
  1552    png_const_structrp png_ptr, png_colorspacerp colorspace,
       
  1553    png_const_bytep profile, uLong adler), PNG_EMPTY);
       
  1554    /* 'adler' is the Adler32 checksum of the uncompressed profile data. It may
       
  1555     * be zero to indicate that it is not available.  It is used, if provided,
       
  1556     * as a fast check on the profile when checking to see if it is sRGB.
       
  1557     */
       
  1558 #endif
       
  1559 #endif /* iCCP */
       
  1560 
       
  1561 #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
       
  1562 PNG_INTERNAL_FUNCTION(void,png_colorspace_set_rgb_coefficients,
       
  1563    (png_structrp png_ptr), PNG_EMPTY);
       
  1564    /* Set the rgb_to_gray coefficients from the colorspace Y values */
       
  1565 #endif /* READ_RGB_TO_GRAY */
       
  1566 #endif /* COLORSPACE */
  1108 
  1567 
  1109 /* Added at libpng version 1.4.0 */
  1568 /* Added at libpng version 1.4.0 */
  1110 PNG_EXTERN void png_check_IHDR PNGARG((png_structp png_ptr,
  1569 PNG_INTERNAL_FUNCTION(void,png_check_IHDR,(png_const_structrp png_ptr,
  1111     png_uint_32 width, png_uint_32 height, int bit_depth,
  1570     png_uint_32 width, png_uint_32 height, int bit_depth,
  1112     int color_type, int interlace_type, int compression_type,
  1571     int color_type, int interlace_type, int compression_type,
  1113     int filter_type));
  1572     int filter_type),PNG_EMPTY);
  1114 
  1573 
  1115 /* Free all memory used by the read (old method - NOT DLL EXPORTED) */
  1574 /* Added at libpng version 1.5.10 */
  1116 PNG_EXTERN void png_read_destroy PNGARG((png_structp png_ptr,
  1575 #if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \
  1117     png_infop info_ptr, png_infop end_info_ptr));
  1576     defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED)
  1118 
  1577 PNG_INTERNAL_FUNCTION(void,png_do_check_palette_indexes,
  1119 /* Free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */
  1578    (png_structrp png_ptr, png_row_infop row_info),PNG_EMPTY);
  1120 PNG_EXTERN void png_write_destroy PNGARG((png_structp png_ptr));
  1579 #endif
  1121 
       
  1122 #ifdef USE_FAR_KEYWORD  /* memory model conversion function */
       
  1123 PNG_EXTERN void *png_far_to_near PNGARG((png_structp png_ptr, png_voidp ptr,
       
  1124     int check));
       
  1125 #endif /* USE_FAR_KEYWORD */
       
  1126 
  1580 
  1127 #if defined(PNG_FLOATING_POINT_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED)
  1581 #if defined(PNG_FLOATING_POINT_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED)
  1128 PNG_EXTERN PNG_FUNCTION(void, png_fixed_error, (png_structp png_ptr,
  1582 PNG_INTERNAL_FUNCTION(void,png_fixed_error,(png_const_structrp png_ptr,
  1129    png_const_charp name),PNG_NORETURN);
  1583    png_const_charp name),PNG_NORETURN);
  1130 #endif
  1584 #endif
  1131 
  1585 
  1132 /* Puts 'string' into 'buffer' at buffer[pos], taking care never to overwrite
  1586 /* Puts 'string' into 'buffer' at buffer[pos], taking care never to overwrite
  1133  * the end.  Always leaves the buffer nul terminated.  Never errors out (and
  1587  * the end.  Always leaves the buffer nul terminated.  Never errors out (and
  1134  * there is no error code.)
  1588  * there is no error code.)
  1135  */
  1589  */
  1136 PNG_EXTERN size_t png_safecat(png_charp buffer, size_t bufsize, size_t pos,
  1590 PNG_INTERNAL_FUNCTION(size_t,png_safecat,(png_charp buffer, size_t bufsize,
  1137     png_const_charp string);
  1591    size_t pos, png_const_charp string),PNG_EMPTY);
  1138 
  1592 
  1139 /* Various internal functions to handle formatted warning messages, currently
  1593 /* Various internal functions to handle formatted warning messages, currently
  1140  * only implemented for warnings.
  1594  * only implemented for warnings.
  1141  */
  1595  */
  1142 #if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_TIME_RFC1123_SUPPORTED)
  1596 #if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_TIME_RFC1123_SUPPORTED)
  1143 /* Utility to dump an unsigned value into a buffer, given a start pointer and
  1597 /* Utility to dump an unsigned value into a buffer, given a start pointer and
  1144  * and end pointer (which should point just *beyond* the end of the buffer!)
  1598  * and end pointer (which should point just *beyond* the end of the buffer!)
  1145  * Returns the pointer to the start of the formatted string.  This utility only
  1599  * Returns the pointer to the start of the formatted string.  This utility only
  1146  * does unsigned values.
  1600  * does unsigned values.
  1147  */
  1601  */
  1148 PNG_EXTERN png_charp png_format_number(png_const_charp start, png_charp end,
  1602 PNG_INTERNAL_FUNCTION(png_charp,png_format_number,(png_const_charp start,
  1149    int format, png_alloc_size_t number);
  1603    png_charp end, int format, png_alloc_size_t number),PNG_EMPTY);
  1150 
  1604 
  1151 /* Convenience macro that takes an array: */
  1605 /* Convenience macro that takes an array: */
  1152 #define PNG_FORMAT_NUMBER(buffer,format,number) \
  1606 #define PNG_FORMAT_NUMBER(buffer,format,number) \
  1153    png_format_number(buffer, buffer + (sizeof buffer), format, number)
  1607    png_format_number(buffer, buffer + (sizeof buffer), format, number)
  1154 
  1608 
  1168 #endif
  1622 #endif
  1169 
  1623 
  1170 #ifdef PNG_WARNINGS_SUPPORTED
  1624 #ifdef PNG_WARNINGS_SUPPORTED
  1171 /* New defines and members adding in libpng-1.5.4 */
  1625 /* New defines and members adding in libpng-1.5.4 */
  1172 #  define PNG_WARNING_PARAMETER_SIZE 32
  1626 #  define PNG_WARNING_PARAMETER_SIZE 32
  1173 #  define PNG_WARNING_PARAMETER_COUNT 8
  1627 #  define PNG_WARNING_PARAMETER_COUNT 8 /* Maximum 9; see pngerror.c */
  1174 
  1628 
  1175 /* An l-value of this type has to be passed to the APIs below to cache the
  1629 /* An l-value of this type has to be passed to the APIs below to cache the
  1176  * values of the parameters to a formatted warning message.
  1630  * values of the parameters to a formatted warning message.
  1177  */
  1631  */
  1178 typedef char png_warning_parameters[PNG_WARNING_PARAMETER_COUNT][
  1632 typedef char png_warning_parameters[PNG_WARNING_PARAMETER_COUNT][
  1179    PNG_WARNING_PARAMETER_SIZE];
  1633    PNG_WARNING_PARAMETER_SIZE];
  1180 
  1634 
  1181 PNG_EXTERN void png_warning_parameter(png_warning_parameters p, int number,
  1635 PNG_INTERNAL_FUNCTION(void,png_warning_parameter,(png_warning_parameters p,
  1182     png_const_charp string);
  1636    int number, png_const_charp string),PNG_EMPTY);
  1183     /* Parameters are limited in size to PNG_WARNING_PARAMETER_SIZE characters,
  1637    /* Parameters are limited in size to PNG_WARNING_PARAMETER_SIZE characters,
  1184      * including the trailing '\0'.
  1638     * including the trailing '\0'.
  1185      */
  1639     */
  1186 PNG_EXTERN void png_warning_parameter_unsigned(png_warning_parameters p,
  1640 PNG_INTERNAL_FUNCTION(void,png_warning_parameter_unsigned,
  1187     int number, int format, png_alloc_size_t value);
  1641    (png_warning_parameters p, int number, int format, png_alloc_size_t value),
  1188     /* Use png_alloc_size_t because it is an unsigned type as big as any we
  1642    PNG_EMPTY);
  1189      * need to output.  Use the following for a signed value.
  1643    /* Use png_alloc_size_t because it is an unsigned type as big as any we
  1190      */
  1644     * need to output.  Use the following for a signed value.
  1191 PNG_EXTERN void png_warning_parameter_signed(png_warning_parameters p,
  1645     */
  1192     int number, int format, png_int_32 value);
  1646 PNG_INTERNAL_FUNCTION(void,png_warning_parameter_signed,
  1193 
  1647    (png_warning_parameters p, int number, int format, png_int_32 value),
  1194 PNG_EXTERN void png_formatted_warning(png_structp png_ptr,
  1648    PNG_EMPTY);
  1195     png_warning_parameters p, png_const_charp message);
  1649 
  1196     /* 'message' follows the X/Open approach of using @1, @2 to insert
  1650 PNG_INTERNAL_FUNCTION(void,png_formatted_warning,(png_const_structrp png_ptr,
  1197      * parameters previously supplied using the above functions.  Errors in
  1651    png_warning_parameters p, png_const_charp message),PNG_EMPTY);
  1198      * specifying the parameters will simple result in garbage substitutions.
  1652    /* 'message' follows the X/Open approach of using @1, @2 to insert
  1199      */
  1653     * parameters previously supplied using the above functions.  Errors in
  1200 #endif
  1654     * specifying the parameters will simply result in garbage substitutions.
       
  1655     */
       
  1656 #endif
       
  1657 
       
  1658 #ifdef PNG_BENIGN_ERRORS_SUPPORTED
       
  1659 /* Application errors (new in 1.6); use these functions (declared below) for
       
  1660  * errors in the parameters or order of API function calls on read.  The
       
  1661  * 'warning' should be used for an error that can be handled completely; the
       
  1662  * 'error' for one which can be handled safely but which may lose application
       
  1663  * information or settings.
       
  1664  *
       
  1665  * By default these both result in a png_error call prior to release, while in a
       
  1666  * released version the 'warning' is just a warning.  However if the application
       
  1667  * explicitly disables benign errors (explicitly permitting the code to lose
       
  1668  * information) they both turn into warnings.
       
  1669  *
       
  1670  * If benign errors aren't supported they end up as the corresponding base call
       
  1671  * (png_warning or png_error.)
       
  1672  */
       
  1673 PNG_INTERNAL_FUNCTION(void,png_app_warning,(png_const_structrp png_ptr,
       
  1674    png_const_charp message),PNG_EMPTY);
       
  1675    /* The application provided invalid parameters to an API function or called
       
  1676     * an API function at the wrong time, libpng can completely recover.
       
  1677     */
       
  1678 
       
  1679 PNG_INTERNAL_FUNCTION(void,png_app_error,(png_const_structrp png_ptr,
       
  1680    png_const_charp message),PNG_EMPTY);
       
  1681    /* As above but libpng will ignore the call, or attempt some other partial
       
  1682     * recovery from the error.
       
  1683     */
       
  1684 #else
       
  1685 #  define png_app_warning(pp,s) png_warning(pp,s)
       
  1686 #  define png_app_error(pp,s) png_error(pp,s)
       
  1687 #endif
       
  1688 
       
  1689 PNG_INTERNAL_FUNCTION(void,png_chunk_report,(png_const_structrp png_ptr,
       
  1690    png_const_charp message, int error),PNG_EMPTY);
       
  1691    /* Report a recoverable issue in chunk data.  On read this is used to report
       
  1692     * a problem found while reading a particular chunk and the
       
  1693     * png_chunk_benign_error or png_chunk_warning function is used as
       
  1694     * appropriate.  On write this is used to report an error that comes from
       
  1695     * data set via an application call to a png_set_ API and png_app_error or
       
  1696     * png_app_warning is used as appropriate.
       
  1697     *
       
  1698     * The 'error' parameter must have one of the following values:
       
  1699     */
       
  1700 #define PNG_CHUNK_WARNING     0 /* never an error */
       
  1701 #define PNG_CHUNK_WRITE_ERROR 1 /* an error only on write */
       
  1702 #define PNG_CHUNK_ERROR       2 /* always an error */
  1201 
  1703 
  1202 /* ASCII to FP interfaces, currently only implemented if sCAL
  1704 /* ASCII to FP interfaces, currently only implemented if sCAL
  1203  * support is required.
  1705  * support is required.
  1204  */
  1706  */
  1205 #if defined(PNG_READ_sCAL_SUPPORTED)
  1707 #if defined(PNG_sCAL_SUPPORTED)
  1206 /* MAX_DIGITS is actually the maximum number of characters in an sCAL
  1708 /* MAX_DIGITS is actually the maximum number of characters in an sCAL
  1207  * width or height, derived from the precision (number of significant
  1709  * width or height, derived from the precision (number of significant
  1208  * digits - a build time settable option) and assumpitions about the
  1710  * digits - a build time settable option) and assumptions about the
  1209  * maximum ridiculous exponent.
  1711  * maximum ridiculous exponent.
  1210  */
  1712  */
  1211 #define PNG_sCAL_MAX_DIGITS (PNG_sCAL_PRECISION+1/*.*/+1/*E*/+10/*exponent*/)
  1713 #define PNG_sCAL_MAX_DIGITS (PNG_sCAL_PRECISION+1/*.*/+1/*E*/+10/*exponent*/)
  1212 
  1714 
  1213 #ifdef PNG_FLOATING_POINT_SUPPORTED
  1715 #ifdef PNG_FLOATING_POINT_SUPPORTED
  1214 PNG_EXTERN void png_ascii_from_fp PNGARG((png_structp png_ptr, png_charp ascii,
  1716 PNG_INTERNAL_FUNCTION(void,png_ascii_from_fp,(png_const_structrp png_ptr,
  1215     png_size_t size, double fp, unsigned int precision));
  1717    png_charp ascii, png_size_t size, double fp, unsigned int precision),
       
  1718    PNG_EMPTY);
  1216 #endif /* FLOATING_POINT */
  1719 #endif /* FLOATING_POINT */
  1217 
  1720 
  1218 #ifdef PNG_FIXED_POINT_SUPPORTED
  1721 #ifdef PNG_FIXED_POINT_SUPPORTED
  1219 PNG_EXTERN void png_ascii_from_fixed PNGARG((png_structp png_ptr,
  1722 PNG_INTERNAL_FUNCTION(void,png_ascii_from_fixed,(png_const_structrp png_ptr,
  1220     png_charp ascii, png_size_t size, png_fixed_point fp));
  1723    png_charp ascii, png_size_t size, png_fixed_point fp),PNG_EMPTY);
  1221 #endif /* FIXED_POINT */
  1724 #endif /* FIXED_POINT */
  1222 #endif /* READ_sCAL */
  1725 #endif /* sCAL */
  1223 
  1726 
  1224 #if defined(PNG_sCAL_SUPPORTED) || defined(PNG_pCAL_SUPPORTED)
  1727 #if defined(PNG_sCAL_SUPPORTED) || defined(PNG_pCAL_SUPPORTED)
  1225 /* An internal API to validate the format of a floating point number.
  1728 /* An internal API to validate the format of a floating point number.
  1226  * The result is the index of the next character.  If the number is
  1729  * The result is the index of the next character.  If the number is
  1227  * not valid it will be the index of a character in the supposed number.
  1730  * not valid it will be the index of a character in the supposed number.
  1241  * fraction is permitted to have no digits only if the integer is present.
  1744  * fraction is permitted to have no digits only if the integer is present.
  1242  *
  1745  *
  1243  * NOTE: The dangling E problem.
  1746  * NOTE: The dangling E problem.
  1244  *   There is a PNG valid floating point number in the following:
  1747  *   There is a PNG valid floating point number in the following:
  1245  *
  1748  *
  1246  *       PNG floating point numb1.ers are not greedy.
  1749  *       PNG floating point numbers are not greedy.
  1247  *
  1750  *
  1248  *   Working this out requires *TWO* character lookahead (because of the
  1751  *   Working this out requires *TWO* character lookahead (because of the
  1249  *   sign), the parser does not do this - it will fail at the 'r' - this
  1752  *   sign), the parser does not do this - it will fail at the 'r' - this
  1250  *   doesn't matter for PNG sCAL chunk values, but it requires more care
  1753  *   doesn't matter for PNG sCAL chunk values, but it requires more care
  1251  *   if the value were ever to be embedded in something more complex.  Use
  1754  *   if the value were ever to be embedded in something more complex.  Use
  1292    /* PNG_FP_SAW_DIGIT: the string is valid. */
  1795    /* PNG_FP_SAW_DIGIT: the string is valid. */
  1293 #define PNG_FP_IS_ZERO(state) (((state) & PNG_FP_Z_MASK) == PNG_FP_SAW_DIGIT)
  1796 #define PNG_FP_IS_ZERO(state) (((state) & PNG_FP_Z_MASK) == PNG_FP_SAW_DIGIT)
  1294 #define PNG_FP_IS_POSITIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_Z_MASK)
  1797 #define PNG_FP_IS_POSITIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_Z_MASK)
  1295 #define PNG_FP_IS_NEGATIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_NZ_MASK)
  1798 #define PNG_FP_IS_NEGATIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_NZ_MASK)
  1296 
  1799 
  1297 /* The actual parser.  This can be called repeatedly, it updates
  1800 /* The actual parser.  This can be called repeatedly. It updates
  1298  * the index into the string and the state variable (which must
  1801  * the index into the string and the state variable (which must
  1299  * be initialzed to 0).  It returns a result code, as above.  There
  1802  * be initialized to 0).  It returns a result code, as above.  There
  1300  * is no point calling the parser any more if it fails to advance to
  1803  * is no point calling the parser any more if it fails to advance to
  1301  * the end of the string - it is stuck on an invalid character (or
  1804  * the end of the string - it is stuck on an invalid character (or
  1302  * terminated by '\0').
  1805  * terminated by '\0').
  1303  *
  1806  *
  1304  * Note that the pointer will consume an E or even an E+ then leave
  1807  * Note that the pointer will consume an E or even an E+ and then leave
  1305  * a 'maybe' state even though a preceding integer.fraction is valid.
  1808  * a 'maybe' state even though a preceding integer.fraction is valid.
  1306  * The PNG_FP_WAS_VALID flag indicates that a preceding substring was
  1809  * The PNG_FP_WAS_VALID flag indicates that a preceding substring was
  1307  * a valid number.  It's possible to recover from this by calling
  1810  * a valid number.  It's possible to recover from this by calling
  1308  * the parser again (from the start, with state 0) but with a string
  1811  * the parser again (from the start, with state 0) but with a string
  1309  * that omits the last character (i.e. set the size to the index of
  1812  * that omits the last character (i.e. set the size to the index of
  1310  * the problem character.)  This has not been tested within libpng.
  1813  * the problem character.)  This has not been tested within libpng.
  1311  */
  1814  */
  1312 PNG_EXTERN int png_check_fp_number PNGARG((png_const_charp string,
  1815 PNG_INTERNAL_FUNCTION(int,png_check_fp_number,(png_const_charp string,
  1313     png_size_t size, int *statep, png_size_tp whereami));
  1816    png_size_t size, int *statep, png_size_tp whereami),PNG_EMPTY);
  1314 
  1817 
  1315 /* This is the same but it checks a complete string and returns true
  1818 /* This is the same but it checks a complete string and returns true
  1316  * only if it just contains a floating point number.  As of 1.5.4 this
  1819  * only if it just contains a floating point number.  As of 1.5.4 this
  1317  * function also returns the state at the end of parsing the number if
  1820  * function also returns the state at the end of parsing the number if
  1318  * it was valid (otherwise it returns 0.)  This can be used for testing
  1821  * it was valid (otherwise it returns 0.)  This can be used for testing
  1319  * for negative or zero values using the sticky flag.
  1822  * for negative or zero values using the sticky flag.
  1320  */
  1823  */
  1321 PNG_EXTERN int png_check_fp_string PNGARG((png_const_charp string,
  1824 PNG_INTERNAL_FUNCTION(int,png_check_fp_string,(png_const_charp string,
  1322     png_size_t size));
  1825    png_size_t size),PNG_EMPTY);
  1323 #endif /* pCAL || sCAL */
  1826 #endif /* pCAL || sCAL */
  1324 
  1827 
  1325 #if defined(PNG_READ_GAMMA_SUPPORTED) ||\
  1828 #if defined(PNG_GAMMA_SUPPORTED) ||\
  1326     defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG_READ_pHYs_SUPPORTED)
  1829     defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG_READ_pHYs_SUPPORTED)
  1327 /* Added at libpng version 1.5.0 */
  1830 /* Added at libpng version 1.5.0 */
  1328 /* This is a utility to provide a*times/div (rounded) and indicate
  1831 /* This is a utility to provide a*times/div (rounded) and indicate
  1329  * if there is an overflow.  The result is a boolean - false (0)
  1832  * if there is an overflow.  The result is a boolean - false (0)
  1330  * for overflow, true (1) if no overflow, in which case *res
  1833  * for overflow, true (1) if no overflow, in which case *res
  1331  * holds the result.
  1834  * holds the result.
  1332  */
  1835  */
  1333 PNG_EXTERN int png_muldiv PNGARG((png_fixed_point_p res, png_fixed_point a,
  1836 PNG_INTERNAL_FUNCTION(int,png_muldiv,(png_fixed_point_p res, png_fixed_point a,
  1334     png_int_32 multiplied_by, png_int_32 divided_by));
  1837    png_int_32 multiplied_by, png_int_32 divided_by),PNG_EMPTY);
  1335 #endif
  1838 #endif
  1336 
  1839 
  1337 #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_INCH_CONVERSIONS_SUPPORTED)
  1840 #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_INCH_CONVERSIONS_SUPPORTED)
  1338 /* Same deal, but issue a warning on overflow and return 0. */
  1841 /* Same deal, but issue a warning on overflow and return 0. */
  1339 PNG_EXTERN png_fixed_point png_muldiv_warn PNGARG((png_structp png_ptr,
  1842 PNG_INTERNAL_FUNCTION(png_fixed_point,png_muldiv_warn,
  1340     png_fixed_point a, png_int_32 multiplied_by, png_int_32 divided_by));
  1843    (png_const_structrp png_ptr, png_fixed_point a, png_int_32 multiplied_by,
  1341 #endif
  1844    png_int_32 divided_by),PNG_EMPTY);
       
  1845 #endif
       
  1846 
       
  1847 #ifdef PNG_GAMMA_SUPPORTED
       
  1848 /* Calculate a reciprocal - used for gamma values.  This returns
       
  1849  * 0 if the argument is 0 in order to maintain an undefined value;
       
  1850  * there are no warnings.
       
  1851  */
       
  1852 PNG_INTERNAL_FUNCTION(png_fixed_point,png_reciprocal,(png_fixed_point a),
       
  1853    PNG_EMPTY);
  1342 
  1854 
  1343 #ifdef PNG_READ_GAMMA_SUPPORTED
  1855 #ifdef PNG_READ_GAMMA_SUPPORTED
  1344 /* Calculate a reciprocal - used for gamma values.  This returns
       
  1345  * 0 if the argument is 0 in order to maintain an undefined value,
       
  1346  * there are no warnings.
       
  1347  */
       
  1348 PNG_EXTERN png_fixed_point png_reciprocal PNGARG((png_fixed_point a));
       
  1349 
       
  1350 /* The same but gives a reciprocal of the product of two fixed point
  1856 /* The same but gives a reciprocal of the product of two fixed point
  1351  * values.  Accuracy is suitable for gamma calculations but this is
  1857  * values.  Accuracy is suitable for gamma calculations but this is
  1352  * not exact - use png_muldiv for that.
  1858  * not exact - use png_muldiv for that.  Only required at present on read.
  1353  */
  1859  */
  1354 PNG_EXTERN png_fixed_point png_reciprocal2 PNGARG((png_fixed_point a,
  1860 PNG_INTERNAL_FUNCTION(png_fixed_point,png_reciprocal2,(png_fixed_point a,
  1355     png_fixed_point b));
  1861    png_fixed_point b),PNG_EMPTY);
       
  1862 #endif
       
  1863 
       
  1864 /* Return true if the gamma value is significantly different from 1.0 */
       
  1865 PNG_INTERNAL_FUNCTION(int,png_gamma_significant,(png_fixed_point gamma_value),
       
  1866    PNG_EMPTY);
  1356 #endif
  1867 #endif
  1357 
  1868 
  1358 #ifdef PNG_READ_GAMMA_SUPPORTED
  1869 #ifdef PNG_READ_GAMMA_SUPPORTED
  1359 /* Internal fixed point gamma correction.  These APIs are called as
  1870 /* Internal fixed point gamma correction.  These APIs are called as
  1360  * required to convert single values - they don't need to be fast,
  1871  * required to convert single values - they don't need to be fast,
  1361  * they are not used when processing image pixel values.
  1872  * they are not used when processing image pixel values.
  1362  *
  1873  *
  1363  * While the input is an 'unsigned' value it must actually be the
  1874  * While the input is an 'unsigned' value it must actually be the
  1364  * correct bit value - 0..255 or 0..65535 as required.
  1875  * correct bit value - 0..255 or 0..65535 as required.
  1365  */
  1876  */
  1366 PNG_EXTERN png_uint_16 png_gamma_correct PNGARG((png_structp png_ptr,
  1877 PNG_INTERNAL_FUNCTION(png_uint_16,png_gamma_correct,(png_structrp png_ptr,
  1367     unsigned int value, png_fixed_point gamma_value));
  1878    unsigned int value, png_fixed_point gamma_value),PNG_EMPTY);
  1368 PNG_EXTERN int png_gamma_significant PNGARG((png_fixed_point gamma_value));
  1879 PNG_INTERNAL_FUNCTION(png_uint_16,png_gamma_16bit_correct,(unsigned int value,
  1369 PNG_EXTERN png_uint_16 png_gamma_16bit_correct PNGARG((unsigned int value,
  1880    png_fixed_point gamma_value),PNG_EMPTY);
  1370     png_fixed_point gamma_value));
  1881 PNG_INTERNAL_FUNCTION(png_byte,png_gamma_8bit_correct,(unsigned int value,
  1371 PNG_EXTERN png_byte png_gamma_8bit_correct PNGARG((unsigned int value,
  1882    png_fixed_point gamma_value),PNG_EMPTY);
  1372     png_fixed_point gamma_value));
  1883 PNG_INTERNAL_FUNCTION(void,png_destroy_gamma_table,(png_structrp png_ptr),
  1373 PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr,
  1884    PNG_EMPTY);
  1374     int bit_depth));
  1885 PNG_INTERNAL_FUNCTION(void,png_build_gamma_table,(png_structrp png_ptr,
  1375 #endif
  1886    int bit_depth),PNG_EMPTY);
  1376 
  1887 #endif
  1377 /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */
  1888 
  1378 
  1889 /* SIMPLIFIED READ/WRITE SUPPORT */
       
  1890 #if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\
       
  1891    defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
       
  1892 /* The internal structure that png_image::opaque points to. */
       
  1893 typedef struct png_control
       
  1894 {
       
  1895    png_structp png_ptr;
       
  1896    png_infop   info_ptr;
       
  1897    png_voidp   error_buf;           /* Always a jmp_buf at present. */
       
  1898 
       
  1899    png_const_bytep memory;          /* Memory buffer. */
       
  1900    png_size_t      size;            /* Size of the memory buffer. */
       
  1901 
       
  1902    unsigned int for_write       :1; /* Otherwise it is a read structure */
       
  1903    unsigned int owned_file      :1; /* We own the file in io_ptr */
       
  1904 } png_control;
       
  1905 
       
  1906 /* Return the pointer to the jmp_buf from a png_control: necessary because C
       
  1907  * does not reveal the type of the elements of jmp_buf.
       
  1908  */
       
  1909 #ifdef __cplusplus
       
  1910 #  define png_control_jmp_buf(pc) (((jmp_buf*)((pc)->error_buf))[0])
       
  1911 #else
       
  1912 #  define png_control_jmp_buf(pc) ((pc)->error_buf)
       
  1913 #endif
       
  1914 
       
  1915 /* Utility to safely execute a piece of libpng code catching and logging any
       
  1916  * errors that might occur.  Returns true on success, false on failure (either
       
  1917  * of the function or as a result of a png_error.)
       
  1918  */
       
  1919 PNG_INTERNAL_CALLBACK(void,png_safe_error,(png_structp png_ptr,
       
  1920    png_const_charp error_message),PNG_NORETURN);
       
  1921 
       
  1922 #ifdef PNG_WARNINGS_SUPPORTED
       
  1923 PNG_INTERNAL_CALLBACK(void,png_safe_warning,(png_structp png_ptr,
       
  1924    png_const_charp warning_message),PNG_EMPTY);
       
  1925 #else
       
  1926 #  define png_safe_warning 0/*dummy argument*/
       
  1927 #endif
       
  1928 
       
  1929 PNG_INTERNAL_FUNCTION(int,png_safe_execute,(png_imagep image,
       
  1930    int (*function)(png_voidp), png_voidp arg),PNG_EMPTY);
       
  1931 
       
  1932 /* Utility to log an error; this also cleans up the png_image; the function
       
  1933  * always returns 0 (false).
       
  1934  */
       
  1935 PNG_INTERNAL_FUNCTION(int,png_image_error,(png_imagep image,
       
  1936    png_const_charp error_message),PNG_EMPTY);
       
  1937 
       
  1938 #ifndef PNG_SIMPLIFIED_READ_SUPPORTED
       
  1939 /* png_image_free is used by the write code but not exported */
       
  1940 PNG_INTERNAL_FUNCTION(void, png_image_free, (png_imagep image), PNG_EMPTY);
       
  1941 #endif /* !SIMPLIFIED_READ */
       
  1942 
       
  1943 #endif /* SIMPLIFIED READ/WRITE */
       
  1944 
       
  1945 /* These are initialization functions for hardware specific PNG filter
       
  1946  * optimizations; list these here then select the appropriate one at compile
       
  1947  * time using the macro PNG_FILTER_OPTIMIZATIONS.  If the macro is not defined
       
  1948  * the generic code is used.
       
  1949  */
       
  1950 #ifdef PNG_FILTER_OPTIMIZATIONS
       
  1951 PNG_INTERNAL_FUNCTION(void, PNG_FILTER_OPTIMIZATIONS, (png_structp png_ptr,
       
  1952    unsigned int bpp), PNG_EMPTY);
       
  1953    /* Just declare the optimization that will be used */
       
  1954 #else
       
  1955    /* List *all* the possible optimizations here - this branch is required if
       
  1956     * the builder of libpng passes the definition of PNG_FILTER_OPTIMIZATIONS in
       
  1957     * CFLAGS in place of CPPFLAGS *and* uses symbol prefixing.
       
  1958     */
       
  1959 PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_neon,
       
  1960    (png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
       
  1961 #endif
       
  1962 
       
  1963 /* Maintainer: Put new private prototypes here ^ */
  1379 
  1964 
  1380 #include "pngdebug.h"
  1965 #include "pngdebug.h"
  1381 
  1966 
  1382 #ifdef __cplusplus
  1967 #ifdef __cplusplus
  1383 }
  1968 }
  1384 #endif
  1969 #endif
  1385 
  1970 
       
  1971 #endif /* PNG_VERSION_INFO_ONLY */
  1386 #endif /* PNGPRIV_H */
  1972 #endif /* PNGPRIV_H */