tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

libpng-manual.txt (227763B)


      1 libpng-manual.txt - A description on how to use and modify libpng
      2 
      3 Copyright (c) 2018-2025 Cosmin Truta
      4 Copyright (c) 1998-2018 Glenn Randers-Pehrson
      5 
      6 This document is released under the libpng license.
      7 For conditions of distribution and use, see the disclaimer
      8 and license in png.h
      9 
     10 Based on:
     11 
     12 libpng version 1.6.36, December 2018, through 1.6.53 - December 2025
     13 Updated and distributed by Cosmin Truta
     14 Copyright (c) 2018-2025 Cosmin Truta
     15 
     16 libpng versions 0.97, January 1998, through 1.6.35 - July 2018
     17 Updated and distributed by Glenn Randers-Pehrson
     18 Copyright (c) 1998-2018 Glenn Randers-Pehrson
     19 
     20 libpng 1.0 beta 6 - version 0.96 - May 28, 1997
     21 Updated and distributed by Andreas Dilger
     22 Copyright (c) 1996, 1997 Andreas Dilger
     23 
     24 libpng 1.0 beta 2 - version 0.88 - January 26, 1996
     25 For conditions of distribution and use, see copyright
     26 notice in png.h. Copyright (c) 1995, 1996 Guy Eric
     27 Schalnat, Group 42, Inc.
     28 
     29 Updated/rewritten per request in the libpng FAQ
     30 Copyright (c) 1995, 1996 Frank J. T. Wojcik
     31 December 18, 1995 & January 20, 1996
     32 
     33 TABLE OF CONTENTS
     34 
     35    I. Introduction
     36   II. Structures
     37  III. Reading
     38   IV. Writing
     39    V. Simplified API
     40   VI. Modifying/Customizing libpng
     41  VII. MNG support
     42 VIII. Changes to Libpng from version 0.88
     43   IX. Changes to Libpng from version 1.0.x to 1.2.x
     44    X. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x
     45   XI. Changes to Libpng from version 1.4.x to 1.5.x
     46  XII. Changes to Libpng from version 1.5.x to 1.6.x
     47 XIII. Detecting libpng
     48  XIV. Source code repository
     49   XV. Coding style
     50 
     51 I. Introduction
     52 
     53 This file describes how to use and modify the PNG reference library
     54 (known as libpng) for your own use.  In addition to this
     55 file, example.c is a good starting point for using the library, as
     56 it is heavily commented and should include everything most people
     57 will need.  We assume that libpng is already installed; see the
     58 INSTALL file for instructions on how to configure and install libpng.
     59 
     60 For examples of libpng usage, see the files "example.c", "pngtest.c",
     61 and the files in the "contrib" directory, all of which are included in
     62 the libpng distribution.
     63 
     64 Libpng was written as a companion to the PNG specification, as a way
     65 of reducing the amount of time and effort it takes to support the PNG
     66 file format in application programs.
     67 
     68 The PNG specification (Third Edition), June 2025, is available as
     69 a W3C Recommendation at
     70 <https://www.w3.org/TR/2025/REC-png-3-20250624/>.
     71 
     72 The PNG specification (Second Edition), November 2003, is available as
     73 a W3C Recommendation and as an ISO Standard (ISO/IEC 15948:2004 (E)) at
     74 <https://www.w3.org/TR/2003/REC-PNG-20031110/>.
     75 The W3C and ISO documents have identical technical content.
     76 
     77 The PNG-1.2 specification is available at
     78 <https://www.libpng.org/pub/png/spec/1.2/>.
     79 It is technically equivalent to the PNG specification (Second Edition)
     80 but has some additional material.
     81 
     82 The PNG-1.0 specification is available as RFC 2083 at
     83 <https://www.libpng.org/pub/png/spec/1.0/> and as a
     84 W3C Recommendation at <https://www.w3.org/TR/REC-png-961001>.
     85 
     86 Some additional chunks are described in the special-purpose public chunks
     87 documents at <http://www.libpng.org/pub/png/spec/register/>
     88 
     89 Other information
     90 about PNG, and the latest version of libpng, can be found at the PNG home
     91 page, <http://www.libpng.org/pub/png/>.
     92 
     93 Most users will not have to modify the library significantly; advanced
     94 users may want to modify it more.  All attempts were made to make it as
     95 complete as possible, while keeping the code easy to understand.
     96 Currently, this library only supports C.  Support for other languages
     97 is being considered.
     98 
     99 Libpng has been designed to handle multiple sessions at one time,
    100 to be easily modifiable, to be portable to the vast majority of
    101 machines (ANSI, K&R, 16-, 32-, and 64-bit) available, and to be easy
    102 to use.  The ultimate goal of libpng is to promote the acceptance of
    103 the PNG file format in whatever way possible.  While there is still
    104 work to be done (see the TODO file), libpng should cover the
    105 majority of the needs of its users.
    106 
    107 Libpng uses zlib for its compression and decompression of PNG files.
    108 Further information about zlib, and the latest version of zlib, can
    109 be found at the zlib home page, <https://zlib.net/>.
    110 The zlib compression utility is a general purpose utility that is
    111 useful for more than PNG files, and can be used without libpng.
    112 See the documentation delivered with zlib for more details.
    113 You can usually find the source files for the zlib utility wherever you
    114 find the libpng source files.
    115 
    116 Libpng is thread safe, provided the threads are using different
    117 instances of the structures.  Each thread should have its own
    118 png_struct and png_info instances, and thus its own image.
    119 Libpng does not protect itself against two threads using the
    120 same instance of a structure.
    121 
    122 II. Structures
    123 
    124 There are two main structures that are important to libpng, png_struct
    125 and png_info.  Both are internal structures that are no longer exposed
    126 in the libpng interface (as of libpng 1.5.0).
    127 
    128 The png_info structure is designed to provide information about the
    129 PNG file.  At one time, the fields of png_info were intended to be
    130 directly accessible to the user.  However, this tended to cause problems
    131 with applications using dynamically loaded libraries, and as a result
    132 a set of interface functions for png_info (the png_get_*() and png_set_*()
    133 functions) was developed, and direct access to the png_info fields was
    134 deprecated..
    135 
    136 The png_struct structure is the object used by the library to decode a
    137 single image.  As of 1.5.0 this structure is also not exposed.
    138 
    139 Almost all libpng APIs require a pointer to a png_struct as the first argument.
    140 Many (in particular the png_set and png_get APIs) also require a pointer
    141 to png_info as the second argument.  Some application visible macros
    142 defined in png.h designed for basic data access (reading and writing
    143 integers in the PNG format) don't take a png_info pointer, but it's almost
    144 always safe to assume that a (png_struct*) has to be passed to call an API
    145 function.
    146 
    147 You can have more than one png_info structure associated with an image,
    148 as illustrated in pngtest.c, one for information valid prior to the
    149 IDAT chunks and another (called "end_info" below) for things after them.
    150 
    151 The png.h header file is an invaluable reference for programming with libpng.
    152 And while I'm on the topic, make sure you include the libpng header file:
    153 
    154 #include <png.h>
    155 
    156 and also (as of libpng-1.5.0) the zlib header file, if you need it:
    157 
    158 #include <zlib.h>
    159 
    160 Types
    161 
    162 The png.h header file defines a number of integral types used by the
    163 APIs.  Most of these are fairly obvious; for example types corresponding
    164 to integers of particular sizes and types for passing color values.
    165 
    166 One exception is how non-integral numbers are handled.  For application
    167 convenience most APIs that take such numbers have C (double) arguments;
    168 however, internally PNG, and libpng, use 32 bit signed integers and encode
    169 the value by multiplying by 100,000.  As of libpng 1.5.0 a convenience
    170 macro PNG_FP_1 is defined in png.h along with a type (png_fixed_point)
    171 which is simply (png_int_32).
    172 
    173 All APIs that take (double) arguments also have a matching API that
    174 takes the corresponding fixed point integer arguments.  The fixed point
    175 API has the same name as the floating point one with "_fixed" appended.
    176 The actual range of values permitted in the APIs is frequently less than
    177 the full range of (png_fixed_point) (-21474 to +21474).  When APIs require
    178 a non-negative argument the type is recorded as png_uint_32 above.  Consult
    179 the header file and the text below for more information.
    180 
    181 Special care must be take with sCAL chunk handling because the chunk itself
    182 uses non-integral values encoded as strings containing decimal floating point
    183 numbers.  See the comments in the header file.
    184 
    185 Configuration
    186 
    187 The main header file function declarations are frequently protected by C
    188 preprocessing directives of the form:
    189 
    190    #ifdef PNG_feature_SUPPORTED
    191    declare-function
    192    #endif
    193    ...
    194    #ifdef PNG_feature_SUPPORTED
    195    use-function
    196    #endif
    197 
    198 The library can be built without support for these APIs, although a
    199 standard build will have all implemented APIs.  Application programs
    200 should check the feature macros before using an API for maximum
    201 portability.  From libpng 1.5.0 the feature macros set during the build
    202 of libpng are recorded in the header file "pnglibconf.h" and this file
    203 is always included by png.h.
    204 
    205 If you don't need to change the library configuration from the default, skip to
    206 the next section ("Reading").
    207 
    208 Notice that some of the makefiles in the 'scripts' directory and (in 1.5.0) all
    209 of the build project files in the 'projects' directory simply copy
    210 scripts/pnglibconf.h.prebuilt to pnglibconf.h.  This means that these build
    211 systems do not permit easy auto-configuration of the library - they only
    212 support the default configuration.
    213 
    214 The easiest way to make minor changes to the libpng configuration when
    215 auto-configuration is supported is to add definitions to the command line
    216 using (typically) CPPFLAGS.  For example:
    217 
    218 CPPFLAGS=-DPNG_NO_FLOATING_ARITHMETIC
    219 
    220 will change the internal libpng math implementation for gamma correction and
    221 other arithmetic calculations to fixed point, avoiding the need for fast
    222 floating point support.  The result can be seen in the generated pnglibconf.h -
    223 make sure it contains the changed feature macro setting.
    224 
    225 If you need to make more extensive configuration changes - more than one or two
    226 feature macro settings - you can either add -DPNG_USER_CONFIG to the build
    227 command line and put a list of feature macro settings in pngusr.h or you can set
    228 DFA_XTRA (a makefile variable) to a file containing the same information in the
    229 form of 'option' settings.
    230 
    231 A. Changing pnglibconf.h
    232 
    233 A variety of methods exist to build libpng.  Not all of these support
    234 reconfiguration of pnglibconf.h.  To reconfigure pnglibconf.h it must either be
    235 rebuilt from scripts/pnglibconf.dfa using awk or it must be edited by hand.
    236 
    237 Hand editing is achieved by copying scripts/pnglibconf.h.prebuilt to
    238 pnglibconf.h and changing the lines defining the supported features, paying
    239 very close attention to the 'option' information in scripts/pnglibconf.dfa
    240 that describes those features and their requirements.  This is easy to get
    241 wrong.
    242 
    243 B. Configuration using DFA_XTRA
    244 
    245 Rebuilding from pnglibconf.dfa is easy if a functioning 'awk', or a later
    246 variant such as 'nawk' or 'gawk', is available.  The configure build will
    247 automatically find an appropriate awk and build pnglibconf.h.
    248 The scripts/pnglibconf.mak file contains a set of make rules for doing the
    249 same thing if configure is not used, and many of the makefiles in the scripts
    250 directory use this approach.
    251 
    252 When rebuilding simply write a new file containing changed options and set
    253 DFA_XTRA to the name of this file.  This causes the build to append the new file
    254 to the end of scripts/pnglibconf.dfa.  The pngusr.dfa file should contain lines
    255 of the following forms:
    256 
    257 everything = off
    258 
    259 This turns all optional features off.  Include it at the start of pngusr.dfa to
    260 make it easier to build a minimal configuration.  You will need to turn at least
    261 some features on afterward to enable either reading or writing code, or both.
    262 
    263 option feature on
    264 option feature off
    265 
    266 Enable or disable a single feature.  This will automatically enable other
    267 features required by a feature that is turned on or disable other features that
    268 require a feature which is turned off.  Conflicting settings will cause an error
    269 message to be emitted by awk.
    270 
    271 setting feature default value
    272 
    273 Changes the default value of setting 'feature' to 'value'.  There are a small
    274 number of settings listed at the top of pnglibconf.h, they are documented in the
    275 source code.  Most of these values have performance implications for the library
    276 but most of them have no visible effect on the API.  Some can also be overridden
    277 from the API.
    278 
    279 This method of building a customized pnglibconf.h is illustrated in
    280 contrib/pngminim/*.  See the "$(PNGCONF):" target in the makefile and
    281 pngusr.dfa in these directories.
    282 
    283 C. Configuration using PNG_USER_CONFIG
    284 
    285 If -DPNG_USER_CONFIG is added to the CPPFLAGS when pnglibconf.h is built,
    286 the file pngusr.h will automatically be included before the options in
    287 scripts/pnglibconf.dfa are processed.  Your pngusr.h file should contain only
    288 macro definitions turning features on or off or setting settings.
    289 
    290 Apart from the global setting "everything = off" all the options listed above
    291 can be set using macros in pngusr.h:
    292 
    293 #define PNG_feature_SUPPORTED
    294 
    295 is equivalent to:
    296 
    297 option feature on
    298 
    299 #define PNG_NO_feature
    300 
    301 is equivalent to:
    302 
    303 option feature off
    304 
    305 #define PNG_feature value
    306 
    307 is equivalent to:
    308 
    309 setting feature default value
    310 
    311 Notice that in both cases, pngusr.dfa and pngusr.h, the contents of the
    312 pngusr file you supply override the contents of scripts/pnglibconf.dfa
    313 
    314 If confusing or incomprehensible behavior results it is possible to
    315 examine the intermediate file pnglibconf.dfn to find the full set of
    316 dependency information for each setting and option.  Simply locate the
    317 feature in the file and read the C comments that precede it.
    318 
    319 This method is also illustrated in the contrib/pngminim/* makefiles and
    320 pngusr.h.
    321 
    322 III. Reading
    323 
    324 We'll now walk you through the possible functions to call when reading
    325 in a PNG file sequentially, briefly explaining the syntax and purpose
    326 of each one.  See example.c and png.h for more detail.  While
    327 progressive reading is covered in the next section, you will still
    328 need some of the functions discussed in this section to read a PNG
    329 file.
    330 
    331 Setup
    332 
    333 You will want to do the I/O initialization(*) before you get into libpng,
    334 so if it doesn't work, you don't have much to undo.  Of course, you
    335 will also want to insure that you are, in fact, dealing with a PNG
    336 file.  Libpng provides a simple check to see if a file is a PNG file.
    337 To use it, pass in the first 1 to 8 bytes of the file to the function
    338 png_sig_cmp(), and it will return 0 (false) if the bytes match the
    339 corresponding bytes of the PNG signature, or nonzero (true) otherwise.
    340 Of course, the more bytes you pass in, the greater the accuracy of the
    341 prediction.
    342 
    343 If you are intending to keep the file pointer open for use in libpng,
    344 you must ensure you don't read more than 8 bytes from the beginning
    345 of the file, and you also have to make a call to png_set_sig_bytes()
    346 with the number of bytes you read from the beginning.  Libpng will
    347 then only check the bytes (if any) that your program didn't read.
    348 
    349 (*): If you are not using the standard I/O functions, you will need
    350 to replace them with custom functions.  See the discussion under
    351 Customizing libpng.
    352 
    353    FILE *fp = fopen(file_name, "rb");
    354    if (!fp)
    355    {
    356       return ERROR;
    357    }
    358 
    359    if (fread(header, 1, number, fp) != number)
    360    {
    361       return ERROR;
    362    }
    363 
    364    is_png = (png_sig_cmp(header, 0, number) == 0);
    365    if (!is_png)
    366    {
    367       return NOT_PNG;
    368    }
    369 
    370 Next, png_struct and png_info need to be allocated and initialized.  In
    371 order to ensure that the size of these structures is correct even with a
    372 dynamically linked libpng, there are functions to initialize and
    373 allocate the structures.  We also pass the library version, optional
    374 pointers to error handling functions, and a pointer to a data struct for
    375 use by the error functions, if necessary (the pointer and functions can
    376 be NULL if the default error handlers are to be used).  See the section
    377 on Changes to Libpng below regarding the old initialization functions.
    378 The structure allocation functions quietly return NULL if they fail to
    379 create the structure, so your application should check for that.
    380 
    381    png_structp png_ptr = png_create_read_struct
    382        (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
    383        user_error_fn, user_warning_fn);
    384 
    385    if (!png_ptr)
    386       return ERROR;
    387 
    388    png_infop info_ptr = png_create_info_struct(png_ptr);
    389 
    390    if (!info_ptr)
    391    {
    392       png_destroy_read_struct(&png_ptr, NULL, NULL);
    393       return ERROR;
    394    }
    395 
    396 If you want to use your own memory allocation routines,
    397 use a libpng that was built with PNG_USER_MEM_SUPPORTED defined, and use
    398 png_create_read_struct_2() instead of png_create_read_struct():
    399 
    400    png_structp png_ptr = png_create_read_struct_2
    401        (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
    402        user_error_fn, user_warning_fn, (png_voidp)
    403        user_mem_ptr, user_malloc_fn, user_free_fn);
    404 
    405 The error handling routines passed to png_create_read_struct()
    406 and the memory alloc/free routines passed to png_create_struct_2()
    407 are only necessary if you are not using the libpng supplied error
    408 handling and memory alloc/free functions.
    409 
    410 When libpng encounters an error, it expects to longjmp back
    411 to your routine.  Therefore, you will need to call setjmp and pass
    412 your png_jmpbuf(png_ptr).  If you read the file from different
    413 routines, you will need to update the longjmp buffer every time you enter
    414 a new routine that will call a png_*() function.
    415 
    416 See your documentation of setjmp/longjmp for your compiler for more
    417 information on setjmp/longjmp.  See the discussion on libpng error
    418 handling in the Customizing Libpng section below for more information
    419 on the libpng error handling.  If an error occurs, and libpng longjmp's
    420 back to your setjmp, you will want to call png_destroy_read_struct() to
    421 free any memory.
    422 
    423    if (setjmp(png_jmpbuf(png_ptr)))
    424    {
    425       png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
    426       fclose(fp);
    427       return ERROR;
    428    }
    429 
    430 Pass NULL instead of &end_info if you didn't create an end_info
    431 structure.
    432 
    433 If you would rather avoid the complexity of setjmp/longjmp issues,
    434 you can compile libpng with PNG_NO_SETJMP, in which case
    435 errors will result in a call to PNG_ABORT() which defaults to abort().
    436 
    437 You can #define PNG_ABORT() to a function that does something
    438 more useful than abort(), as long as your function does not
    439 return.
    440 
    441 Now you need to set up the input code.  The default for libpng is to
    442 use the C function fread().  If you use this, you will need to pass a
    443 valid FILE * in the function png_init_io().  Be sure that the file is
    444 opened in binary mode.  If you wish to handle reading data in another
    445 way, you need not call the png_init_io() function, but you must then
    446 implement the libpng I/O methods discussed in the Customizing Libpng
    447 section below.
    448 
    449    png_init_io(png_ptr, fp);
    450 
    451 If you had previously opened the file and read any of the signature from
    452 the beginning in order to see if this was a PNG file, you need to let
    453 libpng know that there are some bytes missing from the start of the file.
    454 
    455    png_set_sig_bytes(png_ptr, number);
    456 
    457 You can change the zlib compression buffer size to be used while
    458 reading compressed data with
    459 
    460    png_set_compression_buffer_size(png_ptr, buffer_size);
    461 
    462 where the default size is 8192 bytes.  Note that the buffer size
    463 is changed immediately and the buffer is reallocated immediately,
    464 instead of setting a flag to be acted upon later.
    465 
    466 If you want CRC errors to be handled in a different manner than
    467 the default, use
    468 
    469    png_set_crc_action(png_ptr, crit_action, ancil_action);
    470 
    471 The values for png_set_crc_action() say how libpng is to handle CRC errors in
    472 ancillary and critical chunks, and whether to use the data contained
    473 therein. Starting with libpng-1.6.26, this also governs how an ADLER32 error
    474 is handled while reading the IDAT chunk. Note that it is impossible to
    475 "discard" data in a critical chunk.
    476 
    477 Choices for (int) crit_action are
    478   PNG_CRC_DEFAULT      0  error/quit
    479   PNG_CRC_ERROR_QUIT   1  error/quit
    480   PNG_CRC_WARN_USE     3  warn/use data
    481   PNG_CRC_QUIET_USE    4  quiet/use data
    482   PNG_CRC_NO_CHANGE    5  use the current value
    483 
    484 Choices for (int) ancil_action are
    485   PNG_CRC_DEFAULT      0  error/quit
    486   PNG_CRC_ERROR_QUIT   1  error/quit
    487   PNG_CRC_WARN_DISCARD 2  warn/discard data
    488   PNG_CRC_WARN_USE     3  warn/use data
    489   PNG_CRC_QUIET_USE    4  quiet/use data
    490   PNG_CRC_NO_CHANGE    5  use the current value
    491 
    492 When the setting for crit_action is PNG_CRC_QUIET_USE, the CRC and ADLER32
    493 checksums are not only ignored, but they are not evaluated.
    494 
    495 Setting up callback code
    496 
    497 You can set up a callback function to handle any unknown chunks in the
    498 input stream. You must supply the function
    499 
    500    read_chunk_callback(png_structp png_ptr,
    501         png_unknown_chunkp chunk)
    502    {
    503       /* The unknown chunk structure contains your
    504          chunk data, along with similar data for any other
    505          unknown chunks: */
    506 
    507           png_byte name[5];
    508           png_byte *data;
    509           size_t size;
    510 
    511       /* Note that libpng has already taken care of
    512          the CRC handling */
    513 
    514       /* put your code here.  Search for your chunk in the
    515          unknown chunk structure, process it, and return one
    516          of the following: */
    517 
    518       return -n; /* chunk had an error */
    519       return 0; /* did not recognize */
    520       return n; /* success */
    521    }
    522 
    523 (You can give your function another name that you like instead of
    524 "read_chunk_callback")
    525 
    526 To inform libpng about your function, use
    527 
    528    png_set_read_user_chunk_fn(png_ptr, user_chunk_ptr,
    529        read_chunk_callback);
    530 
    531 This names not only the callback function, but also a user pointer that
    532 you can retrieve with
    533 
    534    png_get_user_chunk_ptr(png_ptr);
    535 
    536 If you call the png_set_read_user_chunk_fn() function, then all unknown
    537 chunks which the callback does not handle will be saved when read.  You can
    538 cause them to be discarded by returning '1' ("handled") instead of '0'.  This
    539 behavior will change in libpng 1.7 and the default handling set by the
    540 png_set_keep_unknown_chunks() function, described below, will be used when the
    541 callback returns 0.  If you want the existing behavior you should set the global
    542 default to PNG_HANDLE_CHUNK_IF_SAFE now; this is compatible with all current
    543 versions of libpng and with 1.7.  Libpng 1.6 issues a warning if you keep the
    544 default, or PNG_HANDLE_CHUNK_NEVER, and the callback returns 0.
    545 
    546 At this point, you can set up a callback function that will be
    547 called after each row has been read, which you can use to control
    548 a progress meter or the like.  It's demonstrated in pngtest.c.
    549 You must supply a function
    550 
    551    void read_row_callback(png_structp png_ptr,
    552       png_uint_32 row, int pass)
    553    {
    554       /* put your code here */
    555    }
    556 
    557 (You can give it another name that you like instead of "read_row_callback")
    558 
    559 To inform libpng about your function, use
    560 
    561    png_set_read_status_fn(png_ptr, read_row_callback);
    562 
    563 When this function is called the row has already been completely processed and
    564 the 'row' and 'pass' refer to the next row to be handled.  For the
    565 non-interlaced case the row that was just handled is simply one less than the
    566 passed in row number, and pass will always be 0.  For the interlaced case the
    567 same applies unless the row value is 0, in which case the row just handled was
    568 the last one from one of the preceding passes.  Because interlacing may skip a
    569 pass you cannot be sure that the preceding pass is just 'pass-1'; if you really
    570 need to know what the last pass is record (row,pass) from the callback and use
    571 the last recorded value each time.
    572 
    573 As with the user transform you can find the output row using the
    574 PNG_ROW_FROM_PASS_ROW macro.
    575 
    576 Unknown-chunk handling
    577 
    578 Now you get to set the way the library processes unknown chunks in the
    579 input PNG stream. Both known and unknown chunks will be read.  Normal
    580 behavior is that known chunks will be parsed into information in
    581 various info_ptr members while unknown chunks will be discarded. This
    582 behavior can be wasteful if your application will never use some known
    583 chunk types. To change this, you can call:
    584 
    585    png_set_keep_unknown_chunks(png_ptr, keep,
    586        chunk_list, num_chunks);
    587 
    588    keep       - 0: default unknown chunk handling
    589                 1: ignore; do not keep
    590                 2: keep only if safe-to-copy
    591                 3: keep even if unsafe-to-copy
    592 
    593               You can use these definitions:
    594                 PNG_HANDLE_CHUNK_AS_DEFAULT   0
    595                 PNG_HANDLE_CHUNK_NEVER        1
    596                 PNG_HANDLE_CHUNK_IF_SAFE      2
    597                 PNG_HANDLE_CHUNK_ALWAYS       3
    598 
    599    chunk_list - list of chunks affected (a byte string,
    600                 five bytes per chunk, NULL or '\0' if
    601                 num_chunks is positive; ignored if
    602                 numchunks <= 0).
    603 
    604    num_chunks - number of chunks affected; if 0, all
    605                 unknown chunks are affected.  If positive,
    606                 only the chunks in the list are affected,
    607                 and if negative all unknown chunks and
    608                 all known chunks except for the IHDR,
    609                 PLTE, tRNS, IDAT, and IEND chunks are
    610                 affected.
    611 
    612 Unknown chunks declared in this way will be saved as raw data onto a
    613 list of png_unknown_chunk structures.  If a chunk that is normally
    614 known to libpng is named in the list, it will be handled as unknown,
    615 according to the "keep" directive.  If a chunk is named in successive
    616 instances of png_set_keep_unknown_chunks(), the final instance will
    617 take precedence.  The IHDR and IEND chunks should not be named in
    618 chunk_list; if they are, libpng will process them normally anyway.
    619 If you know that your application will never make use of some particular
    620 chunks, use PNG_HANDLE_CHUNK_NEVER (or 1) as demonstrated below.
    621 
    622 Here is an example of the usage of png_set_keep_unknown_chunks(),
    623 where the private "vpAg" chunk will later be processed by a user chunk
    624 callback function:
    625 
    626    png_byte vpAg[5]={118, 112,  65, 103, (png_byte) '\0'};
    627 
    628    #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
    629      png_byte unused_chunks[]=
    630      {
    631        104,  73,  83,  84, (png_byte) '\0',   /* hIST */
    632        105,  84,  88, 116, (png_byte) '\0',   /* iTXt */
    633        112,  67,  65,  76, (png_byte) '\0',   /* pCAL */
    634        115,  67,  65,  76, (png_byte) '\0',   /* sCAL */
    635        115,  80,  76,  84, (png_byte) '\0',   /* sPLT */
    636        116,  73,  77,  69, (png_byte) '\0',   /* tIME */
    637      };
    638    #endif
    639 
    640    ...
    641 
    642    #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
    643      /* ignore all unknown chunks
    644       * (use global setting "2" for libpng16 and earlier):
    645       */
    646      png_set_keep_unknown_chunks(read_ptr, 2, NULL, 0);
    647 
    648      /* except for vpAg: */
    649      png_set_keep_unknown_chunks(read_ptr, 2, vpAg, 1);
    650 
    651      /* also ignore unused known chunks: */
    652      png_set_keep_unknown_chunks(read_ptr, 1, unused_chunks,
    653         (int)(sizeof unused_chunks)/5);
    654    #endif
    655 
    656 User limits
    657 
    658 The PNG specification allows the width and height of an image to be as
    659 large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns.
    660 For safety, libpng imposes a default limit of 1 million rows and columns.
    661 Larger images will be rejected immediately with a png_error() call. If
    662 you wish to change these limits, you can use
    663 
    664   png_set_user_limits(png_ptr, width_max, height_max);
    665 
    666 to set your own limits (libpng may reject some very wide images
    667 anyway because of potential buffer overflow conditions).
    668 
    669 You should put this statement after you create the PNG structure and
    670 before calling png_read_info(), png_read_png(), or png_process_data().
    671 
    672 When writing a PNG datastream, put this statement before calling
    673 png_write_info() or png_write_png().
    674 
    675 If you need to retrieve the limits that are being applied, use
    676 
    677   width_max = png_get_user_width_max(png_ptr);
    678   height_max = png_get_user_height_max(png_ptr);
    679 
    680 The PNG specification sets no limit on the number of ancillary chunks
    681 allowed in a PNG datastream.  By default, libpng imposes a limit of
    682 a total of 1000 sPLT, tEXt, iTXt, zTXt, and unknown chunks to be stored.
    683 If you have set up both info_ptr and end_info_ptr, the limit applies
    684 separately to each.  You can change the limit on the total number of such
    685 chunks that will be stored, with
    686 
    687   png_set_chunk_cache_max(png_ptr, user_chunk_cache_max);
    688 
    689 where 0x7fffffffL means unlimited.  You can retrieve this limit with
    690 
    691   chunk_cache_max = png_get_chunk_cache_max(png_ptr);
    692 
    693 Libpng imposes a limit of 8 Megabytes (8,000,000 bytes) on the amount of
    694 memory that any chunk other than IDAT can occupy, originally or when
    695 decompressed (prior to libpng-1.6.32 the limit was only applied to compressed
    696 chunks after decompression). You can change this limit with
    697 
    698   png_set_chunk_malloc_max(png_ptr, user_chunk_malloc_max);
    699 
    700 and you can retrieve the limit with
    701 
    702   chunk_malloc_max = png_get_chunk_malloc_max(png_ptr);
    703 
    704 Any chunks that would cause either of these limits to be exceeded will
    705 be ignored.
    706 
    707 Information about your system
    708 
    709 If you intend to display the PNG or to incorporate it in other image data you
    710 need to tell libpng information about your display or drawing surface so that
    711 libpng can convert the values in the image to match the display.
    712 
    713 From libpng-1.5.4 this information can be set before reading the PNG file
    714 header.  In earlier versions png_set_gamma() existed but behaved incorrectly if
    715 called before the PNG file header had been read and png_set_alpha_mode() did not
    716 exist.
    717 
    718 If you need to support versions prior to libpng-1.5.4 test the version number
    719 as illustrated below using "PNG_LIBPNG_VER >= 10504" and follow the procedures
    720 described in the appropriate manual page.
    721 
    722 You give libpng the encoding expected by your system expressed as a 'gamma'
    723 value.  You can also specify a default encoding for the PNG file in
    724 case the required information is missing from the file.  By default libpng
    725 assumes that the PNG data matches your system, to keep this default call:
    726 
    727   png_set_gamma(png_ptr, screen_gamma, output_gamma);
    728 
    729 or you can use the fixed point equivalent:
    730 
    731   png_set_gamma_fixed(png_ptr, PNG_FP_1*screen_gamma,
    732      PNG_FP_1*output_gamma);
    733 
    734 If you don't know the gamma for your system it is probably 2.2 - a good
    735 approximation to the IEC standard for display systems (sRGB).  If images are
    736 too contrasty or washed out you got the value wrong - check your system
    737 documentation!
    738 
    739 Many systems permit the system gamma to be changed via a lookup table in the
    740 display driver, a few systems, including older Macs, change the response by
    741 default.  As of 1.5.4 three special values are available to handle common
    742 situations:
    743 
    744   PNG_DEFAULT_sRGB: Indicates that the system conforms to the
    745                     IEC 61966-2-1 standard.  This matches almost
    746                     all systems.
    747   PNG_GAMMA_MAC_18: Indicates that the system is an older
    748                     (pre Mac OS 10.6) Apple Macintosh system with
    749                     the default settings.
    750   PNG_GAMMA_LINEAR: Just the fixed point value for 1.0 - indicates
    751                     that the system expects data with no gamma
    752                     encoding.
    753 
    754 You would use the linear (unencoded) value if you need to process the pixel
    755 values further because this avoids the need to decode and re-encode each
    756 component value whenever arithmetic is performed.  A lot of graphics software
    757 uses linear values for this reason, often with higher precision component values
    758 to preserve overall accuracy.
    759 
    760 
    761 The output_gamma value expresses how to decode the output values, not how
    762 they are encoded.  The values used correspond to the normal numbers used to
    763 describe the overall gamma of a computer display system; for example 2.2 for
    764 an sRGB conformant system.  The values are scaled by 100000 in the _fixed
    765 version of the API (so 220000 for sRGB.)
    766 
    767 The inverse of the value is always used to provide a default for the PNG file
    768 encoding if it has no gAMA chunk and if png_set_gamma() has not been called
    769 to override the PNG gamma information.
    770 
    771 When the ALPHA_OPTIMIZED mode is selected the output gamma is used to encode
    772 opaque pixels however pixels with lower alpha values are not encoded,
    773 regardless of the output gamma setting.
    774 
    775 When the standard Porter Duff handling is requested with mode 1 the output
    776 encoding is set to be linear and the output_gamma value is only relevant
    777 as a default for input data that has no gamma information.  The linear output
    778 encoding will be overridden if png_set_gamma() is called - the results may be
    779 highly unexpected!
    780 
    781 The following numbers are derived from the sRGB standard and the research
    782 behind it.  sRGB is defined to be approximated by a PNG gAMA chunk value of
    783 0.45455 (1/2.2) for PNG.  The value implicitly includes any viewing
    784 correction required to take account of any differences in the color
    785 environment of the original scene and the intended display environment; the
    786 value expresses how to *decode* the image for display, not how the original
    787 data was *encoded*.
    788 
    789 sRGB provides a peg for the PNG standard by defining a viewing environment.
    790 sRGB itself, and earlier TV standards, actually use a more complex transform
    791 (a linear portion then a gamma 2.4 power law) than PNG can express.  (PNG is
    792 limited to simple power laws.)  By saying that an image for direct display on
    793 an sRGB conformant system should be stored with a gAMA chunk value of 45455
    794 (11.3.3.2 and 11.3.3.5 of the ISO PNG specification) the PNG specification
    795 makes it possible to derive values for other display systems and
    796 environments.
    797 
    798 The Mac value is deduced from the sRGB based on an assumption that the actual
    799 extra viewing correction used in early Mac display systems was implemented as
    800 a power 1.45 lookup table.
    801 
    802 Any system where a programmable lookup table is used or where the behavior of
    803 the final display device characteristics can be changed requires system
    804 specific code to obtain the current characteristic.  However this can be
    805 difficult and most PNG gamma correction only requires an approximate value.
    806 
    807 By default, if png_set_alpha_mode() is not called, libpng assumes that all
    808 values are unencoded, linear, values and that the output device also has a
    809 linear characteristic.  This is only very rarely correct - it is invariably
    810 better to call png_set_alpha_mode() with PNG_DEFAULT_sRGB than rely on the
    811 default if you don't know what the right answer is!
    812 
    813 The special value PNG_GAMMA_MAC_18 indicates an older Mac system (pre Mac OS
    814 10.6) which used a correction table to implement a somewhat lower gamma on an
    815 otherwise sRGB system.
    816 
    817 Both these values are reserved (not simple gamma values) in order to allow
    818 more precise correction internally in the future.
    819 
    820 NOTE: the values can be passed to either the fixed or floating
    821 point APIs, but the floating point API will also accept floating point
    822 values.
    823 
    824 The second thing you may need to tell libpng about is how your system handles
    825 alpha channel information.  Some, but not all, PNG files contain an alpha
    826 channel.  To display these files correctly you need to compose the data onto a
    827 suitable background, as described in the PNG specification.
    828 
    829 Libpng only supports composing onto a single color (using png_set_background;
    830 see below).  Otherwise you must do the composition yourself and, in this case,
    831 you may need to call png_set_alpha_mode:
    832 
    833   #if PNG_LIBPNG_VER >= 10504
    834      png_set_alpha_mode(png_ptr, mode, screen_gamma);
    835   #else
    836      png_set_gamma(png_ptr, screen_gamma, 1.0/screen_gamma);
    837   #endif
    838 
    839 The screen_gamma value is the same as the argument to png_set_gamma; however,
    840 how it affects the output depends on the mode.  png_set_alpha_mode() sets the
    841 file gamma default to 1/screen_gamma, so normally you don't need to call
    842 png_set_gamma.  If you need different defaults call png_set_gamma() before
    843 png_set_alpha_mode() - if you call it after it will override the settings made
    844 by png_set_alpha_mode().
    845 
    846 The mode is as follows:
    847 
    848    PNG_ALPHA_PNG: The data is encoded according to the PNG
    849 specification.  Red, green and blue, or gray, components are
    850 gamma encoded color values and are not premultiplied by the
    851 alpha value.  The alpha value is a linear measure of the
    852 contribution of the pixel to the corresponding final output pixel.
    853 
    854 You should normally use this format if you intend to perform
    855 color correction on the color values; most, maybe all, color
    856 correction software has no handling for the alpha channel and,
    857 anyway, the math to handle pre-multiplied component values is
    858 unnecessarily complex.
    859 
    860 Before you do any arithmetic on the component values you need
    861 to remove the gamma encoding and multiply out the alpha
    862 channel.  See the PNG specification for more detail.  It is
    863 important to note that when an image with an alpha channel is
    864 scaled, linear encoded, pre-multiplied component values must
    865 be used!
    866 
    867 The remaining modes assume you don't need to do any further color correction or
    868 that if you do, your color correction software knows all about alpha (it
    869 probably doesn't!).  They 'associate' the alpha with the color information by
    870 storing color channel values that have been scaled by the alpha.  The
    871 advantage is that the color channels can be resampled (the image can be
    872 scaled) in this form.  The disadvantage is that normal practice is to store
    873 linear, not (gamma) encoded, values and this requires 16-bit channels for
    874 still images rather than the 8-bit channels that are just about sufficient if
    875 gamma encoding is used.  In addition all non-transparent pixel values,
    876 including completely opaque ones, must be gamma encoded to produce the final
    877 image.  These are the 'STANDARD', 'ASSOCIATED' or 'PREMULTIPLIED' modes
    878 described below (the latter being the two common names for associated alpha
    879 color channels). Note that PNG files always contain non-associated color
    880 channels; png_set_alpha_mode() with one of the modes causes the decoder to
    881 convert the pixels to an associated form before returning them to your
    882 application.
    883 
    884 Since it is not necessary to perform arithmetic on opaque color values so
    885 long as they are not to be resampled and are in the final color space it is
    886 possible to optimize the handling of alpha by storing the opaque pixels in
    887 the PNG format (adjusted for the output color space) while storing partially
    888 opaque pixels in the standard, linear, format.  The accuracy required for
    889 standard alpha composition is relatively low, because the pixels are
    890 isolated, therefore typically the accuracy loss in storing 8-bit linear
    891 values is acceptable.  (This is not true if the alpha channel is used to
    892 simulate transparency over large areas - use 16 bits or the PNG mode in
    893 this case!)  This is the 'OPTIMIZED' mode.  For this mode a pixel is
    894 treated as opaque only if the alpha value is equal to the maximum value.
    895 
    896    PNG_ALPHA_STANDARD:  The data libpng produces is encoded in the
    897 standard way assumed by most correctly written graphics software.
    898 The gamma encoding will be removed by libpng and the
    899 linear component values will be pre-multiplied by the
    900 alpha channel.
    901 
    902 With this format the final image must be re-encoded to
    903 match the display gamma before the image is displayed.
    904 If your system doesn't do that, yet still seems to
    905 perform arithmetic on the pixels without decoding them,
    906 it is broken - check out the modes below.
    907 
    908 With PNG_ALPHA_STANDARD libpng always produces linear
    909 component values, whatever screen_gamma you supply.  The
    910 screen_gamma value is, however, used as a default for
    911 the file gamma if the PNG file has no gamma information.
    912 
    913 If you call png_set_gamma() after png_set_alpha_mode() you
    914 will override the linear encoding.  Instead the
    915 pre-multiplied pixel values will be gamma encoded but
    916 the alpha channel will still be linear.  This may
    917 actually match the requirements of some broken software,
    918 but it is unlikely.
    919 
    920 While linear 8-bit data is often used it has
    921 insufficient precision for any image with a reasonable
    922 dynamic range.  To avoid problems, and if your software
    923 supports it, use png_set_expand_16() to force all
    924 components to 16 bits.
    925 
    926    PNG_ALPHA_OPTIMIZED: This mode is the same as PNG_ALPHA_STANDARD
    927 except that completely opaque pixels are gamma encoded according to
    928 the screen_gamma value.  Pixels with alpha less than 1.0
    929 will still have linear components.
    930 
    931 Use this format if you have control over your
    932 compositing software and so don't do other arithmetic
    933 (such as scaling) on the data you get from libpng.  Your
    934 compositing software can simply copy opaque pixels to
    935 the output but still has linear values for the
    936 non-opaque pixels.
    937 
    938 In normal compositing, where the alpha channel encodes
    939 partial pixel coverage (as opposed to broad area
    940 translucency), the inaccuracies of the 8-bit
    941 representation of non-opaque pixels are irrelevant.
    942 
    943 You can also try this format if your software is broken;
    944 it might look better.
    945 
    946    PNG_ALPHA_BROKEN: This is PNG_ALPHA_STANDARD; however, all component
    947 values, including the alpha channel are gamma encoded.  This is
    948 broken because, in practice, no implementation that uses this choice
    949 correctly undoes the encoding before handling alpha composition.  Use this
    950 choice only if other serious errors in the software or hardware you use
    951 mandate it.  In most cases of broken software or hardware the bug in the
    952 final display manifests as a subtle halo around composited parts of the
    953 image.  You may not even perceive this as a halo; the composited part of
    954 the image may simply appear separate from the background, as though it had
    955 been cut out of paper and pasted on afterward.
    956 
    957 If you don't have to deal with bugs in software or hardware, or if you can fix
    958 them, there are three recommended ways of using png_set_alpha_mode():
    959 
    960   png_set_alpha_mode(png_ptr, PNG_ALPHA_PNG,
    961       screen_gamma);
    962 
    963 You can do color correction on the result (libpng does not currently
    964 support color correction internally).  When you handle the alpha channel
    965 you need to undo the gamma encoding and multiply out the alpha.
    966 
    967   png_set_alpha_mode(png_ptr, PNG_ALPHA_STANDARD,
    968       screen_gamma);
    969   png_set_expand_16(png_ptr);
    970 
    971 If you are using the high level interface, don't call png_set_expand_16();
    972 instead pass PNG_TRANSFORM_EXPAND_16 to the interface.
    973 
    974 With this mode you can't do color correction, but you can do arithmetic,
    975 including composition and scaling, on the data without further processing.
    976 
    977   png_set_alpha_mode(png_ptr, PNG_ALPHA_OPTIMIZED,
    978       screen_gamma);
    979 
    980 You can avoid the expansion to 16-bit components with this mode, but you
    981 lose the ability to scale the image or perform other linear arithmetic.
    982 All you can do is compose the result onto a matching output.  Since this
    983 mode is libpng-specific you also need to write your own composition
    984 software.
    985 
    986 The following are examples of calls to png_set_alpha_mode to achieve the
    987 required overall gamma correction and, where necessary, alpha
    988 premultiplication.
    989 
    990    png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB);
    991 
    992 Choices for the alpha_mode are
    993 
    994    PNG_ALPHA_PNG           0 /* according to the PNG standard */
    995    PNG_ALPHA_STANDARD      1 /* according to Porter/Duff */
    996    PNG_ALPHA_ASSOCIATED    1 /* as above; this is the normal practice */
    997    PNG_ALPHA_PREMULTIPLIED 1 /* as above */
    998    PNG_ALPHA_OPTIMIZED     2 /* 'PNG' for opaque pixels, else 'STANDARD' */
    999    PNG_ALPHA_BROKEN        3 /* the alpha channel is gamma encoded */
   1000 
   1001 PNG_ALPHA_PNG is the default libpng handling of the alpha channel. It is not
   1002 pre-multiplied into the color components. In addition the call states
   1003 that the output is for a sRGB system and causes all PNG files without gAMA
   1004 chunks to be assumed to be encoded using sRGB.
   1005 
   1006    png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC);
   1007 
   1008 In this case the output is assumed to be something like an sRGB conformant
   1009 display preceded by a power-law lookup table of power 1.45.  This is how
   1010 early Mac systems behaved.
   1011 
   1012    png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_GAMMA_LINEAR);
   1013 
   1014 This is the classic Jim Blinn approach and will work in academic
   1015 environments where everything is done by the book.  It has the shortcoming
   1016 of assuming that input PNG data with no gamma information is linear - this
   1017 is unlikely to be correct unless the PNG files were generated locally.
   1018 Most of the time the output precision will be so low as to show
   1019 significant banding in dark areas of the image.
   1020 
   1021    png_set_expand_16(pp);
   1022    png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_DEFAULT_sRGB);
   1023 
   1024 This is a somewhat more realistic Jim Blinn inspired approach.  PNG files
   1025 are assumed to have the sRGB encoding if not marked with a gamma value and
   1026 the output is always 16 bits per component.  This permits accurate scaling
   1027 and processing of the data.  If you know that your input PNG files were
   1028 generated locally you might need to replace PNG_DEFAULT_sRGB with the
   1029 correct value for your system.
   1030 
   1031    png_set_alpha_mode(pp, PNG_ALPHA_OPTIMIZED, PNG_DEFAULT_sRGB);
   1032 
   1033 If you just need to composite the PNG image onto an existing background
   1034 and if you control the code that does this you can use the optimization
   1035 setting.  In this case you just copy completely opaque pixels to the
   1036 output.  For pixels that are not completely transparent (you just skip
   1037 those) you do the composition math using png_composite or png_composite_16
   1038 below then encode the resultant 8-bit or 16-bit values to match the output
   1039 encoding.
   1040 
   1041    Other cases
   1042 
   1043 If neither the PNG nor the standard linear encoding work for you because
   1044 of the software or hardware you use then you have a big problem.  The PNG
   1045 case will probably result in halos around the image.  The linear encoding
   1046 will probably result in a washed out, too bright, image (it's actually too
   1047 contrasty.)  Try the ALPHA_OPTIMIZED mode above - this will probably
   1048 substantially reduce the halos.  Alternatively try:
   1049 
   1050    png_set_alpha_mode(pp, PNG_ALPHA_BROKEN, PNG_DEFAULT_sRGB);
   1051 
   1052 This option will also reduce the halos, but there will be slight dark
   1053 halos round the opaque parts of the image where the background is light.
   1054 In the OPTIMIZED mode the halos will be light halos where the background
   1055 is dark.  Take your pick - the halos are unavoidable unless you can get
   1056 your hardware/software fixed!  (The OPTIMIZED approach is slightly
   1057 faster.)
   1058 
   1059 When the default gamma of PNG files doesn't match the output gamma.
   1060 If you have PNG files with no gamma information png_set_alpha_mode allows
   1061 you to provide a default gamma, but it also sets the output gamma to the
   1062 matching value.  If you know your PNG files have a gamma that doesn't
   1063 match the output you can take advantage of the fact that
   1064 png_set_alpha_mode always sets the output gamma but only sets the PNG
   1065 default if it is not already set:
   1066 
   1067    png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB);
   1068    png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC);
   1069 
   1070 The first call sets both the default and the output gamma values, the
   1071 second call overrides the output gamma without changing the default.  This
   1072 is easier than achieving the same effect with png_set_gamma.  You must use
   1073 PNG_ALPHA_PNG for the first call - internal checking in png_set_alpha will
   1074 fire if more than one call to png_set_alpha_mode and png_set_background is
   1075 made in the same read operation, however multiple calls with PNG_ALPHA_PNG
   1076 are ignored.
   1077 
   1078 If you don't need, or can't handle, the alpha channel you can call
   1079 png_set_background() to remove it by compositing against a fixed color.  Don't
   1080 call png_set_strip_alpha() to do this - it will leave spurious pixel values in
   1081 transparent parts of this image.
   1082 
   1083   png_set_background(png_ptr, &background_color,
   1084       PNG_BACKGROUND_GAMMA_SCREEN, 0, 1);
   1085 
   1086 The background_color is an RGB or grayscale value according to the data format
   1087 libpng will produce for you.  Because you don't yet know the format of the PNG
   1088 file, if you call png_set_background at this point you must arrange for the
   1089 format produced by libpng to always have 8-bit or 16-bit components and then
   1090 store the color as an 8-bit or 16-bit color as appropriate.  The color contains
   1091 separate gray and RGB component values, so you can let libpng produce gray or
   1092 RGB output according to the input format, but low bit depth grayscale images
   1093 must always be converted to at least 8-bit format.  (Even though low bit depth
   1094 grayscale images can't have an alpha channel they can have a transparent
   1095 color!)
   1096 
   1097 You set the transforms you need later, either as flags to the high level
   1098 interface or libpng API calls for the low level interface.  For reference the
   1099 settings and API calls required are:
   1100 
   1101 8-bit values:
   1102   PNG_TRANSFORM_SCALE_16 | PNG_EXPAND
   1103   png_set_expand(png_ptr); png_set_scale_16(png_ptr);
   1104 
   1105   If you must get exactly the same inaccurate results
   1106   produced by default in versions prior to libpng-1.5.4,
   1107   use PNG_TRANSFORM_STRIP_16 and png_set_strip_16(png_ptr)
   1108   instead.
   1109 
   1110 16-bit values:
   1111   PNG_TRANSFORM_EXPAND_16
   1112   png_set_expand_16(png_ptr);
   1113 
   1114 In either case palette image data will be expanded to RGB.  If you just want
   1115 color data you can add PNG_TRANSFORM_GRAY_TO_RGB or png_set_gray_to_rgb(png_ptr)
   1116 to the list.
   1117 
   1118 Calling png_set_background before the PNG file header is read will not work
   1119 prior to libpng-1.5.4.  Because the failure may result in unexpected warnings or
   1120 errors it is therefore much safer to call png_set_background after the head has
   1121 been read.  Unfortunately this means that prior to libpng-1.5.4 it cannot be
   1122 used with the high level interface.
   1123 
   1124 The high-level read interface
   1125 
   1126 At this point there are two ways to proceed; through the high-level
   1127 read interface, or through a sequence of low-level read operations.
   1128 You can use the high-level interface if (a) you are willing to read
   1129 the entire image into memory, and (b) the input transformations
   1130 you want to do are limited to the following set:
   1131 
   1132    PNG_TRANSFORM_IDENTITY      No transformation
   1133    PNG_TRANSFORM_SCALE_16      Strip 16-bit samples to
   1134                                8-bit accurately
   1135    PNG_TRANSFORM_STRIP_16      Chop 16-bit samples to
   1136                                8-bit less accurately
   1137    PNG_TRANSFORM_STRIP_ALPHA   Discard the alpha channel
   1138    PNG_TRANSFORM_PACKING       Expand 1, 2 and 4-bit
   1139                                samples to bytes
   1140    PNG_TRANSFORM_PACKSWAP      Change order of packed
   1141                                pixels to LSB first
   1142    PNG_TRANSFORM_EXPAND        Perform set_expand()
   1143    PNG_TRANSFORM_INVERT_MONO   Invert monochrome images
   1144    PNG_TRANSFORM_SHIFT         Normalize pixels to the
   1145                                sBIT depth
   1146    PNG_TRANSFORM_BGR           Flip RGB to BGR, RGBA
   1147                                to BGRA
   1148    PNG_TRANSFORM_SWAP_ALPHA    Flip RGBA to ARGB or GA
   1149                                to AG
   1150    PNG_TRANSFORM_INVERT_ALPHA  Change alpha from opacity
   1151                                to transparency
   1152    PNG_TRANSFORM_SWAP_ENDIAN   Byte-swap 16-bit samples
   1153    PNG_TRANSFORM_GRAY_TO_RGB   Expand grayscale samples
   1154                                to RGB (or GA to RGBA)
   1155    PNG_TRANSFORM_EXPAND_16     Expand samples to 16 bits
   1156 
   1157 (This excludes setting a background color, doing gamma transformation,
   1158 quantizing, and setting filler.)  If this is the case, simply do this:
   1159 
   1160    png_read_png(png_ptr, info_ptr, png_transforms, NULL)
   1161 
   1162 where png_transforms is an integer containing the bitwise OR of some
   1163 set of transformation flags.  This call is equivalent to png_read_info(),
   1164 followed the set of transformations indicated by the transform mask,
   1165 then png_read_image(), and finally png_read_end().
   1166 
   1167 (The final parameter of this call is not yet used.  Someday it might point
   1168 to transformation parameters required by some future input transform.)
   1169 
   1170 You must use png_transforms and not call any png_set_transform() functions
   1171 when you use png_read_png().
   1172 
   1173 After you have called png_read_png(), you can retrieve the image data
   1174 with
   1175 
   1176   row_pointers = png_get_rows(png_ptr, info_ptr);
   1177 
   1178 where row_pointers is an array of pointers to the pixel data for each row:
   1179 
   1180   png_bytep row_pointers[height];
   1181 
   1182 If you know your image size and pixel size ahead of time, you can allocate
   1183 row_pointers prior to calling png_read_png() with
   1184 
   1185   if (height > PNG_UINT_32_MAX / (sizeof (png_bytep)))
   1186      png_error(png_ptr,
   1187          "Image is too tall to process in memory");
   1188 
   1189   if (width > PNG_UINT_32_MAX / pixel_size)
   1190      png_error(png_ptr,
   1191          "Image is too wide to process in memory");
   1192 
   1193   row_pointers = png_malloc(png_ptr,
   1194       height*(sizeof (png_bytep)));
   1195 
   1196   for (int i = 0; i < height, i++)
   1197      row_pointers[i] = NULL;  /* security precaution */
   1198 
   1199   for (int i = 0; i < height, i++)
   1200      row_pointers[i] = png_malloc(png_ptr,
   1201          width*pixel_size);
   1202 
   1203   png_set_rows(png_ptr, info_ptr, &row_pointers);
   1204 
   1205 Alternatively you could allocate your image in one big block and define
   1206 row_pointers[i] to point into the proper places in your block, but first
   1207 be sure that your platform is able to allocate such a large buffer:
   1208 
   1209   /* Guard against integer overflow */
   1210   if (height > PNG_SIZE_MAX/(width*pixel_size))
   1211      png_error(png_ptr, "image_data buffer would be too large");
   1212 
   1213   png_bytep buffer = png_malloc(png_ptr,
   1214      height*width*pixel_size);
   1215 
   1216   for (int i = 0; i < height, i++)
   1217      row_pointers[i] = buffer + i*width*pixel_size;
   1218 
   1219   png_set_rows(png_ptr, info_ptr, &row_pointers);
   1220 
   1221 If you use png_set_rows(), the application is responsible for freeing
   1222 row_pointers (and row_pointers[i], if they were separately allocated).
   1223 
   1224 If you don't allocate row_pointers ahead of time, png_read_png() will
   1225 do it, and it'll be free'ed by libpng when you call png_destroy_*().
   1226 
   1227 The low-level read interface
   1228 
   1229 If you are going the low-level route, you are now ready to read all
   1230 the file information up to the actual image data.  You do this with a
   1231 call to png_read_info().
   1232 
   1233    png_read_info(png_ptr, info_ptr);
   1234 
   1235 This will process all chunks up to but not including the image data.
   1236 
   1237 This also copies some of the data from the PNG file into the decode structure
   1238 for use in later transformations.  Important information copied in is:
   1239 
   1240 1) The PNG file gamma from the gAMA chunk.  This overwrites the default value
   1241 provided by an earlier call to png_set_gamma or png_set_alpha_mode.
   1242 
   1243 2) Prior to libpng-1.5.4 the background color from a bKGd chunk.  This
   1244 damages the information provided by an earlier call to png_set_background
   1245 resulting in unexpected behavior.  Libpng-1.5.4 no longer does this.
   1246 
   1247 3) The number of significant bits in each component value.  Libpng uses this to
   1248 optimize gamma handling by reducing the internal lookup table sizes.
   1249 
   1250 4) The transparent color information from a tRNS chunk.  This can be modified by
   1251 a later call to png_set_tRNS.
   1252 
   1253 Querying the info structure
   1254 
   1255 Functions are used to get the information from the info_ptr once it
   1256 has been read.  Note that these fields may not be completely filled
   1257 in until png_read_end() has read the chunk data following the image.
   1258 
   1259    png_get_IHDR(png_ptr, info_ptr, &width, &height,
   1260       &bit_depth, &color_type, &interlace_type,
   1261       &compression_type, &filter_method);
   1262 
   1263    width          - holds the width of the image
   1264                     in pixels (up to 2^31).
   1265 
   1266    height         - holds the height of the image
   1267                     in pixels (up to 2^31).
   1268 
   1269    bit_depth      - holds the bit depth of one of the
   1270                     image channels.  (valid values are
   1271                     1, 2, 4, 8, 16 and depend also on
   1272                     the color_type.  See also
   1273                     significant bits (sBIT) below).
   1274 
   1275    color_type     - describes which color/alpha channels
   1276                         are present.
   1277                     PNG_COLOR_TYPE_GRAY
   1278                        (bit depths 1, 2, 4, 8, 16)
   1279                     PNG_COLOR_TYPE_GRAY_ALPHA
   1280                        (bit depths 8, 16)
   1281                     PNG_COLOR_TYPE_PALETTE
   1282                        (bit depths 1, 2, 4, 8)
   1283                     PNG_COLOR_TYPE_RGB
   1284                        (bit_depths 8, 16)
   1285                     PNG_COLOR_TYPE_RGB_ALPHA
   1286                        (bit_depths 8, 16)
   1287 
   1288                     PNG_COLOR_MASK_PALETTE
   1289                     PNG_COLOR_MASK_COLOR
   1290                     PNG_COLOR_MASK_ALPHA
   1291 
   1292    interlace_type - (PNG_INTERLACE_NONE or
   1293                     PNG_INTERLACE_ADAM7)
   1294 
   1295    compression_type - (must be PNG_COMPRESSION_TYPE_BASE
   1296                     for PNG 1.0)
   1297 
   1298    filter_method  - (must be PNG_FILTER_TYPE_BASE
   1299                     for PNG 1.0, and can also be
   1300                     PNG_INTRAPIXEL_DIFFERENCING if
   1301                     the PNG datastream is embedded in
   1302                     a MNG-1.0 datastream)
   1303 
   1304    Any of width, height, color_type, bit_depth,
   1305    interlace_type, compression_type, or filter_method can
   1306    be NULL if you are not interested in their values.
   1307 
   1308    Note that png_get_IHDR() returns 32-bit data into
   1309    the application's width and height variables.
   1310    This is an unsafe situation if these are not png_uint_32
   1311    variables.  In such situations, the
   1312    png_get_image_width() and png_get_image_height()
   1313    functions described below are safer.
   1314 
   1315    width            = png_get_image_width(png_ptr,
   1316                         info_ptr);
   1317 
   1318    height           = png_get_image_height(png_ptr,
   1319                         info_ptr);
   1320 
   1321    bit_depth        = png_get_bit_depth(png_ptr,
   1322                         info_ptr);
   1323 
   1324    color_type       = png_get_color_type(png_ptr,
   1325                         info_ptr);
   1326 
   1327    interlace_type   = png_get_interlace_type(png_ptr,
   1328                         info_ptr);
   1329 
   1330    compression_type = png_get_compression_type(png_ptr,
   1331                         info_ptr);
   1332 
   1333    filter_method    = png_get_filter_type(png_ptr,
   1334                         info_ptr);
   1335 
   1336    channels = png_get_channels(png_ptr, info_ptr);
   1337 
   1338    channels       - number of channels of info for the
   1339                     color type (valid values are 1 (GRAY,
   1340                     PALETTE), 2 (GRAY_ALPHA), 3 (RGB),
   1341                     4 (RGB_ALPHA or RGB + filler byte))
   1342 
   1343    rowbytes = png_get_rowbytes(png_ptr, info_ptr);
   1344 
   1345    rowbytes       - number of bytes needed to hold a row
   1346                     This value, the bit_depth, color_type,
   1347                     and the number of channels can change
   1348                     if you use transforms such as
   1349                     png_set_expand(). See
   1350                     png_read_update_info(), below.
   1351 
   1352    signature = png_get_signature(png_ptr, info_ptr);
   1353 
   1354    signature      - holds the signature read from the
   1355                     file (if any).  The data is kept in
   1356                     the same offset it would be if the
   1357                     whole signature were read (i.e. if an
   1358                     application had already read in 4
   1359                     bytes of signature before starting
   1360                     libpng, the remaining 4 bytes would
   1361                     be in signature[4] through signature[7]
   1362                     (see png_set_sig_bytes())).
   1363 
   1364 These are also important, but their validity depends on whether the chunk
   1365 has been read.  The png_get_valid(png_ptr, info_ptr, PNG_INFO_<chunk>) and
   1366 png_get_<chunk>(png_ptr, info_ptr, ...) functions return non-zero if the
   1367 data has been read, or zero if it is missing.  The parameters to the
   1368 png_get_<chunk> are set directly if they are simple data types, or a
   1369 pointer into the info_ptr is returned for any complex types.
   1370 
   1371 The colorspace data from gAMA, cHRM, sRGB, iCCP, and sBIT chunks
   1372 is simply returned to give the application information about how the
   1373 image was encoded.  Libpng itself only does transformations using the file
   1374 gamma when combining semitransparent pixels with the background color, and,
   1375 since libpng-1.6.0, when converting between 8-bit sRGB and 16-bit linear pixels
   1376 within the simplified API.  Libpng also uses the file gamma when converting
   1377 RGB to gray, beginning with libpng-1.0.5, if the application calls
   1378 png_set_rgb_to_gray()).
   1379 
   1380    png_get_PLTE(png_ptr, info_ptr, &palette,
   1381                     &num_palette);
   1382 
   1383    palette        - the palette for the file
   1384                     (array of png_color)
   1385 
   1386    num_palette    - number of entries in the palette
   1387 
   1388    png_get_gAMA(png_ptr, info_ptr, &file_gamma);
   1389    png_get_gAMA_fixed(png_ptr, info_ptr, &int_file_gamma);
   1390 
   1391    file_gamma     - the gamma at which the file is
   1392                     written (PNG_INFO_gAMA)
   1393 
   1394    int_file_gamma - 100,000 times the gamma at which the
   1395                     file is written
   1396 
   1397    png_get_cHRM(png_ptr, info_ptr,  &white_x, &white_y, &red_x,
   1398                     &red_y, &green_x, &green_y, &blue_x, &blue_y)
   1399    png_get_cHRM_XYZ(png_ptr, info_ptr, &red_X, &red_Y, &red_Z,
   1400                     &green_X, &green_Y, &green_Z, &blue_X, &blue_Y,
   1401                     &blue_Z)
   1402    png_get_cHRM_fixed(png_ptr, info_ptr, &int_white_x,
   1403                     &int_white_y, &int_red_x, &int_red_y,
   1404                     &int_green_x, &int_green_y, &int_blue_x,
   1405                     &int_blue_y)
   1406    png_get_cHRM_XYZ_fixed(png_ptr, info_ptr, &int_red_X, &int_red_Y,
   1407                     &int_red_Z, &int_green_X, &int_green_Y,
   1408                     &int_green_Z, &int_blue_X, &int_blue_Y,
   1409                     &int_blue_Z)
   1410 
   1411    {white,red,green,blue}_{x,y}
   1412                     A color space encoding specified using the
   1413                     chromaticities of the end points and the
   1414                     white point. (PNG_INFO_cHRM)
   1415 
   1416    {red,green,blue}_{X,Y,Z}
   1417                     A color space encoding specified using the
   1418                     encoding end points - the CIE tristimulus
   1419                     specification of the intended color of the red,
   1420                     green and blue channels in the PNG RGB data.
   1421                     The white point is simply the sum of the three
   1422                     end points. (PNG_INFO_cHRM)
   1423 
   1424    png_get_sRGB(png_ptr, info_ptr, &srgb_intent);
   1425 
   1426    srgb_intent -    the rendering intent (PNG_INFO_sRGB)
   1427                     The presence of the sRGB chunk
   1428                     means that the pixel data is in the
   1429                     sRGB color space.  This chunk also
   1430                     implies specific values of gAMA and
   1431                     cHRM.
   1432 
   1433    png_get_iCCP(png_ptr, info_ptr, &name,
   1434       &compression_type, &profile, &proflen);
   1435 
   1436    name             - The profile name.
   1437 
   1438    compression_type - The compression type; always
   1439                       PNG_COMPRESSION_TYPE_BASE for PNG 1.0.
   1440                       You may give NULL to this argument to
   1441                       ignore it.
   1442 
   1443    profile          - International Color Consortium color
   1444                       profile data. May contain NULs.
   1445 
   1446    proflen          - length of profile data in bytes.
   1447 
   1448    png_get_sBIT(png_ptr, info_ptr, &sig_bit);
   1449 
   1450    sig_bit        - the number of significant bits for
   1451                     (PNG_INFO_sBIT) each of the gray,
   1452                     red, green, and blue channels,
   1453                     whichever are appropriate for the
   1454                     given color type (png_color_16)
   1455 
   1456    png_get_tRNS(png_ptr, info_ptr, &trans_alpha,
   1457                     &num_trans, &trans_color);
   1458 
   1459    trans_alpha    - array of alpha (transparency)
   1460                     entries for palette (PNG_INFO_tRNS)
   1461 
   1462    num_trans      - number of transparent entries
   1463                     (PNG_INFO_tRNS)
   1464 
   1465    trans_color    - graylevel or color sample values of
   1466                     the single transparent color for
   1467                     non-paletted images (PNG_INFO_tRNS)
   1468 
   1469    png_get_eXIf_1(png_ptr, info_ptr, &num_exif, &exif);
   1470 
   1471    exif           - Exif profile (array of png_byte)
   1472                     (PNG_INFO_eXIf)
   1473 
   1474    png_get_hIST(png_ptr, info_ptr, &hist);
   1475 
   1476    hist           - histogram of palette (array of
   1477                     png_uint_16) (PNG_INFO_hIST)
   1478 
   1479    png_get_tIME(png_ptr, info_ptr, &mod_time);
   1480 
   1481    mod_time       - time image was last modified
   1482                     (PNG_INFO_tIME)
   1483 
   1484    png_get_bKGD(png_ptr, info_ptr, &background);
   1485 
   1486    background     - background color (of type
   1487                     png_color_16p) (PNG_INFO_bKGD)
   1488                     valid 16-bit red, green and blue
   1489                     values, regardless of color_type
   1490 
   1491    num_comments   = png_get_text(png_ptr, info_ptr,
   1492                     &text_ptr, &num_text);
   1493 
   1494    num_comments   - number of comments
   1495 
   1496    text_ptr       - array of png_text holding image
   1497                     comments
   1498 
   1499    text_ptr[i].compression - type of compression used
   1500                 on "text" PNG_TEXT_COMPRESSION_NONE
   1501                           PNG_TEXT_COMPRESSION_zTXt
   1502                           PNG_ITXT_COMPRESSION_NONE
   1503                           PNG_ITXT_COMPRESSION_zTXt
   1504 
   1505    text_ptr[i].key   - keyword for comment.  Must contain
   1506                         1-79 characters.
   1507 
   1508    text_ptr[i].text  - text comments for current
   1509                         keyword.  Can be empty.
   1510 
   1511    text_ptr[i].text_length - length of text string,
   1512                 after decompression, 0 for iTXt
   1513 
   1514    text_ptr[i].itxt_length - length of itxt string,
   1515                 after decompression, 0 for tEXt/zTXt
   1516 
   1517    text_ptr[i].lang  - language of comment (empty
   1518                         string for unknown).
   1519 
   1520    text_ptr[i].lang_key  - keyword in UTF-8
   1521                         (empty string for unknown).
   1522 
   1523    Note that the itxt_length, lang, and lang_key
   1524    members of the text_ptr structure only exist when the
   1525    library is built with iTXt chunk support.  Prior to
   1526    libpng-1.4.0 the library was built by default without
   1527    iTXt support. Also note that when iTXt is supported,
   1528    they contain NULL pointers when the "compression"
   1529    field contains PNG_TEXT_COMPRESSION_NONE or
   1530    PNG_TEXT_COMPRESSION_zTXt.
   1531 
   1532    num_text       - number of comments (same as
   1533                     num_comments; you can put NULL here
   1534                     to avoid the duplication)
   1535 
   1536    Note while png_set_text() will accept text, language,
   1537    and translated keywords that can be NULL pointers, the
   1538    structure returned by png_get_text will always contain
   1539    regular zero-terminated C strings.  They might be
   1540    empty strings but they will never be NULL pointers.
   1541 
   1542    num_spalettes = png_get_sPLT(png_ptr, info_ptr,
   1543       &palette_ptr);
   1544 
   1545    num_spalettes  - number of sPLT chunks read.
   1546 
   1547    palette_ptr    - array of palette structures holding
   1548                     contents of one or more sPLT chunks
   1549                     read.
   1550 
   1551    png_get_oFFs(png_ptr, info_ptr, &offset_x, &offset_y,
   1552       &unit_type);
   1553 
   1554    offset_x       - positive offset from the left edge
   1555                     of the screen (can be negative)
   1556 
   1557    offset_y       - positive offset from the top edge
   1558                     of the screen (can be negative)
   1559 
   1560    unit_type      - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER
   1561 
   1562    png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y,
   1563       &unit_type);
   1564 
   1565    res_x          - pixels/unit physical resolution in
   1566                     x direction
   1567 
   1568    res_y          - pixels/unit physical resolution in
   1569                     x direction
   1570 
   1571    unit_type      - PNG_RESOLUTION_UNKNOWN,
   1572                     PNG_RESOLUTION_METER
   1573 
   1574    png_get_sCAL(png_ptr, info_ptr, &unit, &width,
   1575       &height)
   1576 
   1577    unit        - physical scale units (an integer)
   1578 
   1579    width       - width of a pixel in physical scale units
   1580 
   1581    height      - height of a pixel in physical scale units
   1582                 (width and height are doubles)
   1583 
   1584    png_get_sCAL_s(png_ptr, info_ptr, &unit, &width,
   1585       &height)
   1586 
   1587    unit        - physical scale units (an integer)
   1588 
   1589    width       - width of a pixel in physical scale units
   1590                  (expressed as a string)
   1591 
   1592    height      - height of a pixel in physical scale units
   1593                 (width and height are strings like "2.54")
   1594 
   1595    num_unknown_chunks = png_get_unknown_chunks(png_ptr,
   1596       info_ptr, &unknowns)
   1597 
   1598    unknowns          - array of png_unknown_chunk
   1599                        structures holding unknown chunks
   1600 
   1601    unknowns[i].name  - name of unknown chunk
   1602 
   1603    unknowns[i].data  - data of unknown chunk
   1604 
   1605    unknowns[i].size  - size of unknown chunk's data
   1606 
   1607    unknowns[i].location - position of chunk in file
   1608 
   1609    The value of "i" corresponds to the order in which the
   1610    chunks were read from the PNG file or inserted with the
   1611    png_set_unknown_chunks() function.
   1612 
   1613    The value of "location" is a bitwise "or" of
   1614 
   1615         PNG_HAVE_IHDR  (0x01)
   1616         PNG_HAVE_PLTE  (0x02)
   1617         PNG_AFTER_IDAT (0x08)
   1618 
   1619 The data from the pHYs chunk can be retrieved in several convenient
   1620 forms:
   1621 
   1622    res_x = png_get_x_pixels_per_meter(png_ptr,
   1623       info_ptr)
   1624 
   1625    res_y = png_get_y_pixels_per_meter(png_ptr,
   1626       info_ptr)
   1627 
   1628    res_x_and_y = png_get_pixels_per_meter(png_ptr,
   1629       info_ptr)
   1630 
   1631    res_x = png_get_x_pixels_per_inch(png_ptr,
   1632       info_ptr)
   1633 
   1634    res_y = png_get_y_pixels_per_inch(png_ptr,
   1635       info_ptr)
   1636 
   1637    res_x_and_y = png_get_pixels_per_inch(png_ptr,
   1638       info_ptr)
   1639 
   1640    aspect_ratio = png_get_pixel_aspect_ratio(png_ptr,
   1641       info_ptr)
   1642 
   1643    Each of these returns 0 [signifying "unknown"] if
   1644       the data is not present or if res_x is 0;
   1645       res_x_and_y is 0 if res_x != res_y
   1646 
   1647    Note that because of the way the resolutions are
   1648       stored internally, the inch conversions won't
   1649       come out to exactly even number.  For example,
   1650       72 dpi is stored as 0.28346 pixels/meter, and
   1651       when this is retrieved it is 71.9988 dpi, so
   1652       be sure to round the returned value appropriately
   1653       if you want to display a reasonable-looking result.
   1654 
   1655 The data from the oFFs chunk can be retrieved in several convenient
   1656 forms:
   1657 
   1658    x_offset = png_get_x_offset_microns(png_ptr, info_ptr);
   1659 
   1660    y_offset = png_get_y_offset_microns(png_ptr, info_ptr);
   1661 
   1662    x_offset = png_get_x_offset_inches(png_ptr, info_ptr);
   1663 
   1664    y_offset = png_get_y_offset_inches(png_ptr, info_ptr);
   1665 
   1666    Each of these returns 0 [signifying "unknown" if both
   1667       x and y are 0] if the data is not present or if the
   1668       chunk is present but the unit is the pixel.  The
   1669       remark about inexact inch conversions applies here
   1670       as well, because a value in inches can't always be
   1671       converted to microns and back without some loss
   1672       of precision.
   1673 
   1674 For more information, see the
   1675 PNG specification for chunk contents.  Be careful with trusting
   1676 rowbytes, as some of the transformations could increase the space
   1677 needed to hold a row (expand, filler, gray_to_rgb, etc.).
   1678 See png_read_update_info(), below.
   1679 
   1680 A quick word about text_ptr and num_text.  PNG stores comments in
   1681 keyword/text pairs, one pair per chunk, with no limit on the number
   1682 of text chunks, and a 2^31 byte limit on their size.  While there are
   1683 suggested keywords, there is no requirement to restrict the use to these
   1684 strings.  It is strongly suggested that keywords and text be sensible
   1685 to humans (that's the point), so don't use abbreviations.  Non-printing
   1686 symbols are not allowed.  See the PNG specification for more details.
   1687 There is also no requirement to have text after the keyword.
   1688 
   1689 Keywords should be limited to 79 Latin-1 characters without leading or
   1690 trailing spaces, but non-consecutive spaces are allowed within the
   1691 keyword.  It is possible to have the same keyword any number of times.
   1692 The text_ptr is an array of png_text structures, each holding a
   1693 pointer to a language string, a pointer to a keyword and a pointer to
   1694 a text string.  The text string, language code, and translated
   1695 keyword may be empty or NULL pointers.  The keyword/text
   1696 pairs are put into the array in the order that they are received.
   1697 However, some or all of the text chunks may be after the image, so, to
   1698 make sure you have read all the text chunks, don't mess with these
   1699 until after you read the stuff after the image.  This will be
   1700 mentioned again below in the discussion that goes with png_read_end().
   1701 
   1702 Input transformations
   1703 
   1704 After you've read the header information, you can set up the library
   1705 to handle any special transformations of the image data.  The various
   1706 ways to transform the data will be described in the order that they
   1707 should occur.  This is important, as some of these change the color
   1708 type and/or bit depth of the data, and some others only work on
   1709 certain color types and bit depths.
   1710 
   1711 Transformations you request are ignored if they don't have any meaning for a
   1712 particular input data format.  However some transformations can have an effect
   1713 as a result of a previous transformation.  If you specify a contradictory set of
   1714 transformations, for example both adding and removing the alpha channel, you
   1715 cannot predict the final result.
   1716 
   1717 The color used for the transparency values should be supplied in the same
   1718 format/depth as the current image data.  It is stored in the same format/depth
   1719 as the image data in a tRNS chunk, so this is what libpng expects for this data.
   1720 
   1721 The color used for the background value depends on the need_expand argument as
   1722 described below.
   1723 
   1724 Data will be decoded into the supplied row buffers packed into bytes
   1725 unless the library has been told to transform it into another format.
   1726 For example, 4 bit/pixel paletted or grayscale data will be returned
   1727 2 pixels/byte with the leftmost pixel in the high-order bits of the byte,
   1728 unless png_set_packing() is called.  8-bit RGB data will be stored
   1729 in RGB RGB RGB format unless png_set_filler() or png_set_add_alpha()
   1730 is called to insert filler bytes, either before or after each RGB triplet.
   1731 
   1732 16-bit RGB data will be returned RRGGBB RRGGBB, with the most significant
   1733 byte of the color value first, unless png_set_scale_16() is called to
   1734 transform it to regular RGB RGB triplets, or png_set_filler() or
   1735 png_set_add alpha() is called to insert two filler bytes, either before
   1736 or after each RRGGBB triplet.  Similarly, 8-bit or 16-bit grayscale data can
   1737 be modified with png_set_filler(), png_set_add_alpha(), png_set_strip_16(),
   1738 or png_set_scale_16().
   1739 
   1740 The following code transforms grayscale images of less than 8 to 8 bits,
   1741 changes paletted images to RGB, and adds a full alpha channel if there is
   1742 transparency information in a tRNS chunk.  This is most useful on
   1743 grayscale images with bit depths of 2 or 4 or if there is a multiple-image
   1744 viewing application that wishes to treat all images in the same way.
   1745 
   1746    if (color_type == PNG_COLOR_TYPE_PALETTE)
   1747       png_set_palette_to_rgb(png_ptr);
   1748 
   1749    if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
   1750       png_set_tRNS_to_alpha(png_ptr);
   1751 
   1752    if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
   1753       png_set_expand_gray_1_2_4_to_8(png_ptr);
   1754 
   1755 The first two functions are actually aliases for png_set_expand(), added
   1756 in libpng version 1.0.4, with the function names expanded to improve code
   1757 readability.  In some future version they may actually do different
   1758 things.
   1759 
   1760 As of libpng version 1.2.9, png_set_expand_gray_1_2_4_to_8() was
   1761 added.  It expands the sample depth without changing tRNS to alpha.
   1762 
   1763 As of libpng version 1.5.2, png_set_expand_16() was added.  It behaves as
   1764 png_set_expand(); however, the resultant channels have 16 bits rather than 8.
   1765 Use this when the output color or gray channels are made linear to avoid fairly
   1766 severe accuracy loss.
   1767 
   1768    if (bit_depth < 16)
   1769       png_set_expand_16(png_ptr);
   1770 
   1771 PNG can have files with 16 bits per channel.  If you only can handle
   1772 8 bits per channel, this will strip the pixels down to 8-bit.
   1773 
   1774    if (bit_depth == 16)
   1775    {
   1776 #if PNG_LIBPNG_VER >= 10504
   1777       png_set_scale_16(png_ptr);
   1778 #else
   1779       png_set_strip_16(png_ptr);
   1780 #endif
   1781    }
   1782 
   1783 (The more accurate "png_set_scale_16()" API became available in libpng version
   1784 1.5.4).
   1785 
   1786 If you need to process the alpha channel on the image separately from the image
   1787 data (for example if you convert it to a bitmap mask) it is possible to have
   1788 libpng strip the channel leaving just RGB or gray data:
   1789 
   1790    if (color_type & PNG_COLOR_MASK_ALPHA)
   1791       png_set_strip_alpha(png_ptr);
   1792 
   1793 If you strip the alpha channel you need to find some other way of dealing with
   1794 the information.  If, instead, you want to convert the image to an opaque
   1795 version with no alpha channel use png_set_background; see below.
   1796 
   1797 As of libpng version 1.5.2, almost all useful expansions are supported, the
   1798 major omissions are conversion of grayscale to indexed images (which can be
   1799 done trivially in the application) and conversion of indexed to grayscale (which
   1800 can be done by a trivial manipulation of the palette.)
   1801 
   1802 In the following table, the 01 means grayscale with depth<8, 31 means
   1803 indexed with depth<8, other numerals represent the color type, "T" means
   1804 the tRNS chunk is present, A means an alpha channel is present, and O
   1805 means tRNS or alpha is present but all pixels in the image are opaque.
   1806 
   1807  FROM  01  31   0  0T  0O   2  2T  2O   3  3T  3O  4A  4O  6A  6O
   1808   TO
   1809   01    -  [G]  -   -   -   -   -   -   -   -   -   -   -   -   -
   1810   31   [Q]  Q  [Q] [Q] [Q]  Q   Q   Q   Q   Q   Q  [Q] [Q]  Q   Q
   1811    0    1   G   +   .   .   G   G   G   G   G   G   B   B  GB  GB
   1812   0T    lt  Gt  t   +   .   Gt  G   G   Gt  G   G   Bt  Bt GBt GBt
   1813   0O    lt  Gt  t   .   +   Gt  Gt  G   Gt  Gt  G   Bt  Bt GBt GBt
   1814    2    C   P   C   C   C   +   .   .   C   -   -  CB  CB   B   B
   1815   2T    Ct  -   Ct  C   C   t   +   t   -   -   -  CBt CBt  Bt  Bt
   1816   2O    Ct  -   Ct  C   C   t   t   +   -   -   -  CBt CBt  Bt  Bt
   1817    3   [Q]  p  [Q] [Q] [Q]  Q   Q   Q   +   .   .  [Q] [Q]  Q   Q
   1818   3T   [Qt] p  [Qt][Q] [Q]  Qt  Qt  Qt  t   +   t  [Qt][Qt] Qt  Qt
   1819   3O   [Qt] p  [Qt][Q] [Q]  Qt  Qt  Qt  t   t   +  [Qt][Qt] Qt  Qt
   1820   4A    lA  G   A   T   T   GA  GT  GT  GA  GT  GT  +   BA  G  GBA
   1821   4O    lA GBA  A   T   T   GA  GT  GT  GA  GT  GT  BA  +  GBA  G
   1822   6A    CA  PA  CA  C   C   A   T  tT   PA  P   P   C  CBA  +   BA
   1823   6O    CA PBA  CA  C   C   A  tT   T   PA  P   P  CBA  C   BA  +
   1824 
   1825 Within the matrix,
   1826     "+" identifies entries where 'from' and 'to' are the same.
   1827     "-" means the transformation is not supported.
   1828     "." means nothing is necessary (a tRNS chunk can just be ignored).
   1829     "t" means the transformation is obtained by png_set_tRNS.
   1830     "A" means the transformation is obtained by png_set_add_alpha().
   1831     "X" means the transformation is obtained by png_set_expand().
   1832     "1" means the transformation is obtained by
   1833         png_set_expand_gray_1_2_4_to_8() (and by png_set_expand()
   1834         if there is no transparency in the original or the final
   1835         format).
   1836     "C" means the transformation is obtained by png_set_gray_to_rgb().
   1837     "G" means the transformation is obtained by png_set_rgb_to_gray().
   1838     "P" means the transformation is obtained by
   1839         png_set_expand_palette_to_rgb().
   1840     "p" means the transformation is obtained by png_set_packing().
   1841     "Q" means the transformation is obtained by png_set_quantize().
   1842     "T" means the transformation is obtained by
   1843         png_set_tRNS_to_alpha().
   1844     "B" means the transformation is obtained by
   1845         png_set_background(), or png_strip_alpha().
   1846 
   1847 When an entry has multiple transforms listed all are required to cause the
   1848 right overall transformation.  When two transforms are separated by a comma
   1849 either will do the job.  When transforms are enclosed in [] the transform should
   1850 do the job but this is currently unimplemented - a different format will result
   1851 if the suggested transformations are used.
   1852 
   1853 In PNG files, the alpha channel in an image
   1854 is the level of opacity.  If you need the alpha channel in an image to
   1855 be the level of transparency instead of opacity, you can invert the
   1856 alpha channel (or the tRNS chunk data) after it's read, so that 0 is
   1857 fully opaque and 255 (in 8-bit or paletted images) or 65535 (in 16-bit
   1858 images) is fully transparent, with
   1859 
   1860    png_set_invert_alpha(png_ptr);
   1861 
   1862 PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as
   1863 they can, resulting in, for example, 8 pixels per byte for 1 bit
   1864 files.  This code expands to 1 pixel per byte without changing the
   1865 values of the pixels:
   1866 
   1867    if (bit_depth < 8)
   1868       png_set_packing(png_ptr);
   1869 
   1870 PNG files have possible bit depths of 1, 2, 4, 8, and 16.  All pixels
   1871 stored in a PNG image have been "scaled" or "shifted" up to the next
   1872 higher possible bit depth (e.g. from 5 bits/sample in the range [0,31]
   1873 to 8 bits/sample in the range [0, 255]).  However, it is also possible
   1874 to convert the PNG pixel data back to the original bit depth of the
   1875 image.  This call reduces the pixels back down to the original bit depth:
   1876 
   1877    png_color_8p sig_bit;
   1878 
   1879    if (png_get_sBIT(png_ptr, info_ptr, &sig_bit))
   1880       png_set_shift(png_ptr, sig_bit);
   1881 
   1882 PNG files store 3-color pixels in red, green, blue order.  This code
   1883 changes the storage of the pixels to blue, green, red:
   1884 
   1885    if (color_type == PNG_COLOR_TYPE_RGB ||
   1886        color_type == PNG_COLOR_TYPE_RGB_ALPHA)
   1887       png_set_bgr(png_ptr);
   1888 
   1889 PNG files store RGB pixels packed into 3 or 6 bytes. This code expands them
   1890 into 4 or 8 bytes for windowing systems that need them in this format:
   1891 
   1892    if (color_type == PNG_COLOR_TYPE_RGB)
   1893       png_set_filler(png_ptr, filler, PNG_FILLER_BEFORE);
   1894 
   1895 where "filler" is the 8-bit or 16-bit number to fill with, and the location
   1896 is either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether
   1897 you want the filler before the RGB or after. When filling an 8-bit pixel,
   1898 the least significant 8 bits of the number are used, if a 16-bit number is
   1899 supplied.  This transformation does not affect images that already have full
   1900 alpha channels.  To add an opaque alpha channel, use filler=0xffff and
   1901 PNG_FILLER_AFTER which will generate RGBA pixels.
   1902 
   1903 Note that png_set_filler() does not change the color type.  If you want
   1904 to do that, you can add a true alpha channel with
   1905 
   1906    if (color_type == PNG_COLOR_TYPE_RGB ||
   1907        color_type == PNG_COLOR_TYPE_GRAY)
   1908       png_set_add_alpha(png_ptr, filler, PNG_FILLER_AFTER);
   1909 
   1910 where "filler" contains the alpha value to assign to each pixel.
   1911 The png_set_add_alpha() function was added in libpng-1.2.7.
   1912 
   1913 If you are reading an image with an alpha channel, and you need the
   1914 data as ARGB instead of the normal PNG format RGBA:
   1915 
   1916    if (color_type == PNG_COLOR_TYPE_RGB_ALPHA)
   1917       png_set_swap_alpha(png_ptr);
   1918 
   1919 For some uses, you may want a grayscale image to be represented as
   1920 RGB.  This code will do that conversion:
   1921 
   1922    if (color_type == PNG_COLOR_TYPE_GRAY ||
   1923        color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
   1924       png_set_gray_to_rgb(png_ptr);
   1925 
   1926 Conversely, you can convert an RGB or RGBA image to grayscale or grayscale
   1927 with alpha.
   1928 
   1929    if (color_type == PNG_COLOR_TYPE_RGB ||
   1930        color_type == PNG_COLOR_TYPE_RGB_ALPHA)
   1931       png_set_rgb_to_gray(png_ptr, error_action,
   1932          (double)red_weight, (double)green_weight);
   1933 
   1934    error_action = 1: silently do the conversion
   1935 
   1936    error_action = 2: issue a warning if the original
   1937                      image has any pixel where
   1938                      red != green or red != blue
   1939 
   1940    error_action = 3: issue an error and abort the
   1941                      conversion if the original
   1942                      image has any pixel where
   1943                      red != green or red != blue
   1944 
   1945    red_weight:       weight of red component
   1946 
   1947    green_weight:     weight of green component
   1948                      If either weight is negative, default
   1949                      weights are used.
   1950 
   1951 In the corresponding fixed point API the red_weight and green_weight values are
   1952 simply scaled by 100,000:
   1953 
   1954    png_set_rgb_to_gray(png_ptr, error_action,
   1955       (png_fixed_point)red_weight,
   1956       (png_fixed_point)green_weight);
   1957 
   1958 If you have set error_action = 1 or 2, you can
   1959 later check whether the image really was gray, after processing
   1960 the image rows, with the png_get_rgb_to_gray_status(png_ptr) function.
   1961 It will return a png_byte that is zero if the image was gray or
   1962 1 if there were any non-gray pixels.  Background and sBIT data
   1963 will be silently converted to grayscale, using the green channel
   1964 data for sBIT, regardless of the error_action setting.
   1965 
   1966 The default values come from the PNG file cHRM chunk if present; otherwise, the
   1967 defaults correspond to the ITU-R recommendation 709, and also the sRGB color
   1968 space, as recommended in the Charles Poynton's Colour FAQ,
   1969 Copyright (c) 2006-11-28 Charles Poynton, in section 9:
   1970 
   1971 <http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9>
   1972 
   1973    Y = 0.2126 * R + 0.7152 * G + 0.0722 * B
   1974 
   1975 Previous versions of this document, 1998 through 2002, recommended a slightly
   1976 different formula:
   1977 
   1978    Y = 0.212671 * R + 0.715160 * G + 0.072169 * B
   1979 
   1980 Libpng uses an integer approximation:
   1981 
   1982    Y = (6968 * R + 23434 * G + 2366 * B)/32768
   1983 
   1984 The calculation is done in a linear colorspace, if the image gamma
   1985 can be determined.
   1986 
   1987 The png_set_background() function has been described already; it tells libpng to
   1988 composite images with alpha or simple transparency against the supplied
   1989 background color.  For compatibility with versions of libpng earlier than
   1990 libpng-1.5.4 it is recommended that you call the function after reading the file
   1991 header, even if you don't want to use the color in a bKGD chunk, if one exists.
   1992 
   1993 If the PNG file contains a bKGD chunk (PNG_INFO_bKGD valid),
   1994 you may use this color, or supply another color more suitable for
   1995 the current display (e.g., the background color from a web page).  You
   1996 need to tell libpng how the color is represented, both the format of the
   1997 component values in the color (the number of bits) and the gamma encoding of the
   1998 color.  The function takes two arguments, background_gamma_mode and need_expand
   1999 to convey this information; however, only two combinations are likely to be
   2000 useful:
   2001 
   2002    png_color_16 my_background;
   2003    png_color_16p image_background;
   2004 
   2005    if (png_get_bKGD(png_ptr, info_ptr, &image_background))
   2006       png_set_background(png_ptr, image_background,
   2007           PNG_BACKGROUND_GAMMA_FILE, 1/*needs to be expanded*/, 1);
   2008    else
   2009       png_set_background(png_ptr, &my_background,
   2010           PNG_BACKGROUND_GAMMA_SCREEN, 0/*do not expand*/, 1);
   2011 
   2012 The second call was described above - my_background is in the format of the
   2013 final, display, output produced by libpng.  Because you now know the format of
   2014 the PNG it is possible to avoid the need to choose either 8-bit or 16-bit
   2015 output and to retain palette images (the palette colors will be modified
   2016 appropriately and the tRNS chunk removed.)  However, if you are doing this,
   2017 take great care not to ask for transformations without checking first that
   2018 they apply!
   2019 
   2020 In the first call the background color has the original bit depth and color type
   2021 of the PNG file.  So, for palette images the color is supplied as a palette
   2022 index and for low bit greyscale images the color is a reduced bit value in
   2023 image_background->gray.
   2024 
   2025 If you didn't call png_set_gamma() before reading the file header, for example
   2026 if you need your code to remain compatible with older versions of libpng prior
   2027 to libpng-1.5.4, this is the place to call it.
   2028 
   2029 Do not call it if you called png_set_alpha_mode(); doing so will damage the
   2030 settings put in place by png_set_alpha_mode().  (If png_set_alpha_mode() is
   2031 supported then you can certainly do png_set_gamma() before reading the PNG
   2032 header.)
   2033 
   2034 This API unconditionally sets the screen and file gamma values, so it will
   2035 override the value in the PNG file unless it is called before the PNG file
   2036 reading starts.  For this reason you must always call it with the PNG file
   2037 value when you call it in this position:
   2038 
   2039   if (png_get_gAMA(png_ptr, info_ptr, &file_gamma))
   2040      png_set_gamma(png_ptr, screen_gamma, file_gamma);
   2041 
   2042   else
   2043      png_set_gamma(png_ptr, screen_gamma, 0.45455);
   2044 
   2045 If you need to reduce an RGB file to a paletted file, or if a paletted
   2046 file has more entries than will fit on your screen, png_set_quantize()
   2047 will do that.  Note that this is a simple match quantization that merely
   2048 finds the closest color available.  This should work fairly well with
   2049 optimized palettes, but fairly badly with linear color cubes.  If you
   2050 pass a palette that is larger than maximum_colors, the file will
   2051 reduce the number of colors in the palette so it will fit into
   2052 maximum_colors.  If there is a histogram, libpng will use it to make
   2053 more intelligent choices when reducing the palette.  If there is no
   2054 histogram, it may not do as good a job.
   2055 
   2056   if (color_type & PNG_COLOR_MASK_COLOR)
   2057   {
   2058      if (png_get_valid(png_ptr, info_ptr,
   2059          PNG_INFO_PLTE))
   2060      {
   2061         png_uint_16p histogram = NULL;
   2062 
   2063         png_get_hIST(png_ptr, info_ptr,
   2064             &histogram);
   2065         png_set_quantize(png_ptr, palette, num_palette,
   2066            max_screen_colors, histogram, 1);
   2067      }
   2068 
   2069      else
   2070      {
   2071         png_color std_color_cube[MAX_SCREEN_COLORS] =
   2072            { ... colors ... };
   2073 
   2074         png_set_quantize(png_ptr, std_color_cube,
   2075            MAX_SCREEN_COLORS, MAX_SCREEN_COLORS,
   2076            NULL,0);
   2077      }
   2078   }
   2079 
   2080 PNG files describe monochrome as black being zero and white being one.
   2081 The following code will reverse this (make black be one and white be
   2082 zero):
   2083 
   2084   if (bit_depth == 1 && color_type == PNG_COLOR_TYPE_GRAY)
   2085      png_set_invert_mono(png_ptr);
   2086 
   2087 This function can also be used to invert grayscale and gray-alpha images:
   2088 
   2089   if (color_type == PNG_COLOR_TYPE_GRAY ||
   2090       color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
   2091      png_set_invert_mono(png_ptr);
   2092 
   2093 PNG files store 16-bit pixels in network byte order (big-endian,
   2094 ie. most significant bits first).  This code changes the storage to the
   2095 other way (little-endian, i.e. least significant bits first, the
   2096 way PCs store them):
   2097 
   2098    if (bit_depth == 16)
   2099       png_set_swap(png_ptr);
   2100 
   2101 If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you
   2102 need to change the order the pixels are packed into bytes, you can use:
   2103 
   2104    if (bit_depth < 8)
   2105       png_set_packswap(png_ptr);
   2106 
   2107 Finally, you can write your own transformation function if none of
   2108 the existing ones meets your needs.  This is done by setting a callback
   2109 with
   2110 
   2111    png_set_read_user_transform_fn(png_ptr,
   2112        read_transform_fn);
   2113 
   2114 You must supply the function
   2115 
   2116    void read_transform_fn(png_structp png_ptr, png_row_infop
   2117        row_info, png_bytep data)
   2118 
   2119 See pngtest.c for a working example.  Your function will be called
   2120 after all of the other transformations have been processed.  Take care with
   2121 interlaced images if you do the interlace yourself - the width of the row is the
   2122 width in 'row_info', not the overall image width.
   2123 
   2124 If supported, libpng provides two information routines that you can use to find
   2125 where you are in processing the image:
   2126 
   2127   png_get_current_pass_number(png_structp png_ptr);
   2128   png_get_current_row_number(png_structp png_ptr);
   2129 
   2130 Don't try using these outside a transform callback - firstly they are only
   2131 supported if user transforms are supported, secondly they may well return
   2132 unexpected results unless the row is actually being processed at the moment they
   2133 are called.
   2134 
   2135 With interlaced
   2136 images the value returned is the row in the input sub-image image.  Use
   2137 PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to
   2138 find the output pixel (x,y) given an interlaced sub-image pixel (row,col,pass).
   2139 
   2140 The discussion of interlace handling above contains more information on how to
   2141 use these values.
   2142 
   2143 You can also set up a pointer to a user structure for use by your
   2144 callback function, and you can inform libpng that your transform
   2145 function will change the number of channels or bit depth with the
   2146 function
   2147 
   2148    png_set_user_transform_info(png_ptr, user_ptr,
   2149        user_depth, user_channels);
   2150 
   2151 The user's application, not libpng, is responsible for allocating and
   2152 freeing any memory required for the user structure.
   2153 
   2154 You can retrieve the pointer via the function
   2155 png_get_user_transform_ptr().  For example:
   2156 
   2157    voidp read_user_transform_ptr =
   2158        png_get_user_transform_ptr(png_ptr);
   2159 
   2160 The last thing to handle is interlacing; this is covered in detail below,
   2161 but you must call the function here if you want libpng to handle expansion
   2162 of the interlaced image.
   2163 
   2164    number_of_passes = png_set_interlace_handling(png_ptr);
   2165 
   2166 After setting the transformations, libpng can update your png_info
   2167 structure to reflect any transformations you've requested with this
   2168 call.
   2169 
   2170    png_read_update_info(png_ptr, info_ptr);
   2171 
   2172 This is most useful to update the info structure's rowbytes
   2173 field so you can use it to allocate your image memory.  This function
   2174 will also update your palette with the correct screen_gamma and
   2175 background if these have been given with the calls above.  You may
   2176 only call png_read_update_info() once with a particular info_ptr.
   2177 
   2178 After you call png_read_update_info(), you can allocate any
   2179 memory you need to hold the image.  The row data is simply
   2180 raw byte data for all forms of images.  As the actual allocation
   2181 varies among applications, no example will be given.  If you
   2182 are allocating one large chunk, you will need to build an
   2183 array of pointers to each row, as it will be needed for some
   2184 of the functions below.
   2185 
   2186 Be sure that your platform can allocate the buffer that you'll need.
   2187 libpng internally checks for oversize width, but you'll need to
   2188 do your own check for number_of_rows*width*pixel_size if you are using
   2189 a multiple-row buffer:
   2190 
   2191   /* Guard against integer overflow */
   2192   if (number_of_rows > PNG_SIZE_MAX/(width*pixel_size))
   2193      png_error(png_ptr, "image_data buffer would be too large");
   2194 
   2195 Remember: Before you call png_read_update_info(), the png_get_*()
   2196 functions return the values corresponding to the original PNG image.
   2197 After you call png_read_update_info the values refer to the image
   2198 that libpng will output.  Consequently you must call all the png_set_
   2199 functions before you call png_read_update_info().  This is particularly
   2200 important for png_set_interlace_handling() - if you are going to call
   2201 png_read_update_info() you must call png_set_interlace_handling() before
   2202 it unless you want to receive interlaced output.
   2203 
   2204 Reading image data
   2205 
   2206 After you've allocated memory, you can read the image data.
   2207 The simplest way to do this is in one function call.  If you are
   2208 allocating enough memory to hold the whole image, you can just
   2209 call png_read_image() and libpng will read in all the image data
   2210 and put it in the memory area supplied.  You will need to pass in
   2211 an array of pointers to each row.
   2212 
   2213 This function automatically handles interlacing, so you don't
   2214 need to call png_set_interlace_handling() (unless you call
   2215 png_read_update_info()) or call this function multiple times, or any
   2216 of that other stuff necessary with png_read_rows().
   2217 
   2218   png_read_image(png_ptr, row_pointers);
   2219 
   2220 where row_pointers is:
   2221 
   2222   png_bytep row_pointers[height];
   2223 
   2224 You can point to void or char or whatever you use for pixels.
   2225 
   2226 If you don't want to read in the whole image at once, you can
   2227 use png_read_rows() instead.  If there is no interlacing (check
   2228 interlace_type == PNG_INTERLACE_NONE), this is simple:
   2229 
   2230    png_read_rows(png_ptr, row_pointers, NULL,
   2231        number_of_rows);
   2232 
   2233 where row_pointers is the same as in the png_read_image() call.
   2234 
   2235 If you are doing this just one row at a time, you can do this with
   2236 a single row_pointer instead of an array of row_pointers:
   2237 
   2238    png_bytep row_pointer = row;
   2239    png_read_row(png_ptr, row_pointer, NULL);
   2240 
   2241 If the file is interlaced (interlace_type != 0 in the IHDR chunk), things
   2242 get somewhat harder.  The only current (PNG Specification version 1.2)
   2243 interlacing type for PNG is (interlace_type == PNG_INTERLACE_ADAM7);
   2244 a somewhat complicated 2D interlace scheme, known as Adam7, that
   2245 breaks down an image into seven smaller images of varying size, based
   2246 on an 8x8 grid.  This number is defined (from libpng 1.5) as
   2247 PNG_INTERLACE_ADAM7_PASSES in png.h
   2248 
   2249 libpng can fill out those images or it can give them to you "as is".
   2250 It is almost always better to have libpng handle the interlacing for you.
   2251 If you want the images filled out, there are two ways to do that.  The one
   2252 mentioned in the PNG specification is to expand each pixel to cover
   2253 those pixels that have not been read yet (the "rectangle" method).
   2254 This results in a blocky image for the first pass, which gradually
   2255 smooths out as more pixels are read.  The other method is the "sparkle"
   2256 method, where pixels are drawn only in their final locations, with the
   2257 rest of the image remaining whatever colors they were initialized to
   2258 before the start of the read.  The first method usually looks better,
   2259 but tends to be slower, as there are more pixels to put in the rows.
   2260 
   2261 If, as is likely, you want libpng to expand the images, call this before
   2262 calling png_start_read_image() or png_read_update_info():
   2263 
   2264    if (interlace_type == PNG_INTERLACE_ADAM7)
   2265       number_of_passes
   2266           = png_set_interlace_handling(png_ptr);
   2267 
   2268 This will return the number of passes needed.  Currently, this is seven,
   2269 but may change if another interlace type is added.  This function can be
   2270 called even if the file is not interlaced, where it will return one pass.
   2271 You then need to read the whole image 'number_of_passes' times.  Each time
   2272 will distribute the pixels from the current pass to the correct place in
   2273 the output image, so you need to supply the same rows to png_read_rows in
   2274 each pass.
   2275 
   2276 If you are not going to display the image after each pass, but are
   2277 going to wait until the entire image is read in, use the sparkle
   2278 effect.  This effect is faster and the end result of either method
   2279 is exactly the same.  If you are planning on displaying the image
   2280 after each pass, the "rectangle" effect is generally considered the
   2281 better looking one.
   2282 
   2283 If you only want the "sparkle" effect, just call png_read_row() or
   2284 png_read_rows() as
   2285 normal, with the third parameter NULL.  Make sure you make pass over
   2286 the image number_of_passes times, and you don't change the data in the
   2287 rows between calls.  You can change the locations of the data, just
   2288 not the data.  Each pass only writes the pixels appropriate for that
   2289 pass, and assumes the data from previous passes is still valid.
   2290 
   2291    png_read_rows(png_ptr, row_pointers, NULL,
   2292        number_of_rows);
   2293    or
   2294    png_read_row(png_ptr, row_pointers, NULL);
   2295 
   2296 If you only want the first effect (the rectangles), do the same as
   2297 before except pass the row buffer in the third parameter, and leave
   2298 the second parameter NULL.
   2299 
   2300    png_read_rows(png_ptr, NULL, row_pointers,
   2301        number_of_rows);
   2302    or
   2303    png_read_row(png_ptr, NULL, row_pointers);
   2304 
   2305 If you don't want libpng to handle the interlacing details, just call
   2306 png_read_rows() PNG_INTERLACE_ADAM7_PASSES times to read in all the images.
   2307 Each of the images is a valid image by itself; however, you will almost
   2308 certainly need to distribute the pixels from each sub-image to the
   2309 correct place.  This is where everything gets very tricky.
   2310 
   2311 If you want to retrieve the separate images you must pass the correct
   2312 number of rows to each successive call of png_read_rows().  The calculation
   2313 gets pretty complicated for small images, where some sub-images may
   2314 not even exist because either their width or height ends up zero.
   2315 libpng provides two macros to help you in 1.5 and later versions:
   2316 
   2317   png_uint_32 width = PNG_PASS_COLS(image_width, pass_number);
   2318   png_uint_32 height = PNG_PASS_ROWS(image_height, pass_number);
   2319 
   2320 Respectively these tell you the width and height of the sub-image
   2321 corresponding to the numbered pass.  'pass' is in in the range 0 to 6 -
   2322 this can be confusing because the specification refers to the same passes
   2323 as 1 to 7!  Be careful, you must check both the width and height before
   2324 calling png_read_rows() and not call it for that pass if either is zero.
   2325 
   2326 You can, of course, read each sub-image row by row.  If you want to
   2327 produce optimal code to make a pixel-by-pixel transformation of an
   2328 interlaced image this is the best approach; read each row of each pass,
   2329 transform it, and write it out to a new interlaced image.
   2330 
   2331 If you want to de-interlace the image yourself libpng provides further
   2332 macros to help that tell you where to place the pixels in the output image.
   2333 Because the interlacing scheme is rectangular - sub-image pixels are always
   2334 arranged on a rectangular grid - all you need to know for each pass is the
   2335 starting column and row in the output image of the first pixel plus the
   2336 spacing between each pixel.  As of libpng 1.5 there are four macros to
   2337 retrieve this information:
   2338 
   2339   png_uint_32 x = PNG_PASS_START_COL(pass);
   2340   png_uint_32 y = PNG_PASS_START_ROW(pass);
   2341   png_uint_32 xStep = 1U << PNG_PASS_COL_SHIFT(pass);
   2342   png_uint_32 yStep = 1U << PNG_PASS_ROW_SHIFT(pass);
   2343 
   2344 These allow you to write the obvious loop:
   2345 
   2346   png_uint_32 input_y = 0;
   2347   png_uint_32 output_y = PNG_PASS_START_ROW(pass);
   2348 
   2349   while (output_y < output_image_height)
   2350   {
   2351      png_uint_32 input_x = 0;
   2352      png_uint_32 output_x = PNG_PASS_START_COL(pass);
   2353 
   2354      while (output_x < output_image_width)
   2355      {
   2356         image[output_y][output_x] =
   2357             subimage[pass][input_y][input_x++];
   2358 
   2359         output_x += xStep;
   2360      }
   2361 
   2362      ++input_y;
   2363      output_y += yStep;
   2364   }
   2365 
   2366 Notice that the steps between successive output rows and columns are
   2367 returned as shifts.  This is possible because the pixels in the subimages
   2368 are always a power of 2 apart - 1, 2, 4 or 8 pixels - in the original
   2369 image.  In practice you may need to directly calculate the output coordinate
   2370 given an input coordinate.  libpng provides two further macros for this
   2371 purpose:
   2372 
   2373   png_uint_32 output_x = PNG_COL_FROM_PASS_COL(input_x, pass);
   2374   png_uint_32 output_y = PNG_ROW_FROM_PASS_ROW(input_y, pass);
   2375 
   2376 Finally a pair of macros are provided to tell you if a particular image
   2377 row or column appears in a given pass:
   2378 
   2379   int col_in_pass = PNG_COL_IN_INTERLACE_PASS(output_x, pass);
   2380   int row_in_pass = PNG_ROW_IN_INTERLACE_PASS(output_y, pass);
   2381 
   2382 Bear in mind that you will probably also need to check the width and height
   2383 of the pass in addition to the above to be sure the pass even exists!
   2384 
   2385 With any luck you are convinced by now that you don't want to do your own
   2386 interlace handling.  In reality normally the only good reason for doing this
   2387 is if you are processing PNG files on a pixel-by-pixel basis and don't want
   2388 to load the whole file into memory when it is interlaced.
   2389 
   2390 libpng includes a test program, pngvalid, that illustrates reading and
   2391 writing of interlaced images.  If you can't get interlacing to work in your
   2392 code and don't want to leave it to libpng (the recommended approach), see
   2393 how pngvalid.c does it.
   2394 
   2395 Finishing a sequential read
   2396 
   2397 After you are finished reading the image through the
   2398 low-level interface, you can finish reading the file.
   2399 
   2400 If you want to use a different crc action for handling CRC errors in
   2401 chunks after the image data, you can call png_set_crc_action()
   2402 again at this point.
   2403 
   2404 If you are interested in comments or time, which may be stored either
   2405 before or after the image data, you should pass the separate png_info
   2406 struct if you want to keep the comments from before and after the image
   2407 separate.
   2408 
   2409    png_infop end_info = png_create_info_struct(png_ptr);
   2410 
   2411    if (!end_info)
   2412    {
   2413       png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
   2414       return ERROR;
   2415    }
   2416 
   2417    png_read_end(png_ptr, end_info);
   2418 
   2419 If you are not interested, you should still call png_read_end()
   2420 but you can pass NULL, avoiding the need to create an end_info structure.
   2421 If you do this, libpng will not process any chunks after IDAT other than
   2422 skipping over them and perhaps (depending on whether you have called
   2423 png_set_crc_action) checking their CRCs while looking for the IEND chunk.
   2424 
   2425   png_read_end(png_ptr, NULL);
   2426 
   2427 If you don't call png_read_end(), then your file pointer will be
   2428 left pointing to the first chunk after the last IDAT, which is probably
   2429 not what you want if you expect to read something beyond the end of
   2430 the PNG datastream.
   2431 
   2432 When you are done, you can free all memory allocated by libpng like this:
   2433 
   2434   png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
   2435 
   2436 or, if you didn't create an end_info structure,
   2437 
   2438   png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
   2439 
   2440 It is also possible to individually free the info_ptr members that
   2441 point to libpng-allocated storage with the following function:
   2442 
   2443    png_free_data(png_ptr, info_ptr, mask, seq)
   2444 
   2445    mask - identifies data to be freed, a mask
   2446           containing the bitwise OR of one or
   2447           more of
   2448             PNG_FREE_PLTE, PNG_FREE_TRNS,
   2449             PNG_FREE_HIST, PNG_FREE_ICCP,
   2450             PNG_FREE_PCAL, PNG_FREE_ROWS,
   2451             PNG_FREE_SCAL, PNG_FREE_SPLT,
   2452             PNG_FREE_TEXT, PNG_FREE_UNKN,
   2453           or simply PNG_FREE_ALL
   2454 
   2455    seq  - sequence number of item to be freed
   2456           (-1 for all items)
   2457 
   2458 This function may be safely called when the relevant storage has
   2459 already been freed, or has not yet been allocated, or was allocated
   2460 by the user and not by libpng,  and will in those cases do nothing.
   2461 The "seq" parameter is ignored if only one item of the selected data
   2462 type, such as PLTE, is allowed.  If "seq" is not -1, and multiple items
   2463 are allowed for the data type identified in the mask, such as text or
   2464 sPLT, only the n'th item in the structure is freed, where n is "seq".
   2465 
   2466 The default behavior is only to free data that was allocated internally
   2467 by libpng.  This can be changed, so that libpng will not free the data,
   2468 or so that it will free data that was allocated by the user with png_malloc()
   2469 or png_calloc() and passed in via a png_set_*() function, with
   2470 
   2471    png_data_freer(png_ptr, info_ptr, freer, mask)
   2472 
   2473    freer  - one of
   2474               PNG_DESTROY_WILL_FREE_DATA
   2475               PNG_SET_WILL_FREE_DATA
   2476               PNG_USER_WILL_FREE_DATA
   2477 
   2478    mask   - which data elements are affected
   2479             same choices as in png_free_data()
   2480 
   2481 This function only affects data that has already been allocated.
   2482 You can call this function after reading the PNG data but before calling
   2483 any png_set_*() functions, to control whether the user or the png_set_*()
   2484 function is responsible for freeing any existing data that might be present,
   2485 and again after the png_set_*() functions to control whether the user
   2486 or png_destroy_*() is supposed to free the data.  When the user assumes
   2487 responsibility for libpng-allocated data, the application must use
   2488 png_free() to free it, and when the user transfers responsibility to libpng
   2489 for data that the user has allocated, the user must have used png_malloc()
   2490 or png_calloc() to allocate it.
   2491 
   2492 If you allocated your row_pointers in a single block, as suggested above in
   2493 the description of the high level read interface, you must not transfer
   2494 responsibility for freeing it to the png_set_rows or png_read_destroy function,
   2495 because they would also try to free the individual row_pointers[i].
   2496 
   2497 If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword
   2498 separately, do not transfer responsibility for freeing text_ptr to libpng,
   2499 because when libpng fills a png_text structure it combines these members with
   2500 the key member, and png_free_data() will free only text_ptr.key.  Similarly,
   2501 if you transfer responsibility for free'ing text_ptr from libpng to your
   2502 application, your application must not separately free those members.
   2503 
   2504 The png_free_data() function will turn off the "valid" flag for anything
   2505 it frees.  If you need to turn the flag off for a chunk that was freed by
   2506 your application instead of by libpng, you can use
   2507 
   2508    png_set_invalid(png_ptr, info_ptr, mask);
   2509 
   2510    mask - identifies the chunks to be made invalid,
   2511           containing the bitwise OR of one or
   2512           more of
   2513             PNG_INFO_gAMA, PNG_INFO_sBIT,
   2514             PNG_INFO_cHRM, PNG_INFO_PLTE,
   2515             PNG_INFO_tRNS, PNG_INFO_bKGD,
   2516             PNG_INFO_eXIf,
   2517             PNG_INFO_hIST, PNG_INFO_pHYs,
   2518             PNG_INFO_oFFs, PNG_INFO_tIME,
   2519             PNG_INFO_pCAL, PNG_INFO_sRGB,
   2520             PNG_INFO_iCCP, PNG_INFO_sPLT,
   2521             PNG_INFO_sCAL, PNG_INFO_IDAT
   2522 
   2523 For a more compact example of reading a PNG image, see the file example.c.
   2524 
   2525 Reading PNG files progressively
   2526 
   2527 The progressive reader is slightly different from the non-progressive
   2528 reader.  Instead of calling png_read_info(), png_read_rows(), and
   2529 png_read_end(), you make one call to png_process_data(), which calls
   2530 callbacks when it has the info, a row, or the end of the image.  You
   2531 set up these callbacks with png_set_progressive_read_fn().  You don't
   2532 have to worry about the input/output functions of libpng, as you are
   2533 giving the library the data directly in png_process_data().  I will
   2534 assume that you have read the section on reading PNG files above,
   2535 so I will only highlight the differences (although I will show
   2536 all of the code).
   2537 
   2538 png_structp png_ptr;
   2539 png_infop info_ptr;
   2540 
   2541 /*  An example code fragment of how you would
   2542     initialize the progressive reader in your
   2543     application. */
   2544 int
   2545 initialize_png_reader()
   2546 {
   2547    png_ptr = png_create_read_struct
   2548        (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
   2549         user_error_fn, user_warning_fn);
   2550 
   2551    if (!png_ptr)
   2552        return ERROR;
   2553 
   2554    info_ptr = png_create_info_struct(png_ptr);
   2555 
   2556    if (!info_ptr)
   2557    {
   2558       png_destroy_read_struct(&png_ptr, NULL, NULL);
   2559       return ERROR;
   2560    }
   2561 
   2562    if (setjmp(png_jmpbuf(png_ptr)))
   2563    {
   2564       png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
   2565       return ERROR;
   2566    }
   2567 
   2568    /* This one's new.  You can provide functions
   2569       to be called when the header info is valid,
   2570       when each row is completed, and when the image
   2571       is finished.  If you aren't using all functions,
   2572       you can specify NULL parameters.  Even when all
   2573       three functions are NULL, you need to call
   2574       png_set_progressive_read_fn().  You can use
   2575       any struct as the user_ptr (cast to a void pointer
   2576       for the function call), and retrieve the pointer
   2577       from inside the callbacks using the function
   2578 
   2579          png_get_progressive_ptr(png_ptr);
   2580 
   2581       which will return a void pointer, which you have
   2582       to cast appropriately.
   2583     */
   2584    png_set_progressive_read_fn(png_ptr, (void *)user_ptr,
   2585        info_callback, row_callback, end_callback);
   2586 
   2587    return 0;
   2588 }
   2589 
   2590 /* A code fragment that you call as you receive blocks
   2591   of data */
   2592 int
   2593 process_data(png_bytep buffer, png_uint_32 length)
   2594 {
   2595    if (setjmp(png_jmpbuf(png_ptr)))
   2596    {
   2597       png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
   2598       return ERROR;
   2599    }
   2600 
   2601    /* This one's new also.  Simply give it a chunk
   2602       of data from the file stream (in order, of
   2603       course).  On machines with segmented memory
   2604       models machines, don't give it any more than
   2605       64K.  The library seems to run fine with sizes
   2606       of 4K. Although you can give it much less if
   2607       necessary (I assume you can give it chunks of
   2608       1 byte, I haven't tried less than 256 bytes
   2609       yet).  When this function returns, you may
   2610       want to display any rows that were generated
   2611       in the row callback if you don't already do
   2612       so there.
   2613     */
   2614    png_process_data(png_ptr, info_ptr, buffer, length);
   2615 
   2616    /* At this point you can call png_process_data_skip if
   2617       you want to handle data the library will skip yourself;
   2618       it simply returns the number of bytes to skip (and stops
   2619       libpng skipping that number of bytes on the next
   2620       png_process_data call).
   2621    return 0;
   2622 }
   2623 
   2624 /* This function is called (as set by
   2625    png_set_progressive_read_fn() above) when enough data
   2626    has been supplied so all of the header has been
   2627    read.
   2628 */
   2629 void
   2630 info_callback(png_structp png_ptr, png_infop info)
   2631 {
   2632    /* Do any setup here, including setting any of
   2633       the transformations mentioned in the Reading
   2634       PNG files section.  For now, you _must_ call
   2635       either png_start_read_image() or
   2636       png_read_update_info() after all the
   2637       transformations are set (even if you don't set
   2638       any).  You may start getting rows before
   2639       png_process_data() returns, so this is your
   2640       last chance to prepare for that.
   2641 
   2642       This is where you turn on interlace handling,
   2643       assuming you don't want to do it yourself.
   2644 
   2645       If you need to you can stop the processing of
   2646       your original input data at this point by calling
   2647       png_process_data_pause.  This returns the number
   2648       of unprocessed bytes from the last png_process_data
   2649       call - it is up to you to ensure that the next call
   2650       sees these bytes again.  If you don't want to bother
   2651       with this you can get libpng to cache the unread
   2652       bytes by setting the 'save' parameter (see png.h) but
   2653       then libpng will have to copy the data internally.
   2654     */
   2655 }
   2656 
   2657 /* This function is called when each row of image
   2658    data is complete */
   2659 void
   2660 row_callback(png_structp png_ptr, png_bytep new_row,
   2661    png_uint_32 row_num, int pass)
   2662 {
   2663    /* If the image is interlaced, and you turned
   2664       on the interlace handler, this function will
   2665       be called for every row in every pass.  Some
   2666       of these rows will not be changed from the
   2667       previous pass.  When the row is not changed,
   2668       the new_row variable will be NULL.  The rows
   2669       and passes are called in order, so you don't
   2670       really need the row_num and pass, but I'm
   2671       supplying them because it may make your life
   2672       easier.
   2673 
   2674       If you did not turn on interlace handling then
   2675       the callback is called for each row of each
   2676       sub-image when the image is interlaced.  In this
   2677       case 'row_num' is the row in the sub-image, not
   2678       the row in the output image as it is in all other
   2679       cases.
   2680 
   2681       For the non-NULL rows of interlaced images when
   2682       you have switched on libpng interlace handling,
   2683       you must call png_progressive_combine_row()
   2684       passing in the row and the old row.  You can
   2685       call this function for NULL rows (it will just
   2686       return) and for non-interlaced images (it just
   2687       does the memcpy for you) if it will make the
   2688       code easier.  Thus, you can just do this for
   2689       all cases if you switch on interlace handling;
   2690     */
   2691 
   2692        png_progressive_combine_row(png_ptr, old_row,
   2693          new_row);
   2694 
   2695    /* where old_row is what was displayed
   2696       previously for the row.  Note that the first
   2697       pass (pass == 0, really) will completely cover
   2698       the old row, so the rows do not have to be
   2699       initialized.  After the first pass (and only
   2700       for interlaced images), you will have to pass
   2701       the current row, and the function will combine
   2702       the old row and the new row.
   2703 
   2704       You can also call png_process_data_pause in this
   2705       callback - see above.
   2706    */
   2707 }
   2708 
   2709 void
   2710 end_callback(png_structp png_ptr, png_infop info)
   2711 {
   2712    /* This function is called after the whole image
   2713       has been read, including any chunks after the
   2714       image (up to and including the IEND).  You
   2715       will usually have the same info chunk as you
   2716       had in the header, although some data may have
   2717       been added to the comments and time fields.
   2718 
   2719       Most people won't do much here, perhaps setting
   2720       a flag that marks the image as finished.
   2721     */
   2722 }
   2723 
   2724 
   2725 
   2726 IV. Writing
   2727 
   2728 Much of this is very similar to reading.  However, everything of
   2729 importance is repeated here, so you won't have to constantly look
   2730 back up in the reading section to understand writing.
   2731 
   2732 Setup
   2733 
   2734 You will want to do the I/O initialization before you get into libpng,
   2735 so if it doesn't work, you don't have anything to undo. If you are not
   2736 using the standard I/O functions, you will need to replace them with
   2737 custom writing functions.  See the discussion under Customizing libpng.
   2738 
   2739    FILE *fp = fopen(file_name, "wb");
   2740 
   2741    if (!fp)
   2742       return ERROR;
   2743 
   2744 Next, png_struct and png_info need to be allocated and initialized.
   2745 As these can be both relatively large, you may not want to store these
   2746 on the stack, unless you have stack space to spare.  Of course, you
   2747 will want to check if they return NULL.  If you are also reading,
   2748 you won't want to name your read structure and your write structure
   2749 both "png_ptr"; you can call them anything you like, such as
   2750 "read_ptr" and "write_ptr".  Look at pngtest.c, for example.
   2751 
   2752    png_structp png_ptr = png_create_write_struct
   2753       (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
   2754        user_error_fn, user_warning_fn);
   2755 
   2756    if (!png_ptr)
   2757       return ERROR;
   2758 
   2759    png_infop info_ptr = png_create_info_struct(png_ptr);
   2760    if (!info_ptr)
   2761    {
   2762       png_destroy_write_struct(&png_ptr, NULL);
   2763       return ERROR;
   2764    }
   2765 
   2766 If you want to use your own memory allocation routines,
   2767 define PNG_USER_MEM_SUPPORTED and use
   2768 png_create_write_struct_2() instead of png_create_write_struct():
   2769 
   2770    png_structp png_ptr = png_create_write_struct_2
   2771       (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
   2772        user_error_fn, user_warning_fn, (png_voidp)
   2773        user_mem_ptr, user_malloc_fn, user_free_fn);
   2774 
   2775 After you have these structures, you will need to set up the
   2776 error handling.  When libpng encounters an error, it expects to
   2777 longjmp() back to your routine.  Therefore, you will need to call
   2778 setjmp() and pass the png_jmpbuf(png_ptr).  If you
   2779 write the file from different routines, you will need to update
   2780 the png_jmpbuf(png_ptr) every time you enter a new routine that will
   2781 call a png_*() function.  See your documentation of setjmp/longjmp
   2782 for your compiler for more information on setjmp/longjmp.  See
   2783 the discussion on libpng error handling in the Customizing Libpng
   2784 section below for more information on the libpng error handling.
   2785 
   2786    if (setjmp(png_jmpbuf(png_ptr)))
   2787    {
   2788       png_destroy_write_struct(&png_ptr, &info_ptr);
   2789       fclose(fp);
   2790       return ERROR;
   2791    }
   2792    ...
   2793    return;
   2794 
   2795 If you would rather avoid the complexity of setjmp/longjmp issues,
   2796 you can compile libpng with PNG_NO_SETJMP, in which case
   2797 errors will result in a call to PNG_ABORT() which defaults to abort().
   2798 
   2799 You can #define PNG_ABORT() to a function that does something
   2800 more useful than abort(), as long as your function does not
   2801 return.
   2802 
   2803 Checking for invalid palette index on write was added at libpng
   2804 1.5.10.  If a pixel contains an invalid (out-of-range) index libpng issues
   2805 a benign error.  This is enabled by default because this condition is an
   2806 error according to the PNG specification, Clause 11.3.2, but the error can
   2807 be ignored in each png_ptr with
   2808 
   2809   png_set_check_for_invalid_index(png_ptr, 0);
   2810 
   2811 If the error is ignored, or if png_benign_error() treats it as a warning,
   2812 any invalid pixels are written as-is by the encoder, resulting in an
   2813 invalid PNG datastream as output.  In this case the application is
   2814 responsible for ensuring that the pixel indexes are in range when it writes
   2815 a PLTE chunk with fewer entries than the bit depth would allow.
   2816 
   2817 Now you need to set up the output code.  The default for libpng is to
   2818 use the C function fwrite().  If you use this, you will need to pass a
   2819 valid FILE * in the function png_init_io().  Be sure that the file is
   2820 opened in binary mode.  Again, if you wish to handle writing data in
   2821 another way, see the discussion on libpng I/O handling in the Customizing
   2822 Libpng section below.
   2823 
   2824    png_init_io(png_ptr, fp);
   2825 
   2826 If you are embedding your PNG into a datastream such as MNG, and don't
   2827 want libpng to write the 8-byte signature, or if you have already
   2828 written the signature in your application, use
   2829 
   2830    png_set_sig_bytes(png_ptr, 8);
   2831 
   2832 to inform libpng that it should not write a signature.
   2833 
   2834 Write callbacks
   2835 
   2836 At this point, you can set up a callback function that will be
   2837 called after each row has been written, which you can use to control
   2838 a progress meter or the like.  It's demonstrated in pngtest.c.
   2839 You must supply a function
   2840 
   2841    void write_row_callback(png_structp png_ptr, png_uint_32 row,
   2842       int pass)
   2843    {
   2844       /* put your code here */
   2845    }
   2846 
   2847 (You can give it another name that you like instead of "write_row_callback")
   2848 
   2849 To inform libpng about your function, use
   2850 
   2851    png_set_write_status_fn(png_ptr, write_row_callback);
   2852 
   2853 When this function is called the row has already been completely processed and
   2854 it has also been written out.  The 'row' and 'pass' refer to the next row to be
   2855 handled.  For the
   2856 non-interlaced case the row that was just handled is simply one less than the
   2857 passed in row number, and pass will always be 0.  For the interlaced case the
   2858 same applies unless the row value is 0, in which case the row just handled was
   2859 the last one from one of the preceding passes.  Because interlacing may skip a
   2860 pass you cannot be sure that the preceding pass is just 'pass-1', if you really
   2861 need to know what the last pass is record (row,pass) from the callback and use
   2862 the last recorded value each time.
   2863 
   2864 As with the user transform you can find the output row using the
   2865 PNG_ROW_FROM_PASS_ROW macro.
   2866 
   2867 You now have the option of modifying how the compression library will
   2868 run.  The following functions are mainly for testing, but may be useful
   2869 in some cases, like if you need to write PNG files extremely fast and
   2870 are willing to give up some compression, or if you want to get the
   2871 maximum possible compression at the expense of slower writing.  If you
   2872 have no special needs in this area, let the library do what it wants by
   2873 not calling this function at all, as it has been tuned to deliver a good
   2874 speed/compression ratio. The second parameter to png_set_filter() is
   2875 the filter method, for which the only valid values are 0 (as of the
   2876 July 1999 PNG specification, version 1.2) or 64 (if you are writing
   2877 a PNG datastream that is to be embedded in a MNG datastream).  The third
   2878 parameter is a flag that indicates which filter type(s) are to be tested
   2879 for each scanline.  See the PNG specification for details on the specific
   2880 filter types.
   2881 
   2882 
   2883    /* turn on or off filtering, and/or choose
   2884       specific filters.  You can use either a single
   2885       PNG_FILTER_VALUE_NAME or the bitwise OR of one
   2886       or more PNG_FILTER_NAME masks.
   2887     */
   2888    png_set_filter(png_ptr, 0,
   2889       PNG_FILTER_NONE  | PNG_FILTER_VALUE_NONE |
   2890       PNG_FILTER_SUB   | PNG_FILTER_VALUE_SUB  |
   2891       PNG_FILTER_UP    | PNG_FILTER_VALUE_UP   |
   2892       PNG_FILTER_AVG   | PNG_FILTER_VALUE_AVG  |
   2893       PNG_FILTER_PAETH | PNG_FILTER_VALUE_PAETH|
   2894       PNG_ALL_FILTERS  | PNG_FAST_FILTERS);
   2895 
   2896 If an application wants to start and stop using particular filters during
   2897 compression, it should start out with all of the filters (to ensure that
   2898 the previous row of pixels will be stored in case it's needed later),
   2899 and then add and remove them after the start of compression.
   2900 
   2901 If you are writing a PNG datastream that is to be embedded in a MNG
   2902 datastream, the second parameter can be either 0 or 64.
   2903 
   2904 The png_set_compression_*() functions interface to the zlib compression
   2905 library, and should mostly be ignored unless you really know what you are
   2906 doing.  The only generally useful call is png_set_compression_level()
   2907 which changes how much time zlib spends on trying to compress the image
   2908 data.  See the Compression Library (zlib.h and algorithm.txt, distributed
   2909 with zlib) for details on the compression levels.
   2910 
   2911    #include zlib.h
   2912 
   2913    /* Set the zlib compression level */
   2914    png_set_compression_level(png_ptr,
   2915        Z_BEST_COMPRESSION);
   2916 
   2917    /* Set other zlib parameters for compressing IDAT */
   2918    png_set_compression_mem_level(png_ptr, 8);
   2919    png_set_compression_strategy(png_ptr,
   2920        Z_DEFAULT_STRATEGY);
   2921    png_set_compression_window_bits(png_ptr, 15);
   2922    png_set_compression_method(png_ptr, 8);
   2923    png_set_compression_buffer_size(png_ptr, 8192)
   2924 
   2925    /* Set zlib parameters for text compression
   2926     * If you don't call these, the parameters
   2927     * fall back on those defined for IDAT chunks
   2928     */
   2929    png_set_text_compression_mem_level(png_ptr, 8);
   2930    png_set_text_compression_strategy(png_ptr,
   2931        Z_DEFAULT_STRATEGY);
   2932    png_set_text_compression_window_bits(png_ptr, 15);
   2933    png_set_text_compression_method(png_ptr, 8);
   2934 
   2935 Setting the contents of info for output
   2936 
   2937 You now need to fill in the png_info structure with all the data you
   2938 wish to write before the actual image.  Note that the only thing you
   2939 are allowed to write after the image is the text chunks and the time
   2940 chunk (as of PNG Specification 1.2, anyway).  See png_write_end() and
   2941 the latest PNG specification for more information on that.  If you
   2942 wish to write them before the image, fill them in now, and flag that
   2943 data as being valid.  If you want to wait until after the data, don't
   2944 fill them until png_write_end().  For all the fields in png_info and
   2945 their data types, see png.h.  For explanations of what the fields
   2946 contain, see the PNG specification.
   2947 
   2948 Some of the more important parts of the png_info are:
   2949 
   2950    png_set_IHDR(png_ptr, info_ptr, width, height,
   2951       bit_depth, color_type, interlace_type,
   2952       compression_type, filter_method)
   2953 
   2954    width          - holds the width of the image
   2955                     in pixels (up to 2^31).
   2956 
   2957    height         - holds the height of the image
   2958                     in pixels (up to 2^31).
   2959 
   2960    bit_depth      - holds the bit depth of one of the
   2961                     image channels.
   2962                     (valid values are 1, 2, 4, 8, 16
   2963                     and depend also on the
   2964                     color_type.  See also significant
   2965                     bits (sBIT) below).
   2966 
   2967    color_type     - describes which color/alpha
   2968                     channels are present.
   2969                     PNG_COLOR_TYPE_GRAY
   2970                        (bit depths 1, 2, 4, 8, 16)
   2971                     PNG_COLOR_TYPE_GRAY_ALPHA
   2972                        (bit depths 8, 16)
   2973                     PNG_COLOR_TYPE_PALETTE
   2974                        (bit depths 1, 2, 4, 8)
   2975                     PNG_COLOR_TYPE_RGB
   2976                        (bit_depths 8, 16)
   2977                     PNG_COLOR_TYPE_RGB_ALPHA
   2978                        (bit_depths 8, 16)
   2979 
   2980                     PNG_COLOR_MASK_PALETTE
   2981                     PNG_COLOR_MASK_COLOR
   2982                     PNG_COLOR_MASK_ALPHA
   2983 
   2984    interlace_type - PNG_INTERLACE_NONE or
   2985                     PNG_INTERLACE_ADAM7
   2986 
   2987    compression_type - (must be
   2988                     PNG_COMPRESSION_TYPE_DEFAULT)
   2989 
   2990    filter_method  - (must be PNG_FILTER_TYPE_DEFAULT
   2991                     or, if you are writing a PNG to
   2992                     be embedded in a MNG datastream,
   2993                     can also be
   2994                     PNG_INTRAPIXEL_DIFFERENCING)
   2995 
   2996 If you call png_set_IHDR(), the call must appear before any of the
   2997 other png_set_*() functions, because they might require access to some of
   2998 the IHDR settings.  The remaining png_set_*() functions can be called
   2999 in any order.
   3000 
   3001 If you wish, you can reset the compression_type, interlace_type, or
   3002 filter_method later by calling png_set_IHDR() again; if you do this, the
   3003 width, height, bit_depth, and color_type must be the same in each call.
   3004 
   3005    png_set_PLTE(png_ptr, info_ptr, palette,
   3006       num_palette);
   3007 
   3008    palette        - the palette for the file
   3009                     (array of png_color)
   3010    num_palette    - number of entries in the palette
   3011 
   3012 
   3013    png_set_gAMA(png_ptr, info_ptr, file_gamma);
   3014    png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma);
   3015 
   3016    file_gamma     - the gamma at which the image was
   3017                     created (PNG_INFO_gAMA)
   3018 
   3019    int_file_gamma - 100,000 times the gamma at which
   3020                     the image was created
   3021 
   3022    png_set_cHRM(png_ptr, info_ptr,  white_x, white_y, red_x, red_y,
   3023                     green_x, green_y, blue_x, blue_y)
   3024    png_set_cHRM_XYZ(png_ptr, info_ptr, red_X, red_Y, red_Z, green_X,
   3025                     green_Y, green_Z, blue_X, blue_Y, blue_Z)
   3026    png_set_cHRM_fixed(png_ptr, info_ptr, int_white_x, int_white_y,
   3027                     int_red_x, int_red_y, int_green_x, int_green_y,
   3028                     int_blue_x, int_blue_y)
   3029    png_set_cHRM_XYZ_fixed(png_ptr, info_ptr, int_red_X, int_red_Y,
   3030                     int_red_Z, int_green_X, int_green_Y, int_green_Z,
   3031                     int_blue_X, int_blue_Y, int_blue_Z)
   3032 
   3033    {white,red,green,blue}_{x,y}
   3034                     A color space encoding specified using the chromaticities
   3035                     of the end points and the white point.
   3036 
   3037    {red,green,blue}_{X,Y,Z}
   3038                     A color space encoding specified using the encoding end
   3039                     points - the CIE tristimulus specification of the intended
   3040                     color of the red, green and blue channels in the PNG RGB
   3041                     data.  The white point is simply the sum of the three end
   3042                     points.
   3043 
   3044    png_set_sRGB(png_ptr, info_ptr, srgb_intent);
   3045 
   3046    srgb_intent    - the rendering intent
   3047                     (PNG_INFO_sRGB) The presence of
   3048                     the sRGB chunk means that the pixel
   3049                     data is in the sRGB color space.
   3050                     This chunk also implies specific
   3051                     values of gAMA and cHRM.  Rendering
   3052                     intent is the CSS-1 property that
   3053                     has been defined by the International
   3054                     Color Consortium
   3055                     (http://www.color.org).
   3056                     It can be one of
   3057                     PNG_sRGB_INTENT_SATURATION,
   3058                     PNG_sRGB_INTENT_PERCEPTUAL,
   3059                     PNG_sRGB_INTENT_ABSOLUTE, or
   3060                     PNG_sRGB_INTENT_RELATIVE.
   3061 
   3062 
   3063    png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr,
   3064       srgb_intent);
   3065 
   3066    srgb_intent    - the rendering intent
   3067                     (PNG_INFO_sRGB) The presence of the
   3068                     sRGB chunk means that the pixel
   3069                     data is in the sRGB color space.
   3070                     This function also causes gAMA and
   3071                     cHRM chunks with the specific values
   3072                     that are consistent with sRGB to be
   3073                     written.
   3074 
   3075    png_set_iCCP(png_ptr, info_ptr, name, compression_type,
   3076                       profile, proflen);
   3077 
   3078    name             - The profile name.
   3079 
   3080    compression_type - The compression type; always
   3081                       PNG_COMPRESSION_TYPE_BASE for PNG 1.0.
   3082                       You may give NULL to this argument to
   3083                       ignore it.
   3084 
   3085    profile          - International Color Consortium color
   3086                       profile data. May contain NULs.
   3087 
   3088    proflen          - length of profile data in bytes.
   3089 
   3090    png_set_sBIT(png_ptr, info_ptr, sig_bit);
   3091 
   3092    sig_bit        - the number of significant bits for
   3093                     (PNG_INFO_sBIT) each of the gray, red,
   3094                     green, and blue channels, whichever are
   3095                     appropriate for the given color type
   3096                     (png_color_16)
   3097 
   3098    png_set_tRNS(png_ptr, info_ptr, trans_alpha,
   3099       num_trans, trans_color);
   3100 
   3101    trans_alpha    - array of alpha (transparency)
   3102                     entries for palette (PNG_INFO_tRNS)
   3103 
   3104    num_trans      - number of transparent entries
   3105                     (PNG_INFO_tRNS)
   3106 
   3107    trans_color    - graylevel or color sample values
   3108                     (in order red, green, blue) of the
   3109                     single transparent color for
   3110                     non-paletted images (PNG_INFO_tRNS)
   3111 
   3112    png_set_eXIf_1(png_ptr, info_ptr, num_exif, exif);
   3113 
   3114    exif           - Exif profile (array of png_byte)
   3115                     (PNG_INFO_eXIf)
   3116 
   3117    png_set_hIST(png_ptr, info_ptr, hist);
   3118 
   3119    hist           - histogram of palette (array of
   3120                     png_uint_16) (PNG_INFO_hIST)
   3121 
   3122    png_set_tIME(png_ptr, info_ptr, mod_time);
   3123 
   3124    mod_time       - time image was last modified
   3125                     (PNG_INFO_tIME)
   3126 
   3127    png_set_bKGD(png_ptr, info_ptr, background);
   3128 
   3129    background     - background color (of type
   3130                     png_color_16p) (PNG_INFO_bKGD)
   3131 
   3132    png_set_text(png_ptr, info_ptr, text_ptr, num_text);
   3133 
   3134    text_ptr       - array of png_text holding image
   3135                     comments
   3136 
   3137    text_ptr[i].compression - type of compression used
   3138                 on "text" PNG_TEXT_COMPRESSION_NONE
   3139                           PNG_TEXT_COMPRESSION_zTXt
   3140                           PNG_ITXT_COMPRESSION_NONE
   3141                           PNG_ITXT_COMPRESSION_zTXt
   3142    text_ptr[i].key   - keyword for comment.  Must contain
   3143                 1-79 characters.
   3144    text_ptr[i].text  - text comments for current
   3145                         keyword.  Can be NULL or empty.
   3146    text_ptr[i].text_length - length of text string,
   3147                 after decompression, 0 for iTXt
   3148    text_ptr[i].itxt_length - length of itxt string,
   3149                 after decompression, 0 for tEXt/zTXt
   3150    text_ptr[i].lang  - language of comment (NULL or
   3151                         empty for unknown).
   3152    text_ptr[i].translated_keyword  - keyword in UTF-8 (NULL
   3153                         or empty for unknown).
   3154 
   3155    Note that the itxt_length, lang, and lang_key
   3156    members of the text_ptr structure only exist when the
   3157    library is built with iTXt chunk support.  Prior to
   3158    libpng-1.4.0 the library was built by default without
   3159    iTXt support. Also note that when iTXt is supported,
   3160    they contain NULL pointers when the "compression"
   3161    field contains PNG_TEXT_COMPRESSION_NONE or
   3162    PNG_TEXT_COMPRESSION_zTXt.
   3163 
   3164    num_text       - number of comments
   3165 
   3166    png_set_sPLT(png_ptr, info_ptr, &palette_ptr,
   3167       num_spalettes);
   3168 
   3169    palette_ptr    - array of png_sPLT_struct structures
   3170                     to be added to the list of palettes
   3171                     in the info structure.
   3172    num_spalettes  - number of palette structures to be
   3173                     added.
   3174 
   3175    png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y,
   3176        unit_type);
   3177 
   3178    offset_x  - positive offset from the left
   3179                     edge of the screen
   3180 
   3181    offset_y  - positive offset from the top
   3182                     edge of the screen
   3183 
   3184    unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER
   3185 
   3186    png_set_pHYs(png_ptr, info_ptr, res_x, res_y,
   3187        unit_type);
   3188 
   3189    res_x       - pixels/unit physical resolution
   3190                  in x direction
   3191 
   3192    res_y       - pixels/unit physical resolution
   3193                  in y direction
   3194 
   3195    unit_type   - PNG_RESOLUTION_UNKNOWN,
   3196                  PNG_RESOLUTION_METER
   3197 
   3198    png_set_sCAL(png_ptr, info_ptr, unit, width, height)
   3199 
   3200    unit        - physical scale units (an integer)
   3201 
   3202    width       - width of a pixel in physical scale units
   3203 
   3204    height      - height of a pixel in physical scale units
   3205                  (width and height are doubles)
   3206 
   3207    png_set_sCAL_s(png_ptr, info_ptr, unit, width, height)
   3208 
   3209    unit        - physical scale units (an integer)
   3210 
   3211    width       - width of a pixel in physical scale units
   3212                  expressed as a string
   3213 
   3214    height      - height of a pixel in physical scale units
   3215                 (width and height are strings like "2.54")
   3216 
   3217    png_set_unknown_chunks(png_ptr, info_ptr, &unknowns,
   3218       num_unknowns)
   3219 
   3220    unknowns          - array of png_unknown_chunk
   3221                        structures holding unknown chunks
   3222    unknowns[i].name  - name of unknown chunk
   3223    unknowns[i].data  - data of unknown chunk
   3224    unknowns[i].size  - size of unknown chunk's data
   3225    unknowns[i].location - position to write chunk in file
   3226                           0: do not write chunk
   3227                           PNG_HAVE_IHDR: before PLTE
   3228                           PNG_HAVE_PLTE: before IDAT
   3229                           PNG_AFTER_IDAT: after IDAT
   3230 
   3231 The "location" member is set automatically according to
   3232 what part of the output file has already been written.
   3233 You can change its value after calling png_set_unknown_chunks()
   3234 as demonstrated in pngtest.c.  Within each of the "locations",
   3235 the chunks are sequenced according to their position in the
   3236 structure (that is, the value of "i", which is the order in which
   3237 the chunk was either read from the input file or defined with
   3238 png_set_unknown_chunks).
   3239 
   3240 A quick word about text and num_text.  text is an array of png_text
   3241 structures.  num_text is the number of valid structures in the array.
   3242 Each png_text structure holds a language code, a keyword, a text value,
   3243 and a compression type.
   3244 
   3245 The compression types have the same valid numbers as the compression
   3246 types of the image data.  Currently, the only valid number is zero.
   3247 However, you can store text either compressed or uncompressed, unlike
   3248 images, which always have to be compressed.  So if you don't want the
   3249 text compressed, set the compression type to PNG_TEXT_COMPRESSION_NONE.
   3250 Because tEXt and zTXt chunks don't have a language field, if you
   3251 specify PNG_TEXT_COMPRESSION_NONE or PNG_TEXT_COMPRESSION_zTXt
   3252 any language code or translated keyword will not be written out.
   3253 
   3254 Until text gets around a few hundred bytes, it is not worth compressing it.
   3255 After the text has been written out to the file, the compression type
   3256 is set to PNG_TEXT_COMPRESSION_NONE_WR or PNG_TEXT_COMPRESSION_zTXt_WR,
   3257 so that it isn't written out again at the end (in case you are calling
   3258 png_write_end() with the same struct).
   3259 
   3260 The keywords that are given in the PNG Specification are:
   3261 
   3262    Title            Short (one line) title or
   3263                     caption for image
   3264 
   3265    Author           Name of image's creator
   3266 
   3267    Description      Description of image (possibly long)
   3268 
   3269    Copyright        Copyright notice
   3270 
   3271    Creation Time    Time of original image creation
   3272                     (usually RFC 1123 format, see below)
   3273 
   3274    Software         Software used to create the image
   3275 
   3276    Disclaimer       Legal disclaimer
   3277 
   3278    Warning          Warning of nature of content
   3279 
   3280    Source           Device used to create the image
   3281 
   3282    Comment          Miscellaneous comment; conversion
   3283                     from other image format
   3284 
   3285 The keyword-text pairs work like this.  Keywords should be short
   3286 simple descriptions of what the comment is about.  Some typical
   3287 keywords are found in the PNG specification, as is some recommendations
   3288 on keywords.  You can repeat keywords in a file.  You can even write
   3289 some text before the image and some after.  For example, you may want
   3290 to put a description of the image before the image, but leave the
   3291 disclaimer until after, so viewers working over modem connections
   3292 don't have to wait for the disclaimer to go over the modem before
   3293 they start seeing the image.  Finally, keywords should be full
   3294 words, not abbreviations.  Keywords and text are in the ISO 8859-1
   3295 (Latin-1) character set (a superset of regular ASCII) and can not
   3296 contain NUL characters, and should not contain control or other
   3297 unprintable characters.  To make the comments widely readable, stick
   3298 with basic ASCII, and avoid machine specific character set extensions
   3299 like the IBM-PC character set.  The keyword must be present, but
   3300 you can leave off the text string on non-compressed pairs.
   3301 Compressed pairs must have a text string, as only the text string
   3302 is compressed anyway, so the compression would be meaningless.
   3303 
   3304 PNG supports modification time via the png_time structure.  Two
   3305 conversion routines are provided, png_convert_from_time_t() for
   3306 time_t and png_convert_from_struct_tm() for struct tm.  The
   3307 time_t routine uses gmtime().  You don't have to use either of
   3308 these, but if you wish to fill in the png_time structure directly,
   3309 you should provide the time in universal time (GMT) if possible
   3310 instead of your local time.  Note that the year number is the full
   3311 year (e.g. 1998, rather than 98 - PNG is year 2000 compliant!), and
   3312 that months start with 1.
   3313 
   3314 If you want to store the time of the original image creation, you should
   3315 use a plain tEXt chunk with the "Creation Time" keyword.  This is
   3316 necessary because the "creation time" of a PNG image is somewhat vague,
   3317 depending on whether you mean the PNG file, the time the image was
   3318 created in a non-PNG format, a still photo from which the image was
   3319 scanned, or possibly the subject matter itself.  In order to facilitate
   3320 machine-readable dates, it is recommended that the "Creation Time"
   3321 tEXt chunk use RFC 1123 format dates (e.g. "22 May 1997 18:07:10 GMT"),
   3322 although this isn't a requirement.  Unlike the tIME chunk, the
   3323 "Creation Time" tEXt chunk is not expected to be automatically changed
   3324 by the software.  To facilitate the use of RFC 1123 dates, a function
   3325 png_convert_to_rfc1123_buffer(buffer, png_timep) is provided to
   3326 convert from PNG time to an RFC 1123 format string.  The caller must provide
   3327 a writeable buffer of at least 29 bytes.
   3328 
   3329 Writing unknown chunks
   3330 
   3331 You can use the png_set_unknown_chunks function to queue up private chunks
   3332 for writing.  You give it a chunk name, location, raw data, and a size.  You
   3333 also must use png_set_keep_unknown_chunks() to ensure that libpng will
   3334 handle them.  That's all there is to it.  The chunks will be written by the
   3335 next following png_write_info_before_PLTE, png_write_info, or png_write_end
   3336 function, depending upon the specified location.  Any chunks previously
   3337 read into the info structure's unknown-chunk list will also be written out
   3338 in a sequence that satisfies the PNG specification's ordering rules.
   3339 
   3340 Here is an example of writing two private chunks, prVt and miNE:
   3341 
   3342    #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
   3343    /* Set unknown chunk data */
   3344    png_unknown_chunk unk_chunk[2];
   3345    strcpy((char *) unk_chunk[0].name, "prVt";
   3346    unk_chunk[0].data = (unsigned char *) "PRIVATE DATA";
   3347    unk_chunk[0].size = strlen(unk_chunk[0].data)+1;
   3348    unk_chunk[0].location = PNG_HAVE_IHDR;
   3349    strcpy((char *) unk_chunk[1].name, "miNE";
   3350    unk_chunk[1].data = (unsigned char *) "MY CHUNK DATA";
   3351    unk_chunk[1].size = strlen(unk_chunk[0].data)+1;
   3352    unk_chunk[1].location = PNG_AFTER_IDAT;
   3353    png_set_unknown_chunks(write_ptr, write_info_ptr,
   3354        unk_chunk, 2);
   3355    /* Needed because miNE is not safe-to-copy */
   3356    png_set_keep_unknown_chunks(png, PNG_HANDLE_CHUNK_ALWAYS,
   3357       (png_bytep) "miNE", 1);
   3358    #endif
   3359 
   3360 The high-level write interface
   3361 
   3362 At this point there are two ways to proceed; through the high-level
   3363 write interface, or through a sequence of low-level write operations.
   3364 You can use the high-level interface if your image data is present
   3365 in the info structure.  All defined output
   3366 transformations are permitted, enabled by the following masks.
   3367 
   3368    PNG_TRANSFORM_IDENTITY      No transformation
   3369    PNG_TRANSFORM_PACKING       Pack 1, 2 and 4-bit samples
   3370    PNG_TRANSFORM_PACKSWAP      Change order of packed
   3371                                pixels to LSB first
   3372    PNG_TRANSFORM_INVERT_MONO   Invert monochrome images
   3373    PNG_TRANSFORM_SHIFT         Normalize pixels to the
   3374                                sBIT depth
   3375    PNG_TRANSFORM_BGR           Flip RGB to BGR, RGBA
   3376                                to BGRA
   3377    PNG_TRANSFORM_SWAP_ALPHA    Flip RGBA to ARGB or GA
   3378                                to AG
   3379    PNG_TRANSFORM_INVERT_ALPHA  Change alpha from opacity
   3380                                to transparency
   3381    PNG_TRANSFORM_SWAP_ENDIAN   Byte-swap 16-bit samples
   3382    PNG_TRANSFORM_STRIP_FILLER        Strip out filler
   3383                                      bytes (deprecated).
   3384    PNG_TRANSFORM_STRIP_FILLER_BEFORE Strip out leading
   3385                                      filler bytes
   3386    PNG_TRANSFORM_STRIP_FILLER_AFTER  Strip out trailing
   3387                                      filler bytes
   3388 
   3389 If you have valid image data in the info structure (you can use
   3390 png_set_rows() to put image data in the info structure), simply do this:
   3391 
   3392    png_write_png(png_ptr, info_ptr, png_transforms, NULL)
   3393 
   3394 where png_transforms is an integer containing the bitwise OR of some set of
   3395 transformation flags.  This call is equivalent to png_write_info(),
   3396 followed the set of transformations indicated by the transform mask,
   3397 then png_write_image(), and finally png_write_end().
   3398 
   3399 (The final parameter of this call is not yet used.  Someday it might point
   3400 to transformation parameters required by some future output transform.)
   3401 
   3402 You must use png_transforms and not call any png_set_transform() functions
   3403 when you use png_write_png().
   3404 
   3405 The low-level write interface
   3406 
   3407 If you are going the low-level route instead, you are now ready to
   3408 write all the file information up to the actual image data.  You do
   3409 this with a call to png_write_info().
   3410 
   3411    png_write_info(png_ptr, info_ptr);
   3412 
   3413 Note that there is one transformation you may need to do before
   3414 png_write_info().  In PNG files, the alpha channel in an image is the
   3415 level of opacity.  If your data is supplied as a level of transparency,
   3416 you can invert the alpha channel before you write it, so that 0 is
   3417 fully transparent and 255 (in 8-bit or paletted images) or 65535
   3418 (in 16-bit images) is fully opaque, with
   3419 
   3420    png_set_invert_alpha(png_ptr);
   3421 
   3422 This must appear before png_write_info() instead of later with the
   3423 other transformations because in the case of paletted images the tRNS
   3424 chunk data has to be inverted before the tRNS chunk is written.  If
   3425 your image is not a paletted image, the tRNS data (which in such cases
   3426 represents a single color to be rendered as transparent) won't need to
   3427 be changed, and you can safely do this transformation after your
   3428 png_write_info() call.
   3429 
   3430 If you need to write a private chunk that you want to appear before
   3431 the PLTE chunk when PLTE is present, you can write the PNG info in
   3432 two steps, and insert code to write your own chunk between them:
   3433 
   3434    png_write_info_before_PLTE(png_ptr, info_ptr);
   3435    png_set_unknown_chunks(png_ptr, info_ptr, ...);
   3436    png_write_info(png_ptr, info_ptr);
   3437 
   3438 After you've written the file information, you can set up the library
   3439 to handle any special transformations of the image data.  The various
   3440 ways to transform the data will be described in the order that they
   3441 should occur.  This is important, as some of these change the color
   3442 type and/or bit depth of the data, and some others only work on
   3443 certain color types and bit depths.  Even though each transformation
   3444 checks to see if it has data that it can do something with, you should
   3445 make sure to only enable a transformation if it will be valid for the
   3446 data.  For example, don't swap red and blue on grayscale data.
   3447 
   3448 PNG files store RGB pixels packed into 3 or 6 bytes.  This code tells
   3449 the library to strip input data that has 4 or 8 bytes per pixel down
   3450 to 3 or 6 bytes (or strip 2 or 4-byte grayscale+filler data to 1 or 2
   3451 bytes per pixel).
   3452 
   3453    png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
   3454 
   3455 where the 0 is unused, and the location is either PNG_FILLER_BEFORE or
   3456 PNG_FILLER_AFTER, depending upon whether the filler byte in the pixel
   3457 is stored XRGB or RGBX.
   3458 
   3459 PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as
   3460 they can, resulting in, for example, 8 pixels per byte for 1 bit files.
   3461 If the data is supplied at 1 pixel per byte, use this code, which will
   3462 correctly pack the pixels into a single byte:
   3463 
   3464    png_set_packing(png_ptr);
   3465 
   3466 PNG files reduce possible bit depths to 1, 2, 4, 8, and 16.  If your
   3467 data is of another bit depth, you can write an sBIT chunk into the
   3468 file so that decoders can recover the original data if desired.
   3469 
   3470    /* Set the true bit depth of the image data */
   3471    if (color_type & PNG_COLOR_MASK_COLOR)
   3472    {
   3473       sig_bit.red = true_bit_depth;
   3474       sig_bit.green = true_bit_depth;
   3475       sig_bit.blue = true_bit_depth;
   3476    }
   3477 
   3478    else
   3479    {
   3480       sig_bit.gray = true_bit_depth;
   3481    }
   3482 
   3483    if (color_type & PNG_COLOR_MASK_ALPHA)
   3484    {
   3485       sig_bit.alpha = true_bit_depth;
   3486    }
   3487 
   3488    png_set_sBIT(png_ptr, info_ptr, &sig_bit);
   3489 
   3490 If the data is stored in the row buffer in a bit depth other than
   3491 one supported by PNG (e.g. 3 bit data in the range 0-7 for a 4-bit PNG),
   3492 this will scale the values to appear to be the correct bit depth as
   3493 is required by PNG.
   3494 
   3495    png_set_shift(png_ptr, &sig_bit);
   3496 
   3497 PNG files store 16-bit pixels in network byte order (big-endian,
   3498 ie. most significant bits first).  This code would be used if they are
   3499 supplied the other way (little-endian, i.e. least significant bits
   3500 first, the way PCs store them):
   3501 
   3502    if (bit_depth > 8)
   3503       png_set_swap(png_ptr);
   3504 
   3505 If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you
   3506 need to change the order the pixels are packed into bytes, you can use:
   3507 
   3508    if (bit_depth < 8)
   3509       png_set_packswap(png_ptr);
   3510 
   3511 PNG files store 3 color pixels in red, green, blue order.  This code
   3512 would be used if they are supplied as blue, green, red:
   3513 
   3514    png_set_bgr(png_ptr);
   3515 
   3516 PNG files describe monochrome as black being zero and white being
   3517 one. This code would be used if the pixels are supplied with this reversed
   3518 (black being one and white being zero):
   3519 
   3520    png_set_invert_mono(png_ptr);
   3521 
   3522 Finally, you can write your own transformation function if none of
   3523 the existing ones meets your needs.  This is done by setting a callback
   3524 with
   3525 
   3526    png_set_write_user_transform_fn(png_ptr,
   3527       write_transform_fn);
   3528 
   3529 You must supply the function
   3530 
   3531    void write_transform_fn(png_structp png_ptr, png_row_infop
   3532       row_info, png_bytep data)
   3533 
   3534 See pngtest.c for a working example.  Your function will be called
   3535 before any of the other transformations are processed.  If supported
   3536 libpng also supplies an information routine that may be called from
   3537 your callback:
   3538 
   3539   png_get_current_row_number(png_ptr);
   3540   png_get_current_pass_number(png_ptr);
   3541 
   3542 This returns the current row passed to the transform.  With interlaced
   3543 images the value returned is the row in the input sub-image image.  Use
   3544 PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to
   3545 find the output pixel (x,y) given an interlaced sub-image pixel (row,col,pass).
   3546 
   3547 The discussion of interlace handling above contains more information on how to
   3548 use these values.
   3549 
   3550 You can also set up a pointer to a user structure for use by your
   3551 callback function.
   3552 
   3553    png_set_user_transform_info(png_ptr, user_ptr, 0, 0);
   3554 
   3555 The user_channels and user_depth parameters of this function are ignored
   3556 when writing; you can set them to zero as shown.
   3557 
   3558 You can retrieve the pointer via the function png_get_user_transform_ptr().
   3559 For example:
   3560 
   3561    voidp write_user_transform_ptr =
   3562       png_get_user_transform_ptr(png_ptr);
   3563 
   3564 It is possible to have libpng flush any pending output, either manually,
   3565 or automatically after a certain number of lines have been written.  To
   3566 flush the output stream a single time call:
   3567 
   3568    png_write_flush(png_ptr);
   3569 
   3570 and to have libpng flush the output stream periodically after a certain
   3571 number of scanlines have been written, call:
   3572 
   3573    png_set_flush(png_ptr, nrows);
   3574 
   3575 Note that the distance between rows is from the last time png_write_flush()
   3576 was called, or the first row of the image if it has never been called.
   3577 So if you write 50 lines, and then png_set_flush 25, it will flush the
   3578 output on the next scanline, and every 25 lines thereafter, unless
   3579 png_write_flush() is called before 25 more lines have been written.
   3580 If nrows is too small (less than about 10 lines for a 640 pixel wide
   3581 RGB image) the image compression may decrease noticeably (although this
   3582 may be acceptable for real-time applications).  Infrequent flushing will
   3583 only degrade the compression performance by a few percent over images
   3584 that do not use flushing.
   3585 
   3586 Writing the image data
   3587 
   3588 That's it for the transformations.  Now you can write the image data.
   3589 The simplest way to do this is in one function call.  If you have the
   3590 whole image in memory, you can just call png_write_image() and libpng
   3591 will write the image.  You will need to pass in an array of pointers to
   3592 each row.  This function automatically handles interlacing, so you don't
   3593 need to call png_set_interlace_handling() or call this function multiple
   3594 times, or any of that other stuff necessary with png_write_rows().
   3595 
   3596    png_write_image(png_ptr, row_pointers);
   3597 
   3598 where row_pointers is:
   3599 
   3600    png_byte *row_pointers[height];
   3601 
   3602 You can point to void or char or whatever you use for pixels.
   3603 
   3604 If you don't want to write the whole image at once, you can
   3605 use png_write_rows() instead.  If the file is not interlaced,
   3606 this is simple:
   3607 
   3608    png_write_rows(png_ptr, row_pointers,
   3609       number_of_rows);
   3610 
   3611 row_pointers is the same as in the png_write_image() call.
   3612 
   3613 If you are just writing one row at a time, you can do this with
   3614 a single row_pointer instead of an array of row_pointers:
   3615 
   3616    png_bytep row_pointer = row;
   3617 
   3618    png_write_row(png_ptr, row_pointer);
   3619 
   3620 When the file is interlaced, things can get a good deal more complicated.
   3621 The only currently (as of the PNG Specification version 1.2, dated July
   3622 1999) defined interlacing scheme for PNG files is the "Adam7" interlace
   3623 scheme, that breaks down an image into seven smaller images of varying
   3624 size.  libpng will build these images for you, or you can do them
   3625 yourself.  If you want to build them yourself, see the PNG specification
   3626 for details of which pixels to write when.
   3627 
   3628 If you don't want libpng to handle the interlacing details, just
   3629 use png_set_interlace_handling() and call png_write_rows() the
   3630 correct number of times to write all the sub-images
   3631 (png_set_interlace_handling() returns the number of sub-images.)
   3632 
   3633 If you want libpng to build the sub-images, call this before you start
   3634 writing any rows:
   3635 
   3636    number_of_passes = png_set_interlace_handling(png_ptr);
   3637 
   3638 This will return the number of passes needed.  Currently, this is seven,
   3639 but may change if another interlace type is added.
   3640 
   3641 Then write the complete image number_of_passes times.
   3642 
   3643    png_write_rows(png_ptr, row_pointers, number_of_rows);
   3644 
   3645 Think carefully before you write an interlaced image.  Typically code that
   3646 reads such images reads all the image data into memory, uncompressed, before
   3647 doing any processing.  Only code that can display an image on the fly can
   3648 take advantage of the interlacing and even then the image has to be exactly
   3649 the correct size for the output device, because scaling an image requires
   3650 adjacent pixels and these are not available until all the passes have been
   3651 read.
   3652 
   3653 If you do write an interlaced image you will hardly ever need to handle
   3654 the interlacing yourself.  Call png_set_interlace_handling() and use the
   3655 approach described above.
   3656 
   3657 The only time it is conceivable that you will really need to write an
   3658 interlaced image pass-by-pass is when you have read one pass by pass and
   3659 made some pixel-by-pixel transformation to it, as described in the read
   3660 code above.  In this case use the PNG_PASS_ROWS and PNG_PASS_COLS macros
   3661 to determine the size of each sub-image in turn and simply write the rows
   3662 you obtained from the read code.
   3663 
   3664 Finishing a sequential write
   3665 
   3666 After you are finished writing the image, you should finish writing
   3667 the file.  If you are interested in writing comments or time, you should
   3668 pass an appropriately filled png_info pointer.  If you are not interested,
   3669 you can pass NULL.
   3670 
   3671    png_write_end(png_ptr, info_ptr);
   3672 
   3673 When you are done, you can free all memory used by libpng like this:
   3674 
   3675    png_destroy_write_struct(&png_ptr, &info_ptr);
   3676 
   3677 It is also possible to individually free the info_ptr members that
   3678 point to libpng-allocated storage with the following function:
   3679 
   3680    png_free_data(png_ptr, info_ptr, mask, seq)
   3681 
   3682    mask  - identifies data to be freed, a mask
   3683            containing the bitwise OR of one or
   3684            more of
   3685              PNG_FREE_PLTE, PNG_FREE_TRNS,
   3686              PNG_FREE_HIST, PNG_FREE_ICCP,
   3687              PNG_FREE_PCAL, PNG_FREE_ROWS,
   3688              PNG_FREE_SCAL, PNG_FREE_SPLT,
   3689              PNG_FREE_TEXT, PNG_FREE_UNKN,
   3690            or simply PNG_FREE_ALL
   3691 
   3692    seq   - sequence number of item to be freed
   3693            (-1 for all items)
   3694 
   3695 This function may be safely called when the relevant storage has
   3696 already been freed, or has not yet been allocated, or was allocated
   3697 by the user  and not by libpng,  and will in those cases do nothing.
   3698 The "seq" parameter is ignored if only one item of the selected data
   3699 type, such as PLTE, is allowed.  If "seq" is not -1, and multiple items
   3700 are allowed for the data type identified in the mask, such as text or
   3701 sPLT, only the n'th item in the structure is freed, where n is "seq".
   3702 
   3703 If you allocated data such as a palette that you passed in to libpng
   3704 with png_set_*, you must not free it until just before the call to
   3705 png_destroy_write_struct().
   3706 
   3707 The default behavior is only to free data that was allocated internally
   3708 by libpng.  This can be changed, so that libpng will not free the data,
   3709 or so that it will free data that was allocated by the user with png_malloc()
   3710 or png_calloc() and passed in via a png_set_*() function, with
   3711 
   3712    png_data_freer(png_ptr, info_ptr, freer, mask)
   3713 
   3714    freer  - one of
   3715               PNG_DESTROY_WILL_FREE_DATA
   3716               PNG_SET_WILL_FREE_DATA
   3717               PNG_USER_WILL_FREE_DATA
   3718 
   3719    mask   - which data elements are affected
   3720             same choices as in png_free_data()
   3721 
   3722 For example, to transfer responsibility for some data from a read structure
   3723 to a write structure, you could use
   3724 
   3725    png_data_freer(read_ptr, read_info_ptr,
   3726       PNG_USER_WILL_FREE_DATA,
   3727       PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST)
   3728 
   3729    png_data_freer(write_ptr, write_info_ptr,
   3730       PNG_DESTROY_WILL_FREE_DATA,
   3731       PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST)
   3732 
   3733 thereby briefly reassigning responsibility for freeing to the user but
   3734 immediately afterwards reassigning it once more to the write_destroy
   3735 function.  Having done this, it would then be safe to destroy the read
   3736 structure and continue to use the PLTE, tRNS, and hIST data in the write
   3737 structure.
   3738 
   3739 This function only affects data that has already been allocated.
   3740 You can call this function before calling after the png_set_*() functions
   3741 to control whether the user or png_destroy_*() is supposed to free the data.
   3742 When the user assumes responsibility for libpng-allocated data, the
   3743 application must use
   3744 png_free() to free it, and when the user transfers responsibility to libpng
   3745 for data that the user has allocated, the user must have used png_malloc()
   3746 or png_calloc() to allocate it.
   3747 
   3748 If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword
   3749 separately, do not transfer responsibility for freeing text_ptr to libpng,
   3750 because when libpng fills a png_text structure it combines these members with
   3751 the key member, and png_free_data() will free only text_ptr.key.  Similarly,
   3752 if you transfer responsibility for free'ing text_ptr from libpng to your
   3753 application, your application must not separately free those members.
   3754 For a more compact example of writing a PNG image, see the file example.c.
   3755 
   3756 V. Simplified API
   3757 
   3758 The simplified API, which became available in libpng-1.6.0, hides the details
   3759 of both libpng and the PNG file format itself.
   3760 It allows PNG files to be read into a very limited number of
   3761 in-memory bitmap formats or to be written from the same formats.  If these
   3762 formats do not accommodate your needs then you can, and should, use the more
   3763 sophisticated APIs above - these support a wide variety of in-memory formats
   3764 and a wide variety of sophisticated transformations to those formats as well
   3765 as a wide variety of APIs to manipulate ancillary information.
   3766 
   3767 To read a PNG file using the simplified API:
   3768 
   3769  1) Declare a 'png_image' structure (see below) on the stack, set the
   3770     version field to PNG_IMAGE_VERSION and the 'opaque' pointer to NULL
   3771     (this is REQUIRED, your program may crash if you don't do it.)
   3772 
   3773  2) Call the appropriate png_image_begin_read... function.
   3774 
   3775  3) Set the png_image 'format' member to the required sample format.
   3776 
   3777  4) Allocate a buffer for the image and, if required, the color-map.
   3778 
   3779  5) Call png_image_finish_read to read the image and, if required, the
   3780     color-map into your buffers.
   3781 
   3782 There are no restrictions on the format of the PNG input itself; all valid
   3783 color types, bit depths, and interlace methods are acceptable, and the
   3784 input image is transformed as necessary to the requested in-memory format
   3785 during the png_image_finish_read() step.  The only caveat is that if you
   3786 request a color-mapped image from a PNG that is full-color or makes
   3787 complex use of an alpha channel the transformation is extremely lossy and the
   3788 result may look terrible.
   3789 
   3790 To write a PNG file using the simplified API:
   3791 
   3792  1) Declare a 'png_image' structure on the stack and memset()
   3793     it to all zero.
   3794 
   3795  2) Initialize the members of the structure that describe the
   3796     image, setting the 'format' member to the format of the
   3797     image samples.
   3798 
   3799  3) Call the appropriate png_image_write... function with a
   3800     pointer to the image and, if necessary, the color-map to write
   3801     the PNG data.
   3802 
   3803 png_image is a structure that describes the in-memory format of an image
   3804 when it is being read or defines the in-memory format of an image that you
   3805 need to write.  The "png_image" structure contains the following members:
   3806 
   3807   png_controlp opaque  Initialize to NULL, free with png_image_free
   3808   png_uint_32  version Set to PNG_IMAGE_VERSION
   3809   png_uint_32  width   Image width in pixels (columns)
   3810   png_uint_32  height  Image height in pixels (rows)
   3811   png_uint_32  format  Image format as defined below
   3812   png_uint_32  flags   A bit mask containing informational flags
   3813   png_uint_32  colormap_entries; Number of entries in the color-map
   3814   png_uint_32  warning_or_error;
   3815   char         message[64];
   3816 
   3817 In the event of an error or warning the "warning_or_error"
   3818 field will be set to a non-zero value and the 'message' field will contain
   3819 a '\0' terminated string with the libpng error or warning message.  If both
   3820 warnings and an error were encountered, only the error is recorded.  If there
   3821 are multiple warnings, only the first one is recorded.
   3822 
   3823 The upper 30 bits of the "warning_or_error" value are reserved; the low two
   3824 bits contain a two bit code such that a value more than 1 indicates a failure
   3825 in the API just called:
   3826 
   3827   0 - no warning or error
   3828   1 - warning
   3829   2 - error
   3830   3 - error preceded by warning
   3831 
   3832 The pixels (samples) of the image have one to four channels whose components
   3833 have original values in the range 0 to 1.0:
   3834 
   3835  1: A single gray or luminance channel (G).
   3836  2: A gray/luminance channel and an alpha channel (GA).
   3837  3: Three red, green, blue color channels (RGB).
   3838  4: Three color channels and an alpha channel (RGBA).
   3839 
   3840 The channels are encoded in one of two ways:
   3841 
   3842  a) As a small integer, value 0..255, contained in a single byte.  For the
   3843 alpha channel the original value is simply value/255.  For the color or
   3844 luminance channels the value is encoded according to the sRGB specification
   3845 and matches the 8-bit format expected by typical display devices.
   3846 
   3847 The color/gray channels are not scaled (pre-multiplied) by the alpha
   3848 channel and are suitable for passing to color management software.
   3849 
   3850  b) As a value in the range 0..65535, contained in a 2-byte integer, in
   3851 the native byte order of the platform on which the application is running.
   3852 All channels can be converted to the original value by dividing by 65535; all
   3853 channels are linear.  Color channels use the RGB encoding (RGB end-points) of
   3854 the sRGB specification.  This encoding is identified by the
   3855 PNG_FORMAT_FLAG_LINEAR flag below.
   3856 
   3857 When the simplified API needs to convert between sRGB and linear colorspaces,
   3858 the actual sRGB transfer curve defined in the sRGB specification (see the
   3859 article at https://en.wikipedia.org/wiki/SRGB) is used, not the gamma=1/2.2
   3860 approximation used elsewhere in libpng.
   3861 
   3862 When an alpha channel is present it is expected to denote pixel coverage
   3863 of the color or luminance channels and is returned as an associated alpha
   3864 channel: the color/gray channels are scaled (pre-multiplied) by the alpha
   3865 value.
   3866 
   3867 The samples are either contained directly in the image data, between 1 and 8
   3868 bytes per pixel according to the encoding, or are held in a color-map indexed
   3869 by bytes in the image data.  In the case of a color-map the color-map entries
   3870 are individual samples, encoded as above, and the image data has one byte per
   3871 pixel to select the relevant sample from the color-map.
   3872 
   3873 PNG_FORMAT_*
   3874 
   3875 The #defines to be used in png_image::format.  Each #define identifies a
   3876 particular layout of channel data and, if present, alpha values.  There are
   3877 separate defines for each of the two component encodings.
   3878 
   3879 A format is built up using single bit flag values.  All combinations are
   3880 valid.  Formats can be built up from the flag values or you can use one of
   3881 the predefined values below.  When testing formats always use the FORMAT_FLAG
   3882 macros to test for individual features - future versions of the library may
   3883 add new flags.
   3884 
   3885 When reading or writing color-mapped images the format should be set to the
   3886 format of the entries in the color-map then png_image_{read,write}_colormap
   3887 called to read or write the color-map and set the format correctly for the
   3888 image data.  Do not set the PNG_FORMAT_FLAG_COLORMAP bit directly!
   3889 
   3890 NOTE: libpng can be built with particular features disabled. If you see
   3891 compiler errors because the definition of one of the following flags has been
   3892 compiled out it is because libpng does not have the required support.  It is
   3893 possible, however, for the libpng configuration to enable the format on just
   3894 read or just write; in that case you may see an error at run time.
   3895 You can guard against this by checking for the definition of the
   3896 appropriate "_SUPPORTED" macro, one of:
   3897 
   3898   PNG_SIMPLIFIED_{READ,WRITE}_{BGR,AFIRST}_SUPPORTED
   3899 
   3900   PNG_FORMAT_FLAG_ALPHA    format with an alpha channel
   3901   PNG_FORMAT_FLAG_COLOR    color format: otherwise grayscale
   3902   PNG_FORMAT_FLAG_LINEAR   2-byte channels else 1-byte
   3903   PNG_FORMAT_FLAG_COLORMAP image data is color-mapped
   3904   PNG_FORMAT_FLAG_BGR      BGR colors, else order is RGB
   3905   PNG_FORMAT_FLAG_AFIRST   alpha channel comes first
   3906 
   3907 Supported formats are as follows.  Future versions of libpng may support more
   3908 formats; for compatibility with older versions simply check if the format
   3909 macro is defined using #ifdef.  These defines describe the in-memory layout
   3910 of the components of the pixels of the image.
   3911 
   3912 First the single byte (sRGB) formats:
   3913 
   3914   PNG_FORMAT_GRAY
   3915   PNG_FORMAT_GA
   3916   PNG_FORMAT_AG
   3917   PNG_FORMAT_RGB
   3918   PNG_FORMAT_BGR
   3919   PNG_FORMAT_RGBA
   3920   PNG_FORMAT_ARGB
   3921   PNG_FORMAT_BGRA
   3922   PNG_FORMAT_ABGR
   3923 
   3924 Then the linear 2-byte formats.  When naming these "Y" is used to
   3925 indicate a luminance (gray) channel.  The component order within the pixel
   3926 is always the same - there is no provision for swapping the order of the
   3927 components in the linear format.  The components are 16-bit integers in
   3928 the native byte order for your platform, and there is no provision for
   3929 swapping the bytes to a different endian condition.
   3930 
   3931   PNG_FORMAT_LINEAR_Y
   3932   PNG_FORMAT_LINEAR_Y_ALPHA
   3933   PNG_FORMAT_LINEAR_RGB
   3934   PNG_FORMAT_LINEAR_RGB_ALPHA
   3935 
   3936 With color-mapped formats the image data is one byte for each pixel. The byte
   3937 is an index into the color-map which is formatted as above.  To obtain a
   3938 color-mapped format it is sufficient just to add the PNG_FOMAT_FLAG_COLORMAP
   3939 to one of the above definitions, or you can use one of the definitions below.
   3940 
   3941   PNG_FORMAT_RGB_COLORMAP
   3942   PNG_FORMAT_BGR_COLORMAP
   3943   PNG_FORMAT_RGBA_COLORMAP
   3944   PNG_FORMAT_ARGB_COLORMAP
   3945   PNG_FORMAT_BGRA_COLORMAP
   3946   PNG_FORMAT_ABGR_COLORMAP
   3947 
   3948 PNG_IMAGE macros
   3949 
   3950 These are convenience macros to derive information from a png_image
   3951 structure.  The PNG_IMAGE_SAMPLE_ macros return values appropriate to the
   3952 actual image sample values - either the entries in the color-map or the
   3953 pixels in the image.  The PNG_IMAGE_PIXEL_ macros return corresponding values
   3954 for the pixels and will always return 1 for color-mapped formats.  The
   3955 remaining macros return information about the rows in the image and the
   3956 complete image.
   3957 
   3958 NOTE: All the macros that take a png_image::format parameter are compile time
   3959 constants if the format parameter is, itself, a constant.  Therefore these
   3960 macros can be used in array declarations and case labels where required.
   3961 Similarly the macros are also pre-processor constants (sizeof is not used) so
   3962 they can be used in #if tests.
   3963 
   3964  PNG_IMAGE_SAMPLE_CHANNELS(fmt)
   3965    Returns the total number of channels in a given format: 1..4
   3966 
   3967  PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt)
   3968    Returns the size in bytes of a single component of a pixel or color-map
   3969    entry (as appropriate) in the image: 1 or 2.
   3970 
   3971  PNG_IMAGE_SAMPLE_SIZE(fmt)
   3972    This is the size of the sample data for one sample.  If the image is
   3973    color-mapped it is the size of one color-map entry (and image pixels are
   3974    one byte in size), otherwise it is the size of one image pixel.
   3975 
   3976  PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(fmt)
   3977    The maximum size of the color-map required by the format expressed in a
   3978    count of components.  This can be used to compile-time allocate a
   3979    color-map:
   3980 
   3981    png_uint_16 colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(linear_fmt)];
   3982 
   3983    png_byte colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(sRGB_fmt)];
   3984 
   3985    Alternatively use the PNG_IMAGE_COLORMAP_SIZE macro below to use the
   3986    information from one of the png_image_begin_read_ APIs and dynamically
   3987    allocate the required memory.
   3988 
   3989  PNG_IMAGE_COLORMAP_SIZE(fmt)
   3990   The size of the color-map required by the format; this is the size of the
   3991   color-map buffer passed to the png_image_{read,write}_colormap APIs. It is
   3992   a fixed number determined by the format so can easily be allocated on the
   3993   stack if necessary.
   3994 
   3995 Corresponding information about the pixels
   3996 
   3997  PNG_IMAGE_PIXEL_CHANNELS(fmt)
   3998   The number of separate channels (components) in a pixel; 1 for a
   3999   color-mapped image.
   4000 
   4001  PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)\
   4002   The size, in bytes, of each component in a pixel; 1 for a color-mapped
   4003   image.
   4004 
   4005  PNG_IMAGE_PIXEL_SIZE(fmt)
   4006   The size, in bytes, of a complete pixel; 1 for a color-mapped image.
   4007 
   4008 Information about the whole row, or whole image
   4009 
   4010  PNG_IMAGE_ROW_STRIDE(image)
   4011   Returns the total number of components in a single row of the image; this
   4012   is the minimum 'row stride', the minimum count of components between each
   4013   row.  For a color-mapped image this is the minimum number of bytes in a
   4014   row.
   4015 
   4016   If you need the stride measured in bytes, row_stride_bytes is
   4017   PNG_IMAGE_ROW_STRIDE(image) * PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)
   4018   plus any padding bytes that your application might need, for example
   4019   to start the next row on a 4-byte boundary.
   4020 
   4021  PNG_IMAGE_BUFFER_SIZE(image, row_stride)
   4022   Return the size, in bytes, of an image buffer given a png_image and a row
   4023   stride - the number of components to leave space for in each row.
   4024 
   4025  PNG_IMAGE_SIZE(image)
   4026   Return the size, in bytes, of the image in memory given just a png_image;
   4027   the row stride is the minimum stride required for the image.
   4028 
   4029  PNG_IMAGE_COLORMAP_SIZE(image)
   4030   Return the size, in bytes, of the color-map of this image.  If the image
   4031   format is not a color-map format this will return a size sufficient for
   4032   256 entries in the given format; check PNG_FORMAT_FLAG_COLORMAP if
   4033   you don't want to allocate a color-map in this case.
   4034 
   4035 PNG_IMAGE_FLAG_*
   4036 
   4037 Flags containing additional information about the image are held in
   4038 the 'flags' field of png_image.
   4039 
   4040  PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB == 0x01
   4041    This indicates that the RGB values of the in-memory bitmap do not
   4042    correspond to the red, green and blue end-points defined by sRGB.
   4043 
   4044  PNG_IMAGE_FLAG_FAST == 0x02
   4045   On write emphasise speed over compression; the resultant PNG file will be
   4046   larger but will be produced significantly faster, particular for large
   4047   images.  Do not use this option for images which will be distributed, only
   4048   used it when producing intermediate files that will be read back in
   4049   repeatedly.  For a typical 24-bit image the option will double the read
   4050   speed at the cost of increasing the image size by 25%, however for many
   4051   more compressible images the PNG file can be 10 times larger with only a
   4052   slight speed gain.
   4053 
   4054  PNG_IMAGE_FLAG_16BIT_sRGB == 0x04
   4055    On read if the image is a 16-bit per component image and there is no gAMA
   4056    or sRGB chunk assume that the components are sRGB encoded.  Notice that
   4057    images output by the simplified API always have gamma information; setting
   4058    this flag only affects the interpretation of 16-bit images from an
   4059    external source.  It is recommended that the application expose this flag
   4060    to the user; the user can normally easily recognize the difference between
   4061    linear and sRGB encoding.  This flag has no effect on write - the data
   4062    passed to the write APIs must have the correct encoding (as defined
   4063    above.)
   4064 
   4065    If the flag is not set (the default) input 16-bit per component data is
   4066    assumed to be linear.
   4067 
   4068    NOTE: the flag can only be set after the png_image_begin_read_ call,
   4069    because that call initializes the 'flags' field.
   4070 
   4071 READ APIs
   4072 
   4073   The png_image passed to the read APIs must have been initialized by setting
   4074   the png_controlp field 'opaque' to NULL (or, better, memset the whole thing.)
   4075 
   4076   int png_image_begin_read_from_file( png_imagep image,
   4077     const char *file_name)
   4078 
   4079     The named file is opened for read and the image header
   4080     is filled in from the PNG header in the file.
   4081 
   4082   int png_image_begin_read_from_stdio (png_imagep image,
   4083     FILE *file)
   4084 
   4085      The PNG header is read from the stdio FILE object.
   4086 
   4087   int png_image_begin_read_from_memory(png_imagep image,
   4088      png_const_voidp memory, size_t size)
   4089 
   4090      The PNG header is read from the given memory buffer.
   4091 
   4092   int png_image_finish_read(png_imagep image,
   4093      png_colorp background, void *buffer,
   4094      png_int_32 row_stride, void *colormap));
   4095 
   4096      Finish reading the image into the supplied buffer and
   4097      clean up the png_image structure.
   4098 
   4099      row_stride is the step, in png_byte or png_uint_16 units
   4100      as appropriate, between adjacent rows.  A positive stride
   4101      indicates that the top-most row is first in the buffer -
   4102      the normal top-down arrangement.  A negative stride
   4103      indicates that the bottom-most row is first in the buffer.
   4104 
   4105      background need only be supplied if an alpha channel must
   4106      be removed from a png_byte format and the removal is to be
   4107      done by compositing on a solid color; otherwise it may be
   4108      NULL and any composition will be done directly onto the
   4109      buffer.  The value is an sRGB color to use for the
   4110      background, for grayscale output the green channel is used.
   4111 
   4112      For linear output removing the alpha channel is always done
   4113      by compositing on black.
   4114 
   4115   void png_image_free(png_imagep image)
   4116 
   4117      Free any data allocated by libpng in image->opaque,
   4118      setting the pointer to NULL.  May be called at any time
   4119      after the structure is initialized.
   4120 
   4121 When the simplified API needs to convert between sRGB and linear colorspaces,
   4122 the actual sRGB transfer curve defined in the sRGB specification (see the
   4123 article at https://en.wikipedia.org/wiki/SRGB) is used, not the gamma=1/2.2
   4124 approximation used elsewhere in libpng.
   4125 
   4126 WRITE APIS
   4127 
   4128 For write you must initialize a png_image structure to describe the image to
   4129 be written:
   4130 
   4131   version: must be set to PNG_IMAGE_VERSION
   4132   opaque: must be initialized to NULL
   4133   width: image width in pixels
   4134   height: image height in rows
   4135   format: the format of the data you wish to write
   4136   flags: set to 0 unless one of the defined flags applies; set
   4137      PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB for color format images
   4138      where the RGB values do not correspond to the colors in sRGB.
   4139   colormap_entries: set to the number of entries in the color-map (0 to 256)
   4140 
   4141   int png_image_write_to_file, (png_imagep image,
   4142      const char *file, int convert_to_8bit, const void *buffer,
   4143      png_int_32 row_stride, const void *colormap));
   4144 
   4145      Write the image to the named file.
   4146 
   4147   int png_image_write_to_memory (png_imagep image, void *memory,
   4148      png_alloc_size_t * PNG_RESTRICT memory_bytes,
   4149      int convert_to_8_bit, const void *buffer, ptrdiff_t row_stride,
   4150      const void *colormap));
   4151 
   4152      Write the image to memory.
   4153 
   4154   int png_image_write_to_stdio(png_imagep image, FILE *file,
   4155      int convert_to_8_bit, const void *buffer,
   4156      png_int_32 row_stride, const void *colormap)
   4157 
   4158      Write the image to the given FILE object.
   4159 
   4160 With all write APIs if image is in one of the linear formats with
   4161 (png_uint_16) data then setting convert_to_8_bit will cause the output to be
   4162 a (png_byte) PNG gamma encoded according to the sRGB specification, otherwise
   4163 a 16-bit linear encoded PNG file is written.
   4164 
   4165 With all APIs row_stride is handled as in the read APIs - it is the spacing
   4166 from one row to the next in component sized units (float) and if negative
   4167 indicates a bottom-up row layout in the buffer.  If you pass zero, libpng will
   4168 calculate the row_stride for you from the width and number of channels.
   4169 
   4170 Note that the write API does not support interlacing, sub-8-bit pixels,
   4171 indexed (paletted) images, or most ancillary chunks.
   4172 
   4173 VI. Modifying/Customizing libpng
   4174 
   4175 There are two issues here.  The first is changing how libpng does
   4176 standard things like memory allocation, input/output, and error handling.
   4177 The second deals with more complicated things like adding new chunks,
   4178 adding new transformations, and generally changing how libpng works.
   4179 Both of those are compile-time issues; that is, they are generally
   4180 determined at the time the code is written, and there is rarely a need
   4181 to provide the user with a means of changing them.
   4182 
   4183 Memory allocation, input/output, and error handling
   4184 
   4185 All of the memory allocation, input/output, and error handling in libpng
   4186 goes through callbacks that are user-settable.  The default routines are
   4187 in pngmem.c, pngrio.c, pngwio.c, and pngerror.c, respectively.  To change
   4188 these functions, call the appropriate png_set_*_fn() function.
   4189 
   4190 Memory allocation is done through the functions png_malloc(), png_calloc(),
   4191 and png_free().  The png_malloc() and png_free() functions currently just
   4192 call the standard C functions and png_calloc() calls png_malloc() and then
   4193 clears the newly allocated memory to zero; note that png_calloc(png_ptr, size)
   4194 is not the same as the calloc(number, size) function provided by stdlib.h.
   4195 There is limited support for certain systems with segmented memory
   4196 architectures and the types of pointers declared by png.h match this; you
   4197 will have to use appropriate pointers in your application.  If you prefer
   4198 to use a different method of allocating and freeing data, you can use
   4199 png_create_read_struct_2() or png_create_write_struct_2() to register your
   4200 own functions as described above.  These functions also provide a void
   4201 pointer that can be retrieved via
   4202 
   4203    mem_ptr = png_get_mem_ptr(png_ptr);
   4204 
   4205 Your replacement memory functions must have prototypes as follows:
   4206 
   4207    png_voidp malloc_fn(png_structp png_ptr,
   4208       png_alloc_size_t size);
   4209 
   4210    void free_fn(png_structp png_ptr, png_voidp ptr);
   4211 
   4212 Your malloc_fn() must return NULL in case of failure.  The png_malloc()
   4213 function will normally call png_error() if it receives a NULL from the
   4214 system memory allocator or from your replacement malloc_fn().
   4215 
   4216 Your free_fn() will never be called with a NULL ptr, since libpng's
   4217 png_free() checks for NULL before calling free_fn().
   4218 
   4219 Input/Output in libpng is done through png_read() and png_write(),
   4220 which currently just call fread() and fwrite().  The FILE * is stored in
   4221 png_struct and is initialized via png_init_io().  If you wish to change
   4222 the method of I/O, the library supplies callbacks that you can set
   4223 through the function png_set_read_fn() and png_set_write_fn() at run
   4224 time, instead of calling the png_init_io() function.  These functions
   4225 also provide a void pointer that can be retrieved via the function
   4226 png_get_io_ptr().  For example:
   4227 
   4228    png_set_read_fn(png_structp read_ptr,
   4229        voidp read_io_ptr, png_rw_ptr read_data_fn)
   4230 
   4231    png_set_write_fn(png_structp write_ptr,
   4232        voidp write_io_ptr, png_rw_ptr write_data_fn,
   4233        png_flush_ptr output_flush_fn);
   4234 
   4235    voidp read_io_ptr = png_get_io_ptr(read_ptr);
   4236    voidp write_io_ptr = png_get_io_ptr(write_ptr);
   4237 
   4238 The replacement I/O functions must have prototypes as follows:
   4239 
   4240    void user_read_data(png_structp png_ptr,
   4241        png_bytep data, size_t length);
   4242 
   4243    void user_write_data(png_structp png_ptr,
   4244        png_bytep data, size_t length);
   4245 
   4246    void user_flush_data(png_structp png_ptr);
   4247 
   4248 The user_read_data() function is responsible for detecting and
   4249 handling end-of-data errors.
   4250 
   4251 Supplying NULL for the read, write, or flush functions sets them back
   4252 to using the default C stream functions, which expect the io_ptr to
   4253 point to a standard *FILE structure.  It is probably a mistake
   4254 to use NULL for one of write_data_fn and output_flush_fn but not both
   4255 of them, unless you have built libpng with PNG_NO_WRITE_FLUSH defined.
   4256 It is an error to read from a write stream, and vice versa.
   4257 
   4258 Error handling in libpng is done through png_error() and png_warning().
   4259 Errors handled through png_error() are fatal, meaning that png_error()
   4260 should never return to its caller.  Currently, this is handled via
   4261 setjmp() and longjmp() (unless you have compiled libpng with
   4262 PNG_NO_SETJMP, in which case it is handled via PNG_ABORT()),
   4263 but you could change this to do things like exit() if you should wish,
   4264 as long as your function does not return.
   4265 
   4266 On non-fatal errors, png_warning() is called
   4267 to print a warning message, and then control returns to the calling code.
   4268 By default png_error() and png_warning() print a message on stderr via
   4269 fprintf() unless the library is compiled with PNG_NO_CONSOLE_IO defined
   4270 (because you don't want the messages) or PNG_NO_STDIO defined (because
   4271 fprintf() isn't available).  If you wish to change the behavior of the error
   4272 functions, you will need to set up your own message callbacks.  These
   4273 functions are normally supplied at the time that the png_struct is created.
   4274 It is also possible to redirect errors and warnings to your own replacement
   4275 functions after png_create_*_struct() has been called by calling:
   4276 
   4277    png_set_error_fn(png_structp png_ptr,
   4278        png_voidp error_ptr, png_error_ptr error_fn,
   4279        png_error_ptr warning_fn);
   4280 
   4281 If NULL is supplied for either error_fn or warning_fn, then the libpng
   4282 default function will be used, calling fprintf() and/or longjmp() if a
   4283 problem is encountered.  The replacement error functions should have
   4284 parameters as follows:
   4285 
   4286    void user_error_fn(png_structp png_ptr,
   4287        png_const_charp error_msg);
   4288 
   4289    void user_warning_fn(png_structp png_ptr,
   4290        png_const_charp warning_msg);
   4291 
   4292 Then, within your user_error_fn or user_warning_fn, you can retrieve
   4293 the error_ptr if you need it, by calling
   4294 
   4295    png_voidp error_ptr = png_get_error_ptr(png_ptr);
   4296 
   4297 The motivation behind using setjmp() and longjmp() is the C++ throw and
   4298 catch exception handling methods.  This makes the code much easier to write,
   4299 as there is no need to check every return code of every function call.
   4300 However, there are some uncertainties about the status of local variables
   4301 after a longjmp, so the user may want to be careful about doing anything
   4302 after setjmp returns non-zero besides returning itself.  Consult your
   4303 compiler documentation for more details.  For an alternative approach, you
   4304 may wish to use the "cexcept" facility (see https://cexcept.sourceforge.io/),
   4305 which is illustrated in pngvalid.c and in contrib/visupng.
   4306 
   4307 Beginning in libpng-1.4.0, the png_set_benign_errors() API became available.
   4308 You can use this to handle certain errors (normally handled as errors)
   4309 as warnings.
   4310 
   4311    png_set_benign_errors (png_ptr, int allowed);
   4312 
   4313    allowed: 0: treat png_benign_error() as an error.
   4314             1: treat png_benign_error() as a warning.
   4315 
   4316 As of libpng-1.6.0, the default condition is to treat benign errors as
   4317 warnings while reading and as errors while writing.
   4318 
   4319 Custom chunks
   4320 
   4321 If you need to read or write custom chunks, you may need to get deeper
   4322 into the libpng code.  The library now has mechanisms for storing
   4323 and writing chunks of unknown type; you can even declare callbacks
   4324 for custom chunks.  However, this may not be good enough if the
   4325 library code itself needs to know about interactions between your
   4326 chunk and existing `intrinsic' chunks.
   4327 
   4328 If you need to write a new intrinsic chunk, first read the PNG
   4329 specification. Acquire a first level of understanding of how it works.
   4330 Pay particular attention to the sections that describe chunk names,
   4331 and look at how other chunks were designed, so you can do things
   4332 similarly.  Second, check out the sections of libpng that read and
   4333 write chunks.  Try to find a chunk that is similar to yours and use
   4334 it as a template.  More details can be found in the comments inside
   4335 the code.  It is best to handle private or unknown chunks in a generic method,
   4336 via callback functions, instead of by modifying libpng functions. This
   4337 is illustrated in pngtest.c, which uses a callback function to handle a
   4338 private "vpAg" chunk and the new "sTER" chunk, which are both unknown to
   4339 libpng.
   4340 
   4341 If you wish to write your own transformation for the data, look through
   4342 the part of the code that does the transformations, and check out some of
   4343 the simpler ones to get an idea of how they work.  Try to find a similar
   4344 transformation to the one you want to add and copy off of it.  More details
   4345 can be found in the comments inside the code itself.
   4346 
   4347 Configuring for gui/windowing platforms:
   4348 
   4349 You will need to write new error and warning functions that use the GUI
   4350 interface, as described previously, and set them to be the error and
   4351 warning functions at the time that png_create_*_struct() is called,
   4352 in order to have them available during the structure initialization.
   4353 They can be changed later via png_set_error_fn().  On some compilers,
   4354 you may also have to change the memory allocators (png_malloc, etc.).
   4355 
   4356 Configuring zlib:
   4357 
   4358 There are special functions to configure the compression.  Perhaps the
   4359 most useful one changes the compression level, which currently uses
   4360 input compression values in the range 0 - 9.  The library normally
   4361 uses the default compression level (Z_DEFAULT_COMPRESSION = 6).  Tests
   4362 have shown that for a large majority of images, compression values in
   4363 the range 3-6 compress nearly as well as higher levels, and do so much
   4364 faster.  For online applications it may be desirable to have maximum speed
   4365 (Z_BEST_SPEED = 1).  With versions of zlib after v0.99, you can also
   4366 specify no compression (Z_NO_COMPRESSION = 0), but this would create
   4367 files larger than just storing the raw bitmap.  You can specify the
   4368 compression level by calling:
   4369 
   4370    #include zlib.h
   4371    png_set_compression_level(png_ptr, level);
   4372 
   4373 Another useful one is to reduce the memory level used by the library.
   4374 The memory level defaults to 8, but it can be lowered if you are
   4375 short on memory (running DOS, for example, where you only have 640K).
   4376 Note that the memory level does have an effect on compression; among
   4377 other things, lower levels will result in sections of incompressible
   4378 data being emitted in smaller stored blocks, with a correspondingly
   4379 larger relative overhead of up to 15% in the worst case.
   4380 
   4381    #include zlib.h
   4382    png_set_compression_mem_level(png_ptr, level);
   4383 
   4384 The other functions are for configuring zlib.  They are not recommended
   4385 for normal use and may result in writing an invalid PNG file.  See
   4386 zlib.h for more information on what these mean.
   4387 
   4388    #include zlib.h
   4389    png_set_compression_strategy(png_ptr,
   4390        strategy);
   4391 
   4392    png_set_compression_window_bits(png_ptr,
   4393        window_bits);
   4394 
   4395    png_set_compression_method(png_ptr, method);
   4396 
   4397 This controls the size of the IDAT chunks (default 8192):
   4398 
   4399    png_set_compression_buffer_size(png_ptr, size);
   4400 
   4401 As of libpng version 1.5.4, additional APIs became
   4402 available to set these separately for non-IDAT
   4403 compressed chunks such as zTXt, iTXt, and iCCP:
   4404 
   4405    #include zlib.h
   4406    #if PNG_LIBPNG_VER >= 10504
   4407    png_set_text_compression_level(png_ptr, level);
   4408 
   4409    png_set_text_compression_mem_level(png_ptr, level);
   4410 
   4411    png_set_text_compression_strategy(png_ptr,
   4412        strategy);
   4413 
   4414    png_set_text_compression_window_bits(png_ptr,
   4415        window_bits);
   4416 
   4417    png_set_text_compression_method(png_ptr, method);
   4418    #endif
   4419 
   4420 Controlling row filtering
   4421 
   4422 If you want to control whether libpng uses filtering or not, which
   4423 filters are used, and how it goes about picking row filters, you
   4424 can call one of these functions.  The selection and configuration
   4425 of row filters can have a significant impact on the size and
   4426 encoding speed and a somewhat lesser impact on the decoding speed
   4427 of an image.  Filtering is enabled by default for RGB and grayscale
   4428 images (with and without alpha), but not for paletted images nor
   4429 for any images with bit depths less than 8 bits/pixel.
   4430 
   4431 The 'method' parameter sets the main filtering method, which is
   4432 currently only '0' in the PNG 1.2 specification.  The 'filters'
   4433 parameter sets which filter(s), if any, should be used for each
   4434 scanline.  Possible values are PNG_ALL_FILTERS, PNG_NO_FILTERS,
   4435 or PNG_FAST_FILTERS to turn filtering on and off, or to turn on
   4436 just the fast-decoding subset of filters, respectively.
   4437 
   4438 Individual filter types are PNG_FILTER_NONE, PNG_FILTER_SUB,
   4439 PNG_FILTER_UP, PNG_FILTER_AVG, PNG_FILTER_PAETH, which can be bitwise
   4440 ORed together with '|' to specify one or more filters to use.
   4441 These filters are described in more detail in the PNG specification.
   4442 If you intend to change the filter type during the course of writing
   4443 the image, you should start with flags set for all of the filters
   4444 you intend to use so that libpng can initialize its internal
   4445 structures appropriately for all of the filter types.  (Note that this
   4446 means the first row must always be adaptively filtered, because libpng
   4447 currently does not allocate the filter buffers until png_write_row()
   4448 is called for the first time.)
   4449 
   4450    filters = PNG_NO_FILTERS;
   4451    filters = PNG_ALL_FILTERS;
   4452    filters = PNG_FAST_FILTERS;
   4453 
   4454    or
   4455 
   4456    filters = PNG_FILTER_NONE | PNG_FILTER_SUB |
   4457              PNG_FILTER_UP | PNG_FILTER_AVG |
   4458              PNG_FILTER_PAETH;
   4459 
   4460    png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE,
   4461       filters);
   4462 
   4463              The second parameter can also be
   4464              PNG_INTRAPIXEL_DIFFERENCING if you are
   4465              writing a PNG to be embedded in a MNG
   4466              datastream.  This parameter must be the
   4467              same as the value of filter_method used
   4468              in png_set_IHDR().
   4469 
   4470 Requesting debug printout
   4471 
   4472 The macro definition PNG_DEBUG can be used to request debugging
   4473 printout.  Set it to an integer value in the range 0 to 3.  Higher
   4474 numbers result in increasing amounts of debugging information.  The
   4475 information is printed to the "stderr" file, unless another file
   4476 name is specified in the PNG_DEBUG_FILE macro definition.
   4477 
   4478 When PNG_DEBUG > 0, the following functions (macros) become available:
   4479 
   4480   png_debug(level, message)
   4481   png_debug1(level, message, p1)
   4482   png_debug2(level, message, p1, p2)
   4483 
   4484 in which "level" is compared to PNG_DEBUG to decide whether to print
   4485 the message, "message" is the formatted string to be printed,
   4486 and p1 and p2 are parameters that are to be embedded in the string
   4487 according to printf-style formatting directives.  For example,
   4488 
   4489   png_debug1(2, "foo=%d", foo);
   4490 
   4491 is expanded to
   4492 
   4493   if (PNG_DEBUG > 2)
   4494      fprintf(PNG_DEBUG_FILE, "foo=%d\n", foo);
   4495 
   4496 When PNG_DEBUG is defined but is zero, the macros aren't defined, but you
   4497 can still use PNG_DEBUG to control your own debugging:
   4498 
   4499   #ifdef PNG_DEBUG
   4500       fprintf(stderr, ...);
   4501   #endif
   4502 
   4503 When PNG_DEBUG = 1, the macros are defined, but only png_debug statements
   4504 having level = 0 will be printed.  There aren't any such statements in
   4505 this version of libpng, but if you insert some they will be printed.
   4506 
   4507 VII. MNG support
   4508 
   4509 The MNG specification (available at http://www.libpng.org/pub/mng) allows
   4510 certain extensions to PNG for PNG images that are embedded in MNG datastreams.
   4511 Libpng can support some of these extensions.  To enable them, use the
   4512 png_permit_mng_features() function:
   4513 
   4514   feature_set = png_permit_mng_features(png_ptr, mask)
   4515 
   4516   mask is a png_uint_32 containing the bitwise OR of the
   4517        features you want to enable.  These include
   4518        PNG_FLAG_MNG_EMPTY_PLTE
   4519        PNG_FLAG_MNG_FILTER_64
   4520        PNG_ALL_MNG_FEATURES
   4521 
   4522   feature_set is a png_uint_32 that is the bitwise AND of
   4523      your mask with the set of MNG features that is
   4524      supported by the version of libpng that you are using.
   4525 
   4526 It is an error to use this function when reading or writing a standalone
   4527 PNG file with the PNG 8-byte signature.  The PNG datastream must be wrapped
   4528 in a MNG datastream.  As a minimum, it must have the MNG 8-byte signature
   4529 and the MHDR and MEND chunks.  Libpng does not provide support for these
   4530 or any other MNG chunks; your application must provide its own support for
   4531 them.  You may wish to consider using libmng (available at
   4532 https://www.libmng.com/) instead.
   4533 
   4534 VIII. Changes to Libpng from version 0.88
   4535 
   4536 It should be noted that versions of libpng later than 0.96 are not
   4537 distributed by the original libpng author, Guy Schalnat, nor by
   4538 Andreas Dilger, who had taken over from Guy during 1996 and 1997, and
   4539 distributed versions 0.89 through 0.96, but rather by another member
   4540 of the original PNG Group, Glenn Randers-Pehrson.  Guy and Andreas are
   4541 still alive and well, but they have moved on to other things.
   4542 
   4543 The old libpng functions png_read_init(), png_write_init(),
   4544 png_info_init(), png_read_destroy(), and png_write_destroy() have been
   4545 moved to PNG_INTERNAL in version 0.95 to discourage their use.  These
   4546 functions will be removed from libpng version 1.4.0.
   4547 
   4548 The preferred method of creating and initializing the libpng structures is
   4549 via the png_create_read_struct(), png_create_write_struct(), and
   4550 png_create_info_struct() because they isolate the size of the structures
   4551 from the application, allow version error checking, and also allow the
   4552 use of custom error handling routines during the initialization, which
   4553 the old functions do not.  The functions png_read_destroy() and
   4554 png_write_destroy() do not actually free the memory that libpng
   4555 allocated for these structs, but just reset the data structures, so they
   4556 can be used instead of png_destroy_read_struct() and
   4557 png_destroy_write_struct() if you feel there is too much system overhead
   4558 allocating and freeing the png_struct for each image read.
   4559 
   4560 Setting the error callbacks via png_set_message_fn() before
   4561 png_read_init() as was suggested in libpng-0.88 is no longer supported
   4562 because this caused applications that do not use custom error functions
   4563 to fail if the png_ptr was not initialized to zero.  It is still possible
   4564 to set the error callbacks AFTER png_read_init(), or to change them with
   4565 png_set_error_fn(), which is essentially the same function, but with a new
   4566 name to force compilation errors with applications that try to use the old
   4567 method.
   4568 
   4569 Support for the sCAL, iCCP, iTXt, and sPLT chunks was added at libpng-1.0.6;
   4570 however, iTXt support was not enabled by default.
   4571 
   4572 Starting with version 1.0.7, you can find out which version of the library
   4573 you are using at run-time:
   4574 
   4575   png_uint_32 libpng_vn = png_access_version_number();
   4576 
   4577 The number libpng_vn is constructed from the major version, minor
   4578 version with leading zero, and release number with leading zero,
   4579 (e.g., libpng_vn for version 1.0.7 is 10007).
   4580 
   4581 Note that this function does not take a png_ptr, so you can call it
   4582 before you've created one.
   4583 
   4584 You can also check which version of png.h you used when compiling your
   4585 application:
   4586 
   4587   png_uint_32 application_vn = PNG_LIBPNG_VER;
   4588 
   4589 IX. Changes to Libpng from version 1.0.x to 1.2.x
   4590 
   4591 Support for user memory management was enabled by default.  To
   4592 accomplish this, the functions png_create_read_struct_2(),
   4593 png_create_write_struct_2(), png_set_mem_fn(), png_get_mem_ptr(),
   4594 png_malloc_default(), and png_free_default() were added.
   4595 
   4596 Support for the iTXt chunk has been enabled by default as of
   4597 version 1.2.41.
   4598 
   4599 Support for certain MNG features was enabled.
   4600 
   4601 Support for numbered error messages was added.  However, we never got
   4602 around to actually numbering the error messages.  The function
   4603 png_set_strip_error_numbers() was added (Note: the prototype for this
   4604 function was inadvertently removed from png.h in PNG_NO_ASSEMBLER_CODE
   4605 builds of libpng-1.2.15.  It was restored in libpng-1.2.36).
   4606 
   4607 The png_malloc_warn() function was added at libpng-1.2.3.  This issues
   4608 a png_warning and returns NULL instead of aborting when it fails to
   4609 acquire the requested memory allocation.
   4610 
   4611 Support for setting user limits on image width and height was enabled
   4612 by default.  The functions png_set_user_limits(), png_get_user_width_max(),
   4613 and png_get_user_height_max() were added at libpng-1.2.6.
   4614 
   4615 The png_set_add_alpha() function was added at libpng-1.2.7.
   4616 
   4617 The function png_set_expand_gray_1_2_4_to_8() was added at libpng-1.2.9.
   4618 Unlike png_set_gray_1_2_4_to_8(), the new function does not expand the
   4619 tRNS chunk to alpha. The png_set_gray_1_2_4_to_8() function is
   4620 deprecated.
   4621 
   4622 A number of macro definitions in support of runtime selection of
   4623 assembler code features (especially Intel MMX code support) were
   4624 added at libpng-1.2.0:
   4625 
   4626    PNG_ASM_FLAG_MMX_SUPPORT_COMPILED
   4627    PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU
   4628    PNG_ASM_FLAG_MMX_READ_COMBINE_ROW
   4629    PNG_ASM_FLAG_MMX_READ_INTERLACE
   4630    PNG_ASM_FLAG_MMX_READ_FILTER_SUB
   4631    PNG_ASM_FLAG_MMX_READ_FILTER_UP
   4632    PNG_ASM_FLAG_MMX_READ_FILTER_AVG
   4633    PNG_ASM_FLAG_MMX_READ_FILTER_PAETH
   4634    PNG_ASM_FLAGS_INITIALIZED
   4635    PNG_MMX_READ_FLAGS
   4636    PNG_MMX_FLAGS
   4637    PNG_MMX_WRITE_FLAGS
   4638    PNG_MMX_FLAGS
   4639 
   4640 We added the following functions in support of runtime
   4641 selection of assembler code features:
   4642 
   4643    png_get_mmx_flagmask()
   4644    png_set_mmx_thresholds()
   4645    png_get_asm_flags()
   4646    png_get_mmx_bitdepth_threshold()
   4647    png_get_mmx_rowbytes_threshold()
   4648    png_set_asm_flags()
   4649 
   4650 We replaced all of these functions with simple stubs in libpng-1.2.20,
   4651 when the Intel assembler code was removed due to a licensing issue.
   4652 
   4653 These macros are deprecated:
   4654 
   4655    PNG_READ_TRANSFORMS_NOT_SUPPORTED
   4656    PNG_PROGRESSIVE_READ_NOT_SUPPORTED
   4657    PNG_NO_SEQUENTIAL_READ_SUPPORTED
   4658    PNG_WRITE_TRANSFORMS_NOT_SUPPORTED
   4659    PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED
   4660    PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED
   4661 
   4662 They have been replaced, respectively, by:
   4663 
   4664    PNG_NO_READ_TRANSFORMS
   4665    PNG_NO_PROGRESSIVE_READ
   4666    PNG_NO_SEQUENTIAL_READ
   4667    PNG_NO_WRITE_TRANSFORMS
   4668    PNG_NO_READ_ANCILLARY_CHUNKS
   4669    PNG_NO_WRITE_ANCILLARY_CHUNKS
   4670 
   4671 PNG_MAX_UINT was replaced with PNG_UINT_31_MAX.  It has been
   4672 deprecated since libpng-1.0.16 and libpng-1.2.6.
   4673 
   4674 The function
   4675    png_check_sig(sig, num)
   4676 was replaced with
   4677    png_sig_cmp(sig, 0, num) == 0
   4678 It has been deprecated since libpng-0.90.
   4679 
   4680 The function
   4681    png_set_gray_1_2_4_to_8()
   4682 which also expands tRNS to alpha was replaced with
   4683    png_set_expand_gray_1_2_4_to_8()
   4684 which does not. It has been deprecated since libpng-1.0.18 and 1.2.9.
   4685 
   4686 X. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x
   4687 
   4688 Private libpng prototypes and macro definitions were moved from
   4689 png.h and pngconf.h into a new pngpriv.h header file.
   4690 
   4691 Functions png_set_benign_errors(), png_benign_error(), and
   4692 png_chunk_benign_error() were added.
   4693 
   4694 Support for setting the maximum amount of memory that the application
   4695 will allocate for reading chunks was added, as a security measure.
   4696 The functions png_set_chunk_cache_max() and png_get_chunk_cache_max()
   4697 were added to the library.
   4698 
   4699 We implemented support for I/O states by adding png_ptr member io_state
   4700 and functions png_get_io_chunk_name() and png_get_io_state() in pngget.c
   4701 
   4702 We added PNG_TRANSFORM_GRAY_TO_RGB to the available high-level
   4703 input transforms.
   4704 
   4705 Checking for and reporting of errors in the IHDR chunk is more thorough.
   4706 
   4707 Support for global arrays was removed, to improve thread safety.
   4708 
   4709 Some obsolete/deprecated macros and functions have been removed.
   4710 
   4711 Typecasted NULL definitions such as
   4712   #define png_voidp_NULL            (png_voidp)NULL
   4713 were eliminated.  If you used these in your application, just use
   4714 NULL instead.
   4715 
   4716 The png_struct and info_struct members "trans" and "trans_values" were
   4717 changed to "trans_alpha" and "trans_color", respectively.
   4718 
   4719 The obsolete, unused pnggccrd.c and pngvcrd.c files and related makefiles
   4720 were removed.
   4721 
   4722 The PNG_1_0_X and PNG_1_2_X macros were eliminated.
   4723 
   4724 The PNG_LEGACY_SUPPORTED macro was eliminated.
   4725 
   4726 Many WIN32_WCE #ifdefs were removed.
   4727 
   4728 The functions png_read_init(info_ptr), png_write_init(info_ptr),
   4729 png_info_init(info_ptr), png_read_destroy(), and png_write_destroy()
   4730 have been removed.  They have been deprecated since libpng-0.95.
   4731 
   4732 The png_permit_empty_plte() was removed. It has been deprecated
   4733 since libpng-1.0.9.  Use png_permit_mng_features() instead.
   4734 
   4735 We removed the obsolete stub functions png_get_mmx_flagmask(),
   4736 png_set_mmx_thresholds(), png_get_asm_flags(),
   4737 png_get_mmx_bitdepth_threshold(), png_get_mmx_rowbytes_threshold(),
   4738 png_set_asm_flags(), and png_mmx_supported()
   4739 
   4740 We removed the obsolete png_check_sig(), png_memcpy_check(), and
   4741 png_memset_check() functions.  Instead use png_sig_cmp() == 0,
   4742 memcpy(), and memset(), respectively.
   4743 
   4744 The function png_set_gray_1_2_4_to_8() was removed. It has been
   4745 deprecated since libpng-1.0.18 and 1.2.9, when it was replaced with
   4746 png_set_expand_gray_1_2_4_to_8() because the former function also
   4747 expanded any tRNS chunk to an alpha channel.
   4748 
   4749 Macros for png_get_uint_16, png_get_uint_32, and png_get_int_32
   4750 were added and are used by default instead of the corresponding
   4751 functions. Unfortunately,
   4752 from libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
   4753 function) incorrectly returned a value of type png_uint_32.
   4754 
   4755 We changed the prototype for png_malloc() from
   4756    png_malloc(png_structp png_ptr, png_uint_32 size)
   4757 to
   4758    png_malloc(png_structp png_ptr, png_alloc_size_t size)
   4759 
   4760 This also applies to the prototype for the user replacement malloc_fn().
   4761 
   4762 The png_calloc() function was added and is used in place of
   4763 of "png_malloc(); memset();" except in the case in png_read_png()
   4764 where the array consists of pointers; in this case a "for" loop is used
   4765 after the png_malloc() to set the pointers to NULL, to give robust.
   4766 behavior in case the application runs out of memory part-way through
   4767 the process.
   4768 
   4769 We changed the prototypes of png_get_compression_buffer_size() and
   4770 png_set_compression_buffer_size() to work with size_t instead of
   4771 png_uint_32.
   4772 
   4773 Support for numbered error messages was removed by default, since we
   4774 never got around to actually numbering the error messages. The function
   4775 png_set_strip_error_numbers() was removed from the library by default.
   4776 
   4777 The png_zalloc() and png_zfree() functions are no longer exported.
   4778 The png_zalloc() function no longer zeroes out the memory that it
   4779 allocates.  Applications that called png_zalloc(png_ptr, number, size)
   4780 can call png_calloc(png_ptr, number*size) instead, and can call
   4781 png_free() instead of png_zfree().
   4782 
   4783 Support for dithering was disabled by default in libpng-1.4.0, because
   4784 it has not been well tested and doesn't actually "dither".
   4785 The code was not
   4786 removed, however, and could be enabled by building libpng with
   4787 PNG_READ_DITHER_SUPPORTED defined.  In libpng-1.4.2, this support
   4788 was re-enabled, but the function was renamed png_set_quantize() to
   4789 reflect more accurately what it actually does.  At the same time,
   4790 the PNG_DITHER_[RED,GREEN_BLUE]_BITS macros were also renamed to
   4791 PNG_QUANTIZE_[RED,GREEN,BLUE]_BITS, and PNG_READ_DITHER_SUPPORTED
   4792 was renamed to PNG_READ_QUANTIZE_SUPPORTED.
   4793 
   4794 We removed the trailing '.' from the warning and error messages.
   4795 
   4796 XI. Changes to Libpng from version 1.4.x to 1.5.x
   4797 
   4798 From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
   4799 function) incorrectly returned a value of type png_uint_32.
   4800 The incorrect macro was removed from libpng-1.4.5.
   4801 
   4802 Checking for invalid palette index on write was added at libpng
   4803 1.5.10.  If a pixel contains an invalid (out-of-range) index libpng issues
   4804 a benign error.  This is enabled by default because this condition is an
   4805 error according to the PNG specification, Clause 11.3.2, but the error can
   4806 be ignored in each png_ptr with
   4807 
   4808   png_set_check_for_invalid_index(png_ptr, allowed);
   4809 
   4810      allowed  - one of
   4811                 0: disable benign error (accept the
   4812                    invalid data without warning).
   4813                 1: enable benign error (treat the
   4814                    invalid data as an error or a
   4815                    warning).
   4816 
   4817 If the error is ignored, or if png_benign_error() treats it as a warning,
   4818 any invalid pixels are decoded as opaque black by the decoder and written
   4819 as-is by the encoder.
   4820 
   4821 Retrieving the maximum palette index found was added at libpng-1.5.15.
   4822 This statement must appear after png_read_png() or png_read_image() while
   4823 reading, and after png_write_png() or png_write_image() while writing.
   4824 
   4825   int max_palette = png_get_palette_max(png_ptr, info_ptr);
   4826 
   4827 This will return the maximum palette index found in the image, or "-1" if
   4828 the palette was not checked, or "0" if no palette was found.  Note that this
   4829 does not account for any palette index used by ancillary chunks such as the
   4830 bKGD chunk; you must check those separately to determine the maximum
   4831 palette index actually used.
   4832 
   4833 There are no substantial API changes between the non-deprecated parts of
   4834 the 1.4.5 API and the 1.5.0 API; however, the ability to directly access
   4835 members of the main libpng control structures, png_struct and png_info,
   4836 deprecated in earlier versions of libpng, has been completely removed from
   4837 libpng 1.5, and new private "pngstruct.h", "pnginfo.h", and "pngdebug.h"
   4838 header files were created.
   4839 
   4840 We no longer include zlib.h in png.h.  The include statement has been moved
   4841 to pngstruct.h, where it is not accessible by applications. Applications that
   4842 need access to information in zlib.h will need to add the '#include "zlib.h"'
   4843 directive.  It does not matter whether this is placed prior to or after
   4844 the '"#include png.h"' directive.
   4845 
   4846 The png_sprintf(), png_strcpy(), and png_strncpy() macros are no longer used
   4847 and were removed.
   4848 
   4849 We moved the png_strlen(), png_memcpy(), png_memset(), and png_memcmp()
   4850 macros into a private header file (pngpriv.h) that is not accessible to
   4851 applications.
   4852 
   4853 In png_get_iCCP, the type of "profile" was changed from png_charpp
   4854 to png_bytepp, and in png_set_iCCP, from png_charp to png_const_bytep.
   4855 
   4856 There are changes of form in png.h, including new and changed macros to
   4857 declare parts of the API.  Some API functions with arguments that are
   4858 pointers to data not modified within the function have been corrected to
   4859 declare these arguments with const.
   4860 
   4861 Much of the internal use of C macros to control the library build has also
   4862 changed and some of this is visible in the exported header files, in
   4863 particular the use of macros to control data and API elements visible
   4864 during application compilation may require significant revision to
   4865 application code.  (It is extremely rare for an application to do this.)
   4866 
   4867 Any program that compiled against libpng 1.4 and did not use deprecated
   4868 features or access internal library structures should compile and work
   4869 against libpng 1.5, except for the change in the prototype for
   4870 png_get_iCCP() and png_set_iCCP() API functions mentioned above.
   4871 
   4872 libpng 1.5.0 adds PNG_ PASS macros to help in the reading and writing of
   4873 interlaced images.  The macros return the number of rows and columns in
   4874 each pass and information that can be used to de-interlace and (if
   4875 absolutely necessary) interlace an image.
   4876 
   4877 libpng 1.5.0 adds an API png_longjmp(png_ptr, value).  This API calls
   4878 the application-provided png_longjmp_ptr on the internal, but application
   4879 initialized, longjmp buffer.  It is provided as a convenience to avoid
   4880 the need to use the png_jmpbuf macro, which had the unnecessary side
   4881 effect of resetting the internal png_longjmp_ptr value.
   4882 
   4883 libpng 1.5.0 includes a complete fixed point API.  By default this is
   4884 present along with the corresponding floating point API.  In general the
   4885 fixed point API is faster and smaller than the floating point one because
   4886 the PNG file format used fixed point, not floating point.  This applies
   4887 even if the library uses floating point in internal calculations.  A new
   4888 macro, PNG_FLOATING_ARITHMETIC_SUPPORTED, reveals whether the library
   4889 uses floating point arithmetic (the default) or fixed point arithmetic
   4890 internally for performance critical calculations such as gamma correction.
   4891 In some cases, the gamma calculations may produce slightly different
   4892 results.  This has changed the results in png_rgb_to_gray and in alpha
   4893 composition (png_set_background for example). This applies even if the
   4894 original image was already linear (gamma == 1.0) and, therefore, it is
   4895 not necessary to linearize the image.  This is because libpng has *not*
   4896 been changed to optimize that case correctly, yet.
   4897 
   4898 Fixed point support for the sCAL chunk comes with an important caveat;
   4899 the sCAL specification uses a decimal encoding of floating point values
   4900 and the accuracy of PNG fixed point values is insufficient for
   4901 representation of these values. Consequently a "string" API
   4902 (png_get_sCAL_s and png_set_sCAL_s) is the only reliable way of reading
   4903 arbitrary sCAL chunks in the absence of either the floating point API or
   4904 internal floating point calculations.  Starting with libpng-1.5.0, both
   4905 of these functions are present when PNG_sCAL_SUPPORTED is defined.  Prior
   4906 to libpng-1.5.0, their presence also depended upon PNG_FIXED_POINT_SUPPORTED
   4907 being defined and PNG_FLOATING_POINT_SUPPORTED not being defined.
   4908 
   4909 Applications no longer need to include the optional distribution header
   4910 file pngusr.h or define the corresponding macros during application
   4911 build in order to see the correct variant of the libpng API.  From 1.5.0
   4912 application code can check for the corresponding _SUPPORTED macro:
   4913 
   4914 #ifdef PNG_INCH_CONVERSIONS_SUPPORTED
   4915   /* code that uses the inch conversion APIs. */
   4916 #endif
   4917 
   4918 This macro will only be defined if the inch conversion functions have been
   4919 compiled into libpng.  The full set of macros, and whether or not support
   4920 has been compiled in, are available in the header file pnglibconf.h.
   4921 This header file is specific to the libpng build.  Notice that prior to
   4922 1.5.0 the _SUPPORTED macros would always have the default definition unless
   4923 reset by pngusr.h or by explicit settings on the compiler command line.
   4924 These settings may produce compiler warnings or errors in 1.5.0 because
   4925 of macro redefinition.
   4926 
   4927 Applications can now choose whether to use these macros or to call the
   4928 corresponding function by defining PNG_USE_READ_MACROS or
   4929 PNG_NO_USE_READ_MACROS before including png.h.  Notice that this is
   4930 only supported from 1.5.0; defining PNG_NO_USE_READ_MACROS prior to 1.5.0
   4931 will lead to a link failure.
   4932 
   4933 Prior to libpng-1.5.4, the zlib compressor used the same set of parameters
   4934 when compressing the IDAT data and textual data such as zTXt and iCCP.
   4935 In libpng-1.5.4 we reinitialized the zlib stream for each type of data.
   4936 We added five png_set_text_*() functions for setting the parameters to
   4937 use with textual data.
   4938 
   4939 Prior to libpng-1.5.4, the PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
   4940 option was off by default, and slightly inaccurate scaling occurred.
   4941 This option can no longer be turned off, and the choice of accurate
   4942 or inaccurate 16-to-8 scaling is by using the new png_set_scale_16_to_8()
   4943 API for accurate scaling or the old png_set_strip_16_to_8() API for simple
   4944 chopping.  In libpng-1.5.4, the PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
   4945 macro became PNG_READ_SCALE_16_TO_8_SUPPORTED, and the PNG_READ_16_TO_8
   4946 macro became PNG_READ_STRIP_16_TO_8_SUPPORTED, to enable the two
   4947 png_set_*_16_to_8() functions separately.
   4948 
   4949 Prior to libpng-1.5.4, the png_set_user_limits() function could only be
   4950 used to reduce the width and height limits from the value of
   4951 PNG_USER_WIDTH_MAX and PNG_USER_HEIGHT_MAX, although this document said
   4952 that it could be used to override them.  Now this function will reduce or
   4953 increase the limits.
   4954 
   4955 Starting in libpng-1.5.22, default user limits were established. These
   4956 can be overridden by application calls to png_set_user_limits(),
   4957 png_set_user_chunk_cache_max(), and/or png_set_user_malloc_max().
   4958 The limits are now
   4959                             max possible  default
   4960   png_user_width_max        0x7fffffff    1,000,000
   4961   png_user_height_max       0x7fffffff    1,000,000
   4962   png_user_chunk_cache_max  0 (unlimited) 1000
   4963   png_user_chunk_malloc_max 0 (unlimited) 8,000,000
   4964 
   4965 The png_set_option() function (and the "options" member of the png struct) was
   4966 added to libpng-1.5.15, with option PNG_ARM_NEON.
   4967 
   4968 The library now supports a complete fixed point implementation and can
   4969 thus be used on systems that have no floating point support or very
   4970 limited or slow support.  Previously gamma correction, an essential part
   4971 of complete PNG support, required reasonably fast floating point.
   4972 
   4973 As part of this the choice of internal implementation has been made
   4974 independent of the choice of fixed versus floating point APIs and all the
   4975 missing fixed point APIs have been implemented.
   4976 
   4977 The exact mechanism used to control attributes of API functions has
   4978 changed, as described in the INSTALL file.
   4979 
   4980 A new test program, pngvalid, is provided in addition to pngtest.
   4981 pngvalid validates the arithmetic accuracy of the gamma correction
   4982 calculations and includes a number of validations of the file format.
   4983 A subset of the full range of tests is run when "make check" is done
   4984 (in the 'configure' build.)  pngvalid also allows total allocated memory
   4985 usage to be evaluated and performs additional memory overwrite validation.
   4986 
   4987 Many changes to individual feature macros have been made. The following
   4988 are the changes most likely to be noticed by library builders who
   4989 configure libpng:
   4990 
   4991 1) All feature macros now have consistent naming:
   4992 
   4993 #define PNG_NO_feature turns the feature off
   4994 #define PNG_feature_SUPPORTED turns the feature on
   4995 
   4996 pnglibconf.h contains one line for each feature macro which is either:
   4997 
   4998 #define PNG_feature_SUPPORTED
   4999 
   5000 if the feature is supported or:
   5001 
   5002 /*#undef PNG_feature_SUPPORTED*/
   5003 
   5004 if it is not.  Library code consistently checks for the 'SUPPORTED' macro.
   5005 It does not, and libpng applications should not, check for the 'NO' macro
   5006 which will not normally be defined even if the feature is not supported.
   5007 The 'NO' macros are only used internally for setting or not setting the
   5008 corresponding 'SUPPORTED' macros.
   5009 
   5010 Compatibility with the old names is provided as follows:
   5011 
   5012 PNG_INCH_CONVERSIONS turns on PNG_INCH_CONVERSIONS_SUPPORTED
   5013 
   5014 And the following definitions disable the corresponding feature:
   5015 
   5016 PNG_SETJMP_NOT_SUPPORTED disables SETJMP
   5017 PNG_READ_TRANSFORMS_NOT_SUPPORTED disables READ_TRANSFORMS
   5018 PNG_NO_READ_COMPOSITED_NODIV disables READ_COMPOSITE_NODIV
   5019 PNG_WRITE_TRANSFORMS_NOT_SUPPORTED disables WRITE_TRANSFORMS
   5020 PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED disables READ_ANCILLARY_CHUNKS
   5021 PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED disables WRITE_ANCILLARY_CHUNKS
   5022 
   5023 Library builders should remove use of the above, inconsistent, names.
   5024 
   5025 2) Warning and error message formatting was previously conditional on
   5026 the STDIO feature. The library has been changed to use the
   5027 CONSOLE_IO feature instead. This means that if CONSOLE_IO is disabled
   5028 the library no longer uses the printf(3) functions, even though the
   5029 default read/write implementations use (FILE) style stdio.h functions.
   5030 
   5031 3) Three feature macros now control the fixed/floating point decisions:
   5032 
   5033 PNG_FLOATING_POINT_SUPPORTED enables the floating point APIs
   5034 
   5035 PNG_FIXED_POINT_SUPPORTED enables the fixed point APIs; however, in
   5036 practice these are normally required internally anyway (because the PNG
   5037 file format is fixed point), therefore in most cases PNG_NO_FIXED_POINT
   5038 merely stops the function from being exported.
   5039 
   5040 PNG_FLOATING_ARITHMETIC_SUPPORTED chooses between the internal floating
   5041 point implementation or the fixed point one.  Typically the fixed point
   5042 implementation is larger and slower than the floating point implementation
   5043 on a system that supports floating point; however, it may be faster on a
   5044 system which lacks floating point hardware and therefore uses a software
   5045 emulation.
   5046 
   5047 4) Added PNG_{READ,WRITE}_INT_FUNCTIONS_SUPPORTED.  This allows the
   5048 functions to read and write ints to be disabled independently of
   5049 PNG_USE_READ_MACROS, which allows libpng to be built with the functions
   5050 even though the default is to use the macros - this allows applications
   5051 to choose at app buildtime whether or not to use macros (previously
   5052 impossible because the functions weren't in the default build.)
   5053 
   5054 XII. Changes to Libpng from version 1.5.x to 1.6.x
   5055 
   5056 A "simplified API" has been added (see documentation in png.h and a simple
   5057 example in contrib/examples/pngtopng.c).  The new publicly visible API
   5058 includes the following:
   5059 
   5060   macros:
   5061     PNG_FORMAT_*
   5062     PNG_IMAGE_*
   5063   structures:
   5064     png_control
   5065     png_image
   5066   read functions
   5067     png_image_begin_read_from_file()
   5068     png_image_begin_read_from_stdio()
   5069     png_image_begin_read_from_memory()
   5070     png_image_finish_read()
   5071     png_image_free()
   5072   write functions
   5073     png_image_write_to_file()
   5074     png_image_write_to_memory()
   5075     png_image_write_to_stdio()
   5076 
   5077 Starting with libpng-1.6.0, you can configure libpng to prefix all exported
   5078 symbols, using the PNG_PREFIX macro.
   5079 
   5080 We no longer include string.h in png.h.  The include statement has been moved
   5081 to pngpriv.h, where it is not accessible by applications.  Applications that
   5082 need access to information in string.h must add an '#include <string.h>'
   5083 directive.  It does not matter whether this is placed prior to or after
   5084 the '#include "png.h"' directive.
   5085 
   5086 The following API are now DEPRECATED:
   5087   png_info_init_3()
   5088   png_convert_to_rfc1123() which has been replaced
   5089     with png_convert_to_rfc1123_buffer()
   5090   png_malloc_default()
   5091   png_free_default()
   5092   png_reset_zstream()
   5093 
   5094 The following have been removed:
   5095   png_get_io_chunk_name(), which has been replaced
   5096     with png_get_io_chunk_type().  The new
   5097     function returns a 32-bit integer instead of
   5098     a string.
   5099   The png_sizeof(), png_strlen(), png_memcpy(), png_memcmp(), and
   5100     png_memset() macros are no longer used in the libpng sources and
   5101     have been removed.  These had already been made invisible to applications
   5102     (i.e., defined in the private pngpriv.h header file) since libpng-1.5.0.
   5103 
   5104 The signatures of many exported functions were changed, such that
   5105   png_structp became png_structrp or png_const_structrp
   5106   png_infop became png_inforp or png_const_inforp
   5107 where "rp" indicates a "restricted pointer".
   5108 
   5109 Dropped support for 16-bit platforms. The support for FAR/far types has
   5110 been eliminated and the definition of png_alloc_size_t is now controlled
   5111 by a flag so that 'small size_t' systems can select it if necessary.
   5112 
   5113 Error detection in some chunks has improved; in particular the iCCP chunk
   5114 reader now does pretty complete validation of the basic format.  Some bad
   5115 profiles that were previously accepted are now accepted with a warning or
   5116 rejected, depending upon the png_set_benign_errors() setting, in particular
   5117 the very old broken Microsoft/HP 3144-byte sRGB profile.  Starting with
   5118 libpng-1.6.11, recognizing and checking sRGB profiles can be avoided by
   5119 means of
   5120 
   5121    #if defined(PNG_SKIP_sRGB_CHECK_PROFILE) && \
   5122        defined(PNG_SET_OPTION_SUPPORTED)
   5123       png_set_option(png_ptr, PNG_SKIP_sRGB_CHECK_PROFILE,
   5124           PNG_OPTION_ON);
   5125    #endif
   5126 
   5127 It's not a good idea to do this if you are using the "simplified API",
   5128 which needs to be able to recognize sRGB profiles conveyed via the iCCP
   5129 chunk.
   5130 
   5131 The PNG spec requirement that only grayscale profiles may appear in images
   5132 with color type 0 or 4 and that even if the image only contains gray pixels,
   5133 only RGB profiles may appear in images with color type 2, 3, or 6, is now
   5134 enforced.  The sRGB chunk is allowed to appear in images with any color type
   5135 and is interpreted by libpng to convey a one-tracer-curve gray profile or a
   5136 three-tracer-curve RGB profile as appropriate.
   5137 
   5138 Libpng 1.5.x erroneously used /MD for Debug DLL builds; if you used the debug
   5139 builds in your app and you changed your app to use /MD you will need to
   5140 change it back to /MDd for libpng 1.6.x.
   5141 
   5142 Prior to libpng-1.6.0 a warning would be issued if the iTXt chunk contained
   5143 an empty language field or an empty translated keyword.  Both of these
   5144 are allowed by the PNG specification, so these warnings are no longer issued.
   5145 
   5146 The library now issues an error if the application attempts to set a
   5147 transform after it calls png_read_update_info() or if it attempts to call
   5148 both png_read_update_info() and png_start_read_image() or to call either
   5149 of them more than once.
   5150 
   5151 The default condition for benign_errors is now to treat benign errors as
   5152 warnings while reading and as errors while writing.
   5153 
   5154 The library now issues a warning if both background processing and RGB to
   5155 gray are used when gamma correction happens. As with previous versions of
   5156 the library the results are numerically very incorrect in this case.
   5157 
   5158 There are some minor arithmetic changes in some transforms such as
   5159 png_set_background(), that might be detected by certain regression tests.
   5160 
   5161 Unknown chunk handling has been improved internally, without any API change.
   5162 This adds more correct option control of the unknown handling, corrects
   5163 a pre-existing bug where the per-chunk 'keep' setting is ignored, and makes
   5164 it possible to skip IDAT chunks in the sequential reader.
   5165 
   5166 The machine-generated configure files are no longer included in branches
   5167 libpng17 and later of the GIT repository.  They continue to be included
   5168 in the tarball releases, however.
   5169 
   5170 Libpng-1.6.0 through 1.6.2 used the CMF bytes at the beginning of the IDAT
   5171 stream to set the size of the sliding window for reading instead of using the
   5172 default 32-kbyte sliding window size.  It was discovered that there are
   5173 hundreds of PNG files in the wild that have incorrect CMF bytes that caused
   5174 zlib to issue the "invalid distance too far back" error and reject the file.
   5175 Libpng-1.6.3 and later calculate their own safe CMF from the image dimensions,
   5176 provide a way to revert to the libpng-1.5.x behavior (ignoring the CMF bytes
   5177 and using a 32-kbyte sliding window), by using
   5178 
   5179    png_set_option(png_ptr, PNG_MAXIMUM_INFLATE_WINDOW,
   5180        PNG_OPTION_ON);
   5181 
   5182 and provide a tool (contrib/tools/pngfix) for rewriting a PNG file while
   5183 optimizing the CMF bytes in its IDAT chunk correctly.
   5184 
   5185 Libpng-1.6.0 and libpng-1.6.1 wrote uncompressed iTXt chunks with the wrong
   5186 length, which resulted in PNG files that cannot be read beyond the bad iTXt
   5187 chunk.  This error was fixed in libpng-1.6.3, and a tool (called
   5188 contrib/tools/png-fix-itxt) has been added to the libpng distribution.
   5189 
   5190 Starting with libpng-1.6.17, the PNG_SAFE_LIMITS macro was eliminated
   5191 and safe limits are used by default (users who need larger limits
   5192 can still override them at compile time or run time, as described above).
   5193 
   5194 The new limits are
   5195                                default   spec limit
   5196   png_user_width_max         1,000,000  2,147,483,647
   5197   png_user_height_max        1,000,000  2,147,483,647
   5198   png_user_chunk_cache_max         128  unlimited
   5199   png_user_chunk_malloc_max  8,000,000  unlimited
   5200 
   5201 Starting with libpng-1.6.18, a PNG_RELEASE_BUILD macro was added, which allows
   5202 library builders to control compilation for an installed system (a release build).
   5203 It can be set for testing debug or beta builds to ensure that they will compile
   5204 when the build type is switched to RC or STABLE. In essence this overrides the
   5205 PNG_LIBPNG_BUILD_BASE_TYPE definition which is not directly user controllable.
   5206 
   5207 Starting with libpng-1.6.19, attempting to set an over-length PLTE chunk
   5208 is an error. Previously this requirement of the PNG specification was not
   5209 enforced, and the palette was always limited to 256 entries. An over-length
   5210 PLTE chunk found in an input PNG is silently truncated.
   5211 
   5212 Starting with libpng-1.6.31, the eXIf chunk is supported. Libpng does not
   5213 attempt to decode the Exif profile; it simply returns a byte array
   5214 containing the profile to the calling application which must do its own
   5215 decoding.
   5216 
   5217 XIII. Detecting libpng
   5218 
   5219 The png_get_io_ptr() function has been present since libpng-0.88, has never
   5220 changed, and is unaffected by conditional compilation macros.  It is the
   5221 best choice for use in configure scripts for detecting the presence of any
   5222 libpng version since 0.88.  In an autoconf "configure.in" you could use
   5223 
   5224    AC_CHECK_LIB(png, png_get_io_ptr, ...)
   5225 
   5226 XV. Source code repository
   5227 
   5228 Since about February 2009, version 1.2.34, libpng has been under "git" source
   5229 control.  The git repository was built from old libpng-x.y.z.tar.gz files
   5230 going back to version 0.70.  You can access the git repository (read only)
   5231 at
   5232 
   5233    https://github.com/pnggroup/libpng or
   5234    https://git.code.sf.net/p/libpng/code.git
   5235 
   5236 or you can browse it with a web browser at
   5237 
   5238    https://github.com/pnggroup/libpng or
   5239    https://sourceforge.net/p/libpng/code/ci/libpng16/tree/
   5240 
   5241 Patches can be sent to png-mng-implement at lists.sourceforge.net or
   5242 uploaded to the libpng bug tracker at
   5243 
   5244    https://libpng.sourceforge.io/
   5245 
   5246 or as a "pull request" to
   5247 
   5248    https://github.com/pnggroup/libpng/pulls
   5249 
   5250 We also accept patches built from the tar or zip distributions, and
   5251 simple verbal descriptions of bug fixes, reported either to the
   5252 SourceForge bug tracker, to the png-mng-implement at lists.sf.net
   5253 mailing list, as github issues.
   5254 
   5255 XV. Coding style
   5256 
   5257 Our coding style is similar to the "Allman" style
   5258 (See https://en.wikipedia.org/wiki/Indent_style#Allman_style), with curly
   5259 braces on separate lines:
   5260 
   5261    if (condition)
   5262    {
   5263       action;
   5264    }
   5265 
   5266    else if (another condition)
   5267    {
   5268       another action;
   5269    }
   5270 
   5271 The braces can be omitted from simple one-line actions:
   5272 
   5273    if (condition)
   5274       return 0;
   5275 
   5276 We use 3-space indentation, except for continued statements which
   5277 are usually indented the same as the first line of the statement
   5278 plus four more spaces.
   5279 
   5280 For macro definitions we use 2-space indentation, always leaving the "#"
   5281 in the first column.
   5282 
   5283    #ifndef PNG_NO_FEATURE
   5284    #  ifndef PNG_FEATURE_SUPPORTED
   5285    #    define PNG_FEATURE_SUPPORTED
   5286    #  endif
   5287    #endif
   5288 
   5289 Comments appear with the leading "/*" at the same indentation as
   5290 the statement that follows the comment:
   5291 
   5292    /* Single-line comment */
   5293    statement;
   5294 
   5295    /* This is a multiple-line
   5296     * comment.
   5297     */
   5298    statement;
   5299 
   5300 Very short comments can be placed after the end of the statement
   5301 to which they pertain:
   5302 
   5303    statement;    /* comment */
   5304 
   5305 We don't use C++ style ("//") comments. We have, however,
   5306 used them in the past in some now-abandoned MMX assembler
   5307 code.
   5308 
   5309 Functions and their curly braces are not indented, and
   5310 exported functions are marked with PNGAPI:
   5311 
   5312 /* This is a public function that is visible to
   5313  * application programmers. It does thus-and-so.
   5314  */
   5315 void PNGAPI
   5316 png_exported_function(png_ptr, png_info, foo)
   5317 {
   5318    body;
   5319 }
   5320 
   5321 The return type and decorations are placed on a separate line
   5322 ahead of the function name, as illustrated above.
   5323 
   5324 The prototypes for all exported functions appear in png.h,
   5325 above the comment that says
   5326 
   5327    /* Maintainer: Put new public prototypes here ... */
   5328 
   5329 We mark all non-exported functions with "/* PRIVATE */"":
   5330 
   5331 void /* PRIVATE */
   5332 png_non_exported_function(png_ptr, png_info, foo)
   5333 {
   5334    body;
   5335 }
   5336 
   5337 The prototypes for non-exported functions (except for those in
   5338 pngtest) appear in pngpriv.h above the comment that says
   5339 
   5340  /* Maintainer: Put new private prototypes here ^ */
   5341 
   5342 To avoid polluting the global namespace, the names of all exported
   5343 functions and variables begin with "png_", and all publicly visible C
   5344 preprocessor macros begin with "PNG".  We request that applications that
   5345 use libpng *not* begin any of their own symbols with either of these strings.
   5346 
   5347 We put a space after the "sizeof" operator and we omit the
   5348 optional parentheses around its argument when the argument
   5349 is an expression, not a type name, and we always enclose the
   5350 sizeof operator, with its argument, in parentheses:
   5351 
   5352  (sizeof (png_uint_32))
   5353  (sizeof array)
   5354 
   5355 Prior to libpng-1.6.0 we used a "png_sizeof()" macro, formatted as
   5356 though it were a function.
   5357 
   5358 Control keywords if, for, while, and switch are always followed by a space
   5359 to distinguish them from function calls, which have no trailing space.
   5360 
   5361 We put a space after each comma and after each semicolon
   5362 in "for" statements, and we put spaces before and after each
   5363 C binary operator and after "for" or "while", and before
   5364 "?".  We don't put a space between a typecast and the expression
   5365 being cast, nor do we put one between a function name and the
   5366 left parenthesis that follows it:
   5367 
   5368    for (i = 2; i > 0; --i)
   5369       y[i] = a(x) + (int)b;
   5370 
   5371 We prefer #ifdef and #ifndef to #if defined() and #if !defined()
   5372 when there is only one macro being tested.  We always use parentheses
   5373 with "defined".
   5374 
   5375 We express integer constants that are used as bit masks in hex format,
   5376 with an even number of lower-case hex digits, and to make them unsigned
   5377 (e.g., 0x00U, 0xffU, 0x0100U) and long if they are greater than 0x7fff
   5378 (e.g., 0xffffUL).
   5379 
   5380 We prefer to use underscores rather than camelCase in names, except
   5381 for a few type names that we inherit from zlib.h.
   5382 
   5383 We prefer "if (something != 0)" and "if (something == 0)" over
   5384 "if (something)" and if "(!something)", respectively, and for pointers
   5385 we prefer "if (some_pointer != NULL)" or "if (some_pointer == NULL)".
   5386 
   5387 We do not use the TAB character for indentation in the C sources.
   5388 
   5389 Lines do not exceed 80 characters.
   5390 
   5391 Other rules can be inferred by inspecting the libpng source.