home *** CD-ROM | disk | FTP | other *** search
/ Compressed Image File Formats / CompressedImageFileFormatsJohnMiano.iso / mac / Specs / png-1.1-pdg.txt < prev    next >
Text File  |  1999-02-12  |  249KB  |  5,183 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6. PNG Development Group                        G. Randers-Pehrson, et. al.
  7. PNG 1.1                                                     January 1999
  8.  
  9.  
  10.        PNG (Portable Network Graphics) Specification, Version 1.1
  11.  
  12. For list of authors, see Credits (Chapter 19).
  13.  
  14. Status of this Document
  15.  
  16.    This is a revision of the PNG 1.0 specification, which has been
  17.    published as RFC-2083 and as a W3C Recommendation.  The revision has
  18.    been released by the PNG Development Group but has not been approved
  19.    by any standards body.
  20.  
  21. Abstract
  22.  
  23.    This document describes PNG (Portable Network Graphics), an
  24.    extensible file format for the lossless, portable, well-compressed
  25.    storage of raster images.  PNG provides a patent-free replacement for
  26.    GIF and can also replace many common uses of TIFF.  Indexed-color,
  27.    grayscale, and truecolor images are supported, plus an optional alpha
  28.    channel.  Sample depths range from 1 to 16 bits.
  29.  
  30.    PNG is designed to work well in online viewing applications, such as
  31.    the World Wide Web, so it is fully streamable with a progressive
  32.    display option.  PNG is robust, providing both full file integrity
  33.    checking and simple detection of common transmission errors.  Also,
  34.    PNG can store gamma and chromaticity data for improved color matching
  35.    on heterogeneous platforms.
  36.  
  37.    This specification defines the Internet Media Type "image/png".
  38.  
  39. Table of Contents
  40.  
  41.    1. Introduction 
  42.    2. Data Representation 
  43.       2.1. Integers and byte order 
  44.       2.2. Color values 
  45.       2.3. Image layout 
  46.       2.4. Alpha channel 
  47.       2.5. Filtering 
  48.       2.6. Interlaced data order 
  49.       2.7. Gamma correction 
  50.       2.8. Text strings 
  51.    3. File Structure 
  52.       3.1. PNG file signature 
  53.       3.2. Chunk layout 
  54.       3.3. Chunk naming conventions 
  55.       3.4. CRC algorithm 
  56.    4. Chunk Specifications 
  57.       4.1. Critical chunks 
  58.           4.1.1. IHDR Image header 
  59.           4.1.2. PLTE Palette 
  60.           4.1.3. IDAT Image data 
  61.           4.1.4. IEND Image trailer 
  62.       4.2. Ancillary chunks 
  63.           4.2.1. bKGD Background color 
  64.           4.2.2. cHRM Primary chromaticities and white point 
  65.           4.2.3. gAMA Image gamma 
  66.           4.2.4. hIST Palette histogram 
  67.           4.2.5. iCCP Embedded ICC profile 
  68.           4.2.6. pHYs Physical pixel dimensions 
  69.           4.2.7. sBIT Significant bits 
  70.           4.2.8. sPLT Suggested palette 
  71.           4.2.9. sRGB Standard RGB color space 
  72.           4.2.10. tEXt Textual data 
  73.           4.2.11. tIME Image last-modification time 
  74.           4.2.12. tRNS Transparency 
  75.           4.2.13. zTXt Compressed textual data 
  76.       4.3. Summary of standard chunks 
  77.       4.4. Additional chunk types 
  78.    5. Deflate/Inflate Compression 
  79.    6. Filter Algorithms 
  80.       6.1. Filter types 
  81.       6.2. Filter type 0: None 
  82.       6.3. Filter type 1: Sub 
  83.       6.4. Filter type 2: Up 
  84.       6.5. Filter type 3: Average 
  85.       6.6. Filter type 4: Paeth 
  86.    7. Chunk Ordering Rules 
  87.       7.1. Behavior of PNG editors 
  88.       7.2. Ordering of ancillary chunks 
  89.       7.3. Ordering of critical chunks 
  90.    8. Miscellaneous Topics 
  91.       8.1. File name extension 
  92.       8.2. Internet media type 
  93.       8.3. Macintosh file layout 
  94.       8.4. Multiple-image extension 
  95.       8.5. Security considerations 
  96.    9. Recommendations for Encoders 
  97.       9.1. Sample depth scaling 
  98.       9.2. Encoder gamma handling 
  99.       9.3. Encoder color handling 
  100.       9.4. Alpha channel creation 
  101.       9.5. Suggested palettes 
  102.       9.6. Filter selection 
  103.       9.7. Text chunk processing 
  104.       9.8. Use of private chunks 
  105.       9.9. Private type and method codes 
  106.    10. Recommendations for Decoders 
  107.       10.1. Error checking 
  108.       10.2. Pixel dimensions 
  109.       10.3. Truecolor image handling 
  110.       10.4. Sample depth rescaling 
  111.       10.5. Decoder gamma handling 
  112.       10.6. Decoder color handling 
  113.       10.7. Background color 
  114.       10.8. Alpha channel processing 
  115.       10.9. Progressive display 
  116.       10.10. Suggested-palette and histogram usage 
  117.       10.11. Text chunk processing 
  118.    11. Glossary 
  119.    12. Appendix: Rationale 
  120.       12.1. Why a new file format? 
  121.       12.2. Why these features? 
  122.       12.3. Why not these features? 
  123.       12.4. Why not use format X? 
  124.       12.5. Byte order 
  125.       12.6. Interlacing 
  126.       12.7. Why gamma? 
  127.       12.8. Non-premultiplied alpha 
  128.       12.9. Filtering 
  129.       12.10. Text strings 
  130.       12.11. PNG file signature 
  131.       12.12. Chunk layout 
  132.       12.13. Chunk naming conventions 
  133.       12.14. Palette histograms 
  134.    13. Appendix: Gamma Tutorial 
  135.       13.1. Nonlinear transfer functions 
  136.       13.2. Combining exponents 
  137.       13.3. End-to-end exponent 
  138.       13.4. CRT exponent 
  139.       13.5. Gamma correction 
  140.       13.6. Benefits of gamma encoding 
  141.       13.7. General gamma handling 
  142.       13.8. Some specific examples 
  143.       13.9. Video camera transfer functions 
  144.       13.10. Further reading 
  145.    14. Appendix: Color Tutorial 
  146.       14.1. About chromaticity 
  147.       14.2. The problem of color 
  148.       14.3. Device-dependent color 
  149.       14.4. Device-independent color 
  150.       14.5. Calibrated device-dependent color 
  151.       14.6. Chromaticity and luminance 
  152.       14.7. Characterizing computer monitors 
  153.       14.8. Uses for XYZ 
  154.       14.9. Converting between RGB and XYZ 
  155.       14.10. Device gamut 
  156.       14.11. Further reading 
  157.    15. Appendix: Sample CRC Code 
  158.    16. Appendix: Online Resources 
  159.    17. Appendix: Revision History 
  160.    18. References 
  161.    19. Credits 
  162.  
  163. 1. Introduction
  164.  
  165.    The Portable Network Graphics (PNG) format provides a portable,
  166.    legally unencumbered, well-compressed, well-specified standard for
  167.    lossless bitmapped image files.
  168.  
  169.    Although the initial motivation for developing PNG was to replace GIF
  170.    (CompuServe's Graphics Interchange Format), the design provides some
  171.    useful new features not available in GIF, with minimal cost to
  172.    developers.
  173.  
  174.    GIF features retained in PNG include:
  175.  
  176.        * Indexed-color images of up to 256 colors.
  177.  
  178.        * Streamability: files can be read and written serially, thus
  179.          allowing the file format to be used as a communications
  180.          protocol for on-the-fly generation and display of images.
  181.  
  182.        * Progressive display: a suitably prepared image file can be
  183.          displayed as it is received over a communications link,
  184.          yielding a low-resolution image very quickly followed by
  185.          gradual improvement of detail.
  186.  
  187.        * Transparency: portions of the image can be marked as
  188.          transparent, creating the effect of a non-rectangular image.
  189.  
  190.        * Ancillary information: textual comments and other data can be
  191.          stored within the image file.
  192.  
  193.        * Complete hardware and platform independence.
  194.  
  195.        * Effective, 100% lossless compression.
  196.  
  197.    Important new features of PNG, not available in GIF, include:
  198.  
  199.        * Truecolor images of up to 48 bits per pixel.
  200.  
  201.        * Grayscale images of up to 16 bits per pixel.
  202.  
  203.        * Full alpha channel (general transparency masks).
  204.  
  205.        * Image gamma information, which supports automatic display of
  206.          images with correct brightness/contrast regardless of the
  207.          machines used to originate and display the image.
  208.  
  209.        * Reliable, straightforward detection of file corruption.
  210.  
  211.        * Faster initial presentation in progressive display mode.
  212.  
  213.    PNG is designed to be:
  214.  
  215.        * Simple and portable: developers should be able to implement PNG
  216.          easily.
  217.  
  218.        * Legally unencumbered: to the best knowledge of the PNG authors,
  219.          no algorithms under legal challenge are used.  (Some
  220.          considerable effort has been spent to verify this.)
  221.  
  222.        * Well compressed: both indexed-color and truecolor images are
  223.          compressed as effectively as in any other widely used lossless
  224.          format, and in most cases more effectively.
  225.  
  226.        * Interchangeable: any standard-conforming PNG decoder must read
  227.          all conforming PNG files.
  228.  
  229.        * Flexible: the format allows for future extensions and private
  230.          add-ons, without compromising interchangeability of basic PNG.
  231.  
  232.        * Robust: the design supports full file integrity checking as
  233.          well as simple, quick detection of common transmission errors.
  234.  
  235.    The main part of this specification gives the definition of the file
  236.    format and recommendations for encoder and decoder behavior.  An
  237.    appendix gives the rationale for many design decisions.  Although the
  238.    rationale is not part of the formal specification, reading it can
  239.    help implementors understand the design.  Cross-references in the
  240.    main text point to relevant parts of the rationale.  Additional
  241.    appendixes, also not part of the formal specification, provide
  242.    tutorials on gamma and color theory as well as other supporting
  243.    material.
  244.  
  245.    The words "must", "required", "should", "recommended", "may", and
  246.    "optional" in this document are to be interpreted as described in
  247.    [RFC-2119], which is consistent with their plain English meanings.
  248.    The word "can" carries the same force as "may".
  249.  
  250.    See Rationale: Why a new file format? (Section 12.1), Why these
  251.    features? (Section 12.2), Why not these features? (Section 12.3), Why
  252.    not use format X? (Section 12.4).
  253.  
  254.    Pronunciation
  255.  
  256.       PNG is pronounced "ping".
  257.  
  258. 2. Data Representation
  259.  
  260.    This chapter discusses basic data representations used in PNG files,
  261.    as well as the expected representation of the image data.
  262.  
  263.    2.1. Integers and byte order
  264.  
  265.       All integers that require more than one byte must be in network
  266.       byte order: the most significant byte comes first, then the less
  267.       significant bytes in descending order of significance (MSB LSB for
  268.       two-byte integers, B3 B2 B1 B0 for four-byte integers).  The
  269.       highest bit (value 128) of a byte is numbered bit 7; the lowest
  270.       bit (value 1) is numbered bit 0.  Values are unsigned unless
  271.       otherwise noted.  Values explicitly noted as signed are
  272.       represented in two's complement notation.
  273.  
  274.       Unless otherwise stated, four-byte unsigned integers are limited
  275.       to the range 0 to (2^31)-1 to accommodate languages that have
  276.       difficulty with unsigned four-byte values.  Similarly, four-byte
  277.       signed integers are limited to the range -((2^31)-1) to (2^31)-1
  278.       to accommodate languages that have difficulty with the value
  279.       -2^31.
  280.  
  281.       See Rationale: Byte order (Section 12.5).
  282.  
  283.    2.2. Color values
  284.  
  285.       Colors can be represented by either grayscale or RGB (red, green,
  286.       blue) sample data.  Grayscale data represents luminance; RGB data
  287.       represents calibrated color information (if the cHRM chunk is
  288.       present) or uncalibrated device-dependent color (if cHRM is
  289.       absent).  All color values range from zero (representing black) to
  290.       most intense at the maximum value for the sample depth.  Note that
  291.       the maximum value at a given sample depth is (2^sampledepth)-1,
  292.       not 2^sampledepth.
  293.  
  294.       Sample values are not necessarily proportional to light intensity;
  295.       the gAMA chunk specifies the relationship between sample values
  296.       and display output intensity, and viewers are strongly encouraged
  297.       to compensate properly.  See Gamma correction (Section 2.7).
  298.  
  299.       Source data with a precision not directly supported in PNG (for
  300.       example, 5 bit/sample truecolor) must be scaled up to the next
  301.       higher supported bit depth.  This scaling is reversible with no
  302.       loss of data, and it reduces the number of cases that decoders
  303.       have to cope with.  See Recommendations for Encoders: Sample depth
  304.       scaling (Section 9.1) and Recommendations for Decoders: Sample
  305.       depth rescaling (Section 10.4).
  306.  
  307.    2.3. Image layout
  308.  
  309.       Conceptually, a PNG image is a rectangular pixel array, with
  310.       pixels appearing left-to-right within each scanline, and scanlines
  311.       appearing top-to-bottom.  (For progressive display purposes, the
  312.       data may actually be transmitted in a different order; see
  313.       Interlaced data order, Section 2.6.) The size of each pixel is
  314.       determined by the bit depth, which is the number of bits per
  315.       sample in the image data.
  316.  
  317.       Three types of pixel are supported:
  318.  
  319.           * An indexed-color pixel is represented by a single sample
  320.             that is an index into a supplied palette.  The image bit
  321.             depth determines the maximum number of palette entries, but
  322.             not the color precision within the palette.
  323.  
  324.           * A grayscale pixel is represented by a single sample that is
  325.             a grayscale level, where zero is black and the largest value
  326.             for the bit depth is white.
  327.  
  328.           * A truecolor pixel is represented by three samples: red (zero
  329.             = black, max = red) appears first, then green (zero = black,
  330.             max = green), then blue (zero = black, max = blue).  The bit
  331.             depth specifies the size of each sample, not the total pixel
  332.             size.
  333.  
  334.       Optionally, grayscale and truecolor pixels can also include an
  335.       alpha sample, as described in the next section.
  336.  
  337.       Pixels are always packed into scanlines with no wasted bits
  338.       between pixels.  Pixels smaller than a byte never cross byte
  339.       boundaries; they are packed into bytes with the leftmost pixel in
  340.       the high-order bits of a byte, the rightmost in the low-order
  341.       bits.  Permitted bit depths and pixel types are restricted so that
  342.       in all cases the packing is simple and efficient.
  343.  
  344.       PNG permits multi-sample pixels only with 8- and 16-bit samples,
  345.       so multiple samples of a single pixel are never packed into one
  346.       byte.  All 16-bit samples are stored in network byte order (MSB
  347.       first).
  348.  
  349.       Scanlines always begin on byte boundaries.  When pixels have fewer
  350.       than 8 bits and the scanline width is not evenly divisible by the
  351.       number of pixels per byte, the low-order bits in the last byte of
  352.       each scanline are wasted.  The contents of these wasted bits are
  353.       unspecified.
  354.  
  355.       An additional "filter-type" byte is added to the beginning of
  356.       every scanline (see Filtering, Section 2.5). The filter-type byte
  357.       is not considered part of the image data, but it is included in
  358.       the datastream sent to the compression step.
  359.  
  360.    2.4. Alpha channel
  361.  
  362.       An alpha channel, representing transparency information on a per-
  363.       pixel basis, can be included in grayscale and truecolor PNG
  364.       images.
  365.  
  366.       An alpha value of zero represents full transparency, and a value
  367.       of (2^bitdepth)-1 represents a fully opaque pixel.  Intermediate
  368.       values indicate partially transparent pixels that can be combined
  369.       with a background image to yield a composite image.  (Thus, alpha
  370.       is really the degree of opacity of the pixel.  But most people
  371.       refer to alpha as providing transparency information, not opacity
  372.       information, and we continue that custom here.)
  373.  
  374.       Alpha channels can be included with images that have either 8 or
  375.       16 bits per sample, but not with images that have fewer than 8
  376.       bits per sample.  Alpha samples are represented with the same bit
  377.       depth used for the image samples.  The alpha sample for each pixel
  378.       is stored immediately following the grayscale or RGB samples of
  379.       the pixel.
  380.  
  381.       The color values stored for a pixel are not affected by the alpha
  382.       value assigned to the pixel.  This rule is sometimes called
  383.       "unassociated" or "non-premultiplied" alpha.  (Another common
  384.       technique is to store sample values premultiplied by the alpha
  385.       fraction; in effect, such an image is already composited against a
  386.       black background.  PNG does not use premultiplied alpha.)
  387.  
  388.       Transparency control is also possible without the storage cost of
  389.       a full alpha channel.  In an indexed-color image, an alpha value
  390.       can be defined for each palette entry.  In grayscale and truecolor
  391.       images, a single pixel value can be identified as being
  392.       "transparent".  These techniques are controlled by the tRNS
  393.       ancillary chunk type.
  394.  
  395.       If no alpha channel nor tRNS chunk is present, all pixels in the
  396.       image are to be treated as fully opaque.
  397.  
  398.       Viewers can support transparency control partially, or not at all.
  399.  
  400.       See Rationale: Non-premultiplied alpha (Section 12.8),
  401.       Recommendations for Encoders: Alpha channel creation (Section
  402.       9.4), and Recommendations for Decoders: Alpha channel processing
  403.       (Section 10.8).
  404.  
  405.    2.5. Filtering
  406.  
  407.       PNG allows the image data to be filtered before it is compressed.
  408.       Filtering can improve the compressibility of the data.  The filter
  409.       step itself does not reduce the size of the data.  All PNG filters
  410.       are strictly lossless.
  411.  
  412.       PNG defines several different filter algorithms, including "None"
  413.       which indicates no filtering.  The filter algorithm is specified
  414.       for each scanline by a filter-type byte that precedes the filtered
  415.       scanline in the precompression datastream.  An intelligent encoder
  416.       can switch filters from one scanline to the next.  The method for
  417.       choosing which filter to employ is up to the encoder.
  418.  
  419.       See Filter Algorithms (Chapter 6) and Rationale: Filtering
  420.       (Section 12.9).
  421.  
  422.    2.6. Interlaced data order
  423.  
  424.       A PNG image can be stored in interlaced order to allow progressive
  425.       display.  The purpose of this feature is to allow images to "fade
  426.       in" when they are being displayed on-the-fly.  Interlacing
  427.       slightly expands the file size on average, but it gives the user a
  428.       meaningful display much more rapidly.  Note that decoders are
  429.       required to be able to read interlaced images, whether or not they
  430.       actually perform progressive display.
  431.  
  432.       With interlace method 0, pixels are stored sequentially from left
  433.       to right, and scanlines sequentially from top to bottom (no
  434.       interlacing).
  435.  
  436.       Interlace method 1, known as Adam7 after its author, Adam M.
  437.       Costello, consists of seven distinct passes over the image.  Each
  438.       pass transmits a subset of the pixels in the image.  The pass in
  439.       which each pixel is transmitted is defined by replicating the
  440.       following 8-by-8 pattern over the entire image, starting at the
  441.       upper left corner:
  442.  
  443.          1 6 4 6 2 6 4 6
  444.          7 7 7 7 7 7 7 7
  445.          5 6 5 6 5 6 5 6
  446.          7 7 7 7 7 7 7 7
  447.          3 6 4 6 3 6 4 6
  448.          7 7 7 7 7 7 7 7
  449.          5 6 5 6 5 6 5 6
  450.          7 7 7 7 7 7 7 7
  451.  
  452.       Within each pass, the selected pixels are transmitted left to
  453.       right within a scanline, and selected scanlines sequentially from
  454.       top to bottom.  For example, pass 2 contains pixels 4, 12, 20,
  455.       etc. of scanlines 0, 8, 16, etc. (numbering from 0,0 at the upper
  456.       left corner).  The last pass contains the entirety of scanlines 1,
  457.       3, 5, etc.
  458.  
  459.       The data within each pass is laid out as though it were a complete
  460.       image of the appropriate dimensions.  For example, if the complete
  461.       image is 16 by 16 pixels, then pass 3 will contain two scanlines,
  462.       each containing four pixels.  When pixels have fewer than 8 bits,
  463.       each such scanline is padded as needed to fill an integral number
  464.       of bytes (see Image layout, Section 2.3). Filtering is done on
  465.       this reduced image in the usual way, and a filter-type byte is
  466.       transmitted before each of its scanlines (see Filter Algorithms,
  467.       Chapter 6). Notice that the transmission order is defined so that
  468.       all the scanlines transmitted in a pass will have the same number
  469.       of pixels; this is necessary for proper application of some of the
  470.       filters.
  471.  
  472.       Caution: If the image contains fewer than five columns or fewer
  473.       than five rows, some passes will be entirely empty.  Encoders and
  474.       decoders must handle this case correctly.  In particular, filter-
  475.       type bytes are associated only with nonempty scanlines; no
  476.       filter-type bytes are present in an empty pass.
  477.  
  478.       See Rationale: Interlacing (Section 12.6) and Recommendations for
  479.       Decoders: Progressive display (Section 10.9).
  480.  
  481.    2.7. Gamma correction
  482.  
  483.       PNG images can specify, via the gAMA chunk, the power function
  484.       relating the desired display output with the image samples.
  485.       Display programs are strongly encouraged to use this information,
  486.       plus information about the display system they are using, to
  487.       present the image to the viewer in a way that reproduces what the
  488.       image's original author saw as closely as possible.  See Gamma
  489.       Tutorial (Chapter 13) if you aren't already familiar with gamma
  490.       issues.
  491.  
  492.       Gamma correction is not applied to the alpha channel, if any.
  493.       Alpha samples always represent a linear fraction of full opacity.
  494.  
  495.       For high-precision applications, the exact chromaticity of the RGB
  496.       data in a PNG image can be specified via the cHRM chunk, allowing
  497.       more accurate color matching than gamma correction alone will
  498.       provide.  If the RGB data conforms to the sRGB specification
  499.       [sRGB], this can be indicated with the sRGB chunk, enabling even
  500.       more accurate reproduction.  Alternatively, the iCCP chunk can be
  501.       used to embed an ICC profile [ICC] containing detailed color space
  502.       information.  See Color Tutorial (Chapter 14) if you aren't
  503.       already familiar with color representation issues.
  504.  
  505.       See Rationale: Why gamma? (Section 12.7), Recommendations for
  506.       Encoders: Encoder gamma handling (Section 9.2), and
  507.       Recommendations for Decoders: Decoder gamma handling (Section
  508.       10.5).
  509.  
  510.    2.8. Text strings
  511.  
  512.       A PNG file can store text associated with the image, such as an
  513.       image description or copyright notice.  Keywords are used to
  514.       indicate what each text string represents.
  515.  
  516.       ISO/IEC 8859-1 (Latin-1) is the character set recommended for use
  517.       in text strings [ISO/IEC-8859-1]. It is a superset of 7-bit ASCII.
  518.  
  519.       Character codes not defined in Latin-1 should not be used, because
  520.       they have no platform-independent meaning.  If a non-Latin-1 code
  521.       does appear in a PNG text string, its interpretation will vary
  522.       across platforms and decoders.  Some systems might not even be
  523.       able to display all the characters in Latin-1, but most modern
  524.       systems can.
  525.  
  526.       Provision is also made for the storage of compressed text.
  527.  
  528.       See Rationale: Text strings (Section 12.10).
  529.  
  530. 3. File Structure
  531.  
  532.    A PNG file consists of a PNG signature followed by a series of
  533.    chunks.  This chapter defines the signature and the basic properties
  534.    of chunks.  Individual chunk types are discussed in the next chapter.
  535.  
  536.    3.1. PNG file signature
  537.  
  538.       The first eight bytes of a PNG file always contain the following
  539.       (decimal) values:
  540.  
  541.          137 80 78 71 13 10 26 10
  542.  
  543.       This signature indicates that the remainder of the file contains a
  544.       single PNG image, consisting of a series of chunks beginning with
  545.       an IHDR chunk and ending with an IEND chunk.
  546.  
  547.       See Rationale: PNG file signature (Section 12.11).
  548.  
  549.    3.2. Chunk layout
  550.  
  551.       Each chunk consists of four parts:
  552.  
  553.       Length
  554.          A 4-byte unsigned integer giving the number of bytes in the
  555.          chunk's data field.  The length counts only the data field, not
  556.          itself, the chunk type code, or the CRC.  Zero is a valid
  557.          length.  Although encoders and decoders should treat the length
  558.          as unsigned, its value must not exceed (2^31)-1 bytes.
  559.  
  560.       Chunk Type
  561.          A 4-byte chunk type code.  For convenience in description and
  562.          in examining PNG files, type codes are restricted to consist of
  563.          uppercase and lowercase ASCII letters (A-Z and a-z, or 65-90
  564.          and 97-122 decimal).  However, encoders and decoders must treat
  565.          the codes as fixed binary values, not character strings.  For
  566.          example, it would not be correct to represent the type code
  567.          IDAT by the EBCDIC equivalents of those letters.  Additional
  568.          naming conventions for chunk types are discussed in the next
  569.          section.
  570.  
  571.       Chunk Data
  572.          The data bytes appropriate to the chunk type, if any.  This
  573.          field can be of zero length.
  574.  
  575.       CRC
  576.          A 4-byte CRC (Cyclic Redundancy Check) calculated on the
  577.          preceding bytes in the chunk, including the chunk type code and
  578.          chunk data fields, but not including the length field.  The CRC
  579.          is always present, even for chunks containing no data.  See CRC
  580.          algorithm (Section 3.4).
  581.  
  582.       The chunk data length can be any number of bytes up to the
  583.       maximum; therefore, implementors cannot assume that chunks are
  584.       aligned on any boundaries larger than bytes.
  585.  
  586.       Chunks can appear in any order, subject to the restrictions placed
  587.       on each chunk type.  (One notable restriction is that IHDR must
  588.       appear first and IEND must appear last; thus the IEND chunk serves
  589.       as an end-of-file marker.)  Multiple chunks of the same type can
  590.       appear, but only if specifically permitted for that type.
  591.  
  592.       See Rationale: Chunk layout (Section 12.12).
  593.  
  594.    3.3. Chunk naming conventions
  595.  
  596.       Chunk type codes are assigned so that a decoder can determine some
  597.       properties of a chunk even when it does not recognize the type
  598.       code.  These rules are intended to allow safe, flexible extension
  599.       of the PNG format, by allowing a decoder to decide what to do when
  600.       it encounters an unknown chunk.  The naming rules are not normally
  601.       of interest when the decoder does recognize the chunk's type.
  602.  
  603.       Four bits of the type code, namely bit 5 (value 32) of each byte,
  604.       are used to convey chunk properties.  This choice means that a
  605.       human can read off the assigned properties according to whether
  606.       each letter of the type code is uppercase (bit 5 is 0) or
  607.       lowercase (bit 5 is 1).  However, decoders should test the
  608.       properties of an unknown chunk by numerically testing the
  609.       specified bits; testing whether a character is uppercase or
  610.       lowercase is inefficient, and even incorrect if a locale-specific
  611.       case definition is used.
  612.  
  613.       It is worth noting that the property bits are an inherent part of
  614.       the chunk name, and hence are fixed for any chunk type.  Thus,
  615.       TEXT and Text would be unrelated chunk type codes, not the same
  616.       chunk with different properties.  Decoders must recognize type
  617.       codes by a simple four-byte literal comparison; it is incorrect to
  618.       perform case conversion on type codes.
  619.  
  620.       The semantics of the property bits are:
  621.  
  622.       Ancillary bit: bit 5 of first byte
  623.          0 (uppercase) = critical, 1 (lowercase) = ancillary.
  624.  
  625.          Chunks that are not strictly necessary in order to meaningfully
  626.          display the contents of the file are known as "ancillary"
  627.          chunks.  A decoder encountering an unknown chunk in which the
  628.          ancillary bit is 1 can safely ignore the chunk and proceed to
  629.          display the image.  The time chunk (tIME) is an example of an
  630.          ancillary chunk.
  631.  
  632.          Chunks that are necessary for successful display of the file's
  633.          contents are called "critical" chunks.  A decoder encountering
  634.          an unknown chunk in which the ancillary bit is 0 must indicate
  635.          to the user that the image contains information it cannot
  636.          safely interpret.  The image header chunk (IHDR) is an example
  637.          of a critical chunk.
  638.  
  639.       Private bit: bit 5 of second byte
  640.          0 (uppercase) = public, 1 (lowercase) = private.
  641.  
  642.          A public chunk is one that is part of the PNG specification or
  643.          is registered in the list of PNG special-purpose public chunk
  644.          types.  Applications can also define private (unregistered)
  645.          chunks for their own purposes.  The names of private chunks
  646.          must have a lowercase second letter, while public chunks will
  647.          always be assigned names with uppercase second letters.  Note
  648.          that decoders do not need to test the private-chunk property
  649.          bit, since it has no functional significance; it is simply an
  650.          administrative convenience to ensure that public and private
  651.          chunk names will not conflict.  See Additional chunk types
  652.          (Section 4.4), and Recommendations for Encoders: Use of private
  653.          chunks (Section 9.8).
  654.  
  655.       Reserved bit: bit 5 of third byte
  656.          Must be 0 (uppercase) in files conforming to this version of
  657.          PNG.
  658.  
  659.          The significance of the case of the third letter of the chunk
  660.          name is reserved for possible future expansion.  At the present
  661.          time all chunk names must have uppercase third letters.
  662.          (Decoders should not complain about a lowercase third letter,
  663.          however, as some future version of the PNG specification could
  664.          define a meaning for this bit.  It is sufficient to treat a
  665.          chunk with a lowercase third letter in the same way as any
  666.          other unknown chunk type.)
  667.  
  668.       Safe-to-copy bit: bit 5 of fourth byte
  669.          0 (uppercase) = unsafe to copy, 1 (lowercase) = safe to copy.
  670.  
  671.          This property bit is not of interest to pure decoders, but it
  672.          is needed by PNG editors (programs that modify PNG files).
  673.          This bit defines the proper handling of unrecognized chunks in
  674.          a file that is being modified.
  675.  
  676.          If a chunk's safe-to-copy bit is 1, the chunk may be copied to
  677.          a modified PNG file whether or not the software recognizes the
  678.          chunk type, and regardless of the extent of the file
  679.          modifications.
  680.  
  681.          If a chunk's safe-to-copy bit is 0, it indicates that the chunk
  682.          depends on the image data.  If the program has made any changes
  683.          to critical chunks, including addition, modification, deletion,
  684.          or reordering of critical chunks, then unrecognized unsafe
  685.          chunks must not be copied to the output PNG file.  (Of course,
  686.          if the program does recognize the chunk, it can choose to
  687.          output an appropriately modified version.)
  688.  
  689.          A PNG editor is always allowed to copy all unrecognized chunks
  690.          if it has only added, deleted, modified, or reordered ancillary
  691.          chunks.  This implies that it is not permissible for ancillary
  692.          chunks to depend on other ancillary chunks.
  693.  
  694.          PNG editors that do not recognize a critical chunk must report
  695.          an error and refuse to process that PNG file at all.  The
  696.          safe/unsafe mechanism is intended for use with ancillary
  697.          chunks.  The safe-to-copy bit will always be 0 for critical
  698.          chunks.
  699.  
  700.          Rules for PNG editors are discussed further in Chunk Ordering
  701.          Rules (Chapter 7).
  702.  
  703.       For example, the hypothetical chunk type name bLOb has the
  704.       property bits:
  705.  
  706.          bLOb  <-- 32 bit chunk type code represented in text form
  707.          ||||
  708.          |||+- Safe-to-copy bit is 1 (lowercase letter; bit 5 is 1)
  709.          ||+-- Reserved bit is 0     (uppercase letter; bit 5 is 0)
  710.          |+--- Private bit is 0      (uppercase letter; bit 5 is 0)
  711.          +---- Ancillary bit is 1    (lowercase letter; bit 5 is 1)
  712.  
  713.       Therefore, this name represents an ancillary, public, safe-to-copy
  714.       chunk.
  715.  
  716.       See Rationale: Chunk naming conventions (Section 12.13).
  717.  
  718.    3.4. CRC algorithm
  719.  
  720.       Chunk CRCs are calculated using standard CRC methods with pre and
  721.       post conditioning, as defined by ISO 3309 [ISO-3309] or ITU-T V.42
  722.       [ITU-T-V42]. The CRC polynomial employed is
  723.  
  724.          x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1
  725.  
  726.       The 32-bit CRC register is initialized to all 1's, and then the
  727.       data from each byte is processed from the least significant bit
  728.       (1) to the most significant bit (128).  After all the data bytes
  729.       are processed, the CRC register is inverted (its ones complement
  730.       is taken).  This value is transmitted (stored in the file) MSB
  731.       first.  For the purpose of separating into bytes and ordering, the
  732.       least significant bit of the 32-bit CRC is defined to be the
  733.       coefficient of the x^31 term.
  734.  
  735.       Practical calculation of the CRC always employs a precalculated
  736.       table to greatly accelerate the computation.  See Sample CRC Code
  737.       (Chapter 15).
  738.  
  739. 4. Chunk Specifications
  740.  
  741.    This chapter defines the standard types of PNG chunks.
  742.  
  743.    4.1. Critical chunks
  744.  
  745.       All implementations must understand and successfully render the
  746.       standard critical chunks.  A valid PNG image must contain an IHDR
  747.       chunk, one or more IDAT chunks, and an IEND chunk.
  748.  
  749.       4.1.1. IHDR Image header
  750.  
  751.          The IHDR chunk must appear FIRST.  It contains:
  752.  
  753.             Width:              4 bytes
  754.             Height:             4 bytes
  755.             Bit depth:          1 byte
  756.             Color type:         1 byte
  757.             Compression method: 1 byte
  758.             Filter method:      1 byte
  759.             Interlace method:   1 byte
  760.  
  761.          Width and height give the image dimensions in pixels.  They are
  762.          4-byte integers.  Zero is an invalid value.  The maximum for
  763.          each is (2^31)-1 in order to accommodate languages that have
  764.          difficulty with unsigned 4-byte values.
  765.  
  766.          Bit depth is a single-byte integer giving the number of bits
  767.          per sample or per palette index (not per pixel).  Valid values
  768.          are 1, 2, 4, 8, and 16, although not all values are allowed for
  769.          all color types.
  770.  
  771.          Color type is a single-byte integer that describes the
  772.          interpretation of the image data.  Color type codes represent
  773.          sums of the following values: 1 (palette used), 2 (color used),
  774.          and 4 (alpha channel used).  Valid values are 0, 2, 3, 4, and
  775.          6.
  776.  
  777.          Bit depth restrictions for each color type are imposed to
  778.          simplify implementations and to prohibit combinations that do
  779.          not compress well.  Decoders must support all valid
  780.          combinations of bit depth and color type.  The allowed
  781.          combinations are:
  782.  
  783.             Color    Allowed    Interpretation
  784.             Type    Bit Depths
  785.  
  786.             0       1,2,4,8,16  Each pixel is a grayscale sample.
  787.  
  788.             2       8,16        Each pixel is an R,G,B triple.
  789.  
  790.             3       1,2,4,8     Each pixel is a palette index;
  791.                                 a PLTE chunk must appear.
  792.  
  793.             4       8,16        Each pixel is a grayscale sample,
  794.                                 followed by an alpha sample.
  795.  
  796.             6       8,16        Each pixel is an R,G,B triple,
  797.                                 followed by an alpha sample.
  798.  
  799.          The sample depth is the same as the bit depth except in the
  800.          case of color type 3, in which the sample depth is always 8
  801.          bits.
  802.  
  803.          Compression method is a single-byte integer that indicates the
  804.          method used to compress the image data.  At present, only
  805.          compression method 0 (deflate/inflate compression with a
  806.          sliding window of at most 32768 bytes) is defined.  All
  807.          standard PNG images must be compressed with this scheme.  The
  808.          compression method field is provided for possible future
  809.          expansion or proprietary variants.  Decoders must check this
  810.          byte and report an error if it holds an unrecognized code.  See
  811.          Deflate/Inflate Compression (Chapter 5) for details.
  812.  
  813.          Filter method is a single-byte integer that indicates the
  814.          preprocessing method applied to the image data before
  815.          compression.  At present, only filter method 0 (adaptive
  816.          filtering with five basic filter types) is defined.  As with
  817.          the compression method field, decoders must check this byte and
  818.          report an error if it holds an unrecognized code.  See Filter
  819.          Algorithms (Chapter 6) for details.
  820.  
  821.          Interlace method is a single-byte integer that indicates the
  822.          transmission order of the image data.  Two values are currently
  823.          defined: 0 (no interlace) or 1 (Adam7 interlace).  See
  824.          Interlaced data order (Section 2.6) for details.
  825.  
  826.       4.1.2. PLTE Palette
  827.  
  828.          The PLTE chunk contains from 1 to 256 palette entries, each a
  829.          three-byte series of the form:
  830.  
  831.             Red:   1 byte (0 = black, 255 = red)
  832.             Green: 1 byte (0 = black, 255 = green)
  833.             Blue:  1 byte (0 = black, 255 = blue)
  834.  
  835.          The number of entries is determined from the chunk length.  A
  836.          chunk length not divisible by 3 is an error.
  837.  
  838.          This chunk must appear for color type 3, and can appear for
  839.          color types 2 and 6; it must not appear for color types 0 and
  840.          4.  If this chunk does appear, it must precede the first IDAT
  841.          chunk.  There must not be more than one PLTE chunk.
  842.  
  843.          For color type 3 (indexed color), the PLTE chunk is required.
  844.          The first entry in PLTE is referenced by pixel value 0, the
  845.          second by pixel value 1, etc.  The number of palette entries
  846.          must not exceed the range that can be represented in the image
  847.          bit depth (for example, 2^4 = 16 for a bit depth of 4).  It is
  848.          permissible to have fewer entries than the bit depth would
  849.          allow.  In that case, any out-of-range pixel value found in the
  850.          image data is an error.
  851.  
  852.          For color types 2 and 6 (truecolor and truecolor with alpha),
  853.          the PLTE chunk is optional.  If present, it provides a
  854.          suggested set of from 1 to 256 colors to which the truecolor
  855.          image can be quantized if the viewer cannot display truecolor
  856.          directly.  If neither PLTE nor sPLT is present, such a viewer
  857.          will need to select colors on its own, but it is often
  858.          preferable for this to be done once by the encoder.  (See
  859.          Recommendations for Encoders: Suggested palettes, Section 9.5.)
  860.  
  861.          Note that the palette uses 8 bits (1 byte) per sample
  862.          regardless of the image bit depth specification.  In
  863.          particular, the palette is 8 bits deep even when it is a
  864.          suggested quantization of a 16-bit truecolor image.
  865.  
  866.          There is no requirement that the palette entries all be used by
  867.          the image, nor that they all be different.
  868.  
  869.       4.1.3. IDAT Image data
  870.  
  871.          The IDAT chunk contains the actual image data.  To create this
  872.          data:
  873.  
  874.             1. Begin with image scanlines represented as described in
  875.                Image layout (Section 2.3); the layout and total size of
  876.                this raw data are determined by the fields of IHDR.
  877.  
  878.             2. Filter the image data according to the filtering method
  879.                specified by the IHDR chunk.  (Note that with filter
  880.                method 0, the only one currently defined, this implies
  881.                prepending a filter-type byte to each scanline.)
  882.  
  883.             3. Compress the filtered data using the compression method
  884.                specified by the IHDR chunk.
  885.  
  886.          The IDAT chunk contains the output datastream of the
  887.          compression algorithm.
  888.  
  889.          To read the image data, reverse this process.
  890.  
  891.          There can be multiple IDAT chunks; if so, they must appear
  892.          consecutively with no other intervening chunks.  The compressed
  893.          datastream is then the concatenation of the contents of all the
  894.          IDAT chunks.  The encoder can divide the compressed datastream
  895.          into IDAT chunks however it wishes.  (Multiple IDAT chunks are
  896.          allowed so that encoders can work in a fixed amount of memory;
  897.          typically the chunk size will correspond to the encoder's
  898.          buffer size.)  It is important to emphasize that IDAT chunk
  899.          boundaries have no semantic significance and can occur at any
  900.          point in the compressed datastream.  A PNG file in which each
  901.          IDAT chunk contains only one data byte is valid, though
  902.          remarkably wasteful of space.  (For that matter, zero-length
  903.          IDAT chunks are valid, though even more wasteful.)
  904.  
  905.          See Filter Algorithms (Chapter 6) and Deflate/Inflate
  906.          Compression (Chapter 5) for details.
  907.  
  908.       4.1.4. IEND Image trailer
  909.  
  910.          The IEND chunk must appear LAST.  It marks the end of the PNG
  911.          datastream.  The chunk's data field is empty.
  912.  
  913.    4.2. Ancillary chunks
  914.  
  915.       All ancillary chunks are optional, in the sense that encoders need
  916.       not write them and decoders can ignore them.  However, encoders
  917.       are encouraged to write the standard ancillary chunks when the
  918.       information is available, and decoders are encouraged to interpret
  919.       these chunks when appropriate and feasible.
  920.  
  921.       The standard ancillary chunks are listed in alphabetical order.
  922.       This is not necessarily the order in which they would appear in a
  923.       file.
  924.  
  925.       4.2.1. bKGD Background color
  926.  
  927.          The bKGD chunk specifies a default background color to present
  928.          the image against.  Note that viewers are not bound to honor
  929.          this chunk; a viewer can choose to use a different background.
  930.  
  931.          For color type 3 (indexed color), the bKGD chunk contains:
  932.  
  933.             Palette index:  1 byte
  934.  
  935.          The value is the palette index of the color to be used as
  936.          background.
  937.  
  938.          For color types 0 and 4 (grayscale, with or without alpha),
  939.          bKGD contains:
  940.  
  941.             Gray:  2 bytes, range 0 .. (2^bitdepth)-1
  942.  
  943.          (If the image bit depth is less than 16, the least significant
  944.          bits are used and the others are 0.)  The value is the gray
  945.          level to be used as background.
  946.  
  947.          For color types 2 and 6 (truecolor, with or without alpha),
  948.          bKGD contains:
  949.  
  950.             Red:   2 bytes, range 0 .. (2^bitdepth)-1
  951.             Green: 2 bytes, range 0 .. (2^bitdepth)-1
  952.             Blue:  2 bytes, range 0 .. (2^bitdepth)-1
  953.  
  954.          (If the image bit depth is less than 16, the least significant
  955.          bits are used and the others are 0.)  This is the RGB color to
  956.          be used as background.
  957.  
  958.          When present, the bKGD chunk must precede the first IDAT chunk,
  959.          and must follow the PLTE chunk, if any.
  960.  
  961.          See Recommendations for Decoders: Background color (Section
  962.          10.7).
  963.  
  964.       4.2.2. cHRM Primary chromaticities and white point
  965.  
  966.          Applications that need device-independent specification of
  967.          colors in a PNG file can use the cHRM chunk to specify the 1931
  968.          CIE x,y chromaticities of the red, green, and blue primaries
  969.          used in the image, and the referenced white point.  See Color
  970.          Tutorial (Chapter 14) for more information.
  971.  
  972.          The cHRM chunk contains:
  973.  
  974.             White Point x: 4 bytes
  975.             White Point y: 4 bytes
  976.             Red x:         4 bytes
  977.             Red y:         4 bytes
  978.             Green x:       4 bytes
  979.             Green y:       4 bytes
  980.             Blue x:        4 bytes
  981.             Blue y:        4 bytes
  982.  
  983.          Each value is encoded as a 4-byte unsigned integer,
  984.          representing the x or y value times 100000.  For example, a
  985.          value of 0.3127 would be stored as the integer 31270.
  986.  
  987.          cHRM is allowed in all PNG files, although it is of little
  988.          value for grayscale images.
  989.  
  990.          If the encoder does not know the chromaticity values, it should
  991.          not write a cHRM chunk; the absence of a cHRM chunk indicates
  992.          that the image's primary colors are device-dependent.
  993.  
  994.          If the cHRM chunk appears, it must precede the first IDAT
  995.          chunk, and it must also precede the PLTE chunk if present.
  996.  
  997.          An sRGB chunk or iCCP chunk, when present and recognized,
  998.          overrides the cHRM chunk.
  999.  
  1000.          See the sRGB chunk specification (Paragraph 4.2.9), the iCCP
  1001.          chunk specification (Paragraph 4.2.5), Recommendations for
  1002.          Encoders: Encoder color handling (Section 9.3), and
  1003.          Recommendations for Decoders: Decoder color handling (Section
  1004.          10.6).
  1005.  
  1006.       4.2.3. gAMA Image gamma
  1007.  
  1008.          The gAMA chunk specifies the relationship between the image
  1009.          samples and the desired display output intensity as a power
  1010.          function:
  1011.  
  1012.             sample = light_out ^ gamma
  1013.  
  1014.          Here sample and light_out are normalized to the range 0.0
  1015.          (minimum intensity) to 1.0 (maximum intensity).  Therefore:
  1016.  
  1017.             sample = integer_sample / (2^bitdepth - 1)
  1018.  
  1019.          The gAMA chunk contains:
  1020.  
  1021.             Gamma: 4 bytes
  1022.  
  1023.          The value is encoded as a 4-byte unsigned integer, representing
  1024.          gamma times 100000.  For example, a gamma of 1/2.2 would be
  1025.          stored as 45455.
  1026.  
  1027.          The gamma value has no effect on alpha samples, which are
  1028.          always a linear fraction of full opacity.
  1029.  
  1030.          If the encoder does not know the image's gamma value, it should
  1031.          not write a gAMA chunk; the absence of a gAMA chunk indicates
  1032.          that the gamma is unknown.
  1033.  
  1034.          Technically, "desired display output intensity" is not specific
  1035.          enough; one needs to specify the viewing conditions under which
  1036.          the output is desired.  For gAMA these are the reference
  1037.          viewing conditions of the sRGB specification [sRGB], which are
  1038.          based on ISO standards [ISO-3664]. Adjusting for different
  1039.          viewing conditions is a complex process normally handled by a
  1040.          Color Management System (CMS).  If this adjustment is not
  1041.          performed, the error is usually small.  Applications desiring
  1042.          high color fidelity may wish to use an sRGB chunk (see the sRGB
  1043.          chunk specification, Paragraph 4.2.9) or an iCCP chunk (see the
  1044.          iCCP chunk specification, Paragraph 4.2.5).
  1045.  
  1046.          If the gAMA chunk appears, it must precede the first IDAT
  1047.          chunk, and it must also precede the PLTE chunk if present.  An
  1048.          sRGB chunk or iCCP chunk, when present and recognized,
  1049.          overrides the gAMA chunk.
  1050.  
  1051.          See Gamma correction (Section 2.7), Recommendations for
  1052.          Encoders: Encoder gamma handling (Section 9.2), and
  1053.          Recommendations for Decoders: Decoder gamma handling (Section
  1054.          10.5).
  1055.  
  1056.       4.2.4. hIST Palette histogram
  1057.  
  1058.          The hIST chunk gives the approximate usage frequency of each
  1059.          color in the color palette.  A hIST chunk can appear only when
  1060.          a PLTE chunk appears.  If a viewer is unable to provide all the
  1061.          colors listed in the palette, the histogram may help it decide
  1062.          how to choose a subset of the colors for display.
  1063.  
  1064.          The hIST chunk contains a series of 2-byte (16 bit) unsigned
  1065.          integers.  There must be exactly one entry for each entry in
  1066.          the PLTE chunk.  Each entry is proportional to the fraction of
  1067.          pixels in the image that have that palette index; the exact
  1068.          scale factor is chosen by the encoder.
  1069.  
  1070.          Histogram entries are approximate, with the exception that a
  1071.          zero entry specifies that the corresponding palette entry is
  1072.          not used at all in the image.  It is required that a histogram
  1073.          entry be nonzero if there are any pixels of that color.
  1074.  
  1075.          When the palette is a suggested quantization of a truecolor
  1076.          image, the histogram is necessarily approximate, since a
  1077.          decoder may map pixels to palette entries differently than the
  1078.          encoder did.  In this situation, zero entries should not
  1079.          appear.
  1080.  
  1081.          The hIST chunk, if it appears, must follow the PLTE chunk, and
  1082.          must precede the first IDAT chunk.
  1083.  
  1084.          See Rationale: Palette histograms (Section 12.14) and
  1085.          Recommendations for Decoders: Suggested-palette and histogram
  1086.          usage (Section 10.10).
  1087.  
  1088.       4.2.5. iCCP Embedded ICC profile
  1089.  
  1090.          If the iCCP chunk is present, the image samples conform to the
  1091.          color space represented by the embedded ICC profile as defined
  1092.          by the International Color Consortium [ICC]. The color space of
  1093.          the ICC profile must be an RGB color space for color images
  1094.          (PNG color types 2, 3, and 6), or a monochrome grayscale color
  1095.          space for grayscale images (PNG color types 0 and 4).
  1096.  
  1097.          The iCCP chunk contains:
  1098.  
  1099.             Profile name:       1-79 bytes (character string)
  1100.             Null separator:     1 byte
  1101.             Compression method: 1 byte
  1102.             Compressed profile: n bytes
  1103.  
  1104.          The format is like the zTXt chunk.  The profile name can be any
  1105.          convenient name for referring to the profile.  It is case-
  1106.          sensitive and subject to the same restrictions as a tEXt
  1107.          keyword:  it must contain only printable Latin-1
  1108.          [ISO/IEC-8859-1] characters (33-126 and 161-255) and spaces
  1109.          (32), but no leading, trailing, or consecutive spaces.  The
  1110.          only value presently defined for the compression method byte is
  1111.          0, meaning zlib datastream with deflate compression (see
  1112.          Deflate/Inflate Compression, Chapter 5). Decompression of the
  1113.          remainder of the chunk yields the ICC profile.
  1114.  
  1115.          An application that writes the iCCP chunk should also write
  1116.          gAMA and cHRM chunks that approximate the ICC profile's
  1117.          transfer function, for compatibility with applications that do
  1118.          not use the iCCP chunk.
  1119.  
  1120.          When the iCCP chunk is present, applications that recognize it
  1121.          and are capable of color management [ICC] should ignore the
  1122.          gAMA and cHRM chunks and use the iCCP chunk instead, but
  1123.          applications incapable of full-fledged color management should
  1124.          use the gAMA and cHRM chunks if present.
  1125.  
  1126.          A file should contain at most one embedded profile, whether
  1127.          explicit like iCCP or implicit like sRGB.
  1128.  
  1129.          If the iCCP chunk appears, it must precede the first IDAT
  1130.          chunk, and it must also precede the PLTE chunk if present.
  1131.  
  1132.       4.2.6. pHYs Physical pixel dimensions
  1133.  
  1134.          The pHYs chunk specifies the intended pixel size or aspect
  1135.          ratio for display of the image.  It contains:
  1136.  
  1137.             Pixels per unit, X axis: 4 bytes (unsigned integer)
  1138.             Pixels per unit, Y axis: 4 bytes (unsigned integer)
  1139.             Unit specifier:          1 byte
  1140.  
  1141.          The following values are defined for the unit specifier:
  1142.  
  1143.             0: unit is unknown
  1144.             1: unit is the meter
  1145.  
  1146.          When the unit specifier is 0, the pHYs chunk defines pixel
  1147.          aspect ratio only; the actual size of the pixels remains
  1148.          unspecified.
  1149.  
  1150.          Conversion note: one inch is equal to exactly 0.0254 meters.
  1151.  
  1152.          If this ancillary chunk is not present, pixels are assumed to
  1153.          be square, and the physical size of each pixel is unknown.
  1154.  
  1155.          If present, this chunk must precede the first IDAT chunk.
  1156.  
  1157.          See Recommendations for Decoders: Pixel dimensions (Section
  1158.          10.2).
  1159.  
  1160.       4.2.7. sBIT Significant bits
  1161.  
  1162.          To simplify decoders, PNG specifies that only certain sample
  1163.          depths can be used, and further specifies that sample values
  1164.          should be scaled to the full range of possible values at the
  1165.          sample depth.  However, the sBIT chunk is provided in order to
  1166.          store the original number of significant bits.  This allows
  1167.          decoders to recover the original data losslessly even if the
  1168.          data had a sample depth not directly supported by PNG.  We
  1169.          recommend that an encoder emit an sBIT chunk if it has
  1170.          converted the data from a lower sample depth.
  1171.  
  1172.          For color type 0 (grayscale), the sBIT chunk contains a single
  1173.          byte, indicating the number of bits that were significant in
  1174.          the source data.
  1175.  
  1176.          For color type 2 (truecolor), the sBIT chunk contains three
  1177.          bytes, indicating the number of bits that were significant in
  1178.          the source data for the red, green, and blue channels,
  1179.          respectively.
  1180.  
  1181.          For color type 3 (indexed color), the sBIT chunk contains three
  1182.          bytes, indicating the number of bits that were significant in
  1183.          the source data for the red, green, and blue components of the
  1184.          palette entries, respectively.
  1185.  
  1186.          For color type 4 (grayscale with alpha channel), the sBIT chunk
  1187.          contains two bytes, indicating the number of bits that were
  1188.          significant in the source grayscale data and the source alpha
  1189.          data, respectively.
  1190.  
  1191.          For color type 6 (truecolor with alpha channel), the sBIT chunk
  1192.          contains four bytes, indicating the number of bits that were
  1193.          significant in the source data for the red, green, blue, and
  1194.          alpha channels, respectively.
  1195.  
  1196.          Each depth specified in sBIT must be greater than zero and less
  1197.          than or equal to the sample depth (which is 8 for indexed-color
  1198.          images, and the bit depth given in IHDR for other color types).
  1199.  
  1200.          A decoder need not pay attention to sBIT: the stored image is a
  1201.          valid PNG file of the sample depth indicated by IHDR.  However,
  1202.          if the decoder wishes to recover the original data at its
  1203.          original precision, this can be done by right-shifting the
  1204.          stored samples (the stored palette entries, for an indexed-
  1205.          color image).  The encoder must scale the data in such a way
  1206.          that the high-order bits match the original data.
  1207.  
  1208.          If the sBIT chunk appears, it must precede the first IDAT
  1209.          chunk, and it must also precede the PLTE chunk if present.
  1210.  
  1211.          See Recommendations for Encoders: Sample depth scaling (Section
  1212.          9.1) and Recommendations for Decoders: Sample depth rescaling
  1213.          (Section 10.4).
  1214.  
  1215.       4.2.8. sPLT Suggested palette
  1216.  
  1217.          This chunk can be used to suggest a reduced palette to be used
  1218.          when the display device is not capable of displaying the full
  1219.          range of colors present in the image.  If present, it provides
  1220.          a recommended set of colors, with alpha and frequency
  1221.          information, that can be used to construct a reduced palette to
  1222.          which the PNG image can be quantized.
  1223.  
  1224.          This chunk contains a null-terminated text string that names
  1225.          the palette and a one-byte sample depth, followed by a series
  1226.          of palette entries, each a six-byte or ten-byte series
  1227.          containing five unsigned integers:
  1228.  
  1229.             Palette name:    1-79 bytes (character string)
  1230.             Null terminator: 1 byte
  1231.             Sample depth:    1 byte
  1232.             Red:             1 or 2 bytes
  1233.             Green:           1 or 2 bytes
  1234.             Blue:            1 or 2 bytes
  1235.             Alpha:           1 or 2 bytes
  1236.             Frequency:       2 bytes
  1237.             ...etc...
  1238.  
  1239.          There can be any number of entries; a decoder determines the
  1240.          number of entries from the remaining chunk length after the
  1241.          sample depth byte.  It is an error if this remaining length is
  1242.          not divisible by 6 (if the sPLT sample depth is 8) or by 10 (if
  1243.          the sPLT sample depth is 16).  Entries must appear in
  1244.          decreasing order of frequency.  There is no requirement that
  1245.          the entries all be used by the image, nor that they all be
  1246.          different.
  1247.  
  1248.          The palette name can be any convenient name for referring to
  1249.          the palette (for example, "256 color including Macintosh
  1250.          default", "256 color including Windows-3.1 default", "Optimal
  1251.          512").  It may help applications or people to choose the
  1252.          appropriate suggested palette when more than one appears in a
  1253.          PNG file.  The palette name is case-sensitive and subject to
  1254.          the same restrictions as a tEXt keyword:  it must contain only
  1255.          printable Latin-1 [ISO/IEC-8859-1] characters (33-126 and
  1256.          161-255) and spaces (32), but no leading, trailing, or
  1257.          consecutive spaces.
  1258.  
  1259.          The sPLT sample depth must be 8 or 16.
  1260.  
  1261.          The red, green, blue, and alpha samples are either one or two
  1262.          bytes each, depending on the sPLT sample depth, regardless of
  1263.          the image bit depth.  The color samples are not premultiplied
  1264.          by alpha, nor are they precomposited against any background.
  1265.          An alpha value of 0 means fully transparent, while an alpha
  1266.          value of 255 (when the sPLT sample depth is 8) or 65535 (when
  1267.          the sPLT sample depth is 16) means fully opaque.  The palette
  1268.          samples have the same gamma and chromaticity values as those of
  1269.          the PNG image.
  1270.  
  1271.          Each frequency value is proportional to the fraction of pixels
  1272.          in the image that are closest to that palette entry in RGBA
  1273.          space, before the image has been composited against any
  1274.          background.  The exact scale factor is chosen by the encoder,
  1275.          but should be chosen so that the range of individual values
  1276.          reasonably fills the range 0 to 65535.  It is acceptable to
  1277.          artificially inflate the frequencies for "important" colors
  1278.          such as those in a company logo or in the facial features of a
  1279.          portrait.  Zero is a valid frequency meaning the color is
  1280.          "least important" or that it is rarely if ever used.  But when
  1281.          all of the frequencies are zero, they are meaningless (nothing
  1282.          may be inferred about the actual frequencies of the colors).
  1283.  
  1284.          The sPLT chunk can appear for any PNG color type.  Note that
  1285.          entries in sPLT can fall outside the colorspace of the PNG
  1286.          image; for example, in a grayscale PNG, sPLT entries would
  1287.          typically satisfy R=G=B, but this is not required.  Similarly,
  1288.          sPLT entries can have nonopaque alpha values even when the PNG
  1289.          image does not use transparency.
  1290.  
  1291.          If sPLT appears, it must precede the first IDAT chunk.  There
  1292.          can be multiple sPLT chunks, but if so they must have different
  1293.          palette names.
  1294.  
  1295.          See Recommendations for Encoders: Suggested palettes (Section
  1296.          9.5) and Recommendations for Decoders: Suggested-palette and
  1297.          histogram usage (Section 10.10)
  1298.  
  1299.       4.2.9. sRGB Standard RGB color space
  1300.  
  1301.          If the sRGB chunk is present, the image samples conform to the
  1302.          sRGB color space [sRGB], and should be displayed using the
  1303.          specified rendering intent as defined by the International
  1304.          Color Consortium [ICC].
  1305.  
  1306.          The sRGB chunk contains:
  1307.  
  1308.             Rendering intent: 1 byte
  1309.  
  1310.          The following values are defined for the rendering intent:
  1311.  
  1312.             0: Perceptual
  1313.             1: Relative colorimetric
  1314.             2: Saturation
  1315.             3: Absolute colorimetric
  1316.  
  1317.          Perceptual intent is for images preferring good adaptation to
  1318.          the output device gamut at the expense of colorimetric
  1319.          accuracy, like photographs.
  1320.  
  1321.          Relative colorimetric intent is for images requiring color
  1322.          appearance matching (relative to the output device white
  1323.          point), like logos.
  1324.  
  1325.          Saturation intent is for images preferring preservation of
  1326.          saturation at the expense of hue and lightness, like charts and
  1327.          graphs.
  1328.  
  1329.          Absolute colorimetric intent is for images requiring
  1330.          preservation of absolute colorimetry, like proofs (previews of
  1331.          images destined for a different output device).
  1332.  
  1333.          An application that writes the sRGB chunk should also write a
  1334.          gAMA chunk (and perhaps a cHRM chunk) for compatibility with
  1335.          applications that do not use the sRGB chunk.  In this
  1336.          situation, only the following values may be used:
  1337.  
  1338.             gAMA:
  1339.             Gamma:         45455
  1340.  
  1341.             cHRM:
  1342.             White Point x: 31270
  1343.             White Point y: 32900
  1344.             Red x:         64000
  1345.             Red y:         33000
  1346.             Green x:       30000
  1347.             Green y:       60000
  1348.             Blue x:        15000
  1349.             Blue y:         6000
  1350.  
  1351.          When the sRGB chunk is present, applications that recognize it
  1352.          and are capable of color management [ICC] must ignore the gAMA
  1353.          and cHRM chunks and use the sRGB chunk instead.
  1354.  
  1355.          Applications that recognize the sRGB chunk but are not capable
  1356.          of full-fledged color management must also ignore the gAMA and
  1357.          cHRM chunks, because the applications already know what values
  1358.          those chunks should contain.  The applications must therefore
  1359.          use the values of gAMA and cHRM given above as if they had
  1360.          appeared in gAMA and cHRM chunks.
  1361.  
  1362.          If the sRGB chunk appears, it must precede the first IDAT
  1363.          chunk, and it must also precede the PLTE chunk if present.  The
  1364.          sRGB and iCCP chunks should not both appear.
  1365.  
  1366.       4.2.10. tEXt Textual data
  1367.  
  1368.          Textual information that the encoder wishes to record with the
  1369.          image can be stored in tEXt chunks.  Each tEXt chunk contains a
  1370.          keyword and a text string, in the format:
  1371.  
  1372.             Keyword:        1-79 bytes (character string)
  1373.             Null separator: 1 byte
  1374.             Text:           n bytes (character string)
  1375.  
  1376.          The keyword and text string are separated by a zero byte (null
  1377.          character).  Neither the keyword nor the text string can
  1378.          contain a null character.  Note that the text string is not
  1379.          null-terminated (the length of the chunk is sufficient
  1380.          information to locate the ending).  The keyword must be at
  1381.          least one character and less than 80 characters long.  The text
  1382.          string can be of any length from zero bytes up to the maximum
  1383.          permissible chunk size less the length of the keyword and
  1384.          separator.
  1385.  
  1386.          Any number of tEXt chunks can appear, and more than one with
  1387.          the same keyword is permissible.
  1388.  
  1389.          The keyword indicates the type of information represented by
  1390.          the text string.  The following keywords are predefined and
  1391.          should be used where appropriate:
  1392.  
  1393.             Title            Short (one line) title or caption for image
  1394.             Author           Name of image's creator
  1395.             Description      Description of image (possibly long)
  1396.             Copyright        Copyright notice
  1397.             Creation Time    Time of original image creation
  1398.             Software         Software used to create the image
  1399.             Disclaimer       Legal disclaimer
  1400.             Warning          Warning of nature of content
  1401.             Source           Device used to create the image
  1402.             Comment          Miscellaneous comment; conversion from
  1403.                              GIF comment
  1404.  
  1405.          For the Creation Time keyword, the date format defined in
  1406.          section 5.2.14 of RFC 1123 is suggested, but not required
  1407.          [RFC-1123]. Decoders should allow for free-format text
  1408.          associated with this or any other keyword.
  1409.  
  1410.          Other keywords may be invented for other purposes.  Keywords of
  1411.          general interest can be registered with the maintainers of the
  1412.          PNG specification.  However, it is also permitted to use
  1413.          private unregistered keywords.  (Private keywords should be
  1414.          reasonably self-explanatory, in order to minimize the chance
  1415.          that the same keyword will be used for incompatible purposes by
  1416.          different people.)
  1417.  
  1418.          Both keyword and text are interpreted according to the ISO/IEC
  1419.          8859-1 (Latin-1) character set [ISO/IEC-8859-1]. The text
  1420.          string can contain any Latin-1 character.  Newlines in the text
  1421.          string should be represented by a single linefeed character
  1422.          (decimal 10); use of other control characters in the text is
  1423.          discouraged.
  1424.  
  1425.          Keywords must contain only printable Latin-1 characters and
  1426.          spaces; that is, only character codes 32-126 and 161-255
  1427.          decimal are allowed.  To reduce the chances for human
  1428.          misreading of a keyword, leading and trailing spaces are
  1429.          forbidden, as are consecutive spaces.  Note also that the non-
  1430.          breaking space (code 160) is not permitted in keywords, since
  1431.          it is visually indistinguishable from an ordinary space.
  1432.  
  1433.          Keywords must be spelled exactly as registered, so that
  1434.          decoders can use simple literal comparisons when looking for
  1435.          particular keywords.  In particular, keywords are considered
  1436.          case-sensitive.
  1437.  
  1438.          See Recommendations for Encoders: Text chunk processing
  1439.          (Section 9.7) and Recommendations for Decoders: Text chunk
  1440.          processing (Section 10.11).
  1441.  
  1442.       4.2.11. tIME Image last-modification time
  1443.  
  1444.          The tIME chunk gives the time of the last image modification
  1445.          (not the time of initial image creation).  It contains:
  1446.  
  1447.             Year:   2 bytes (complete; for example, 1995, not 95)
  1448.             Month:  1 byte (1-12)
  1449.             Day:    1 byte (1-31)
  1450.             Hour:   1 byte (0-23)
  1451.             Minute: 1 byte (0-59)
  1452.             Second: 1 byte (0-60)    (yes, 60, for leap seconds; not 61,
  1453.                                       a common error)
  1454.  
  1455.          Universal Time (UTC, also called GMT) should be specified
  1456.          rather than local time.
  1457.  
  1458.          The tIME chunk is intended for use as an automatically-applied
  1459.          time stamp that is updated whenever the image data is changed.
  1460.          It is recommended that tIME not be changed by PNG editors that
  1461.          do not change the image data.  See also the Creation Time tEXt
  1462.          keyword, which can be used for a user-supplied time.
  1463.  
  1464.       4.2.12. tRNS Transparency
  1465.  
  1466.          The tRNS chunk specifies that the image uses simple
  1467.          transparency: either alpha values associated with palette
  1468.          entries (for indexed-color images) or a single transparent
  1469.          color (for grayscale and truecolor images).  Although simple
  1470.          transparency is not as elegant as the full alpha channel, it
  1471.          requires less storage space and is sufficient for many common
  1472.          cases.
  1473.  
  1474.          For color type 3 (indexed color), the tRNS chunk contains a
  1475.          series of one-byte alpha values, corresponding to entries in
  1476.          the PLTE chunk:
  1477.  
  1478.             Alpha for palette index 0:  1 byte
  1479.             Alpha for palette index 1:  1 byte
  1480.             ...etc...
  1481.  
  1482.          Each entry indicates that pixels of the corresponding palette
  1483.          index must be treated as having the specified alpha value.
  1484.          Alpha values have the same interpretation as in an 8-bit full
  1485.          alpha channel: 0 is fully transparent, 255 is fully opaque,
  1486.          regardless of image bit depth.  The tRNS chunk must not contain
  1487.          more alpha values than there are palette entries, but tRNS can
  1488.          contain fewer values than there are palette entries.  In this
  1489.          case, the alpha value for all remaining palette entries is
  1490.          assumed to be 255.  In the common case in which only palette
  1491.          index 0 need be made transparent, only a one-byte tRNS chunk is
  1492.          needed.
  1493.  
  1494.          For color type 0 (grayscale), the tRNS chunk contains a single
  1495.          gray level value, stored in the format:
  1496.  
  1497.             Gray:  2 bytes, range 0 .. (2^bitdepth)-1
  1498.  
  1499.          (If the image bit depth is less than 16, the least significant
  1500.          bits are used and the others are 0.)  Pixels of the specified
  1501.          gray level are to be treated as transparent (equivalent to
  1502.          alpha value 0); all other pixels are to be treated as fully
  1503.          opaque (alpha value (2^bitdepth)-1).
  1504.  
  1505.          For color type 2 (truecolor), the tRNS chunk contains a single
  1506.          RGB color value, stored in the format:
  1507.  
  1508.             Red:   2 bytes, range 0 .. (2^bitdepth)-1
  1509.             Green: 2 bytes, range 0 .. (2^bitdepth)-1
  1510.             Blue:  2 bytes, range 0 .. (2^bitdepth)-1
  1511.  
  1512.          (If the image bit depth is less than 16, the least significant
  1513.          bits are used and the others are 0.)  Pixels of the specified
  1514.          color value are to be treated as transparent (equivalent to
  1515.          alpha value 0); all other pixels are to be treated as fully
  1516.          opaque (alpha value (2^bitdepth)-1).
  1517.  
  1518.          tRNS is prohibited for color types 4 and 6, since a full alpha
  1519.          channel is already present in those cases.
  1520.  
  1521.          Note: when dealing with 16-bit grayscale or truecolor data, it
  1522.          is important to compare both bytes of the sample values to
  1523.          determine whether a pixel is transparent.  Although decoders
  1524.          may drop the low-order byte of the samples for display, this
  1525.          must not occur until after the data has been tested for
  1526.          transparency.  For example, if the grayscale level 0x0001 is
  1527.          specified to be transparent, it would be incorrect to compare
  1528.          only the high-order byte and decide that 0x0002 is also
  1529.          transparent.
  1530.  
  1531.          When present, the tRNS chunk must precede the first IDAT chunk,
  1532.          and must follow the PLTE chunk, if any.
  1533.  
  1534.       4.2.13. zTXt Compressed textual data
  1535.  
  1536.          The zTXt chunk contains textual data, just as tEXt does;
  1537.          however, zTXt takes advantage of compression.  The zTXt and
  1538.          tEXt chunks are semantically equivalent, but zTXt is
  1539.          recommended for storing large blocks of text.
  1540.  
  1541.          A zTXt chunk contains:
  1542.  
  1543.             Keyword:            1-79 bytes (character string)
  1544.             Null separator:     1 byte
  1545.             Compression method: 1 byte
  1546.             Compressed text:    n bytes
  1547.  
  1548.          The keyword and null separator are exactly the same as in the
  1549.          tEXt chunk.  Note that the keyword is not compressed.  The
  1550.          compression method byte identifies the compression method used
  1551.          in this zTXt chunk.  The only value presently defined for it is
  1552.          0 (deflate/inflate compression).  The compression method byte
  1553.          is followed by a compressed datastream that makes up the
  1554.          remainder of the chunk.  For compression method 0, this
  1555.          datastream adheres to the zlib datastream format (see
  1556.          Deflate/Inflate Compression, Chapter 5).  Decompression of this
  1557.          datastream yields Latin-1 text that is identical to the text
  1558.          that would be stored in an equivalent tEXt chunk.
  1559.  
  1560.          Any number of zTXt and tEXt chunks can appear in the same file.
  1561.          See the preceding definition of the tEXt chunk for the
  1562.          predefined keywords and the recommended format of the text.
  1563.  
  1564.          See Recommendations for Encoders: Text chunk processing
  1565.          (Section 9.7) and Recommendations for Decoders: Text chunk
  1566.          processing (Section 10.11).
  1567.  
  1568.    4.3. Summary of standard chunks
  1569.  
  1570.       This table summarizes some properties of the standard chunk types.
  1571.  
  1572.          Critical chunks (must appear in this order, except PLTE
  1573.                           is optional):
  1574.  
  1575.                  Name  Multiple  Ordering constraints
  1576.                          OK?
  1577.  
  1578.                  IHDR    No      Must be first
  1579.                  PLTE    No      Before IDAT
  1580.                  IDAT    Yes     Multiple IDATs must be consecutive
  1581.                  IEND    No      Must be last
  1582.  
  1583.          Ancillary chunks (need not appear in this order):
  1584.  
  1585.                  Name  Multiple  Ordering constraints
  1586.                          OK?
  1587.  
  1588.                  cHRM    No      Before PLTE and IDAT
  1589.                  gAMA    No      Before PLTE and IDAT
  1590.                  iCCP    No      Before PLTE and IDAT
  1591.                  sBIT    No      Before PLTE and IDAT
  1592.                  sRGB    No      Before PLTE and IDAT
  1593.                  bKGD    No      After PLTE; before IDAT
  1594.                  hIST    No      After PLTE; before IDAT
  1595.                  tRNS    No      After PLTE; before IDAT
  1596.                  pHYs    No      Before IDAT
  1597.                  sPLT    Yes     Before IDAT
  1598.                  tIME    No      None
  1599.                  tEXt    Yes     None
  1600.                  zTXt    Yes     None
  1601.  
  1602.       Standard keywords for tEXt and zTXt chunks:
  1603.  
  1604.          Title            Short (one line) title or caption for image
  1605.          Author           Name of image's creator
  1606.          Description      Description of image (possibly long)
  1607.          Copyright        Copyright notice
  1608.          Creation Time    Time of original image creation
  1609.          Software         Software used to create the image
  1610.          Disclaimer       Legal disclaimer
  1611.          Warning          Warning of nature of content
  1612.          Source           Device used to create the image
  1613.          Comment          Miscellaneous comment; conversion from
  1614.                           GIF comment
  1615.  
  1616.    4.4. Additional chunk types
  1617.  
  1618.       Additional public PNG chunk types are defined in the document
  1619.       "Extensions to the PNG-1.1 Specification, Version 1.1.0"
  1620.       [PNG-EXTENSIONS].  Chunks described there are expected to be less
  1621.       widely supported than those defined in this specification.
  1622.       However, application authors are encouraged to use those chunk
  1623.       types whenever appropriate for their applications.  Additional
  1624.       chunk types can be proposed for inclusion in that list by
  1625.       contacting the PNG specification maintainers at
  1626.       png-info@uunet.uu.net or at png-group@w3.org.
  1627.  
  1628.       New public chunks will be registered only if they are of use to
  1629.       others and do not violate the design philosophy of PNG.  Chunk
  1630.       registration is not automatic, although it is the intent of the
  1631.       authors that it be straightforward when a new chunk of potentially
  1632.       wide application is needed.  Note that the creation of new
  1633.       critical chunk types is discouraged unless absolutely necessary.
  1634.  
  1635.       Applications can also use private chunk types to carry data that
  1636.       is not of interest to other applications.  See Recommendations for
  1637.       Encoders: Use of private chunks (Section 9.8).
  1638.  
  1639.       Decoders must be prepared to encounter unrecognized public or
  1640.       private chunk type codes.  Unrecognized chunk types must be
  1641.       handled as described in Chunk naming conventions (Section 3.3).
  1642.  
  1643. 5. Deflate/Inflate Compression
  1644.  
  1645.    PNG compression method 0 (the only compression method presently
  1646.    defined for PNG) specifies deflate/inflate compression with a sliding
  1647.    window of at most 32768 bytes.  Deflate compression is an LZ77
  1648.    derivative used in zip, gzip, pkzip, and related programs.  Extensive
  1649.    research has been done supporting its patent-free status.  Portable C
  1650.    implementations are freely available.
  1651.  
  1652.    Deflate-compressed datastreams within PNG are stored in the "zlib"
  1653.    format, which has the structure:
  1654.  
  1655.       Compression method/flags code: 1 byte
  1656.       Additional flags/check bits:   1 byte
  1657.       Compressed data blocks:        n bytes
  1658.       Check value:                   4 bytes
  1659.  
  1660.    Further details on this format are given in the zlib specification
  1661.    [RFC-1950].
  1662.  
  1663.    For PNG compression method 0, the zlib compression method/flags code
  1664.    must specify method code 8 ("deflate" compression) and an LZ77 window
  1665.    size of not more than 32768 bytes.  Note that the zlib compression
  1666.    method number is not the same as the PNG compression method number.
  1667.    The additional flags must not specify a preset dictionary.  A PNG
  1668.    decoder must be able to decompress any valid zlib datastream that
  1669.    satisfies these additional constraints.
  1670.  
  1671.    If the data to be compressed contains 16384 bytes or fewer, the
  1672.    encoder can set the window size by rounding up to a power of 2 (256
  1673.    minimum).  This decreases the memory required not only for encoding
  1674.    but also for decoding, without adversely affecting the compression
  1675.    ratio.
  1676.  
  1677.    The compressed data within the zlib datastream is stored as a series
  1678.    of blocks, each of which can represent raw (uncompressed) data,
  1679.    LZ77-compressed data encoded with fixed Huffman codes, or LZ77-
  1680.    compressed data encoded with custom Huffman codes.  A marker bit in
  1681.    the final block identifies it as the last block, allowing the decoder
  1682.    to recognize the end of the compressed datastream.  Further details
  1683.    on the compression algorithm and the encoding are given in the
  1684.    deflate specification [RFC-1951].
  1685.  
  1686.    The check value stored at the end of the zlib datastream is
  1687.    calculated on the uncompressed data represented by the datastream.
  1688.    Note that the algorithm used is not the same as the CRC calculation
  1689.    used for PNG chunk check values.  The zlib check value is useful
  1690.    mainly as a cross-check that the deflate and inflate algorithms are
  1691.    implemented correctly.  Verifying the chunk CRCs provides adequate
  1692.    confidence that the PNG file has been transmitted undamaged.
  1693.  
  1694.    In a PNG file, the concatenation of the contents of all the IDAT
  1695.    chunks makes up a zlib datastream as specified above.  This
  1696.    datastream decompresses to filtered image data as described elsewhere
  1697.    in this document.
  1698.  
  1699.    It is important to emphasize that the boundaries between IDAT chunks
  1700.    are arbitrary and can fall anywhere in the zlib datastream.  There is
  1701.    not necessarily any correlation between IDAT chunk boundaries and
  1702.    deflate block boundaries or any other feature of the zlib data.  For
  1703.    example, it is entirely possible for the terminating zlib check value
  1704.    to be split across IDAT chunks.
  1705.  
  1706.    In the same vein, there is no required correlation between the
  1707.    structure of the image data (i.e., scanline boundaries) and deflate
  1708.    block boundaries or IDAT chunk boundaries.  The complete image data
  1709.    is represented by a single zlib datastream that is stored in some
  1710.    number of IDAT chunks; a decoder that assumes any more than this is
  1711.    incorrect.  (Of course, some encoder implementations may emit files
  1712.    in which some of these structures are indeed related.  But decoders
  1713.    cannot rely on this.)
  1714.  
  1715.    PNG also uses zlib datastreams in zTXt and iCCP chunks, where the
  1716.    remainder of the chunk following the compression method byte is a
  1717.    zlib datastream as specified above.  Unlike the image data, such
  1718.    datastreams are not split across chunks; each zTXt or iCCP chunk
  1719.    contains an independent zlib datastream.
  1720.  
  1721.    Additional documentation and portable C code for deflate and inflate
  1722.    are available from the Info-ZIP archives at
  1723.    ftp://ftp.cdrom.com/pub/infozip/.
  1724.  
  1725. 6. Filter Algorithms
  1726.  
  1727.    This chapter describes the filter algorithms that can be applied
  1728.    before compression.  The purpose of these filters is to prepare the
  1729.    image data for optimum compression.
  1730.  
  1731.    6.1. Filter types
  1732.  
  1733.       PNG filter method 0 defines five basic filter types:
  1734.  
  1735.          Type    Name
  1736.  
  1737.          0       None
  1738.          1       Sub
  1739.          2       Up
  1740.          3       Average
  1741.          4       Paeth
  1742.  
  1743.       (Note that filter method 0 in IHDR specifies exactly this set of
  1744.       five filter types.  If the set of filter types is ever extended, a
  1745.       different filter method number will be assigned to the extended
  1746.       set, so that decoders need not decompress the data to discover
  1747.       that it contains unsupported filter types.)
  1748.  
  1749.       The encoder can choose which of these filter algorithms to apply
  1750.       on a scanline-by-scanline basis.  In the image data sent to the
  1751.       compression step, each scanline is preceded by a filter-type byte
  1752.       that specifies the filter algorithm used for that scanline.
  1753.  
  1754.       Filtering algorithms are applied to bytes, not to pixels,
  1755.       regardless of the bit depth or color type of the image.  The
  1756.       filtering algorithms work on the byte sequence formed by a
  1757.       scanline that has been represented as described in Image layout
  1758.       (Section 2.3). If the image includes an alpha channel, the alpha
  1759.       data is filtered in the same way as the image data.
  1760.  
  1761.       When the image is interlaced, each pass of the interlace pattern
  1762.       is treated as an independent image for filtering purposes.  The
  1763.       filters work on the byte sequences formed by the pixels actually
  1764.       transmitted during a pass, and the "previous scanline" is the one
  1765.       previously transmitted in the same pass, not the one adjacent in
  1766.       the complete image.  Note that the subimage transmitted in any one
  1767.       pass is always rectangular, but is of smaller width and/or height
  1768.       than the complete image.  Filtering is not applied when this
  1769.       subimage is empty.
  1770.  
  1771.       For all filters, the bytes "to the left of" the first pixel in a
  1772.       scanline must be treated as being zero.  For filters that refer to
  1773.       the prior scanline, the entire prior scanline must be treated as
  1774.       being zeroes for the first scanline of an image (or of a pass of
  1775.       an interlaced image).
  1776.  
  1777.       To reverse the effect of a filter, the decoder must use the
  1778.       decoded values of the prior pixel on the same line, the pixel
  1779.       immediately above the current pixel on the prior line, and the
  1780.       pixel just to the left of the pixel above.  This implies that at
  1781.       least one scanline's worth of image data will have to be stored by
  1782.       the decoder at all times.  Even though some filter types do not
  1783.       refer to the prior scanline, the decoder will always need to store
  1784.       each scanline as it is decoded, since the next scanline might use
  1785.       a filter that refers to it.
  1786.  
  1787.       PNG imposes no restriction on which filter types can be applied to
  1788.       an image.  However, the filters are not equally effective on all
  1789.       types of data.  See Recommendations for Encoders: Filter selection
  1790.       (Section 9.6).
  1791.  
  1792.       See also Rationale: Filtering (Section 12.9).
  1793.  
  1794.    6.2. Filter type 0: None
  1795.  
  1796.       With the None() filter, the scanline is transmitted unmodified; it
  1797.       is necessary only to insert a filter-type byte before the data.
  1798.  
  1799.    6.3. Filter type 1: Sub
  1800.  
  1801.       The Sub() filter transmits the difference between each byte and
  1802.       the value of the corresponding byte of the prior pixel.
  1803.  
  1804.       To compute the Sub() filter, apply the following formula to each
  1805.       byte of the scanline:
  1806.  
  1807.          Sub(x) = Raw(x) - Raw(x-bpp)
  1808.  
  1809.       where x ranges from zero to the number of bytes representing the
  1810.       scanline minus one, Raw() refers to the raw data byte at that byte
  1811.       position in the scanline, and bpp is defined as the number of
  1812.       bytes per complete pixel, rounding up to one.  For example, for
  1813.       color type 2 with a bit depth of 16, bpp is equal to 6 (three
  1814.       samples, two bytes per sample); for color type 0 with a bit depth
  1815.       of 2, bpp is equal to 1 (rounding up); for color type 4 with a bit
  1816.       depth of 16, bpp is equal to 4 (two-byte grayscale sample, plus
  1817.       two-byte alpha sample).
  1818.  
  1819.       Note this computation is done for each byte, regardless of bit
  1820.       depth.  In a 16-bit image, each MSB is predicted from the
  1821.       preceding MSB and each LSB from the preceding LSB, because of the
  1822.       way that bpp is defined.
  1823.  
  1824.       Unsigned arithmetic modulo 256 is used, so that both the inputs
  1825.       and outputs fit into bytes.  The sequence of Sub values is
  1826.       transmitted as the filtered scanline.
  1827.  
  1828.       For all x < 0, assume Raw(x) = 0.
  1829.  
  1830.       To reverse the effect of the Sub() filter after decompression,
  1831.       output the following value:
  1832.  
  1833.          Sub(x) + Raw(x-bpp)
  1834.  
  1835.       (computed mod 256), where Raw() refers to the bytes already
  1836.       decoded.
  1837.  
  1838.    6.4. Filter type 2: Up
  1839.  
  1840.       The Up() filter is just like the Sub() filter except that the
  1841.       pixel immediately above the current pixel, rather than just to its
  1842.       left, is used as the predictor.
  1843.  
  1844.       To compute the Up() filter, apply the following formula to each
  1845.       byte of the scanline:
  1846.  
  1847.          Up(x) = Raw(x) - Prior(x)
  1848.  
  1849.       where x ranges from zero to the number of bytes representing the
  1850.       scanline minus one, Raw() refers to the raw data byte at that byte
  1851.       position in the scanline, and Prior(x) refers to the unfiltered
  1852.       bytes of the prior scanline.
  1853.  
  1854.       Note this is done for each byte, regardless of bit depth.
  1855.       Unsigned arithmetic modulo 256 is used, so that both the inputs
  1856.       and outputs fit into bytes.  The sequence of Up values is
  1857.       transmitted as the filtered scanline.
  1858.  
  1859.       On the first scanline of an image (or of a pass of an interlaced
  1860.       image), assume Prior(x) = 0 for all x.
  1861.  
  1862.       To reverse the effect of the Up() filter after decompression,
  1863.       output the following value:
  1864.  
  1865.          Up(x) + Prior(x)
  1866.  
  1867.       (computed mod 256), where Prior() refers to the decoded bytes of
  1868.       the prior scanline.
  1869.  
  1870.    6.5. Filter type 3: Average
  1871.  
  1872.       The Average() filter uses the average of the two neighboring
  1873.       pixels (left and above) to predict the value of a pixel.
  1874.  
  1875.       To compute the Average() filter, apply the following formula to
  1876.       each byte of the scanline:
  1877.  
  1878.          Average(x) = Raw(x) - floor((Raw(x-bpp)+Prior(x))/2)
  1879.  
  1880.       where x ranges from zero to the number of bytes representing the
  1881.       scanline minus one, Raw() refers to the raw data byte at that byte
  1882.       position in the scanline, Prior() refers to the unfiltered bytes
  1883.       of the prior scanline, and bpp is defined as for the Sub() filter.
  1884.  
  1885.       Note this is done for each byte, regardless of bit depth.  The
  1886.       sequence of Average values is transmitted as the filtered
  1887.       scanline.
  1888.  
  1889.       The subtraction of the predicted value from the raw byte must be
  1890.       done modulo 256, so that both the inputs and outputs fit into
  1891.       bytes.  However, the sum Raw(x-bpp)+Prior(x) must be formed
  1892.       without overflow (using at least nine-bit arithmetic).  floor()
  1893.       indicates that the result of the division is rounded to the next
  1894.       lower integer if fractional; in other words, it is an integer
  1895.       division or right shift operation.
  1896.  
  1897.       For all x < 0, assume Raw(x) = 0.  On the first scanline of an
  1898.       image (or of a pass of an interlaced image), assume Prior(x) = 0
  1899.       for all x.
  1900.  
  1901.       To reverse the effect of the Average() filter after decompression,
  1902.       output the following value:
  1903.  
  1904.          Average(x) + floor((Raw(x-bpp)+Prior(x))/2)
  1905.  
  1906.       where the result is computed mod 256, but the prediction is
  1907.       calculated in the same way as for encoding.  Raw() refers to the
  1908.       bytes already decoded, and Prior() refers to the decoded bytes of
  1909.       the prior scanline.
  1910.  
  1911.    6.6. Filter type 4: Paeth
  1912.  
  1913.       The Paeth() filter computes a simple linear function of the three
  1914.       neighboring pixels (left, above, upper left), then chooses as
  1915.       predictor the neighboring pixel closest to the computed value.
  1916.       This technique is due to Alan W. Paeth [PAETH].
  1917.  
  1918.       To compute the Paeth() filter, apply the following formula to each
  1919.       byte of the scanline:
  1920.  
  1921.          Paeth(x) = Raw(x) -
  1922.                     PaethPredictor(Raw(x-bpp), Prior(x), Prior(x-bpp))
  1923.  
  1924.       where x ranges from zero to the number of bytes representing the
  1925.       scanline minus one, Raw() refers to the raw data byte at that byte
  1926.       position in the scanline, Prior() refers to the unfiltered bytes
  1927.       of the prior scanline, and bpp is defined as for the Sub() filter.
  1928.  
  1929.       Note this is done for each byte, regardless of bit depth.
  1930.       Unsigned arithmetic modulo 256 is used, so that both the inputs
  1931.       and outputs fit into bytes.  The sequence of Paeth values is
  1932.       transmitted as the filtered scanline.
  1933.  
  1934.       The PaethPredictor() function is defined by the following
  1935.       pseudocode:
  1936.  
  1937.          function PaethPredictor (a, b, c)
  1938.          begin
  1939.               ; a = left, b = above, c = upper left
  1940.               p := a + b - c        ; initial estimate
  1941.               pa := abs(p - a)      ; distances to a, b, c
  1942.               pb := abs(p - b)
  1943.               pc := abs(p - c)
  1944.               ; return nearest of a,b,c,
  1945.               ; breaking ties in order a,b,c.
  1946.               if pa <= pb AND pa <= pc then return a
  1947.               else if pb <= pc then return b
  1948.               else return c
  1949.          end
  1950.  
  1951.       The calculations within the PaethPredictor() function must be
  1952.       performed exactly, without overflow.  Arithmetic modulo 256 is to
  1953.       be used only for the final step of subtracting the function result
  1954.       from the target byte value.
  1955.  
  1956.       Note that the order in which ties are broken is critical and must
  1957.       not be altered.  The tie break order is: pixel to the left, pixel
  1958.       above, pixel to the upper left.  (This order differs from that
  1959.       given in Paeth's article.)
  1960.  
  1961.       For all x < 0, assume Raw(x) = 0 and Prior(x) = 0.  On the first
  1962.       scanline of an image (or of a pass of an interlaced image), assume
  1963.       Prior(x) = 0 for all x.
  1964.  
  1965.       To reverse the effect of the Paeth() filter after decompression,
  1966.       output the following value:
  1967.  
  1968.          Paeth(x) + PaethPredictor(Raw(x-bpp), Prior(x), Prior(x-bpp))
  1969.  
  1970.       (computed mod 256), where Raw() and Prior() refer to bytes already
  1971.       decoded.  Exactly the same PaethPredictor() function is used by
  1972.       both encoder and decoder.
  1973.  
  1974. 7. Chunk Ordering Rules
  1975.  
  1976.    To allow new chunk types to be added to PNG, it is necessary to
  1977.    establish rules about the ordering requirements for all chunk types.
  1978.    Otherwise a PNG editing program cannot know what to do when it
  1979.    encounters an unknown chunk.
  1980.  
  1981.    We define a "PNG editor" as a program that modifies a PNG file and
  1982.    wishes to preserve as much as possible of the ancillary information
  1983.    in the file.  Two examples of PNG editors are a program that adds or
  1984.    modifies text chunks, and a program that adds a suggested palette to
  1985.    a truecolor PNG file.  Ordinary image editors are not PNG editors in
  1986.    this sense, because they usually discard all unrecognized information
  1987.    while reading in an image.  (Note: we strongly encourage programs
  1988.    handling PNG files to preserve ancillary information whenever
  1989.    possible.)
  1990.  
  1991.    As an example of possible problems, consider a hypothetical new
  1992.    ancillary chunk type that is safe-to-copy and is required to appear
  1993.    after PLTE if PLTE is present.  If our program to add a suggested
  1994.    PLTE does not recognize this new chunk, it may insert PLTE in the
  1995.    wrong place, namely after the new chunk.  We could prevent such
  1996.    problems by requiring PNG editors to discard all unknown chunks, but
  1997.    that is a very unattractive solution.  Instead, PNG requires
  1998.    ancillary chunks not to have ordering restrictions like this.
  1999.  
  2000.    To prevent this type of problem while allowing for future extension,
  2001.    we put some constraints on both the behavior of PNG editors and the
  2002.    allowed ordering requirements for chunks.
  2003.  
  2004.    7.1. Behavior of PNG editors
  2005.  
  2006.       The rules for PNG editors are:
  2007.  
  2008.           * When copying an unknown unsafe-to-copy ancillary chunk, a
  2009.             PNG editor must not move the chunk relative to any critical
  2010.             chunk.  It can relocate the chunk freely relative to other
  2011.             ancillary chunks that occur between the same pair of
  2012.             critical chunks.  (This is well defined since the editor
  2013.             must not add, delete, modify, or reorder critical chunks if
  2014.             it is preserving unknown unsafe-to-copy chunks.)
  2015.  
  2016.           * When copying an unknown safe-to-copy ancillary chunk, a PNG
  2017.             editor must not move the chunk from before IDAT to after
  2018.             IDAT or vice versa.  (This is well defined because IDAT is
  2019.             always present.)  Any other reordering is permitted.
  2020.  
  2021.           * When copying a known ancillary chunk type, an editor need
  2022.             only honor the specific chunk ordering rules that exist for
  2023.             that chunk type.  However, it can always choose to apply the
  2024.             above general rules instead.
  2025.  
  2026.           * PNG editors must give up on encountering an unknown critical
  2027.             chunk type, because there is no way to be certain that a
  2028.             valid file will result from modifying a file containing such
  2029.             a chunk.  (Note that simply discarding the chunk is not good
  2030.             enough, because it might have unknown implications for the
  2031.             interpretation of other chunks.)
  2032.  
  2033.       These rules are expressed in terms of copying chunks from an input
  2034.       file to an output file, but they apply in the obvious way if a PNG
  2035.       file is modified in place.
  2036.  
  2037.       See also Chunk naming conventions (Section 3.3).
  2038.  
  2039.    7.2. Ordering of ancillary chunks
  2040.  
  2041.       The ordering rules for an ancillary chunk type cannot be any
  2042.       stricter than this:
  2043.  
  2044.           * Unsafe-to-copy chunks can have ordering requirements
  2045.             relative to critical chunks.
  2046.  
  2047.           * Safe-to-copy chunks can have ordering requirements relative
  2048.             to IDAT.
  2049.  
  2050.       The actual ordering rules for any particular ancillary chunk type
  2051.       may be weaker.  See for example the ordering rules for the
  2052.       standard ancillary chunk types (Summary of standard chunks,
  2053.       Section 4.3).
  2054.  
  2055.       Decoders must not assume more about the positioning of any
  2056.       ancillary chunk than is specified by the chunk ordering rules.  In
  2057.       particular, it is never valid to assume that a specific ancillary
  2058.       chunk type occurs with any particular positioning relative to
  2059.       other ancillary chunks.  (For example, it is unsafe to assume that
  2060.       your private ancillary chunk occurs immediately before IEND.  Even
  2061.       if your application always writes it there, a PNG editor might
  2062.       have inserted some other ancillary chunk after it.  But you can
  2063.       safely assume that your chunk will remain somewhere between IDAT
  2064.       and IEND.)
  2065.  
  2066.    7.3. Ordering of critical chunks
  2067.  
  2068.       Critical chunks can have arbitrary ordering requirements, because
  2069.       PNG editors are required to give up if they encounter unknown
  2070.       critical chunks.  For example, IHDR has the special ordering rule
  2071.       that it must always appear first.  A PNG editor, or indeed any
  2072.       PNG-writing program, must know and follow the ordering rules for
  2073.       any critical chunk type that it can emit.
  2074.  
  2075. 8. Miscellaneous Topics
  2076.  
  2077.    8.1. File name extension
  2078.  
  2079.       On systems where file names customarily include an extension
  2080.       signifying file type, the extension ".png" is recommended for PNG
  2081.       files.  Lowercase ".png" is preferred if file names are case-
  2082.       sensitive.
  2083.  
  2084.    8.2. Internet media type
  2085.  
  2086.       The Internet Assigned Numbers Authority (IANA) has registered
  2087.       "image/png" as the Internet Media Type for PNG [RFC-2045],
  2088.       [RFC-2048]. For robustness, decoders may choose to also support
  2089.       the interim media type "image/x-png" that was in use before
  2090.       registration was complete.
  2091.  
  2092.    8.3. Macintosh file layout
  2093.  
  2094.       In the Apple Macintosh system, the following conventions are
  2095.       recommended:
  2096.  
  2097.           * The four-byte file type code for PNG files is "PNGf".  (This
  2098.             code has been registered with Apple for PNG files.)  The
  2099.             creator code will vary depending on the creating
  2100.             application.
  2101.  
  2102.           * The contents of the data fork must be a PNG file exactly as
  2103.             described in the rest of this specification.
  2104.  
  2105.           * The contents of the resource fork are unspecified.  It may
  2106.             be empty or may contain application-dependent resources.
  2107.  
  2108.           * When transferring a Macintosh PNG file to a non-Macintosh
  2109.             system, only the data fork should be transferred.
  2110.  
  2111.    8.4. Multiple-image extension
  2112.  
  2113.       PNG itself is strictly a single-image format.  However, it may be
  2114.       necessary to store multiple images within one file; for example,
  2115.       this is needed to convert some GIF files.  In the future, a
  2116.       multiple-image format based on PNG may be defined.  Such a format
  2117.       will be considered a separate file format and will have a
  2118.       different signature.  PNG-supporting applications may or may not
  2119.       choose to support the multiple-image format.
  2120.  
  2121.       See Rationale: Why not these features? (Section 12.3).
  2122.  
  2123.    8.5. Security considerations
  2124.  
  2125.       A PNG file or datastream is composed of a collection of explicitly
  2126.       typed "chunks".  Chunks whose contents are defined by the
  2127.       specification could actually contain anything, including malicious
  2128.       code.  But there is no known risk that such malicious code could
  2129.       be executed on the recipient's computer as a result of decoding
  2130.       the PNG image.
  2131.  
  2132.       The possible security risks associated with private chunk types
  2133.       and future chunk types cannot be specified at this time.  Security
  2134.       issues will be considered when evaluating chunks proposed for
  2135.       registration as public chunks.  There is no additional security
  2136.       risk associated with unknown or unimplemented chunk types, because
  2137.       such chunks will be ignored, or at most be copied into another PNG
  2138.       file.
  2139.  
  2140.       The tEXt and zTXt chunks contain keywords and data that is meant
  2141.       to be displayed as plain text.  The iCCP, sPLT, and some public
  2142.       "extension" chunks contain keywords meant to be displayed as plain
  2143.       text.  It is possible that if a decoder displays such text without
  2144.       filtering out control characters, especially the ESC (escape)
  2145.       character, certain systems or terminals could behave in
  2146.       undesirable and insecure ways.  We recommend that decoders filter
  2147.       out control characters to avoid this risk; see Recommendations for
  2148.       Decoders:  Text chunk processing (Section 10.11).
  2149.  
  2150.       Every chunk begins with a length field, making it easier to write
  2151.       decoders invulnerable to fraudulent chunks that attempt to
  2152.       overflow buffers.  The CRC at the end of every chunk provides a
  2153.       robust defense against accidentally corrupted data.  Also, the PNG
  2154.       signature bytes provide early detection of common file
  2155.       transmission errors.
  2156.  
  2157.       A decoder that fails to check CRCs could be subject to data
  2158.       corruption.  The only likely consequence of such corruption is
  2159.       incorrectly displayed pixels within the image.  Worse things might
  2160.       happen if the CRC of the IHDR chunk is not checked and the width
  2161.       or height fields are corrupted.  See Recommendations for Decoders:
  2162.       Error checking (Section 10.1).
  2163.  
  2164.       A poorly written decoder might be subject to buffer overflow,
  2165.       because chunks can be extremely large, up to (2^31)-1 bytes long.
  2166.       But properly written decoders will handle large chunks without
  2167.       difficulty.
  2168.  
  2169. 9. Recommendations for Encoders
  2170.  
  2171.    This chapter gives some recommendations for encoder behavior.  The
  2172.    only absolute requirement on a PNG encoder is that it produce files
  2173.    that conform to the format specified in the preceding chapters.
  2174.    However, best results will usually be achieved by following these
  2175.    recommendations.
  2176.  
  2177.    9.1. Sample depth scaling
  2178.  
  2179.       When encoding input samples that have a sample depth that cannot
  2180.       be directly represented in PNG, the encoder must scale the samples
  2181.       up to a sample depth that is allowed by PNG.  The most accurate
  2182.       scaling method is the linear equation
  2183.  
  2184.          output = ROUND(input * MAXOUTSAMPLE / MAXINSAMPLE)
  2185.  
  2186.       where the input samples range from 0 to MAXINSAMPLE and the
  2187.       outputs range from 0 to MAXOUTSAMPLE (which is (2^sampledepth)-1).
  2188.  
  2189.       A close approximation to the linear scaling method can be achieved
  2190.       by "left bit replication", which is shifting the valid bits to
  2191.       begin in the most significant bit and repeating the most
  2192.       significant bits into the open bits.  This method is often faster
  2193.       to compute than linear scaling.  As an example, assume that 5-bit
  2194.       samples are being scaled up to 8 bits.  If the source sample value
  2195.       is 27 (in the range from 0-31), then the original bits are:
  2196.  
  2197.          4 3 2 1 0
  2198.          ---------
  2199.          1 1 0 1 1
  2200.  
  2201.       Left bit replication gives a value of 222:
  2202.  
  2203.          7 6 5 4 3  2 1 0
  2204.          ----------------
  2205.          1 1 0 1 1  1 1 0
  2206.          |=======|  |===|
  2207.              |      Leftmost Bits Repeated to Fill Open Bits
  2208.              |
  2209.          Original Bits
  2210.  
  2211.       which matches the value computed by the linear equation.  Left bit
  2212.       replication usually gives the same value as linear scaling and is
  2213.       never off by more than one.
  2214.  
  2215.       A distinctly less accurate approximation is obtained by simply
  2216.       left-shifting the input value and filling the low order bits with
  2217.       zeroes.  This scheme cannot reproduce white exactly, since it does
  2218.       not generate an all-ones maximum value; the net effect is to
  2219.       darken the image slightly.  This method is not recommended in
  2220.       general, but it does have the effect of improving compression,
  2221.       particularly when dealing with greater-than-eight-bit sample
  2222.       depths.  Since the relative error introduced by zero-fill scaling
  2223.       is small at high sample depths, some encoders may choose to use
  2224.       it.  Zero-fill must not be used for alpha channel data, however,
  2225.       since many decoders will special-case alpha values of all zeroes
  2226.       and all ones.  It is important to represent both those values
  2227.       exactly in the scaled data.
  2228.  
  2229.       When the encoder writes an sBIT chunk, it is required to do the
  2230.       scaling in such a way that the high-order bits of the stored
  2231.       samples match the original data.  That is, if the sBIT chunk
  2232.       specifies a sample depth of S, the high-order S bits of the stored
  2233.       data must agree with the original S-bit data values.  This allows
  2234.       decoders to recover the original data by shifting right.  The
  2235.       added low-order bits are not constrained.  Note that all the above
  2236.       scaling methods meet this restriction.
  2237.  
  2238.       When scaling up source data, it is recommended that the low-order
  2239.       bits be filled consistently for all samples; that is, the same
  2240.       source value should generate the same sample value at any pixel
  2241.       position.  This improves compression by reducing the number of
  2242.       distinct sample values.  However, this is not a requirement, and
  2243.       some encoders may choose not to follow it.  For example, an
  2244.       encoder might instead dither the low-order bits, improving
  2245.       displayed image quality at the price of increasing file size.
  2246.  
  2247.       In some applications the original source data may have a range
  2248.       that is not a power of 2.  The linear scaling equation still works
  2249.       for this case, although the shifting methods do not.  It is
  2250.       recommended that an sBIT chunk not be written for such images,
  2251.       since sBIT suggests that the original data range was exactly
  2252.       0..(2^S)-1.
  2253.  
  2254.    9.2. Encoder gamma handling
  2255.  
  2256.       See Gamma Tutorial (Chapter 13) if you aren't already familiar
  2257.       with gamma issues.
  2258.  
  2259.       Encoders capable of full-fledged color management [ICC] will
  2260.       perform more sophisticated calculations than those described here,
  2261.       and they may choose to use the iCCP chunk.  Encoders that know
  2262.       that their image samples conform to the sRGB specification [sRGB]
  2263.       should use the sRGB chunk and not perform gamma handling.
  2264.       Otherwise, this section applies.
  2265.  
  2266.       The encoder has two gamma-related decisions to make.  First, it
  2267.       must decide how to transform whatever image samples it has into
  2268.       the image samples that will go into the PNG file.  Second, it must
  2269.       decide what value to write into the gAMA chunk.
  2270.  
  2271.       The rule for the second decision is simply to write whatever value
  2272.       will cause a decoder to do what you want.  See Recommendations for
  2273.       Decoders: Decoder gamma handling (Section 10.5).
  2274.  
  2275.       The first decision depends on the nature of the image samples and
  2276.       their precision.  If the samples represent light intensity in
  2277.       floating-point or high-precision integer form (perhaps from a
  2278.       computer image renderer), then the encoder may perform "gamma
  2279.       encoding" (applying a power function with exponent less than 1)
  2280.       before quantizing the data to integer values for output to the
  2281.       file.  This results in fewer banding artifacts at a given sample
  2282.       depth, or allows smaller samples while retaining the same visual
  2283.       quality.  An intensity level expressed as a floating-point value
  2284.       in the range 0 to 1 can be converted to a file image sample by
  2285.  
  2286.          sample = intensity ^ encoding_exponent
  2287.          integer_sample = ROUND(sample * (2^bitdepth - 1))
  2288.  
  2289.       If the intensity in the equation is the desired display output
  2290.       intensity, then the encoding exponent is the gamma value to be
  2291.       written to the file, by the definition of gAMA (See the gAMA chunk
  2292.       specification, Paragraph 4.2.3). But if the intensity available to
  2293.       the encoder is the original scene intensity, another
  2294.       transformation may be needed.  Sometimes the displayed image
  2295.       should have higher contrast than the original image; in other
  2296.       words, the end-to-end transfer function from original scene to
  2297.       display output should have an exponent greater than 1.  In this
  2298.       case,
  2299.  
  2300.          gamma = encoding_exponent / end_to_end_exponent
  2301.  
  2302.       If you don't know whether the conditions under which the original
  2303.       image was captured (or calculated) warrant such a contrast change,
  2304.       you may assume that display intensities are proportional to
  2305.       original scene intensities; in other words, the end-to-end
  2306.       exponent is 1, so gamma and the encoding exponent are equal.
  2307.  
  2308.       If the image is being written to a file only, the encoder is free
  2309.       to choose the encoding exponent.  Choosing a value that causes the
  2310.       gamma value in the gAMA chunk to be 1/2.2 is often a reasonable
  2311.       choice because it minimizes the work for a decoder displaying on a
  2312.       typical video monitor.
  2313.  
  2314.       Some image renderers may simultaneously write the image to a PNG
  2315.       file and display it on-screen.  The displayed pixels should be
  2316.       appropriate for the display system, so that the user sees a proper
  2317.       representation of the intended scene.
  2318.  
  2319.       If the renderer wants to write the displayed sample values to the
  2320.       PNG file, avoiding a separate gamma encoding step for file output,
  2321.       then the renderer should approximate the transfer function of the
  2322.       display system by a power function, and write the reciprocal of
  2323.       the exponent into the gAMA chunk.  This will allow a PNG decoder
  2324.       to reproduce what the file's originator saw on screen during
  2325.       rendering.
  2326.  
  2327.       However, it is equally reasonable for a renderer to compute
  2328.       displayed pixels appropriate for the display device, and to
  2329.       perform separate gamma encoding for file storage, arranging to
  2330.       have a value in the gAMA chunk more appropriate to the future use
  2331.       of the image.
  2332.  
  2333.       Computer graphics renderers often do not perform gamma encoding,
  2334.       instead making sample values directly proportional to scene light
  2335.       intensity.  If the PNG encoder receives intensity samples that
  2336.       have already been quantized into integers, there is no point in
  2337.       doing gamma encoding on them; that would just result in further
  2338.       loss of information.  The encoder should just write the sample
  2339.       values to the PNG file.  This does not imply that the gAMA chunk
  2340.       should contain a gamma value of 1.0, because the desired end-to-
  2341.       end transfer function from scene intensity to display output
  2342.       intensity is not necessarily linear.  The desired gamma value is
  2343.       probably not far from 1.0, however.  It may depend on whether the
  2344.       scene being rendered is a daylight scene or an indoor scene, etc.
  2345.  
  2346.       When the sample values come directly from a piece of hardware, the
  2347.       correct gamma value can in principle be inferred from the transfer
  2348.       function of the hardware and the lighting conditions of the scene.
  2349.       In the case of video digitizers ("frame grabbers"), the samples
  2350.       are probably in the sRGB color space, because the sRGB
  2351.       specification was designed to be compatible with video standards.
  2352.       Image scanners are less predictable.  Their output samples may be
  2353.       proportional to the input light intensity because CCD (charge
  2354.       coupled device) sensors themselves are linear, or the scanner
  2355.       hardware may have already applied a power function designed to
  2356.       compensate for dot gain in subsequent printing (an exponent of
  2357.       about 0.57), or the scanner may have corrected the samples for
  2358.       display on a monitor.  The device documentation might describe the
  2359.       transformation performed, or might describe the target display or
  2360.       printer for the image data (which might be configurable).  You can
  2361.       also scan a calibrated target and use calibration software to
  2362.       determine the behavior of the device.  Remember that gamma relates
  2363.       file samples to desired display output, not to scanner input.
  2364.  
  2365.       File format converters generally should not attempt to convert
  2366.       supplied images to a different gamma.  Store the data in the PNG
  2367.       file without conversion, and deduce the gamma value from
  2368.       information in the source file if possible.  Gamma alteration at
  2369.       file conversion time causes re-quantization of the set of
  2370.       intensity levels that are represented, introducing further
  2371.       roundoff error with little benefit.  It's almost always better to
  2372.       just copy the sample values intact from the input to the output
  2373.       file.
  2374.  
  2375.       If the source file format describes the gamma characteristic of
  2376.       the image, a file format converter is strongly encouraged to write
  2377.       a PNG gAMA chunk.  Note that some file formats specify the
  2378.       exponent of the function mapping file samples to display output
  2379.       rather than the other direction.  If the source file's gamma value
  2380.       is greater than 1.0, it is probably a display system exponent, and
  2381.       you should use its reciprocal for the PNG gamma.  If the source
  2382.       file format records the relationship between image samples and
  2383.       something other than display output, then deducing the PNG gamma
  2384.       value will be more complex.
  2385.  
  2386.       Regardless of how an image was originally created, if an encoder
  2387.       or file format converter knows that the image has been displayed
  2388.       satisfactorily using a display system whose transfer function can
  2389.       be approximated by a power function with exponent
  2390.       display_exponent, then the image can be marked as having the gamma
  2391.       value:
  2392.  
  2393.          gamma = 1 / display_exponent
  2394.  
  2395.       It's better to write a gAMA chunk with an approximately right
  2396.       value than to omit the chunk and force PNG decoders to guess at an
  2397.       appropriate gamma.
  2398.  
  2399.       On the other hand, if the encoder has no way to infer the gamma
  2400.       value, then it is better to omit the gAMA chunk entirely.  If the
  2401.       image gamma has to be guessed at, leave it to the decoder to do
  2402.       the guessing.
  2403.  
  2404.       Gamma does not apply to alpha samples; alpha is always represented
  2405.       linearly.
  2406.  
  2407.       See also Recommendations for Decoders: Decoder gamma handling
  2408.       (Section 10.5).
  2409.  
  2410.    9.3. Encoder color handling
  2411.  
  2412.       See Color Tutorial (Chapter 14) if you aren't already familiar
  2413.       with color issues.
  2414.  
  2415.       Encoders capable of full-fledged color management [ICC] will
  2416.       perform more sophisticated calculations than those described here,
  2417.       and they may choose to use the iCCP chunk.  Encoders that know
  2418.       that their image samples conform to the sRGB specification [sRGB]
  2419.       are strongly encouraged to use the sRGB chunk.  Otherwise, this
  2420.       section applies.
  2421.  
  2422.       If it is possible for the encoder to determine the chromaticities
  2423.       of the source display primaries, or to make a strong guess based
  2424.       on the origin of the image or the hardware running it, then the
  2425.       encoder is strongly encouraged to output the cHRM chunk.  If it
  2426.       does so, the gAMA chunk should also be written; decoders can do
  2427.       little with cHRM if gAMA is missing.
  2428.  
  2429.       Video created with recent video equipment probably uses the CCIR
  2430.       709 primaries and D65 white point [ITU-R-BT709], which are:
  2431.  
  2432.                   R           G           B         White
  2433.          x      0.640       0.300       0.150       0.3127
  2434.          y      0.330       0.600       0.060       0.3290
  2435.  
  2436.       An older but still very popular video standard is SMPTE-C
  2437.       [SMPTE-170M]:
  2438.  
  2439.                   R           G           B         White
  2440.          x      0.630       0.310       0.155       0.3127
  2441.          y      0.340       0.595       0.070       0.3290
  2442.  
  2443.       The original NTSC color primaries have not been used in decades.
  2444.       Although you may still find the NTSC numbers listed in standards
  2445.       documents, you won't find any images that actually use them.
  2446.  
  2447.       Scanners that produce PNG files as output should insert the filter
  2448.       chromaticities into a cHRM chunk.
  2449.  
  2450.       In the case of hand-drawn or digitally edited images, you have to
  2451.       determine what monitor they were viewed on when being produced.
  2452.       Many image editing programs allow you to specify what type of
  2453.       monitor you are using.  This is often because they are working in
  2454.       some device-independent space internally.  Such programs have
  2455.       enough information to write valid cHRM and gAMA chunks, and should
  2456.       do so automatically.
  2457.  
  2458.       If the encoder is compiled as a portion of a computer image
  2459.       renderer that performs full-spectral rendering, the monitor values
  2460.       that were used to convert from the internal device-independent
  2461.       color space to RGB should be written into the cHRM chunk.  Any
  2462.       colors that are outside the gamut of the chosen RGB device should
  2463.       be clipped or otherwise constrained to be within the gamut; PNG
  2464.       does not store out-of-gamut colors.
  2465.  
  2466.       If the computer image renderer performs calculations directly in
  2467.       device-dependent RGB space, a cHRM chunk should not be written
  2468.       unless the scene description and rendering parameters have been
  2469.       adjusted to look good on a particular monitor.  In that case, the
  2470.       data for that monitor (if known) should be used to construct a
  2471.       cHRM chunk.
  2472.  
  2473.       There are often cases where an image's exact origins are unknown,
  2474.       particularly if it began life in some other format.  A few image
  2475.       formats store calibration information, which can be used to fill
  2476.       in the cHRM chunk.  For example, all PhotoCD images use the CCIR
  2477.       709 primaries and D65 whitepoint, so these values can be written
  2478.       into the cHRM chunk when converting a PhotoCD file.  PhotoCD also
  2479.       uses the SMPTE-170M transfer function.  (PhotoCD can store colors
  2480.       outside the RGB gamut, so the image data will require gamut
  2481.       mapping before writing to PNG format.)  TIFF 6.0 files can
  2482.       optionally store calibration information, which if present should
  2483.       be used to construct the cHRM chunk.  GIF and most other formats
  2484.       do not store any calibration information.
  2485.  
  2486.       It is not recommended that file format converters attempt to
  2487.       convert supplied images to a different RGB color space.  Store the
  2488.       data in the PNG file without conversion, and record the source
  2489.       primary chromaticities if they are known.  Color space
  2490.       transformation at file conversion time is a bad idea because of
  2491.       gamut mismatches and rounding errors.  As with gamma conversions,
  2492.       it's better to store the data losslessly and incur at most one
  2493.       conversion when the image is finally displayed.
  2494.  
  2495.       See also Recommendations for Decoders: Decoder color handling
  2496.       (Section 10.6).
  2497.  
  2498.    9.4. Alpha channel creation
  2499.  
  2500.       The alpha channel can be regarded either as a mask that
  2501.       temporarily hides transparent parts of the image, or as a means
  2502.       for constructing a non-rectangular image.  In the first case, the
  2503.       color values of fully transparent pixels should be preserved for
  2504.       future use.  In the second case, the transparent pixels carry no
  2505.       useful data and are simply there to fill out the rectangular image
  2506.       area required by PNG.  In this case, fully transparent pixels
  2507.       should all be assigned the same color value for best compression.
  2508.  
  2509.       Image authors should keep in mind the possibility that a decoder
  2510.       will ignore transparency control.  Hence, the colors assigned to
  2511.       transparent pixels should be reasonable background colors whenever
  2512.       feasible.
  2513.  
  2514.       For applications that do not require a full alpha channel, or
  2515.       cannot afford the price in compression efficiency, the tRNS
  2516.       transparency chunk is also available.
  2517.  
  2518.       If the image has a known background color, this color should be
  2519.       written in the bKGD chunk.  Even decoders that ignore transparency
  2520.       may use the bKGD color to fill unused screen area.
  2521.  
  2522.       If the original image has premultiplied (also called "associated")
  2523.       alpha data, convert it to PNG's non-premultiplied format by
  2524.       dividing each sample value by the corresponding alpha value, then
  2525.       multiplying by the maximum value for the image bit depth, and
  2526.       rounding to the nearest integer.  In valid premultiplied data, the
  2527.       sample values never exceed their corresponding alpha values, so
  2528.       the result of the division should always be in the range 0 to 1.
  2529.       If the alpha value is zero, output black (zeroes).
  2530.  
  2531.    9.5. Suggested palettes
  2532.  
  2533.       Suggested palettes can appear as sPLT chunks in any PNG file, or
  2534.       as a PLTE chunk in truecolor PNG files.  In either case, the
  2535.       suggested palette is not an essential part of the image data, but
  2536.       it may be used to present the image on indexed-color display
  2537.       hardware.  Suggested palettes are of no interest to viewers
  2538.       running on truecolor hardware.
  2539.  
  2540.       When sPLT is used to provide a suggested palette, it is
  2541.       recommended that the encoder use the frequency fields to indicate
  2542.       the relative importance of the palette entries, rather than leave
  2543.       them all zero (meaning undefined).  The frequency values are most
  2544.       easily computed as "nearest neighbor" counts, that is, the
  2545.       approximate usage of each RGBA palette entry if no dithering is
  2546.       applied.  (These counts will often be available for free as a
  2547.       consequence of developing the suggested palette.)  Because the
  2548.       suggested palette includes transparency information, it should be
  2549.       computed for the uncomposited image.
  2550.  
  2551.       Even for indexed-color images, sPLT can be used to define
  2552.       alternative reduced palettes for viewers that are unable to
  2553.       display all the colors present in the PLTE chunk.
  2554.  
  2555.       An older method for including a suggested palette in a truecolor
  2556.       PNG file uses the PLTE chunk.  If this method is used, the
  2557.       histogram (frequencies) should appear in a separate hIST chunk.
  2558.       Also, PLTE does not include transparency information, so for
  2559.       images of color type 6 (truecolor with alpha channel), it is
  2560.       recommended that a bKGD chunk appear and that the palette and
  2561.       histogram be computed with reference to the image as it would
  2562.       appear after compositing against the specified background color.
  2563.       This definition is necessary to ensure that useful palette entries
  2564.       are generated for pixels having fractional alpha values.  The
  2565.       resulting palette will probably be useful only to viewers that
  2566.       present the image against the same background color.  It is
  2567.       recommended that PNG editors delete or recompute the palette if
  2568.       they alter or remove the bKGD chunk in an image of color type 6.
  2569.  
  2570.       For images of color type 2 (truecolor without alpha channel), it
  2571.       is recommended that PLTE and hIST be computed with reference to
  2572.       the RGB data only, ignoring any transparent-color specification.
  2573.       If the file uses transparency (has a tRNS chunk), viewers can
  2574.       easily adapt the resulting palette for use with their intended
  2575.       background color.  They need only replace the palette entry
  2576.       closest to the tRNS color with their background color (which may
  2577.       or may not match the file's bKGD color, if any).
  2578.  
  2579.       If PLTE appears without bKGD in an image of color type 6, the
  2580.       circumstances under which the palette was computed are
  2581.       unspecified.
  2582.  
  2583.       For providing suggested palettes, sPLT is more flexible than PLTE
  2584.       in the following ways:
  2585.  
  2586.           * With sPLT, there can be multiple suggested palettes.  A
  2587.             decoder may choose an appropriate palette based on name or
  2588.             number of entries.
  2589.  
  2590.           * In an RGBA (color type 6) PNG, PLTE represents a palette
  2591.             already composited against the bKGD color, so it is useful
  2592.             only for display against that background color.  The sPLT
  2593.             chunk provides an uncomposited palette, which is useful for
  2594.             display against backgrounds of the decoder's choice.
  2595.  
  2596.           * Since sPLT is a noncritical chunk, a PNG editor can add or
  2597.             modify suggested palettes without being forced to discard
  2598.             unknown unsafe-to-copy chunks.
  2599.  
  2600.           * Whereas sPLT is allowed in PNG files of color types 0, 3,
  2601.             and 4 (grayscale and indexed), PLTE cannot be used to
  2602.             provide reduced palettes in these cases.
  2603.  
  2604.           * More than 256 entries can appear in sPLT.
  2605.  
  2606.       An encoder that uses sPLT may choose to write a PLTE/hIST
  2607.       suggested palette as well, for backward compatibility with
  2608.       decoders that do not recognize sPLT.
  2609.  
  2610.    9.6. Filter selection
  2611.  
  2612.       For images of color type 3 (indexed color), filter type 0 (None)
  2613.       is usually the most effective.  Note that color images with 256 or
  2614.       fewer colors should almost always be stored in indexed color
  2615.       format; truecolor format is likely to be much larger.
  2616.  
  2617.       Filter type 0 is also recommended for images of bit depths less
  2618.       than 8.  For low-bit-depth grayscale images, it may be a net win
  2619.       to expand the image to 8-bit representation and apply filtering,
  2620.       but this is rare.
  2621.  
  2622.       For truecolor and grayscale images, any of the five filters may
  2623.       prove the most effective.  If an encoder uses a fixed filter, the
  2624.       Paeth filter is most likely to be the best.
  2625.  
  2626.       For best compression of truecolor and grayscale images, we
  2627.       recommend an adaptive filtering approach in which a filter is
  2628.       chosen for each scanline.  The following simple heuristic has
  2629.       performed well in early tests: compute the output scanline using
  2630.       all five filters, and select the filter that gives the smallest
  2631.       sum of absolute values of outputs.  (Consider the output bytes as
  2632.       signed differences for this test.)  This method usually
  2633.       outperforms any single fixed filter choice.  However, it is likely
  2634.       that much better heuristics will be found as more experience is
  2635.       gained with PNG.
  2636.  
  2637.       Filtering according to these recommendations is effective on
  2638.       interlaced as well as noninterlaced images.
  2639.  
  2640.    9.7. Text chunk processing
  2641.  
  2642.       A nonempty keyword must be provided for each text chunk.  The
  2643.       generic keyword "Comment" can be used if no better description of
  2644.       the text is available.  If a user-supplied keyword is used, be
  2645.       sure to check that it meets the restrictions on keywords.
  2646.  
  2647.       PNG text strings are expected to use the Latin-1 character set.
  2648.       Encoders should avoid storing characters that are not defined in
  2649.       Latin-1, and should provide character code remapping if the local
  2650.       system's character set is not Latin-1.
  2651.  
  2652.       Encoders should discourage the creation of single lines of text
  2653.       longer than 79 characters, in order to facilitate easy reading.
  2654.  
  2655.       It is recommended that text items less than 1K (1024 bytes) in
  2656.       size should be output using uncompressed tEXt chunks.  In
  2657.       particular, it is recommended that the basic title and author
  2658.       keywords should always be output using uncompressed tEXt chunks.
  2659.       Lengthy disclaimers, on the other hand, are ideal candidates for
  2660.       zTXt.
  2661.  
  2662.       Placing large tEXt and zTXt chunks after the image data (after
  2663.       IDAT) can speed up image display in some situations, since the
  2664.       decoder won't have to read over the text to get to the image data.
  2665.       But it is recommended that small text chunks, such as the image
  2666.       title, appear before IDAT.
  2667.  
  2668.    9.8. Use of private chunks
  2669.  
  2670.       Applications can use PNG private chunks to carry information that
  2671.       need not be understood by other applications.  Such chunks must be
  2672.       given names with lowercase second letters, to ensure that they can
  2673.       never conflict with any future public chunk definition.  Note,
  2674.       however, that there is no guarantee that some other application
  2675.       will not use the same private chunk name.  If you use a private
  2676.       chunk type, it is prudent to store additional identifying
  2677.       information at the beginning of the chunk data.
  2678.  
  2679.       Use an ancillary chunk type (lowercase first letter), not a
  2680.       critical chunk type, for all private chunks that store information
  2681.       that is not absolutely essential to view the image.  Creation of
  2682.       private critical chunks is discouraged because they render PNG
  2683.       files unportable.  Such chunks should not be used in publicly
  2684.       available software or files.  If private critical chunks are
  2685.       essential for your application, it is recommended that one appear
  2686.       near the start of the file, so that a standard decoder need not
  2687.       read very far before discovering that it cannot handle the file.
  2688.  
  2689.       If you want others outside your organization to understand a chunk
  2690.       type that you invent, contact the maintainers of the PNG
  2691.       specification to submit a proposed chunk name and definition for
  2692.       addition to the list of special-purpose public chunks (see
  2693.       Additional chunk types, Section 4.4). Note that a proposed public
  2694.       chunk name (with uppercase second letter) must not be used in
  2695.       publicly available software or files until registration has been
  2696.       approved.
  2697.  
  2698.       If an ancillary chunk contains textual information that might be
  2699.       of interest to a human user, you should not create a special chunk
  2700.       type for it.  Instead use a tEXt chunk and define a suitable
  2701.       keyword.  That way, the information will be available to users not
  2702.       using your software.
  2703.  
  2704.       Keywords in tEXt chunks should be reasonably self-explanatory,
  2705.       since the idea is to let other users figure out what the chunk
  2706.       contains.  If of general usefulness, new keywords can be
  2707.       registered with the maintainers of the PNG specification.  But it
  2708.       is permissible to use keywords without registering them first.
  2709.  
  2710.    9.9. Private type and method codes
  2711.  
  2712.       This specification defines the meaning of only some of the
  2713.       possible values of some fields.  For example, only compression
  2714.       method 0 and filter types 0 through 4 are defined.  Numbers
  2715.       greater than 127 must be used when inventing experimental or
  2716.       private definitions of values for any of these fields.  Numbers
  2717.       below 128 are reserved for possible future public extensions of
  2718.       this specification.  Note that use of private type codes may
  2719.       render a file unreadable by standard decoders.  Such codes are
  2720.       strongly discouraged except for experimental purposes, and should
  2721.       not appear in publicly available software or files.
  2722.  
  2723. 10. Recommendations for Decoders
  2724.  
  2725.    This chapter gives some recommendations for decoder behavior.  The
  2726.    only absolute requirement on a PNG decoder is that it successfully
  2727.    read any file conforming to the format specified in the preceding
  2728.    chapters.  However, best results will usually be achieved by
  2729.    following these recommendations.
  2730.  
  2731.    10.1. Error checking
  2732.  
  2733.       To ensure early detection of common file-transfer problems,
  2734.       decoders should verify that all eight bytes of the PNG file
  2735.       signature are correct.  (See Rationale: PNG file signature,
  2736.       Section 12.11.) A decoder can have additional confidence in the
  2737.       file's integrity if the next eight bytes are an IHDR chunk header
  2738.       with the correct chunk length.
  2739.  
  2740.       Unknown chunk types must be handled as described in Chunk naming
  2741.       conventions (Section 3.3).  An unknown chunk type is not to be
  2742.       treated as an error unless it is a critical chunk.
  2743.  
  2744.       It is strongly recommended that decoders should verify the CRC on
  2745.       each chunk.
  2746.  
  2747.       In some situations it is desirable to check chunk headers (length
  2748.       and type code) before reading the chunk data and CRC.  The chunk
  2749.       type can be checked for plausibility by seeing whether all four
  2750.       bytes are ASCII letters (codes 65-90 and 97-122); note that this
  2751.       need be done only for unrecognized type codes.  If the total file
  2752.       size is known (from file system information, HTTP protocol, etc),
  2753.       the chunk length can be checked for plausibility as well.
  2754.  
  2755.       If CRCs are not checked, dropped/added data bytes or an erroneous
  2756.       chunk length can cause the decoder to get out of step and
  2757.       misinterpret subsequent data as a chunk header.  Verifying that
  2758.       the chunk type contains letters is an inexpensive way of providing
  2759.       early error detection in this situation.
  2760.  
  2761.       For known-length chunks such as IHDR, decoders should treat an
  2762.       unexpected chunk length as an error.  Future extensions to this
  2763.       specification will not add new fields to existing chunks; instead,
  2764.       new chunk types will be added to carry new information.
  2765.  
  2766.       Unexpected values in fields of known chunks (for example, an
  2767.       unexpected compression method in the IHDR chunk) must be checked
  2768.       for and treated as errors.  However, it is recommended that
  2769.       unexpected field values be treated as fatal errors only in
  2770.       critical chunks.  An unexpected value in an ancillary chunk can be
  2771.       handled by ignoring the whole chunk as though it were an unknown
  2772.       chunk type.  (This recommendation assumes that the chunk's CRC has
  2773.       been verified.  In decoders that do not check CRCs, it is safer to
  2774.       treat any unexpected value as indicating a corrupted file.)
  2775.  
  2776.    10.2. Pixel dimensions
  2777.  
  2778.       Non-square pixels can be represented (see the pHYs chunk), but
  2779.       viewers are not required to account for them; a viewer can present
  2780.       any PNG file as though its pixels are square.
  2781.  
  2782.       Conversely, viewers running on display hardware with non-square
  2783.       pixels are strongly encouraged to rescale images for proper
  2784.       display.
  2785.  
  2786.    10.3. Truecolor image handling
  2787.  
  2788.       To achieve PNG's goal of universal interchangeability, decoders
  2789.       are required to accept all types of PNG image: indexed-color,
  2790.       truecolor, and grayscale.  Viewers running on indexed-color
  2791.       display hardware need to be able to reduce truecolor images to
  2792.       indexed format for viewing.  This process is usually called "color
  2793.       quantization".
  2794.  
  2795.       A simple, fast way of doing this is to reduce the image to a fixed
  2796.       palette.  Palettes with uniform color spacing ("color cubes") are
  2797.       usually used to minimize the per-pixel computation.  For
  2798.       photograph-like images, dithering is recommended to avoid ugly
  2799.       contours in what should be smooth gradients; however, dithering
  2800.       introduces graininess that can be objectionable.
  2801.  
  2802.       The quality of rendering can be improved substantially by using a
  2803.       palette chosen specifically for the image, since a color cube
  2804.       usually has numerous entries that are unused in any particular
  2805.       image.  This approach requires more work, first in choosing the
  2806.       palette, and second in mapping individual pixels to the closest
  2807.       available color.  PNG allows the encoder to supply suggested
  2808.       palettes, but not all encoders will do so, and the suggested
  2809.       palettes may be unsuitable in any case (they may have too many or
  2810.       too few colors).  High-quality viewers will therefore need to have
  2811.       a palette selection routine at hand.  A large lookup table is
  2812.       usually the most feasible way of mapping individual pixels to
  2813.       palette entries with adequate speed.
  2814.  
  2815.       Numerous implementations of color quantization are available.  The
  2816.       PNG reference implementation, libpng, includes code for the
  2817.       purpose.
  2818.  
  2819.    10.4. Sample depth rescaling
  2820.  
  2821.       Decoders may wish to scale PNG data to a lesser sample depth (data
  2822.       precision) for display.  For example, 16-bit data will need to be
  2823.       reduced to 8-bit depth for use on most present-day display
  2824.       hardware.  Reduction of 8-bit data to 5-bit depth is also common.
  2825.  
  2826.       The most accurate scaling is achieved by the linear equation
  2827.  
  2828.          output = ROUND(input * MAXOUTSAMPLE / MAXINSAMPLE)
  2829.  
  2830.       where
  2831.  
  2832.          MAXINSAMPLE = (2^sampledepth)-1
  2833.          MAXOUTSAMPLE = (2^desired_sampledepth)-1
  2834.  
  2835.       A slightly less accurate conversion is achieved by simply shifting
  2836.       right by sampledepth - desired_sampledepth places.  For example,
  2837.       to reduce 16-bit samples to 8-bit, one need only discard the low-
  2838.       order byte.  In many situations the shift method is sufficiently
  2839.       accurate for display purposes, and it is certainly much faster.
  2840.       (But if gamma correction is being done, sample rescaling can be
  2841.       merged into the gamma correction lookup table, as is illustrated
  2842.       in Decoder gamma handling, Section 10.5.)
  2843.  
  2844.       When an sBIT chunk is present, the original pre-PNG data can be
  2845.       recovered by shifting right to the sample depth specified by sBIT.
  2846.       Note that linear scaling will not necessarily reproduce the
  2847.       original data, because the encoder is not required to have used
  2848.       linear scaling to scale the data up.  However, the encoder is
  2849.       required to have used a method that preserves the high-order bits,
  2850.       so shifting always works.  This is the only case in which shifting
  2851.       might be said to be more accurate than linear scaling.
  2852.  
  2853.       When comparing pixel values to tRNS chunk values to detect
  2854.       transparent pixels, it is necessary to do the comparison exactly.
  2855.       Therefore, transparent pixel detection must be done before
  2856.       reducing sample precision.
  2857.  
  2858.    10.5. Decoder gamma handling
  2859.  
  2860.       See Gamma Tutorial (Chapter 13) if you aren't already familiar
  2861.       with gamma issues.
  2862.  
  2863.       Decoders capable of full-fledged color management [ICC] will
  2864.       perform more sophisticated calculations than what is described
  2865.       here.  Otherwise, this section applies.
  2866.  
  2867.       For an image display program to produce correct tone reproduction,
  2868.       it is necessary to take into account the relationship between file
  2869.       samples and display output, and the transfer function of the
  2870.       display system.  This can be done by calculating
  2871.  
  2872.          sample = integer_sample / (2^bitdepth - 1.0)
  2873.          display_output = sample ^ (1.0 / gamma)
  2874.          display_input = inverse_display_transfer(display_output)
  2875.          framebuf_sample = ROUND(display_input * MAX_FRAMEBUF_SAMPLE)
  2876.  
  2877.       where integer_sample is the sample value from the file,
  2878.       framebuf_sample is the value to write into the frame buffer, and
  2879.       MAX_FRAMEBUF_SAMPLE is the maximum value of a frame buffer sample
  2880.       (255 for 8-bit, 31 for 5-bit, etc).  The first line converts an
  2881.       integer sample into a normalized 0-to-1 floating-point value, the
  2882.       second converts to a value proportional to the desired display
  2883.       output intensity, the third accounts for the display system's
  2884.       transfer function, and the fourth converts to an integer frame
  2885.       buffer sample.
  2886.  
  2887.       A step could be inserted between the second and third to adjust
  2888.       display_output to account for the difference between the actual
  2889.       viewing conditions and the reference viewing conditions.  However,
  2890.       this adjustment requires accounting for veiling glare, black
  2891.       mapping, and color appearance models, none of which can be well
  2892.       approximated by power functions.  The calculations are not
  2893.       described here.  If viewing conditions are ignored, the error will
  2894.       usually be small.
  2895.  
  2896.       Typically, the display transfer function can be approximated by a
  2897.       power function with exponent display_exponent, in which case the
  2898.       second and third lines can be merged into
  2899.  
  2900.          display_input = sample ^ (1.0 / (gamma * display_exponent))
  2901.                        = sample ^ decoding_exponent
  2902.  
  2903.       so as to perform only one power calculation.  For color images,
  2904.       the entire calculation is performed separately for R, G, and B
  2905.       values.
  2906.  
  2907.       The value of gamma can be taken directly from the gAMA chunk.
  2908.       Alternatively, an application may wish to allow the user to adjust
  2909.       the appearance of the displayed image by influencing the value of
  2910.       gamma.  For example, the user could manually set a parameter
  2911.       called user_exponent that defaults to 1.0, and the application
  2912.       could set
  2913.  
  2914.          gamma = gamma_from_file / user_exponent
  2915.          decoding_exponent = 1.0 / (gamma * display_exponent)
  2916.                = user_exponent / (gamma_from_file * display_exponent)
  2917.  
  2918.       The user would set user_exponent greater than 1 to darken the
  2919.       mid-level tones, or less than 1 to lighten them.
  2920.  
  2921.       It is not necessary to perform transcendental math for every
  2922.       pixel.  Instead, compute a lookup table that gives the correct
  2923.       output value for every possible sample value.  This requires only
  2924.       256 calculations per image (for 8-bit accuracy), not one or three
  2925.       calculations per pixel.  For an indexed-color image, a one-time
  2926.       correction of the palette is sufficient, unless the image uses
  2927.       transparency and is being displayed against a nonuniform
  2928.       background.
  2929.  
  2930.       If floating-point calculations are not possible, gamma correction
  2931.       tables can be computed using integer arithmetic and a precomputed
  2932.       table of logarithms.  Example code appears in the "Extensions to
  2933.       the PNG Specification" document [PNG-EXTENSIONS].
  2934.  
  2935.       When the incoming image has unknown gamma (gAMA, sRGB, and iCCP
  2936.       all absent), choose a likely default gamma value, but allow the
  2937.       user to select a new one if the result proves too dark or too
  2938.       light.  The default gamma can depend on other knowledge about the
  2939.       image, like whether it came from the Internet or from the local
  2940.       system.
  2941.  
  2942.       In practice, it is often difficult to determine what value of the
  2943.       display exponent should be used.  In systems with no built-in
  2944.       gamma correction, the display exponent is determined entirely by
  2945.       the CRT (cathode ray tube).  Assume a CRT exponent of 2.2 unless
  2946.       detailed calibration measurements of this particular CRT are
  2947.       available.
  2948.  
  2949.       Many modern frame buffers have lookup tables that are used to
  2950.       perform gamma correction, and on these systems the display
  2951.       exponent value should be the exponent of the lookup table and CRT
  2952.       combined.  You may not be able to find out what the lookup table
  2953.       contains from within an image viewer application, so you may have
  2954.       to ask the user what the display system's exponent is.
  2955.       Unfortunately, different manufacturers use different ways of
  2956.       specifying what should go into the lookup table, so interpretation
  2957.       of the system "gamma" value is system-dependent.  The Gamma
  2958.       Tutorial (Chapter 13) gives some examples.
  2959.  
  2960.       The response of real displays is actually more complex than can be
  2961.       described by a single number (the display exponent).  If actual
  2962.       measurements of the monitor's light output as a function of
  2963.       voltage input are available, the third and fourth lines of the
  2964.       computation above can be replaced by a lookup in these
  2965.       measurements, to find the actual frame buffer value that most
  2966.       nearly gives the desired brightness.
  2967.  
  2968.    10.6. Decoder color handling
  2969.  
  2970.       See Color Tutorial (Chapter 14) if you aren't already familiar
  2971.       with color issues.
  2972.  
  2973.       In many cases, decoders will treat image data in PNG files as
  2974.       device-dependent RGB data and display it without modification
  2975.       (except for appropriate gamma correction).  This provides the
  2976.       fastest display of PNG images.  But unless the viewer uses exactly
  2977.       the same display hardware as the original image author used, the
  2978.       colors will not be exactly the same as the original author saw,
  2979.       particularly for darker or near-neutral colors.  The cHRM chunk
  2980.       provides information that allows closer color matching than that
  2981.       provided by gamma correction alone.
  2982.  
  2983.       Decoders can use the cHRM data to transform the image data from
  2984.       RGB to CIE XYZ and thence into a perceptually linear color space
  2985.       such as CIE LAB.  They can then partition the colors to generate
  2986.       an optimal palette, because the geometric distance between two
  2987.       colors in CIE LAB is strongly related to how different those
  2988.       colors appear (unlike, for example, RGB or XYZ spaces).  The
  2989.       resulting palette of colors, once transformed back into RGB color
  2990.       space, could be used for display or written into a PLTE chunk.
  2991.  
  2992.       Decoders that are part of image processing applications might also
  2993.       transform image data into CIE LAB space for analysis.
  2994.  
  2995.       In applications where color fidelity is critical, such as product
  2996.       design, scientific visualization, medicine, architecture, or
  2997.       advertising, decoders can transform the image data from source RGB
  2998.       to the display RGB space of the monitor used to view the image.
  2999.       This involves calculating the matrix to go from source RGB to XYZ
  3000.       and the matrix to go from XYZ to display RGB, then combining them
  3001.       to produce the overall transformation.  The decoder is responsible
  3002.       for implementing gamut mapping.
  3003.  
  3004.       Decoders running on platforms that have a Color Management System
  3005.       (CMS) can pass the image data, gAMA, and cHRM values to the CMS
  3006.       for display or further processing.
  3007.  
  3008.       Decoders that provide color printing facilities can use the
  3009.       facilities in Level 2 PostScript to specify image data in
  3010.       calibrated RGB space or in a device-independent color space such
  3011.       as XYZ.  This will provide better color fidelity than a simple RGB
  3012.       to CMYK conversion.  The PostScript Language Reference manual
  3013.       [POSTSCRIPT] gives examples.  Such decoders are responsible for
  3014.       implementing gamut mapping between source RGB (specified in the
  3015.       cHRM chunk) and the target printer.  The PostScript interpreter is
  3016.       then responsible for producing the required colors.
  3017.  
  3018.       Decoders can use the cHRM data to calculate an accurate grayscale
  3019.       representation of a color image.  Conversion from RGB to gray is
  3020.       simply a case of calculating the Y (luminance) component of XYZ,
  3021.       which is a weighted sum of the R, G, and B values.  The weights
  3022.       depend on the monitor type, i.e., the values in the cHRM chunk.
  3023.       Decoders may wish to do this for PNG files with no cHRM chunk.  In
  3024.       that case, a reasonable default would be the CCIR 709 primaries
  3025.       [ITU-R-BT709]. Do not use the original NTSC primaries, unless you
  3026.       really do have an image color-balanced for such a monitor.  Few
  3027.       monitors ever used the NTSC primaries, so such images are probably
  3028.       nonexistent these days.
  3029.  
  3030.    10.7. Background color
  3031.  
  3032.       The background color given by bKGD will typically be used to fill
  3033.       unused screen space around the image, as well as any transparent
  3034.       pixels within the image.  (Thus, bKGD is valid and useful even
  3035.       when the image does not use transparency.)  If no bKGD chunk is
  3036.       present, the viewer will need to make its own decision about a
  3037.       suitable background color.
  3038.  
  3039.       Viewers that have a specific background against which to present
  3040.       the image (such as Web browsers) should ignore the bKGD chunk, in
  3041.       effect overriding bKGD with their preferred background color or
  3042.       background image.
  3043.  
  3044.       The background color given by bKGD is not to be considered
  3045.       transparent, even if it happens to match the color given by tRNS
  3046.       (or, in the case of an indexed-color image, refers to a palette
  3047.       index that is marked as transparent by tRNS).  Otherwise one would
  3048.       have to imagine something "behind the background" to composite
  3049.       against.  The background color is either used as background or
  3050.       ignored; it is not an intermediate layer between the PNG image and
  3051.       some other background.
  3052.  
  3053.       Indeed, it will be common that bKGD and tRNS specify the same
  3054.       color, since then a decoder that does not implement transparency
  3055.       processing will give the intended display, at least when no
  3056.       partially-transparent pixels are present.
  3057.  
  3058.    10.8. Alpha channel processing
  3059.  
  3060.       In the most general case, the alpha channel can be used to
  3061.       composite a foreground image against a background image; the PNG
  3062.       file defines the foreground image and the transparency mask, but
  3063.       not the background image.  Decoders are not required to support
  3064.       this most general case.  It is expected that most will be able to
  3065.       support compositing against a single background color, however.
  3066.  
  3067.       The equation for computing a composited sample value is
  3068.  
  3069.          output = alpha * foreground + (1-alpha) * background
  3070.  
  3071.       where the alpha value and the input and output sample values are
  3072.       expressed as fractions in the range 0 to 1.  This computation
  3073.       should be performed with intensity samples (not gamma-encoded
  3074.       samples).  For color images, the computation is done separately
  3075.       for R, G, and B samples.
  3076.  
  3077.       The following code illustrates the general case of compositing a
  3078.       foreground image over a background image.  It assumes that you
  3079.       have the original pixel data available for the background image,
  3080.       and that output is to a frame buffer for display.  Other variants
  3081.       are possible; see the comments below the code.  The code allows
  3082.       the sample depths and gamma values of foreground and background
  3083.       images to be different, and not necessarily suited to the display
  3084.       system.  Don't assume everything is the same without checking.
  3085.  
  3086.       This code is standard C, with line numbers added for reference in
  3087.       the comments below:
  3088.  
  3089.          01  int foreground[4];  /* image pixel: R, G, B, A */
  3090.          02  int background[3];  /* background pixel: R, G, B */
  3091.          03  int fbpix[3];       /* frame buffer pixel */
  3092.          04  int fg_maxsample;   /* foreground max sample */
  3093.          05  int bg_maxsample;   /* background max sample */
  3094.          06  int fb_maxsample;   /* frame buffer max sample */
  3095.          07  int ialpha;
  3096.          08  float alpha, compalpha;
  3097.          09  float gamfg, linfg, gambg, linbg, comppix, gcvideo;
  3098.  
  3099.              /* Get max sample values in data and frame buffer */
  3100.          10  fg_maxsample = (1 << fg_sample_depth) - 1;
  3101.          11  bg_maxsample = (1 << bg_sample_depth) - 1;
  3102.          12  fb_maxsample = (1 << frame_buffer_sample_depth) - 1;
  3103.              /*
  3104.               * Get integer version of alpha.
  3105.               * Check for opaque and transparent special cases;
  3106.               * no compositing needed if so.
  3107.               *
  3108.               * We show the whole gamma decode/correct process in
  3109.               * floating point, but it would more likely be done
  3110.               * with lookup tables.
  3111.               */
  3112.          13  ialpha = foreground[3];
  3113.  
  3114.          14  if (ialpha == 0) {
  3115.                  /*
  3116.                   * Foreground image is transparent here.
  3117.                   * If the background image is already in the frame
  3118.                   * buffer, there is nothing to do.
  3119.                   */
  3120.          15      ;
  3121.          16  } else if (ialpha == fg_maxsample) {
  3122.                  /*
  3123.                   * Copy foreground pixel to frame buffer.
  3124.                   */
  3125.          17      for (i = 0; i < 3; i++) {
  3126.          18          gamfg = (float) foreground[i] / fg_maxsample;
  3127.          19          linfg = pow(gamfg, 1.0/fg_gamma);
  3128.          20          comppix = linfg;
  3129.          21          gcvideo = pow(comppix, 1.0/display_exponent);
  3130.          22          fbpix[i] = (int) (gcvideo * fb_maxsample + 0.5);
  3131.          23      }
  3132.          24  } else {
  3133.                  /*
  3134.                   * Compositing is necessary.
  3135.                   * Get floating-point alpha and its complement.
  3136.                   * Note: alpha is always linear; gamma does not
  3137.                   * affect it.
  3138.                   */
  3139.          25      alpha = (float) ialpha / fg_maxsample;
  3140.          26      compalpha = 1.0 - alpha;
  3141.  
  3142.          27      for (i = 0; i < 3; i++) {
  3143.                      /*
  3144.                       * Convert foreground and background to
  3145.                       * floating point, then undo gamma encoding.
  3146.                       */
  3147.          28          gamfg = (float) foreground[i] / fg_maxsample;
  3148.          29          linfg = pow(gamfg, 1.0/fg_gamma);
  3149.          30          gambg = (float) background[i] / bg_maxsample;
  3150.          31          linbg = pow(gambg, 1.0/bg_gamma);
  3151.                      /*
  3152.                       * Composite.
  3153.                       */
  3154.          32          comppix = linfg * alpha + linbg * compalpha;
  3155.                      /*
  3156.                       * Gamma correct for display.
  3157.                       * Convert to integer frame buffer pixel.
  3158.                       */
  3159.          33          gcvideo = pow(comppix, 1.0/display_exponent);
  3160.          34          fbpix[i] = (int) (gcvideo * fb_maxsample + 0.5);
  3161.          35      }
  3162.          36  }
  3163.  
  3164.       Variations:
  3165.  
  3166.          1. If output is to another PNG image file instead of a frame
  3167.             buffer, lines 21, 22, 33, and 34 should be changed to be
  3168.             something like:
  3169.  
  3170.                /*
  3171.                 * Gamma encode for storage in output file.
  3172.                 * Convert to integer sample value.
  3173.                 */
  3174.                gamout = pow(comppix, outfile_gamma);
  3175.                outpix[i] = (int) (gamout * out_maxsample + 0.5);
  3176.  
  3177.             Also, it becomes necessary to process background pixels when
  3178.             alpha is zero, rather than just skipping pixels.  Thus, line
  3179.             15 will need to be replaced by copies of lines 17-23, but
  3180.             processing background instead of foreground pixel values.
  3181.  
  3182.          2. If the sample depths of the output file, foreground file,
  3183.             and background file are all the same, and the three gamma
  3184.             values also match, then the no-compositing code in lines
  3185.             14-23 reduces to nothing more than copying pixel values from
  3186.             the input file to the output file if alpha is one, or
  3187.             copying pixel values from background to output file if alpha
  3188.             is zero.  Since alpha is typically either zero or one for
  3189.             the vast majority of pixels in an image, this is a great
  3190.             savings.  No gamma computations are needed for most pixels.
  3191.  
  3192.          3. When the sample depths and gamma values all match, it may
  3193.             appear attractive to skip the gamma decoding and encoding
  3194.             (lines 28-31, 33-34) and just perform line 32 using gamma-
  3195.             encoded sample values.  Although this doesn't hurt image
  3196.             quality too badly, the time savings are small if alpha
  3197.             values of zero and one are special-cased as recommended
  3198.             here.
  3199.  
  3200.          4. If the original pixel values of the background image are no
  3201.             longer available, only processed frame buffer pixels left by
  3202.             display of the background image, then lines 30 and 31 need
  3203.             to extract intensity from the frame buffer pixel values
  3204.             using code like:
  3205.  
  3206.                /*
  3207.                 * Convert frame buffer value into intensity sample.
  3208.                 */
  3209.                gcvideo = (float) fbpix[i] / fb_maxsample;
  3210.                linbg = pow(gcvideo, display_exponent);
  3211.  
  3212.             However, some roundoff error can result, so it is better to
  3213.             have the original background pixels available if at all
  3214.             possible.
  3215.  
  3216.          5. Note that lines 18-22 are performing exactly the same gamma
  3217.             computation that is done when no alpha channel is present.
  3218.             So, if you handle the no-alpha case with a lookup table, you
  3219.             can use the same lookup table here.  Lines 28-31 and 33-34
  3220.             can also be done with (different) lookup tables.
  3221.  
  3222.          6. Of course, everything here can be done in integer
  3223.             arithmetic.  Just be careful to maintain sufficient
  3224.             precision all the way through.
  3225.  
  3226.       Note: in floating-point arithmetic, no overflow or underflow
  3227.       checks are needed, because the input sample values are guaranteed
  3228.       to be between 0 and 1, and compositing always yields a result that
  3229.       is in between the input values (inclusive).  With integer
  3230.       arithmetic, some roundoff-error analysis might be needed to
  3231.       guarantee no overflow or underflow.
  3232.  
  3233.       When displaying a PNG image with full alpha channel, it is
  3234.       important to be able to composite the image against some
  3235.       background, even if it's only black.  Ignoring the alpha channel
  3236.       will cause PNG images that have been converted from an
  3237.       associated-alpha representation to look wrong.  (Of course, if the
  3238.       alpha channel is a separate transparency mask, then ignoring alpha
  3239.       is a useful option: it allows the hidden parts of the image to be
  3240.       recovered.)
  3241.  
  3242.       Even if the decoder author does not wish to implement true
  3243.       compositing logic, it is simple to deal with images that contain
  3244.       only zero and one alpha values.  (This is implicitly true for
  3245.       grayscale and truecolor PNG files that use a tRNS chunk; for
  3246.       indexed-color PNG files, it is easy to check whether tRNS contains
  3247.       any values other than 0 and 255.)  In this simple case,
  3248.       transparent pixels are replaced by the background color, while
  3249.       others are unchanged.
  3250.  
  3251.       If a decoder contains only this much transparency capability, it
  3252.       should deal with a full alpha channel by converting it to a binary
  3253.       alpha channel, either by treating all nonzero alpha values as
  3254.       fully opaque or by dithering.  Neither approach will yield very
  3255.       good results for images converted from associated-alpha formats,
  3256.       but it's better than doing nothing.  Dithering full alpha to
  3257.       binary alpha is very much like dithering grayscale to black-and-
  3258.       white, except that all fully transparent and fully opaque pixels
  3259.       should be left unchanged by the dither.
  3260.  
  3261.    10.9. Progressive display
  3262.  
  3263.       When receiving images over slow transmission links, decoders can
  3264.       improve perceived performance by displaying interlaced images
  3265.       progressively.  This means that as each pass is received, an
  3266.       approximation to the complete image is displayed based on the data
  3267.       received so far.  One simple yet pleasing effect can be obtained
  3268.       by expanding each received pixel to fill a rectangle covering the
  3269.       yet-to-be-transmitted pixel positions below and to the right of
  3270.       the received pixel.  This process can be described by the
  3271.       following pseudocode:
  3272.  
  3273.          Starting_Row [1..7] =  { 0, 0, 4, 0, 2, 0, 1 }
  3274.          Starting_Col [1..7] =  { 0, 4, 0, 2, 0, 1, 0 }
  3275.          Row_Increment [1..7] = { 8, 8, 8, 4, 4, 2, 2 }
  3276.          Col_Increment [1..7] = { 8, 8, 4, 4, 2, 2, 1 }
  3277.          Block_Height [1..7] =  { 8, 8, 4, 4, 2, 2, 1 }
  3278.          Block_Width [1..7] =   { 8, 4, 4, 2, 2, 1, 1 }
  3279.  
  3280.          pass := 1
  3281.          while pass <= 7
  3282.          begin
  3283.              row := Starting_Row[pass]
  3284.  
  3285.              while row < height
  3286.              begin
  3287.                  col := Starting_Col[pass]
  3288.  
  3289.                  while col < width
  3290.                  begin
  3291.                      visit (row, col,
  3292.                             min (Block_Height[pass], height - row),
  3293.                             min (Block_Width[pass], width - col))
  3294.                      col := col + Col_Increment[pass]
  3295.                  end
  3296.                  row := row + Row_Increment[pass]
  3297.              end
  3298.  
  3299.              pass := pass + 1
  3300.          end
  3301.  
  3302.       Here, the function visit(row,column,height,width) obtains the next
  3303.       transmitted pixel and paints a rectangle of the specified height
  3304.       and width, whose upper-left corner is at the specified row and
  3305.       column, using the color indicated by the pixel.  Note that row and
  3306.       column are measured from 0,0 at the upper left corner.
  3307.  
  3308.       If the decoder is merging the received image with a background
  3309.       image, it may be more convenient just to paint the received pixel
  3310.       positions; that is, the visit() function sets only the pixel at
  3311.       the specified row and column, not the whole rectangle.  This
  3312.       produces a "fade-in" effect as the new image gradually replaces
  3313.       the old.  An advantage of this approach is that proper alpha or
  3314.       transparency processing can be done as each pixel is replaced.
  3315.       Painting a rectangle as described above will overwrite
  3316.       background-image pixels that may be needed later, if the pixels
  3317.       eventually received for those positions turn out to be wholly or
  3318.       partially transparent.  Of course, this is a problem only if the
  3319.       background image is not stored anywhere offscreen.
  3320.  
  3321.    10.10. Suggested-palette and histogram usage
  3322.  
  3323.       For viewers running on indexed-color hardware trying to display a
  3324.       truecolor image, or an indexed-color image whose palette is too
  3325.       large for the framebuffer, the encoder may have provided one or
  3326.       more suggested palettes in sPLT chunks.  If one of them is found
  3327.       to be suitable, based on its size and perhaps its name, the
  3328.       decoder can use that palette.  Note that suggested palettes with a
  3329.       sample depth different from what the decoder needs can be
  3330.       converted using sample depth rescaling (See Recommendations for
  3331.       Decoders: Sample depth rescaling, Section 10.4).
  3332.  
  3333.       When the background is a solid color, the decoder should composite
  3334.       the image and the suggested palette against that color, then
  3335.       quantize the resulting image to the resulting RGB palette.  When
  3336.       the image uses transparency and the background is not a solid
  3337.       color, no suggested palette is likely to be useful.
  3338.  
  3339.       For truecolor images, a suggested palette might also be provided
  3340.       in a PLTE chunk.  If the image has a tRNS chunk and the background
  3341.       is a solid color, the viewer can adapt the suggested paletted for
  3342.       use with this background color.  To do this, replace the palette
  3343.       entry closest to the tRNS color with the background color, or just
  3344.       add a palette entry for the background color if the viewer can
  3345.       handle more colors than there are palette entries.
  3346.  
  3347.       For images of color type 6 (truecolor with alpha channel), any
  3348.       PLTE chunk should have been designed for display of the image
  3349.       against a uniform background of the color specified by bKGD.
  3350.       Viewers should probably ignore the palette if they intend to use a
  3351.       different background, or if the bKGD chunk is missing.  Viewers
  3352.       can use the suggested palette for display against a different
  3353.       background than it was intended for, but the results may not be
  3354.       very good.
  3355.  
  3356.       If the viewer presents a transparent truecolor image against a
  3357.       background that is more complex than a single color, it is
  3358.       unlikely that the PLTE chunk will be optimal for the composite
  3359.       image.  In this case it is best to perform a truecolor compositing
  3360.       step on the truecolor PNG image and background image, then color-
  3361.       quantize the resulting image.
  3362.  
  3363.       In truecolor PNG files, if both PLTE and sPLT appear, the decoder
  3364.       can choose from among the palettes suggested by both, bearing in
  3365.       mind the different transparency semantics mentioned above.
  3366.  
  3367.       The frequencies in sPLT and hIST chunks are useful when the viewer
  3368.       cannot provide as many colors as are used in the palette.  If the
  3369.       viewer is short only a few colors, it is usually adequate to drop
  3370.       the least-used colors from the palette.  To reduce the number of
  3371.       colors substantially, it's best to choose entirely new
  3372.       representative colors, rather than trying to use a subset of the
  3373.       existing palette.  This amounts to performing a new color
  3374.       quantization step; however, the existing palette and frequencies
  3375.       can be used as the input data, thus avoiding a scan of the image
  3376.       data.
  3377.  
  3378.       If no suggested palettes are provided, a decoder can develop its
  3379.       own, at the cost of an extra pass over the image data.
  3380.       Alternatively, a default palette (probably a color cube) can be
  3381.       used.
  3382.  
  3383.       See also Recommendations for Encoders: Suggested palettes (Section
  3384.       9.5).
  3385.  
  3386.    10.11. Text chunk processing
  3387.  
  3388.       If practical, decoders should have a way to display to the user
  3389.       all tEXt and zTXt chunks found in the file.  Even if the decoder
  3390.       does not recognize a particular text keyword, the user might be
  3391.       able to understand it.
  3392.  
  3393.       PNG text is not supposed to contain any characters outside the ISO
  3394.       8859-1 (Latin-1) character set (that is, no codes 0-31 or
  3395.       127-159), except for the newline character (decimal 10).  But
  3396.       decoders might encounter such characters anyway.  Some of these
  3397.       characters can be safely displayed (e.g., TAB, FF, and CR, decimal
  3398.       9, 12, and 13, respectively), but others, especially the ESC
  3399.       character (decimal 27), could pose a security hazard because
  3400.       unexpected actions may be taken by display hardware or software.
  3401.       To prevent such hazards, decoders should not attempt to directly
  3402.       display any non-Latin-1 characters (except for newline and perhaps
  3403.       TAB, FF, CR) encountered in a tEXt or zTXt chunk.  Instead, ignore
  3404.       them or display them in a visible notation such as "\nnn".  See
  3405.       Security considerations (Section 8.5).
  3406.  
  3407.       Even though encoders are supposed to represent newlines as LF, it
  3408.       is recommended that decoders not rely on this; it's best to
  3409.       recognize all the common newline combinations (CR, LF, and CR-LF)
  3410.       and display each as a single newline.  TAB can be expanded to the
  3411.       proper number of spaces needed to arrive at a column multiple of
  3412.       8.
  3413.  
  3414.       Decoders running on systems with non-Latin-1 character set
  3415.       encoding should provide character code remapping so that Latin-1
  3416.       characters are displayed correctly.  Some systems may not provide
  3417.       all the characters defined in Latin-1.  Mapping unavailable
  3418.       characters to a visible notation such as "\nnn" is a good
  3419.       fallback.  In particular, character codes 127-255 should be
  3420.       displayed only if they are printable characters on the decoding
  3421.       system.  Some systems may interpret such codes as control
  3422.       characters; for security, decoders running on such systems should
  3423.       not display such characters literally.
  3424.  
  3425.       Decoders should be prepared to display text chunks that contain
  3426.       any number of printing characters between newline characters, even
  3427.       though encoders are encouraged to avoid creating lines in excess
  3428.       of 79 characters.
  3429.  
  3430. 11. Glossary
  3431.  
  3432.    a^b
  3433.       Exponentiation; a raised to the power b.  Note that zero raised to
  3434.       any positive power is zero.  C programmers should be careful not
  3435.       to misread this notation as exclusive-or.
  3436.  
  3437.    Alpha
  3438.       A value representing a pixel's degree of transparency.  The more
  3439.       transparent a pixel, the less it hides the background against
  3440.       which the image is presented.  In PNG, alpha is really the degree
  3441.       of opacity:  zero alpha represents a completely transparent pixel,
  3442.       maximum alpha represents a completely opaque pixel.  But most
  3443.       people refer to alpha as providing transparency information, not
  3444.       opacity information, and we continue that custom here.
  3445.  
  3446.    Ancillary chunk
  3447.       A chunk that provides additional information.  A decoder can still
  3448.       produce a meaningful image, though not necessarily the best
  3449.       possible image, without processing the chunk.
  3450.  
  3451.    Bit depth
  3452.       The number of bits per palette index (in indexed-color PNGs) or
  3453.       per sample (in other color types).  This is the same value that
  3454.       appears in IHDR.
  3455.  
  3456.    Byte
  3457.       Eight bits; also called an octet.
  3458.  
  3459.    Channel
  3460.       The set of all samples of the same kind within an image; for
  3461.       example, all the blue samples in a truecolor image.  (The term
  3462.       "component" is also used, but not in this specification.)  A
  3463.       sample is the intersection of a channel and a pixel.
  3464.  
  3465.    Chromaticity
  3466.       A pair of values x,y that precisely specify a color, except for
  3467.       the brightness information.
  3468.  
  3469.    Chunk
  3470.       A section of a PNG file.  Each chunk has a type indicated by its
  3471.       chunk type name.  Most types of chunks also include some data.
  3472.       The format and meaning of the data within the chunk are determined
  3473.       by the type name.
  3474.  
  3475.    CIE
  3476.       International Commission on Illumination (Commission
  3477.       Internationale de l'Eclairage).
  3478.  
  3479.    CIE XYZ
  3480.       A device-independent color space in which each component is the
  3481.       sum of a weighted power distribution over the visible spectrum.
  3482.       The Y component is luminence (see below).
  3483.  
  3484.    CIE LAB
  3485.       A perceptually linear color space.
  3486.  
  3487.    Composite
  3488.       As a verb, to form an image by merging a foreground image and a
  3489.       background image, using transparency information to determine
  3490.       where the background should be visible.  The foreground image is
  3491.       said to be "composited against" the background.
  3492.  
  3493.    CRC
  3494.       Cyclic Redundancy Check.  A CRC is a type of check value designed
  3495.       to catch most transmission errors.  A decoder calculates the CRC
  3496.       for the received data and compares it to the CRC that the encoder
  3497.       calculated, which is appended to the data.  A mismatch indicates
  3498.       that the data was corrupted in transit.
  3499.  
  3500.    Critical chunk
  3501.       A chunk that must be understood and processed by the decoder in
  3502.       order to produce a meaningful image from a PNG file.
  3503.  
  3504.    CRT
  3505.       Cathode Ray Tube: a common type of computer display hardware.
  3506.  
  3507.    Datastream
  3508.       A sequence of bytes.  This term is used rather than "file" to
  3509.       describe a byte sequence that is only a portion of a file.  We
  3510.       also use it to emphasize that a PNG image might be generated and
  3511.       consumed "on-the-fly", never appearing in a stored file at all.
  3512.  
  3513.    Deflate
  3514.       The name of the compression algorithm used in standard PNG files,
  3515.       as well as in zip, gzip, pkzip, and other compression programs.
  3516.       Deflate is a member of the LZ77 family of compression methods.
  3517.  
  3518.    Filter
  3519.       A transformation applied to image data in hopes of improving its
  3520.       compressibility.  PNG uses only lossless (reversible) filter
  3521.       algorithms.
  3522.  
  3523.    Frame buffer
  3524.       The final digital storage area for the image shown by a computer
  3525.       display.  Software causes an image to appear onscreen by loading
  3526.       it into the frame buffer.
  3527.  
  3528.    Gamma
  3529.       Informally, a measure of the brightness of mid-level tones in an
  3530.       image.  Outside this specification, the term "gamma" is often used
  3531.       as the exponent of a power function that is the transfer function
  3532.       of any stage(s) of an imaging pipeline:
  3533.  
  3534.          output = input ^ gamma
  3535.  
  3536.       where both input and output are scaled to the range 0 to 1.
  3537.       Within this specification, gamma refers specifically to the
  3538.       function from display output to image samples.
  3539.  
  3540.    Grayscale
  3541.       An image representation in which each pixel is represented by a
  3542.       single sample value representing overall luminance (on a scale
  3543.       from black to white).  PNG also permits an alpha sample to be
  3544.       stored for each pixel of a grayscale image.
  3545.  
  3546.    Indexed color
  3547.       An image representation in which each pixel is represented by a
  3548.       single sample that is an index into a palette or lookup table.
  3549.       The selected palette entry defines the actual color of the pixel.
  3550.  
  3551.    Intensity
  3552.       Power per unit area of light entering or leaving a surface.  It is
  3553.       often normalized to the range 0 to 1 by dividing by a maximum
  3554.       intensity.
  3555.  
  3556.    Lossless compression
  3557.       Any method of data compression that guarantees the original data
  3558.       can be reconstructed exactly, bit-for-bit.
  3559.  
  3560.    Lossy compression
  3561.       Any method of data compression that reconstructs the original data
  3562.       approximately, rather than exactly.
  3563.  
  3564.    LSB
  3565.       Least Significant Byte of a multi-byte value.
  3566.  
  3567.    Luminance
  3568.       Perceived brightness, or grayscale level, of a color.  Luminance
  3569.       and chromaticity together fully define a perceived color.
  3570.  
  3571.    LUT
  3572.       Look Up Table.  In general, a table used to transform data.  In
  3573.       frame buffer hardware, a LUT can be used to map indexed-color
  3574.       pixels into a selected set of truecolor values, or to perform
  3575.       gamma correction.  In software, a LUT can be used as a fast way of
  3576.       implementing any one-variable mathematical function.
  3577.  
  3578.    MSB
  3579.       Most Significant Byte of a multi-byte value.
  3580.  
  3581.    Palette
  3582.       The set of colors available in an indexed-color image.  In PNG, a
  3583.       palette is an array of colors defined by red, green, and blue
  3584.       samples.  (Alpha values can also be defined for palette entries,
  3585.       via the tRNS chunk.)
  3586.  
  3587.    Pixel
  3588.       The information stored for a single grid point in the image.  The
  3589.       complete image is a rectangular array of pixels.
  3590.  
  3591.    PNG editor
  3592.       A program that modifies a PNG file and preserves ancillary
  3593.       information, including chunks that it does not recognize.  Such a
  3594.       program must obey the rules given in Chunk Ordering Rules (Chapter
  3595.       7).
  3596.  
  3597.    Sample
  3598.       A single number in the image data; for example, the red value of a
  3599.       pixel.  A pixel is composed of one or more samples.  When
  3600.       discussing physical data layout (in particular, in Image layout,
  3601.       Section 2.3), we use "sample" to mean a number stored in the image
  3602.       array.  It would be more precise but much less readable to say
  3603.       "sample or palette index" in that context.  Elsewhere in the
  3604.       specification, "sample" means a color value or alpha value.  In
  3605.       the indexed-color case, these are palette entries not palette
  3606.       indexes.
  3607.  
  3608.    Sample depth
  3609.       The precision, in bits, of color values and alpha values.  In
  3610.       indexed-color PNGs the sample depth is always 8 by definition of
  3611.       the PLTE chunk.  In other color types it is the same as the bit
  3612.       depth.
  3613.  
  3614.    Scanline
  3615.       One horizontal row of pixels within an image.
  3616.  
  3617.    Truecolor
  3618.       An image representation in which pixel colors are defined by
  3619.       storing three samples for each pixel, representing red, green, and
  3620.       blue intensities respectively.  PNG also permits an alpha sample
  3621.       to be stored for each pixel of a truecolor image.
  3622.  
  3623.    White point
  3624.       The chromaticity of a computer display's nominal white value.
  3625.  
  3626.    zlib
  3627.       A particular format for data that has been compressed using
  3628.       deflate-style compression.  Also the name of a library
  3629.       implementing this method.  PNG implementations need not use the
  3630.       zlib library, but they must conform to its format for compressed
  3631.       data.
  3632.  
  3633. 12. Appendix: Rationale
  3634.  
  3635.    (This appendix is not part of the formal PNG specification.)
  3636.  
  3637.    This appendix gives the reasoning behind some of the design decisions
  3638.    in PNG.  Many of these decisions were the subject of considerable
  3639.    debate.  The authors freely admit that another group might have made
  3640.    different decisions; however, we believe that our choices are
  3641.    defensible and consistent.
  3642.  
  3643.    12.1. Why a new file format?
  3644.  
  3645.       Does the world really need yet another graphics format?  We
  3646.       believe so.  GIF is no longer freely usable, but no other commonly
  3647.       used format can directly replace it, as is discussed in more
  3648.       detail below.  We might have used an adaptation of an existing
  3649.       format, for example GIF with an unpatented compression scheme.
  3650.       But this would require new code anyway; it would not be all that
  3651.       much easier to implement than a whole new file format.  (PNG is
  3652.       designed to be simple to implement, with the exception of the
  3653.       compression engine, which would be needed in any case.)  We feel
  3654.       that this is an excellent opportunity to design a new format that
  3655.       fixes some of the known limitations of GIF.
  3656.  
  3657.    12.2. Why these features?
  3658.  
  3659.       The features chosen for PNG are intended to address the needs of
  3660.       applications that previously used the special strengths of GIF.
  3661.       In particular, GIF is well adapted for online communications
  3662.       because of its streamability and progressive display capability.
  3663.       PNG shares those attributes.
  3664.  
  3665.       We have also addressed some of the widely known shortcomings of
  3666.       GIF.  In particular, PNG supports truecolor images.  We know of no
  3667.       widely used image format that losslessly compresses truecolor
  3668.       images as effectively as PNG does.  We hope that PNG will make use
  3669.       of truecolor images more practical and widespread.
  3670.  
  3671.       Some form of transparency control is desirable for applications in
  3672.       which images are displayed against a background or together with
  3673.       other images.  GIF provided a simple transparent-color
  3674.       specification for this purpose.  PNG supports a full alpha channel
  3675.       as well as transparent-color specifications.  This allows both
  3676.       highly flexible transparency and compression efficiency.
  3677.  
  3678.       Robustness against transmission errors has been an important
  3679.       consideration.  For example, images transferred across the
  3680.       Internet are often mistakenly processed as text, leading to file
  3681.       corruption.  PNG is designed so that such errors can be detected
  3682.       quickly and reliably.
  3683.  
  3684.       PNG has been expressly designed not to be completely dependent on
  3685.       a single compression technique.  Although deflate/inflate
  3686.       compression is mentioned in this document, PNG would still exist
  3687.       without it.
  3688.  
  3689.    12.3. Why not these features?
  3690.  
  3691.       Some features have been deliberately omitted from PNG.  These
  3692.       choices were made to simplify implementation of PNG, promote
  3693.       portability and interchangeability, and make the format as simple
  3694.       and foolproof as possible for users.  In particular:
  3695.  
  3696.           * There is no uncompressed variant of PNG.  It is possible to
  3697.             store uncompressed data by using only uncompressed deflate
  3698.             blocks (a feature normally used to guarantee that deflate
  3699.             does not make incompressible data much larger).  However,
  3700.             PNG software must support full deflate/inflate; any software
  3701.             that does not is not compliant with the PNG standard.  The
  3702.             two most important features of PNG--portability and
  3703.             compression--are absolute requirements for online
  3704.             applications, and users demand them.  Failure to support
  3705.             full deflate/inflate compromises both of these objectives.
  3706.  
  3707.           * There is no lossy compression in PNG.  Existing formats such
  3708.             as JFIF (JPEG File Interchange Format) already handle lossy
  3709.             compression well.  Furthermore, available lossy compression
  3710.             methods, e.g., the JPEG (Joint Photographic Experts Group)
  3711.             algorithm, are far from foolproof--a poor choice of quality
  3712.             level can ruin an image.  To avoid user confusion and
  3713.             unintentional loss of information, we feel it is best to
  3714.             keep lossy and lossless formats strictly separate.  Also,
  3715.             lossy compression is complex to implement.  Adding JPEG
  3716.             support to a PNG decoder might significantly increase its
  3717.             size, causing some decoders to omit support for the feature,
  3718.             which would erode our goal of interchangeability.
  3719.  
  3720.           * There is no support for CMYK (Cyan, Magenta, Yellow, blacK)
  3721.             or other unusual color spaces.  Again, this is in the name
  3722.             of promoting portability.  CMYK, in particular, is far too
  3723.             device-dependent to be useful as a portable image
  3724.             representation.
  3725.  
  3726.           * There is no standard chunk for thumbnail views of images.
  3727.             In discussions with software vendors who use thumbnails in
  3728.             their products, it has become clear that most would not use
  3729.             a "standard" thumbnail chunk.  For one thing, every vendor
  3730.             has a different idea of what the dimensions and
  3731.             characteristics of a thumbnail ought to be.  Also, some
  3732.             vendors keep thumbnails in separate files to accommodate
  3733.             varied image formats; they are not going to stop doing that
  3734.             simply because of a thumbnail chunk in one new format.
  3735.             Proprietary chunks containing vendor-specific thumbnails
  3736.             appear to be more practical than a common thumbnail format.
  3737.  
  3738.       It is worth noting that private extensions to PNG could easily add
  3739.       these features.  We will not, however, include them as part of the
  3740.       basic PNG standard.
  3741.  
  3742.       PNG also does not support multiple images in one file.  This
  3743.       restriction is a reflection of the reality that many applications
  3744.       do not need and will not support multiple images per file.  In any
  3745.       case, single images are a fundamentally different sort of object
  3746.       from sequences of images.  Rather than make false promises of
  3747.       interchangeability, we have drawn a clear distinction between
  3748.       single-image and multi-image formats.  PNG is a single-image
  3749.       format.  (But see Multiple-image extension, Section 8.4.)
  3750.  
  3751.    12.4. Why not use format X?
  3752.  
  3753.       We considered numerous existing formats before deciding to develop
  3754.       PNG.  None could meet the requirements that we felt were important
  3755.       for PNG.
  3756.  
  3757.       GIF is no longer suitable as a universal standard because of legal
  3758.       entanglements.  Although just replacing GIF's compression method
  3759.       would avoid that problem, GIF does not support truecolor images,
  3760.       alpha channels, or gamma correction.  The spec has more subtle
  3761.       problems too.  Only a small subset of the GIF89 spec is actually
  3762.       portable across a variety of implementations, but there is no
  3763.       codification of the most portable part of the spec.
  3764.  
  3765.       TIFF (the Tagged Image File Format) is far too complex to meet our
  3766.       goals of simplicity and interchangeability.  Defining a TIFF
  3767.       subset would meet that objection, but would frustrate users making
  3768.       the reasonable assumption that a file saved as TIFF from their
  3769.       existing software would load into a program supporting our flavor
  3770.       of TIFF.  Furthermore, TIFF is not designed for stream processing,
  3771.       has no provision for progressive display, and does not currently
  3772.       provide any good, legally unencumbered, lossless compression
  3773.       method.
  3774.  
  3775.       IFF has also been suggested, but is not suitable in detail:
  3776.       available image representations are too machine-specific or not
  3777.       adequately compressed.  The overall chunk structure of IFF is a
  3778.       useful concept that PNG has liberally borrowed from, but we did
  3779.       not attempt to be bit-for-bit compatible with IFF chunk structure.
  3780.       Again this is due to detailed issues, notably the fact that IFF
  3781.       FORMs are not designed to be serially writable.
  3782.  
  3783.       Lossless JPEG is not suitable because it does not provide for the
  3784.       storage of indexed-color images.  Furthermore, its lossless
  3785.       truecolor compression is often inferior to that of PNG.
  3786.  
  3787.    12.5. Byte order
  3788.  
  3789.       It has been asked why PNG uses network byte order.  We have
  3790.       selected one byte ordering and used it consistently.  Which order
  3791.       in particular is of little relevance, but network byte order has
  3792.       the advantage that routines to convert to and from it are already
  3793.       available on any platform that supports TCP/IP networking,
  3794.       including all PC platforms.  The functions are trivial and will be
  3795.       included in the reference implementation.
  3796.  
  3797.    12.6. Interlacing
  3798.  
  3799.       PNG's two-dimensional interlacing scheme is more complex to
  3800.       implement than GIF's line-wise interlacing.  It also costs a
  3801.       little more in file size.  However, it yields an initial image
  3802.       eight times faster than GIF (the first pass transmits only 1/64th
  3803.       of the pixels, compared to 1/8th for GIF).  Although this initial
  3804.       image is coarse, it is useful in many situations.  For example, if
  3805.       the image is a World Wide Web imagemap that the user has seen
  3806.       before, PNG's first pass is often enough to determine where to
  3807.       click.  The PNG scheme also looks better than GIF's, because
  3808.       horizontal and vertical resolution never differ by more than a
  3809.       factor of two; this avoids the odd "stretched" look seen when
  3810.       interlaced GIFs are filled in by replicating scanlines.
  3811.       Preliminary results show that small text in an interlaced PNG
  3812.       image is typically readable about twice as fast as in an
  3813.       equivalent GIF, i.e., after PNG's fifth pass or 25% of the image
  3814.       data, instead of after GIF's third pass or 50%.  This is again due
  3815.       to PNG's more balanced increase in resolution.
  3816.  
  3817.    12.7. Why gamma?
  3818.  
  3819.       It might seem natural to standardize on storing sample values
  3820.       proportional to display output intensity (that is, have gamma of
  3821.       1.0).  But in fact, it is common for images to have a gamma of
  3822.       less than 1.  There are three good reasons for this:
  3823.  
  3824.           * CRTs have a transfer function with an exponent of 2.2, and
  3825.             video signals are designed to be sent directly to CRTs.
  3826.             Therefore, images obtained by frame-grabbing video already
  3827.             have a gamma of 1/2.2.
  3828.  
  3829.           * The human eye has a nonlinear response to intensity, so
  3830.             linear encoding of samples either wastes sample codes in
  3831.             bright areas of the image, or provides too few sample codes
  3832.             to avoid banding artifacts in dark areas of the image, or
  3833.             both.  At least 12 bits per sample are needed to avoid
  3834.             visible artifacts in linear encoding with a 100:1 image
  3835.             intensity range.  An image gamma in the range 0.3 to 0.5
  3836.             allocates sample values in a way that roughly corresponds to
  3837.             the eye's response, so that 8 bits/sample are enough to
  3838.             avoid artifacts caused by insufficient sample precision in
  3839.             almost all images.  This makes "gamma encoding" a much
  3840.             better way of storing digital images than the simpler linear
  3841.             encoding.
  3842.  
  3843.           * Many images are created on PCs or workstations with no gamma
  3844.             correction hardware and no software willing to provide gamma
  3845.             correction either.  In these cases, the images have had
  3846.             their lighting and color chosen to look best on this
  3847.             platform--they can be thought of as having "manual" gamma
  3848.             correction built in.  To see what the image author intended,
  3849.             it is necessary to treat such images as having a gamma value
  3850.             of 1/2.2 (assuming the author was using a CRT).
  3851.  
  3852.       In practice, image gamma values around 1.0, 1/2.2, and 1/1.45 are
  3853.       all widely found.  Older image standards such as GIF and JFIF
  3854.       often do not account for this fact.  The exchange of images among
  3855.       a variety of systems has led to widespread problems with images
  3856.       appearing "too dark" or "too light".
  3857.  
  3858.       PNG expects viewers to compensate for image gamma at the time that
  3859.       the image is displayed.  Another possible approach is to expect
  3860.       encoders to convert all images to a uniform gamma at encoding
  3861.       time.  While that method would speed viewers slightly, it has
  3862.       fundamental flaws:
  3863.  
  3864.           * Gamma correction is inherently lossy due to quantization and
  3865.             roundoff error.  Requiring conversion at encoding time thus
  3866.             causes irreversible loss.  Since PNG is intended to be a
  3867.             lossless storage format, this is undesirable; we should
  3868.             store unmodified source data.
  3869.  
  3870.           * The encoder might not know the source gamma value.  If the
  3871.             decoder does gamma correction at viewing time, it can adjust
  3872.             the gamma (change the displayed brightness) in response to
  3873.             feedback from a human user.  The encoder has no such
  3874.             recourse.
  3875.  
  3876.           * Whatever "standard" gamma we settled on would be wrong for
  3877.             some displays.  Hence viewers would still need gamma
  3878.             correction capability.
  3879.  
  3880.       Since there will always be images with no gamma or an incorrect
  3881.       recorded gamma, good viewers will need to incorporate gamma
  3882.       adjustment code anyway.  Gamma correction at viewing time is thus
  3883.       the right way to go.
  3884.  
  3885.       Historical note:  Version 1.0 of this specification used the gAMA
  3886.       chunk to express the relationship between the file samples and the
  3887.       "original scene intensity" (camera input) rather than the desired
  3888.       display output intensity.  This was changed in version 1.1 for the
  3889.       following reasons:
  3890.  
  3891.           * The decoder needs to know the desired display output in
  3892.             order to do its job, but there was not enough information in
  3893.             the file to convert from the original scene to the display
  3894.             output.  The version 1.0 specification claimed that the
  3895.             conversion depended only on viewing conditions at the
  3896.             display, but that was an error; it also depends on
  3897.             conditions at the camera.
  3898.  
  3899.           * Faithful reproduction of the original scene is not always
  3900.             the goal.  Sometimes deliberate distortion is desired.
  3901.  
  3902.           * For hand-drawn images there is no "original scene".
  3903.  
  3904.       Because the gamma-related recommendations in version 1.0 were
  3905.       imprecise, it was not clear what value to put in a gAMA chunk in
  3906.       common situations.  For an image drawn on a CRT display with no
  3907.       LUT under unknown viewing conditions, an argument could be made
  3908.       for any value between 40000 and 50000.  Real applications were
  3909.       observed to write 45000 or 45455, and the latter is recommended by
  3910.       the current specification.
  3911.  
  3912.       See Gamma Tutorial (Chapter 13) for more information.
  3913.  
  3914.    12.8. Non-premultiplied alpha
  3915.  
  3916.       PNG uses "unassociated" or "non-premultiplied" alpha so that
  3917.       images with separate transparency masks can be stored losslessly.
  3918.       Another common technique, "premultiplied alpha", stores pixel
  3919.       values premultiplied by the alpha fraction; in effect, the image
  3920.       is already composited against a black background.  Any image data
  3921.       hidden by the transparency mask is irretrievably lost by that
  3922.       method, since multiplying by a zero alpha value always produces
  3923.       zero.
  3924.  
  3925.       Some image rendering techniques generate images with premultiplied
  3926.       alpha (the alpha value actually represents how much of the pixel
  3927.       is covered by the image).  This representation can be converted to
  3928.       PNG by dividing the sample values by alpha, except where alpha is
  3929.       zero.  The result will look good if displayed by a viewer that
  3930.       handles alpha properly, but will not look very good if the viewer
  3931.       ignores the alpha channel.
  3932.  
  3933.       Although each form of alpha storage has its advantages, we did not
  3934.       want to require all PNG viewers to handle both forms.  We
  3935.       standardized on non-premultiplied alpha as being the lossless and
  3936.       more general case.
  3937.  
  3938.    12.9. Filtering
  3939.  
  3940.       PNG includes filtering capability because filtering can
  3941.       significantly reduce the compressed size of truecolor and
  3942.       grayscale images.  Filtering is also sometimes of value on
  3943.       indexed-color images, although this is less common.
  3944.  
  3945.       The filter algorithms are defined to operate on bytes, rather than
  3946.       pixels; this gains simplicity and speed with very little cost in
  3947.       compression performance.  Tests have shown that filtering is
  3948.       usually ineffective for images with fewer than 8 bits per sample,
  3949.       so providing pixelwise filtering for such images would be
  3950.       pointless.  For 16 bit/sample data, bytewise filtering is nearly
  3951.       as effective as pixelwise filtering, because MSBs are predicted
  3952.       from adjacent MSBs, and LSBs are predicted from adjacent LSBs.
  3953.  
  3954.       The encoder is allowed to change filters for each new scanline.
  3955.       This creates no additional complexity for decoders, since a
  3956.       decoder is required to contain defiltering logic for every filter
  3957.       type anyway.  The only cost is an extra byte per scanline in the
  3958.       pre-compression datastream.  Our tests showed that when the same
  3959.       filter is selected for all scanlines, this extra byte compresses
  3960.       away to almost nothing, so there is little storage cost compared
  3961.       to a fixed filter specified for the whole image.  And the
  3962.       potential benefits of adaptive filtering are too great to ignore.
  3963.       Even with the simplistic filter-choice heuristics so far
  3964.       discovered, adaptive filtering usually outperforms fixed filters.
  3965.       In particular, an adaptive filter can change behavior for
  3966.       successive passes of an interlaced image; a fixed filter cannot.
  3967.  
  3968.    12.10. Text strings
  3969.  
  3970.       Most graphics file formats include the ability to store some
  3971.       textual information along with the image.  But many applications
  3972.       need more than that: they want to be able to store several
  3973.       identifiable pieces of text.  For example, a database using PNG
  3974.       files to store medical X-rays would likely want to include
  3975.       patient's name, doctor's name, etc.  A simple way to do this in
  3976.       PNG would be to invent new private chunks holding text.  The
  3977.       disadvantage of such an approach is that other applications would
  3978.       have no idea what was in those chunks, and would simply ignore
  3979.       them.  Instead, we recommend that textual information be stored in
  3980.       standard tEXt chunks with suitable keywords.  Use of tEXt tells
  3981.       any PNG viewer that the chunk contains text that might be of
  3982.       interest to a human user.  Thus, a person looking at the file with
  3983.       another viewer will still be able to see the text, and even
  3984.       understand what it is if the keywords are reasonably self-
  3985.       explanatory.  (To this end, we recommend spelled-out keywords, not
  3986.       abbreviations that will be hard for a person to understand.
  3987.       Saving a few bytes on a keyword is false economy.)
  3988.  
  3989.       The ISO 8859-1 (Latin-1) character set was chosen as a compromise
  3990.       between functionality and portability.  Some platforms cannot
  3991.       display anything more than 7-bit ASCII characters, while others
  3992.       can handle characters beyond the Latin-1 set.  We felt that
  3993.       Latin-1 represents a widely useful and reasonably portable
  3994.       character set.  Latin-1 is a direct subset of character sets
  3995.       commonly used on popular platforms such as Microsoft Windows and X
  3996.       Windows.  It can also be handled on Macintosh systems with a
  3997.       simple remapping of characters.
  3998.  
  3999.       There is presently no provision for text employing character sets
  4000.       other than Latin-1.  We recognize that the need for other
  4001.       character sets will increase.  However, PNG already requires that
  4002.       programmers implement a number of new and unfamiliar features, and
  4003.       text representation is not PNG's primary purpose.  Since PNG
  4004.       provides for the creation and public registration of new ancillary
  4005.       chunks of general interest, we expect that text chunks for other
  4006.       character sets, such as Unicode, eventually will be registered and
  4007.       increase gradually in popularity.
  4008.  
  4009.    12.11. PNG file signature
  4010.  
  4011.       The first eight bytes of a PNG file always contain the following
  4012.       values:
  4013.  
  4014.          (decimal)              137  80  78  71  13  10  26  10
  4015.          (hexadecimal)           89  50  4e  47  0d  0a  1a  0a
  4016.          (ASCII C notation)    \211   P   N   G  \r  \n \032 \n
  4017.  
  4018.       This signature both identifies the file as a PNG file and provides
  4019.       for immediate detection of common file-transfer problems.  The
  4020.       first two bytes distinguish PNG files on systems that expect the
  4021.       first two bytes to identify the file type uniquely.  The first
  4022.       byte is chosen as a non-ASCII value to reduce the probability that
  4023.       a text file may be misrecognized as a PNG file; also, it catches
  4024.       bad file transfers that clear bit 7.  Bytes two through four name
  4025.       the format.  The CR-LF sequence catches bad file transfers that
  4026.       alter newline sequences.  The control-Z character stops file
  4027.       display under MS-DOS.  The final line feed checks for the inverse
  4028.       of the CR-LF translation problem.
  4029.  
  4030.       A decoder may further verify that the next eight bytes contain an
  4031.       IHDR chunk header with the correct chunk length; this will catch
  4032.       bad transfers that drop or alter null (zero) bytes.
  4033.  
  4034.       Note that there is no version number in the signature, nor indeed
  4035.       anywhere in the file.  This is intentional: the chunk mechanism
  4036.       provides a better, more flexible way to handle format extensions,
  4037.       as explained in Chunk naming conventions (Section 12.13).
  4038.  
  4039.    12.12. Chunk layout
  4040.  
  4041.       The chunk design allows decoders to skip unrecognized or
  4042.       uninteresting chunks: it is simply necessary to skip the
  4043.       appropriate number of bytes, as determined from the length field.
  4044.  
  4045.       Limiting chunk length to (2^31)-1 bytes avoids possible problems
  4046.       for implementations that cannot conveniently handle 4-byte
  4047.       unsigned values.  In practice, chunks will usually be much shorter
  4048.       than that anyway.
  4049.  
  4050.       A separate CRC is provided for each chunk in order to detect
  4051.       badly-transferred images as quickly as possible.  In particular,
  4052.       critical data such as the image dimensions can be validated before
  4053.       being used.
  4054.  
  4055.       The chunk length is excluded from the CRC so that the CRC can be
  4056.       calculated as the data is generated; this avoids a second pass
  4057.       over the data in cases where the chunk length is not known in
  4058.       advance.  Excluding the length from the CRC does not create any
  4059.       extra risk of failing to discover file corruption, since if the
  4060.       length is wrong, the CRC check will fail: the CRC will be computed
  4061.       on the wrong set of bytes and then be tested against the wrong
  4062.       value from the file.
  4063.  
  4064.    12.13. Chunk naming conventions
  4065.  
  4066.       The chunk naming conventions allow safe, flexible extension of the
  4067.       PNG format.  This mechanism is much better than a format version
  4068.       number, because it works on a feature-by-feature basis rather than
  4069.       being an overall indicator.  Decoders can process newer files if
  4070.       and only if the files use no unknown critical features (as
  4071.       indicated by finding unknown critical chunks).  Unknown ancillary
  4072.       chunks can be safely ignored.  We decided against having an
  4073.       overall format version number because experience has shown that
  4074.       format version numbers hurt portability as much as they help.
  4075.       Version numbers tend to be set unnecessarily high, leading to
  4076.       older decoders rejecting files that they could have processed
  4077.       (this was a serious problem for several years after the GIF89 spec
  4078.       came out, for example).  Furthermore, private extensions can be
  4079.       made either critical or ancillary, and standard decoders should
  4080.       react appropriately; overall version numbers are no help for
  4081.       private extensions.
  4082.  
  4083.       A hypothetical chunk for vector graphics would be a critical
  4084.       chunk, since if ignored, important parts of the intended image
  4085.       would be missing.  A chunk carrying the Mandelbrot set coordinates
  4086.       for a fractal image would be ancillary, since other applications
  4087.       could display the image without understanding what the image
  4088.       represents.  In general, a chunk type should be made critical only
  4089.       if it is impossible to display a reasonable representation of the
  4090.       intended image without interpreting that chunk.
  4091.  
  4092.       The public/private property bit ensures that any newly defined
  4093.       public chunk type name cannot conflict with proprietary chunks
  4094.       that could be in use somewhere.  However, this does not protect
  4095.       users of private chunk names from the possibility that someone
  4096.       else may use the same chunk name for a different purpose.  It is a
  4097.       good idea to put additional identifying information at the start
  4098.       of the data for any private chunk type.
  4099.  
  4100.       When a PNG file is modified, certain ancillary chunks may need to
  4101.       be changed to reflect changes in other chunks.  For example, a
  4102.       histogram chunk needs to be changed if the image data changes.  If
  4103.       the file editor does not recognize histogram chunks, copying them
  4104.       blindly to a new output file is incorrect; such chunks should be
  4105.       dropped.  The safe/unsafe property bit allows ancillary chunks to
  4106.       be marked appropriately.
  4107.  
  4108.       Not all possible modification scenarios are covered by the
  4109.       safe/unsafe semantics.  In particular, chunks that are dependent
  4110.       on the total file contents are not supported.  (An example of such
  4111.       a chunk is an index of IDAT chunk locations within the file:
  4112.       adding a comment chunk would inadvertently break the index.)
  4113.       Definition of such chunks is discouraged.  If absolutely necessary
  4114.       for a particular application, such chunks can be made critical
  4115.       chunks, with consequent loss of portability to other applications.
  4116.       In general, ancillary chunks can depend on critical chunks but not
  4117.       on other ancillary chunks.  It is expected that mutually dependent
  4118.       information should be put into a single chunk.
  4119.  
  4120.       In some situations it may be unavoidable to make one ancillary
  4121.       chunk dependent on another.  Although the chunk property bits are
  4122.       insufficient to represent this case, a simple solution is
  4123.       available: in the dependent chunk, record the CRC of the chunk
  4124.       depended on.  It can then be determined whether that chunk has
  4125.       been changed by some other program.
  4126.  
  4127.       The same technique can be useful for other purposes.  For example,
  4128.       if a program relies on the palette being in a particular order, it
  4129.       can store a private chunk containing the CRC of the PLTE chunk.
  4130.       If this value matches when the file is again read in, then it
  4131.       provides high confidence that the palette has not been tampered
  4132.       with.  Note that it is not necessary to mark the private chunk
  4133.       unsafe-to-copy when this technique is used; thus, such a private
  4134.       chunk can survive other editing of the file.
  4135.  
  4136.    12.14. Palette histograms
  4137.  
  4138.       A viewer may not be able to provide as many colors as are listed
  4139.       in the image's palette.  (For example, some colors could be
  4140.       reserved by a window system.)  To produce the best results in this
  4141.       situation, it is helpful to have information about the frequency
  4142.       with which each palette index actually appears, in order to choose
  4143.       the best palette for dithering or to drop the least-used colors.
  4144.       Since images are often created once and viewed many times, it
  4145.       makes sense to calculate this information in the encoder, although
  4146.       it is not mandatory for the encoder to provide it.
  4147.  
  4148.       Other image formats have usually addressed this problem by
  4149.       specifying that the palette entries should appear in order of
  4150.       frequency of use.  That is an inferior solution, because it
  4151.       doesn't give the viewer nearly as much information: the viewer
  4152.       can't determine how much damage will be done by dropping the last
  4153.       few colors.  Nor does a sorted palette give enough information to
  4154.       choose a target palette for dithering, in the case that the viewer
  4155.       needs to reduce the number of colors substantially.  A palette
  4156.       histogram provides the information needed to choose such a target
  4157.       palette without making a pass over the image data.
  4158.  
  4159. 13. Appendix: Gamma Tutorial
  4160.  
  4161.    (This appendix is not part of the formal PNG specification.)
  4162.  
  4163.    13.1. Nonlinear transfer functions
  4164.  
  4165.       It would be convenient for graphics programmers if all of the
  4166.       components of an imaging system were linear.  The voltage coming
  4167.       from an electronic camera would be directly proportional to the
  4168.       intensity (power) of light in the scene, the light emitted by a
  4169.       CRT would be directly proportional to its input voltage, and so
  4170.       on.  However, real-world devices do not behave in this way.  All
  4171.       CRT displays, almost all photographic film, and many electronic
  4172.       cameras have nonlinear signal-to-light-intensity or intensity-to-
  4173.       signal characteristics.
  4174.  
  4175.       Fortunately, all of these nonlinear devices have a transfer
  4176.       function that is approximated fairly well by a single type of
  4177.       mathematical function: a power function.  This power function has
  4178.       the general equation
  4179.  
  4180.          output = input ^ exponent
  4181.  
  4182.       where ^ denotes exponentiation.  The exponent is often called
  4183.       "gamma" and denoted by the Greek letter gamma.
  4184.  
  4185.       By convention, input and output are both scaled to the range 0 to
  4186.       1, with 0 representing black and 1 representing maximum white (or
  4187.       red, etc).  Normalized in this way, the power function is
  4188.       completely described by the exponent.
  4189.  
  4190.       So, given a particular device, we can measure its output as a
  4191.       function of its input, fit a power function to this measured
  4192.       transfer function, and extract the exponent.  People often say
  4193.       "this device has a gamma of 2.2" as a shorthand for "this device
  4194.       has a power-law response with an exponent of 2.2".  People also
  4195.       talk about the gamma of a mathematical transform, or of a lookup
  4196.       table in a frame buffer, if its input and output are related by
  4197.       the power-law expression above.
  4198.  
  4199.       But using the term "gamma" to refer to the exponents of transfer
  4200.       functions of many different stages in imaging pipelines has led to
  4201.       confusion.  Therefore, this specification uses "gamma" to refer
  4202.       specifically to the function from display output to image samples,
  4203.       and simply uses "exponent" when referring to other functions.
  4204.  
  4205.    13.2. Combining exponents
  4206.  
  4207.       Real imaging systems will have several components, and more than
  4208.       one of these can be nonlinear.  If all of the components have
  4209.       transfer characteristics that are power functions, then the
  4210.       transfer function of the entire system is also a power function.
  4211.       The exponent of the whole system's transfer function is just the
  4212.       product of all of the individual exponents of the separate stages
  4213.       in the system.
  4214.  
  4215.       Also, stages that are linear pose no problem, since a power
  4216.       function with an exponent of 1.0 is really a linear function.  So
  4217.       a linear transfer function is just a special case of a power
  4218.       function, with an exponent of 1.0.
  4219.  
  4220.       Thus, as long as our imaging system contains only stages with
  4221.       linear and power-law transfer functions, we can meaningfully talk
  4222.       about the exponent of the entire system.  This is indeed the case
  4223.       with most real imaging systems.
  4224.  
  4225.    13.3. End-to-end exponent
  4226.  
  4227.       If the end-to-end exponent of an imaging system is 1.0, its output
  4228.       is proportional to its input.  This means that the ratio between
  4229.       the intensities of any two areas in the reproduced image will be
  4230.       the same as it was in the original scene.  It might seem that this
  4231.       should always be the goal of an imaging system: to accurately
  4232.       reproduce the tones of the original scene.  Alas, that is not the
  4233.       case.
  4234.  
  4235.       One complication is that the response of the human visual system
  4236.       to low light levels is not a scaled-down version of its response
  4237.       to high light levels.  Therefore, if the display device emits less
  4238.       intense light than entered the capture device (as is usually the
  4239.       case for television cameras and television sets, for example), an
  4240.       end-to-end linear response will not produce an image that appears
  4241.       correct.  There are also other perceptual factors, like the affect
  4242.       of the ambient light level and the field of view surrounding the
  4243.       display, and physical factors, like reflectance of ambient light
  4244.       off the display.
  4245.  
  4246.       Good end-to-end exponents are determined from experience.  For
  4247.       example, for photographic prints it's about 1.0; for slides
  4248.       intended to be projected in a dark room it's about 1.5; for
  4249.       television it's about 1.14.
  4250.  
  4251.    13.4. CRT exponent
  4252.  
  4253.       All CRT displays have a power-law transfer characteristic with an
  4254.       exponent of about 2.2.  This is mainly due to the physical
  4255.       processes involved in controlling the electron beam in the
  4256.       electron gun.
  4257.  
  4258.       An exception to this rule is fancy "calibrated" CRTs that have
  4259.       internal electronics to alter their transfer function.  If you
  4260.       have one of these, you probably should believe what the
  4261.       manufacturer tells you its exponent is.  But in all other cases,
  4262.       assuming 2.2 is likely to be pretty accurate.
  4263.  
  4264.       There are various images around that purport to measure a display
  4265.       system's exponent, usually by comparing the intensity of an area
  4266.       containing alternating white and black with a series of areas of
  4267.       continuous gray of different intensity.  These are usually not
  4268.       reliable.  Test images that use a "checkerboard" pattern of black
  4269.       and white are the worst, because a single white pixel will be
  4270.       reproduced considerably darker than a large area of white.  An
  4271.       image that uses alternating black and white horizontal lines (such
  4272.       as the gamma.png test image at
  4273.       ftp://ftp.uu.net/graphics/png/images/suite/gamma.png) is much
  4274.       better, but even it may be inaccurate at high "picture" settings
  4275.       on some CRTs.
  4276.  
  4277.       If you have a good photometer, you can measure the actual light
  4278.       output of a CRT as a function of input voltage and fit a power
  4279.       function to the measurements.  However, note that this procedure
  4280.       is very sensitive to the CRT's black level adjustment, somewhat
  4281.       sensitive to its picture adjustment, and also affected by ambient
  4282.       light.  Furthermore, CRTs spread some light from bright areas of
  4283.       an image into nearby darker areas; a single bright spot against a
  4284.       black background may be seen to have a "halo".  Your measuring
  4285.       technique will need to minimize the effects of this.
  4286.  
  4287.       Because of the difficulty of measuring the exponent, using either
  4288.       test images or measuring equipment, you're usually better off just
  4289.       assuming 2.2 rather than trying to measure it.
  4290.  
  4291.    13.5. Gamma correction
  4292.  
  4293.       A CRT has an exponent of 2.2, and we can't change that.  To get an
  4294.       end-to-end exponent closer to 1, we need to have at least one
  4295.       other component of the "image pipeline" that is nonlinear.  If, in
  4296.       fact, there is only one nonlinear stage in addition to the CRT,
  4297.       then it's traditional to say that the other nonlinear stage
  4298.       provides "gamma correction" to compensate for the CRT.  However,
  4299.       exactly where the "correction" is done depends on circumstance.
  4300.  
  4301.       In all broadcast video systems, gamma correction is done in the
  4302.       camera.  This choice was made because it was more cost effective
  4303.       to place the expensive processing in the small number of capture
  4304.       devices (studio television cameras) than in the large number of
  4305.       broadcast receivers.  The original NTSC video standard required
  4306.       cameras to have a transfer function with an exponent of 1/2.2, or
  4307.       about 0.45.  Recently, a more complex two-part transfer function
  4308.       has been adopted [SMPTE-170M], but its behavior can be well
  4309.       approximated by a power function with an exponent of 0.52.  When
  4310.       the resulting image is displayed on a CRT with an exponent of 2.2,
  4311.       the end-to-end exponent is about 1.14, which has been found to be
  4312.       appropriate for typical television studio conditions and
  4313.       television viewing conditions.
  4314.  
  4315.       These days, video signals are often digitized and stored in
  4316.       computer frame buffers.  The digital image is intended to be sent
  4317.       through a CRT, which has exponent 2.2, so the image has a gamma of
  4318.       1/2.2.
  4319.  
  4320.       Computer rendering programs often produce samples proportional to
  4321.       scene intensity.  Suppose the desired end-to-end exponent is near
  4322.       1, and the program would like to write its samples directly into
  4323.       the frame buffer.  For correct display, the CRT output intensity
  4324.       must be nearly proportional to the sample values in the frame
  4325.       buffer.  This can be done with a special hardware lookup table
  4326.       between the frame buffer and the CRT hardware.  The lookup table
  4327.       (often called LUT) is loaded with a mapping that implements a
  4328.       power function with an exponent near 1/2.2, providing "gamma
  4329.       correction" for the CRT gamma.
  4330.  
  4331.       Thus, gamma correction sometimes happens before the frame buffer,
  4332.       sometimes after.  As long as images created on a particular
  4333.       platform are always displayed on that platform, everything is
  4334.       fine.  But when people try to exchange images, differences in
  4335.       gamma correction conventions often result in images that seem far
  4336.       too bright and washed out, or far too dark and contrasty.
  4337.  
  4338.    13.6. Benefits of gamma encoding
  4339.  
  4340.       So, is it better to do gamma correction before or after the frame
  4341.       buffer?
  4342.  
  4343.       In an ideal world, sample values would be stored as floating-point
  4344.       numbers, there would be lots of precision, and it wouldn't really
  4345.       matter much.  But in reality, we're always trying to store images
  4346.       in as few bits as we can.
  4347.  
  4348.       If we decide to use samples proportional to intensity, and do the
  4349.       gamma correction in the frame buffer LUT, it turns out that we
  4350.       need to use at least 12 bits for each of red, green, and blue to
  4351.       have enough precision in intensity.  With any less than that, we
  4352.       will sometimes see "contour bands" or "Mach bands" in the darker
  4353.       areas of the image, where two adjacent sample values are still far
  4354.       enough apart in intensity for the difference to be visible.
  4355.  
  4356.       However, through an interesting coincidence, the human eye's
  4357.       subjective perception of brightness is related to the physical
  4358.       stimulation of light intensity in a manner that is very much like
  4359.       the power function used for gamma correction.  If we apply gamma
  4360.       correction to measured (or calculated) light intensity before
  4361.       quantizing to an integer for storage in a frame buffer, we can get
  4362.       away with using many fewer bits to store the image.  In fact, 8
  4363.       bits per color is almost always sufficient to avoid contouring
  4364.       artifacts.  This is because, since gamma correction is so closely
  4365.       related to human perception, we are assigning our 256 available
  4366.       sample codes to intensity values in a manner that approximates how
  4367.       visible those intensity changes are to the eye.  Compared to a
  4368.       linearly encoded image, we allocate fewer sample values to
  4369.       brighter parts of the tonal range and more sample values to the
  4370.       darker portions of the tonal range.
  4371.  
  4372.       Thus, for the same apparent image quality, images using gamma-
  4373.       encoded sample values need only about two-thirds as many bits of
  4374.       storage as images using linearly encoded samples.
  4375.  
  4376.    13.7. General gamma handling
  4377.  
  4378.       When more than two nonlinear transfer functions are involved in
  4379.       the image pipeline, the term "gamma correction" becomes too vague.
  4380.       If we consider a pipeline that involves capturing (or calculating)
  4381.       an image, storing it in an image file, reading the file, and
  4382.       displaying the image on some sort of display screen, there are at
  4383.       least 5 places in the pipeline that could have nonlinear transfer
  4384.       functions.  Let's give a specific name to each exponent:
  4385.  
  4386.       camera exponent
  4387.          the exponent of the image sensor
  4388.  
  4389.       encoding exponent
  4390.          the exponent of any transformation performed by the software
  4391.          writing the image file
  4392.  
  4393.       decoding exponent
  4394.          the exponent of any transformation performed by the software
  4395.          reading the image file
  4396.  
  4397.       LUT exponent
  4398.          the exponent of the frame buffer LUT, if present
  4399.  
  4400.       CRT exponent
  4401.          the exponent of the CRT, generally 2.2
  4402.  
  4403.       In addition, let's add a few other names:
  4404.  
  4405.       display exponent
  4406.          the exponent of the "display system" downstream of the frame
  4407.          buffer
  4408.  
  4409.             display_exponent = LUT_exponent * CRT_exponent
  4410.  
  4411.       gamma
  4412.          the exponent of the function mapping display output intensity
  4413.          to file samples
  4414.  
  4415.             gamma = 1.0 / (decoding_exponent * display_exponent)
  4416.  
  4417.       end-to-end exponent
  4418.          the exponent of the function mapping image sensor input
  4419.          intensity to display output intensity, generally 1.0 to 1.5
  4420.  
  4421.       When displaying an image file, the image decoding program is
  4422.       responsible for making gamma equal to the value specified in the
  4423.       gAMA chunk, by selecting the decoding exponent appropriately:
  4424.  
  4425.          decoding_exponent = 1.0 / (gamma * display_exponent)
  4426.  
  4427.       The display exponent might be known for this machine, or it might
  4428.       be obtained from the system software, or the user might have to be
  4429.       asked what it is.
  4430.  
  4431.    13.8. Some specific examples
  4432.  
  4433.       In digital video systems, the camera exponent is about 0.52 by
  4434.       declaration of the various video standards documents.  The CRT
  4435.       exponent is 2.2 as usual, while the encoding exponent, decoding
  4436.       exponent, and LUT exponent are all 1.0.  As a result, the end-to-
  4437.       end exponent is about 1.14.
  4438.  
  4439.       On frame buffers that have hardware gamma correction tables, and
  4440.       that are calibrated to display samples that are proportional to
  4441.       display output intensity, the display exponent is 1.0.
  4442.  
  4443.       Many workstations and X terminals and PC clones lack gamma
  4444.       correction lookup tables.  Here, the LUT exponent is always 1.0,
  4445.       so the display exponent is 2.2.
  4446.  
  4447.       On the Macintosh, there is a LUT.  By default, it is loaded with a
  4448.       table whose exponent is 1/1.45, giving a display exponent (LUT and
  4449.       CRT combined) of about 1.52.  Some Macs have a "Gamma" control
  4450.       panel with selections labeled 1.0, 1.2, 1.4, 1.8, or 2.2.  These
  4451.       settings load alternate LUTs, but beware: the selection labeled
  4452.       with the value g loads a LUT with exponent g/2.61, yielding
  4453.  
  4454.          display_exponent = (g/2.61) * 2.2
  4455.  
  4456.       On recent SGI systems, there is a hardware gamma-correction table
  4457.       whose contents are controlled by the (privileged) gamma program.
  4458.       The exponent of the table is actually the reciprocal of the number
  4459.       g that gamma prints.  You can obtain g from the file
  4460.       /etc/config/system.glGammaVal and calculate
  4461.  
  4462.          display_exponent = 2.2 / g
  4463.  
  4464.       You will find SGI systems with g set to 1.0 and 2.2 (or higher),
  4465.       but the default when machines are shipped is 1.7.
  4466.  
  4467.       On NeXT systems the LUT has exponent 1/2.2 by default, but it can
  4468.       be modified by third-party applications.
  4469.  
  4470.       In summary, for images designed to need no correction on these
  4471.       platforms:
  4472.  
  4473.          Platform    LUT exponent   Default LUT exponent   Default gAMA
  4474.  
  4475.          PC clone       1.0                     1.0           45455
  4476.          Macintosh     g/2.61        1.8/2.61 = 1/1.45        65909
  4477.          SGI            1/g                     1/1.7         77273
  4478.          NeXT           1/g                     1/2.2        100000
  4479.  
  4480.       The default gAMA values assume a CRT display.
  4481.  
  4482.    13.9. Video camera transfer functions
  4483.  
  4484.       The original NTSC video standards specified a simple power-law
  4485.       camera transfer function with an exponent of 1/2.2 (about 0.45).
  4486.       This is not possible to implement exactly in analog hardware
  4487.       because the function has infinite slope at x=0, so all cameras
  4488.       deviated to some degree from this ideal.  More recently, a new
  4489.       camera transfer function that is physically realizable has been
  4490.       accepted as a standard [SMPTE-170M]. It is
  4491.  
  4492.          if (Vin < 0.018)  Vout = 4.5 * Vin
  4493.          if (Vin >= 0.018) Vout = 1.099 * (Vin^0.45) - 0.099
  4494.  
  4495.       where Vin and Vout are measured on a scale of 0 to 1.  Although
  4496.       the exponent remains 0.45, the multiplication and subtraction
  4497.       change the shape of the transfer function, so it is no longer a
  4498.       pure power function.  It can be well approximated, however, by a
  4499.       power function with exponent 0.52.
  4500.  
  4501.       The PAL and SECAM video standards specify a power-law camera
  4502.       transfer function with an exponent of 1/2.8 (about 0.36).
  4503.       However, this is too low in practice, so real cameras are likely
  4504.       to have exponents close to NTSC practice.
  4505.  
  4506.    13.10. Further reading
  4507.  
  4508.       Charles Poynton's "Gamma FAQ" [GAMMA-FAQ] is a excellent source of
  4509.       information about gamma, although it claims that CRTs have an
  4510.       exponent of 2.5.  See also his book [DIGITAL-VIDEO].
  4511.  
  4512. 14. Appendix: Color Tutorial
  4513.  
  4514.    (This appendix is not part of the formal PNG specification.)
  4515.  
  4516.    14.1. About chromaticity
  4517.  
  4518.       The cHRM chunk is used, together with the gAMA chunk, to convey
  4519.       precise color information so that a PNG image can be displayed or
  4520.       printed with better color fidelity than is possible without this
  4521.       information.  The preceding chapters state how this information is
  4522.       encoded in a PNG image.  This tutorial briefly outlines the
  4523.       underlying color theory for those who might not be familiar with
  4524.       it.
  4525.  
  4526.       Note that displaying an image with incorrect gamma will produce
  4527.       much larger color errors than failing to use the chromaticity
  4528.       data.  First be sure the monitor set-up and gamma correction are
  4529.       right, then worry about chromaticity.
  4530.  
  4531.    14.2. The problem of color
  4532.  
  4533.       The color of an object depends not only on the precise spectrum of
  4534.       light emitted or reflected from it, but also on the observer--
  4535.       their species, what else they can see at the same time, even what
  4536.       they have recently looked at!  Furthermore, two very different
  4537.       spectra can produce exactly the same color sensation.  Color is
  4538.       not an objective property of real-world objects; it is a
  4539.       subjective, biological sensation.  However, by making some
  4540.       simplifying assumptions (such as: we are talking about human
  4541.       vision) it is possible to produce a mathematical model of color
  4542.       and thereby obtain good color accuracy.
  4543.  
  4544.    14.3. Device-dependent color
  4545.  
  4546.       Display the same RGB data on three different monitors, side by
  4547.       side, and you will get a noticeably different color balance on
  4548.       each display.  This is because each monitor emits a slightly
  4549.       different shade and intensity of red, green, and blue light.  RGB
  4550.       is an example of a device-dependent color model--the color you get
  4551.       depends on the device.  This also means that a particular color--
  4552.       represented as say RGB 87, 146, 116 on one monitor--might have to
  4553.       be specified as RGB 98, 123, 104 on another to produce the same
  4554.       color.
  4555.  
  4556.    14.4. Device-independent color
  4557.  
  4558.       A full physical description of a color would require specifying
  4559.       the exact spectral power distribution of the light source.
  4560.       Fortunately, the human eye and brain are not so sensitive as to
  4561.       require exact reproduction of a spectrum.  Mathematical, device-
  4562.       independent color models exist that describe fairly well how a
  4563.       particular color will be seen by humans.  The most important
  4564.       device-independent color model, to which all others can be
  4565.       related, was developed by the International Commission on
  4566.       Illumination (CIE, in French) and is called "CIE XYZ" or simply
  4567.       "XYZ".
  4568.  
  4569.       In XYZ, X is the sum of a weighted power distribution over the
  4570.       whole visible spectrum.  So are Y and Z, each with different
  4571.       weights.  Thus any arbitrary spectral power distribution is
  4572.       condensed down to just three floating-point numbers.  The weights
  4573.       were derived from color matching experiments done on human
  4574.       subjects in the 1920s.  CIE XYZ has been an International Standard
  4575.       since 1931, and it has a number of useful properties:
  4576.  
  4577.           * two colors with the same XYZ values will look the same to
  4578.             humans
  4579.  
  4580.           * two colors with different XYZ values will not look the same
  4581.  
  4582.           * the Y value represents all the brightness information
  4583.             (luminance)
  4584.  
  4585.           * the XYZ color of any object can be objectively measured
  4586.  
  4587.       Color models based on XYZ have been used for many years by people
  4588.       who need accurate control of color--lighting engineers for film
  4589.       and TV, paint and dyestuffs manufacturers, and so on.  They are
  4590.       thus proven in industrial use.  Accurate, device-independent color
  4591.       started to spread from high-end, specialized areas into the
  4592.       mainstream during the late 1980s and early 1990s, and PNG takes
  4593.       notice of that trend.
  4594.  
  4595.    14.5. Calibrated device-dependent color
  4596.  
  4597.       Traditionally, image file formats have used uncalibrated, device-
  4598.       dependent color.  If the precise details of the original display
  4599.       device are known, it becomes possible to convert the device-
  4600.       dependent colors of a particular image to device-independent ones.
  4601.       Making simplifying assumptions, such as working with CRTs (which
  4602.       are much easier than printers), all we need to know are the XYZ
  4603.       values of each primary color and the CRT exponent.
  4604.  
  4605.       So why does PNG not store images in XYZ instead of RGB?  Well, two
  4606.       reasons.  First, storing images in XYZ would require more bits of
  4607.       precision, which would make the files bigger.  Second, all
  4608.       programs would have to convert the image data before viewing it.
  4609.       Whether calibrated or not, all variants of RGB are close enough
  4610.       that undemanding viewers can get by with simply displaying the
  4611.       data without color correction.  By storing calibrated RGB, PNG
  4612.       retains compatibility with existing programs that expect RGB data,
  4613.       yet provides enough information for conversion to XYZ in
  4614.       applications that need precise colors.  Thus, we get the best of
  4615.       both worlds.
  4616.  
  4617.    14.6. Chromaticity and luminance
  4618.  
  4619.       Chromaticity is an objective measurement of the color of an
  4620.       object, leaving aside the brightness information.  Chromaticity
  4621.       uses two parameters x and y, which are readily calculated from
  4622.       XYZ:
  4623.  
  4624.          x = X / (X + Y + Z)
  4625.          y = Y / (X + Y + Z)
  4626.  
  4627.       XYZ colors having the same chromaticity values will appear to have
  4628.       the same hue but can vary in absolute brightness.  Notice that x,y
  4629.       are dimensionless ratios, so they have the same values no matter
  4630.       what units we've used for X,Y,Z.
  4631.  
  4632.       The Y value of an XYZ color is directly proportional to its
  4633.       absolute brightness and is called the luminance of the color.  We
  4634.       can describe a color either by XYZ coordinates or by chromaticity
  4635.       x,y plus luminance Y.  The XYZ form has the advantage that it is
  4636.       linearly related to RGB intensities.
  4637.  
  4638.    14.7. Characterizing computer monitors
  4639.  
  4640.       The "white point" of a monitor is the chromaticity x,y of the
  4641.       monitor's nominal white, that is, the color produced when
  4642.       R=G=B=maximum.
  4643.  
  4644.       It's customary to specify monitor colors by giving the
  4645.       chromaticities of the individual phosphors R, G, and B, plus the
  4646.       white point.  The white point allows one to infer the relative
  4647.       brightnesses of the three phosphors, which isn't determined by
  4648.       their chromaticities alone.
  4649.  
  4650.       Note that the absolute brightness of the monitor is not specified.
  4651.       For computer graphics work, we generally don't care very much
  4652.       about absolute brightness levels.  Instead of dealing with
  4653.       absolute XYZ values (in which X,Y,Z are expressed in physical
  4654.       units of radiated power, such as candelas per square meter), it is
  4655.       convenient to work in "relative XYZ" units, where the monitor's
  4656.       nominal white is taken to have a luminance (Y) of 1.0.  Given this
  4657.       assumption, it's simple to compute XYZ coordinates for the
  4658.       monitor's white, red, green, and blue from their chromaticity
  4659.       values.
  4660.  
  4661.       Why does cHRM use x,y rather than XYZ?  Simply because that is how
  4662.       manufacturers print the information in their spec sheets!
  4663.       Usually, the first thing a program will do is convert the cHRM
  4664.       chromaticities into relative XYZ space.
  4665.  
  4666.    14.8. Uses for XYZ
  4667.  
  4668.       If a PNG file has the gAMA and cHRM chunks, the source RGB values
  4669.       can be converted to XYZ.  This lets you:
  4670.  
  4671.           * do accurate grayscale conversion (just use the Y component)
  4672.  
  4673.           * convert to RGB for your own monitor (to see the original
  4674.             colors)
  4675.  
  4676.           * print the image in Level 2 PostScript with better color
  4677.             fidelity than a simple RGB to CMYK conversion could provide
  4678.  
  4679.           * calculate an optimal color palette
  4680.  
  4681.           * pass the image data to a color management system
  4682.  
  4683.           * etc.
  4684.  
  4685.    14.9. Converting between RGB and XYZ
  4686.  
  4687.       Make a few simplifying assumptions first, like the monitor really
  4688.       is jet black with no input and the guns don't interfere with one
  4689.       another.  Then, given that you know the CIE XYZ values for each of
  4690.       red, green, and blue for a particular monitor, you put them into a
  4691.       matrix M:
  4692.  
  4693.               Xr Xg Xb
  4694.          M =  Yr Yg Yb
  4695.               Zr Zg Zb
  4696.  
  4697.       RGB intensity samples normalized to the range 0 to 1 can be
  4698.       converted to XYZ by matrix multiplication.  (If you have gamma-
  4699.       encoded RGB samples, first undo the gamma encoding.)
  4700.  
  4701.          X     R
  4702.          Y = M G
  4703.          Z     B
  4704.  
  4705.       In other words, X = Xr*R + Xg*G + Xb*B, and similarly for Y and Z.
  4706.       You can go the other way too:
  4707.  
  4708.          R        X
  4709.          G = invM Y
  4710.          B        Z
  4711.  
  4712.       where invM is the inverse of the matrix M.
  4713.  
  4714.    14.10. Device gamut
  4715.  
  4716.       The gamut of a device is the subset of visible colors that the
  4717.       device can display.  (It has nothing to do with gamma.)  The gamut
  4718.       of an RGB device can be visualized as a polyhedron in XYZ space;
  4719.       the vertices correspond to the device's black, blue, red, green,
  4720.       magenta, cyan, yellow, and white.
  4721.  
  4722.       Different devices have different gamuts, in other words one device
  4723.       will be able to display certain colors (usually highly saturated
  4724.       ones) that another device cannot.  The gamut of a particular RGB
  4725.       device can be determined from its R, G, and B chromaticities and
  4726.       white point (the same values given in the cHRM chunk).  The gamut
  4727.       of a color printer is more complex and can be determined only by
  4728.       measurement.  However, printer gamuts are typically smaller than
  4729.       monitor gamuts, meaning that there can be many colors in a
  4730.       displayable image that cannot physically be printed.
  4731.  
  4732.       Converting image data from one device to another generally results
  4733.       in gamut mismatches--colors that cannot be represented exactly on
  4734.       the destination device.  The process of making the colors fit,
  4735.       which can range from a simple clip to elaborate nonlinear scaling
  4736.       transformations, is termed gamut mapping.  The aim is to produce a
  4737.       reasonable visual representation of the original image.
  4738.  
  4739.    Further reading
  4740.  
  4741.    14.11. Further reading
  4742.  
  4743.       References [COLOR-1] through [COLOR-5] provide more detail about
  4744.       color theory.
  4745.  
  4746. 15. Appendix: Sample CRC Code
  4747.  
  4748.    The following sample code represents a practical implementation of
  4749.    the CRC (Cyclic Redundancy Check) employed in PNG chunks.  (See also
  4750.    ISO 3309 [ISO-3309] or ITU-T V.42 [ITU-T-V42] for a formal
  4751.    specification.)
  4752.  
  4753.    The sample code is in the ANSI C programming language.  Non C users
  4754.    may find it easier to read with these hints:
  4755.  
  4756.    &
  4757.       Bitwise AND operator.
  4758.  
  4759.    ^
  4760.       Bitwise exclusive-OR operator.  (Caution: elsewhere in this
  4761.       document, ^ represents exponentiation.)
  4762.  
  4763.    >>
  4764.       Bitwise right shift operator.  When applied to an unsigned
  4765.       quantity, as here, right shift inserts zeroes at the left.
  4766.  
  4767.    !
  4768.       Logical NOT operator.
  4769.  
  4770.    ++
  4771.       N++ increments the variable N.
  4772.  
  4773.    0xNNN
  4774.       0x introduces a hexadecimal (base 16) constant.  Suffix L
  4775.       indicates a long value (at least 32 bits).
  4776.  
  4777.       /* Table of CRCs of all 8-bit messages. */
  4778.       unsigned long crc_table[256];
  4779.  
  4780.       /* Flag: has the table been computed? Initially false. */
  4781.       int crc_table_computed = 0;
  4782.  
  4783.       /* Make the table for a fast CRC. */
  4784.       void make_crc_table(void)
  4785.       {
  4786.         unsigned long c;
  4787.         int n, k;
  4788.  
  4789.         for (n = 0; n < 256; n++) {
  4790.           c = (unsigned long) n;
  4791.           for (k = 0; k < 8; k++) {
  4792.             if (c & 1)
  4793.               c = 0xedb88320L ^ (c >> 1);
  4794.             else
  4795.               c = c >> 1;
  4796.           }
  4797.           crc_table[n] = c;
  4798.         }
  4799.         crc_table_computed = 1;
  4800.       }
  4801.  
  4802.       /* Update a running CRC with the bytes buf[0..len-1]--the CRC
  4803.          should be initialized to all 1's, and the transmitted value
  4804.          is the 1's complement of the final running CRC (see the
  4805.          crc() routine below)). */
  4806.  
  4807.       unsigned long update_crc(unsigned long crc, unsigned char *buf,
  4808.                                int len)
  4809.       {
  4810.         unsigned long c = crc;
  4811.         int n;
  4812.  
  4813.         if (!crc_table_computed)
  4814.           make_crc_table();
  4815.         for (n = 0; n < len; n++) {
  4816.           c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
  4817.         }
  4818.         return c;
  4819.       }
  4820.  
  4821.       /* Return the CRC of the bytes buf[0..len-1]. */
  4822.       unsigned long crc(unsigned char *buf, int len)
  4823.       {
  4824.         return update_crc(0xffffffffL, buf, len) ^ 0xffffffffL;
  4825.       }
  4826.  
  4827. 16. Appendix: Online Resources
  4828.  
  4829.    (This appendix is not part of the formal PNG specification.)
  4830.  
  4831.    This appendix gives the locations of some Internet resources for PNG
  4832.    software developers.  By the nature of the Internet, the list is
  4833.    incomplete and subject to change.
  4834.  
  4835.    Archive sites
  4836.  
  4837.       The latest released versions of this document and related
  4838.       information can always be found at the PNG FTP archive site,
  4839.       ftp://ftp.uu.net/graphics/png/. The PNG specification is available
  4840.       in several formats, including HTML, plain text, and PostScript.
  4841.  
  4842.    Reference implementation and test images
  4843.  
  4844.       A reference implementation in portable C is available from the PNG
  4845.       FTP archive site, ftp://ftp.uu.net/graphics/png/src/. The
  4846.       reference implementation is freely usable in all applications,
  4847.       including commercial applications.
  4848.  
  4849.       Test images are available from
  4850.       ftp://ftp.uu.net/graphics/png/images/.
  4851.  
  4852.    Electronic mail
  4853.  
  4854.       The maintainers of the PNG specification can be contacted by
  4855.       e-mail at png-info@uunet.uu.net or at png-group@w3.org.
  4856.  
  4857.    PNG web site
  4858.  
  4859.       There is a World Wide Web site for PNG at
  4860.       http://www.cdrom.com/pub/png/. This is a central location for
  4861.       current information about PNG and PNG-related tools.
  4862.  
  4863. 17. Appendix: Revision History
  4864.  
  4865.    (This appendix is not part of the formal PNG specification.)
  4866.  
  4867.    The PNG format has been frozen since the Ninth Draft of 7 March 1995,
  4868.    and all future changes are intended to be backward compatible.  The
  4869.    revisions since the Ninth Draft are simply clarifications,
  4870.    improvements in presentation, additions of supporting material, and
  4871.    specifications for additional chunks.
  4872.  
  4873.    On 1 October 1996, the PNG 1.0 specification was approved as a W3C
  4874.    (World Wide Web Consortium) Recommendation.
  4875.  
  4876.    In January 1997 it was published as RFC-2083 (informational) with
  4877.    technical content identical to that of the W3C Recommendation.
  4878.  
  4879.    In October 1998, the PNG 1.1 specification was approved by the PNG
  4880.    Development Group.
  4881.  
  4882.    Changes since version 1.0
  4883.  
  4884.       (W3C Recommendation 01-October-1996, RFC 2083 January 1997)
  4885.  
  4886.       Note: These changes have been approved by the PNG Development
  4887.       Group, but not by any standards body.
  4888.  
  4889.           * Redefined gAMA to be in terms of the desired display output
  4890.             rather than the original scene, and revised all discussions
  4891.             of gamma and references to gamma accordingly
  4892.  
  4893.           * Added the iCCP, sPLT, and sRGB chunks
  4894.  
  4895.           * Extended the scope of the 31-bit limit on chunk lengths and
  4896.             image dimensions to apply to all four-byte unsigned
  4897.             integers, and disallowed the value -2^31 in four-byte signed
  4898.             integers
  4899.  
  4900.           * Mentioned the possibility of dithering the alpha channel
  4901.             when converting it to binary transparency
  4902.  
  4903.           * Clarified that zlib window sizes smaller than 32K are valid
  4904.  
  4905.           * Updated the PNG web site URL and authors' email addresses
  4906.  
  4907.           * Editing and reformatting
  4908.  
  4909.    Changes since the Tenth Draft of 5 May 1995
  4910.  
  4911.           * Clarified meaning of a suggested-palette PLTE chunk in a
  4912.             truecolor image that uses transparency
  4913.  
  4914.           * Clarified exact semantics of sBIT and allowed sample depth
  4915.             scaling procedures
  4916.  
  4917.           * Clarified status of spaces in tEXt chunk keywords
  4918.  
  4919.           * Distinguished private and public extension values in type
  4920.             and method fields
  4921.  
  4922.           * Added a "Creation Time" tEXt keyword
  4923.  
  4924.           * Macintosh representation of PNG specified
  4925.  
  4926.           * Added discussion of security issues
  4927.  
  4928.           * Added more extensive discussion of gamma and chromaticity
  4929.             handling, including tutorial appendixes
  4930.  
  4931.           * Clarified terminology, notably sample depth vs. bit depth
  4932.  
  4933.           * Added a glossary
  4934.  
  4935.           * Editing and reformatting
  4936.  
  4937. 18. References
  4938.  
  4939.    [COLOR-1]
  4940.       Hall, Roy, Illumination and Color in Computer Generated Imagery.
  4941.       Springer-Verlag, New York, 1989.  ISBN 0-387-96774-5.
  4942.  
  4943.    [COLOR-2]
  4944.       Kasson, J., and W. Plouffe, "An Analysis of Selected Computer
  4945.       Interchange Color Spaces", ACM Transactions on Graphics, vol 11 no
  4946.       4 (1992), pp 373-405.
  4947.  
  4948.    [COLOR-3]
  4949.       Lilley, C., F. Lin, W.T. Hewitt, and T.L.J. Howard, Colour in
  4950.       Computer Graphics. CVCP, Sheffield, 1993.  ISBN 1-85889-022-5.
  4951.  
  4952.    [COLOR-4]
  4953.       Stone, M.C., W.B. Cowan, and J.C. Beatty, "Color gamut mapping and
  4954.       the printing of digital images", ACM Transactions on Graphics, vol
  4955.       7 no 3 (1988), pp 249-292.
  4956.  
  4957.    [COLOR-5]
  4958.       Travis, David, Effective Color Displays--Theory and Practice.
  4959.       Academic Press, London, 1991.  ISBN 0-12-697690-2.
  4960.  
  4961.    [DIGITAL-VIDEO]
  4962.       Poynton, Charles, A Technical Introduction to Digital Video.  John
  4963.       Wiley & Sons, 1996.  ISBN 0-471-12253-X.
  4964.       http://www.inforamp.net/~poynton/Poynton-T-I-Digital-Video.html
  4965.  
  4966.    [GAMMA-FAQ]
  4967.       Poynton, C., "Gamma FAQ".
  4968.       http://www.inforamp.net/~poynton/Poynton-colour.html
  4969.  
  4970.    [ICC]
  4971.       The International Color Consortium
  4972.       http://www.color.org/
  4973.  
  4974.    [ISO-3309]
  4975.       International Organization for Standardization, "Information
  4976.       Processing Systems--Data Communication High-Level Data Link
  4977.       Control Procedure--Frame Structure", IS 3309, October 1984, 3rd
  4978.       Edition.
  4979.  
  4980.    [ISO-3664]
  4981.       International Organization for Standardization, "Photography--
  4982.       Illumination Conditions for Viewing Colour Transparencies and
  4983.       their Representation", IS 3664, 1975.
  4984.  
  4985.    [ISO/IEC-8859-1]
  4986.       International Organization for Standardization and International
  4987.       Electrotechnical Commission, "Information Technology--8-bit
  4988.       Single-Byte Coded Graphic Character Sets--Part 1: Latin Alphabet
  4989.       No. 1", IS 8859-1, 1998.
  4990.       Also see sample files at
  4991.       ftp://ftp.uu.net/graphics/png/documents/iso_8859-1.*
  4992.  
  4993.    [ITU-R-BT709]
  4994.       International Telecommunications Union, "Basic Parameter Values
  4995.       for the HDTV Standard for the Studio and for International
  4996.       Programme Exchange", ITU-R Recommendation BT.709 (formerly CCIR
  4997.       Rec. 709), 1990.
  4998.  
  4999.    [ITU-T-V42]
  5000.       International Telecommunications Union, "Error-correcting
  5001.       Procedures for DCEs Using Asynchronous-to-Synchronous Conversion",
  5002.       ITU-T Recommendation V.42, 1994, Rev. 1.
  5003.  
  5004.    [PAETH]
  5005.       Paeth, A.W., "Image File Compression Made Easy", in Graphics Gems
  5006.       II, James Arvo, editor.  Academic Press, San Diego, 1991.  ISBN
  5007.       0-12-064480-0.
  5008.  
  5009.    [POSTSCRIPT]
  5010.       Adobe Systems Incorporated, PostScript Language Reference Manual,
  5011.       2nd edition.  Addison-Wesley, Reading, 1990.  ISBN 0-201-18127-4.
  5012.  
  5013.    [PNG-EXTENSIONS]
  5014.       PNG Group, "Extensions to the PNG 1.1 Specification, Version
  5015.       1.1.0".  Available in several formats from
  5016.       ftp://ftp.uu.net/graphics/png/documents/pngext-*
  5017.  
  5018.    [RFC-1123]
  5019.       Braden, R., Editor, "Requirements for Internet Hosts--Application
  5020.       and Support", STD 3, RFC 1123, USC/Information Sciences Institute,
  5021.       October 1989.
  5022.       ftp://ftp.isi.edu/in-notes/rfc1123.txt
  5023.  
  5024.    [RFC-1950]
  5025.       Deutsch, P. and J-L. Gailly, "ZLIB Compressed Data Format
  5026.       Specification version 3.3", RFC 1950, Aladdin Enterprises,
  5027.       May 1996.
  5028.       ftp://ftp.isi.edu/in-notes/rfc1950.txt
  5029.  
  5030.    [RFC-1951]
  5031.       Deutsch, P., "DEFLATE Compressed Data Format Specification version
  5032.       1.3", RFC 1951, Aladdin Enterprises, May 1996.
  5033.       ftp://ftp.isi.edu/in-notes/rfc1951.txt
  5034.  
  5035.    [RFC-2045]
  5036.       Freed, N., and N. Borenstein, "Multipurpose Internet Mail
  5037.       Extensions (MIME) Part One: Format of Internet Message Bodies",
  5038.       RFC 2045, Innosoft, First Virtual, November 1996.
  5039.       ftp://ftp.isi.edu/in-notes/rfc2045.txt
  5040.  
  5041.    [RFC-2048]
  5042.       Freed, N., Klensin, J., and J. Postel, "Multipurpose Internet Mail
  5043.       Extensions (MIME) Part Four: Registration Procedures", RFC 2048,
  5044.       Innosoft, MCI, USC/Information Sciences Institute, November 1996.
  5045.       ftp://ftp.isi.edu/in-notes/rfc2048.txt
  5046.  
  5047.    [RFC-2119]
  5048.       Bradner, Scott, "Key words for use in RFCs to Indicate Requirement
  5049.       Levels", RFC 2119, Harvard University, March 1997.
  5050.       ftp://ftp.isi.edu/in-notes/rfc2119.txt
  5051.  
  5052.    [SMPTE-170M]
  5053.       Society of Motion Picture and Television Engineers, "Television--
  5054.       Composite Analog Video Signal--NTSC for Studio Applications",
  5055.       SMPTE-170M, 1994.
  5056.  
  5057.    [sRGB]
  5058.       Stokes, Michael, Matthew Anderson, Srinivasan Chandrasekar, and
  5059.       Ricardo Motta, A Standard Default Color Space for the Internet -
  5060.       sRGB.
  5061.       http://www.w3.org/Graphics/Color/sRGB
  5062.  
  5063.       The key portions of this document are being adopted with revisions
  5064.       into:
  5065.  
  5066.       International Electrotechnical Commission, "Colour Measurement and
  5067.       Management in Multimedia Systems and Equipment - Part 2-1: Default
  5068.       RGB Colour Space - sRGB", IEC 61966-2-1.
  5069.       http://w3.hike.te.chiba-u.ac.jp/IEC/100/PT61966/parts/part2/
  5070.  
  5071. 19. Credits
  5072.  
  5073.    Editors
  5074.  
  5075.           * Glenn Randers-Pehrson (PNG 1.1), randeg @ alumni.rpi.edu
  5076.           * Thomas Boutell (PNG 1.0), boutell @ boutell.com
  5077.  
  5078.    Contributing Editors
  5079.  
  5080.           * Adam M. Costello (PNG 1.1), amc @ cs.berkeley.edu
  5081.           * Tom Lane (PNG 1.0), tgl @ sss.pgh.pa.us
  5082.  
  5083.    Authors
  5084.  
  5085.       Authors' names are presented in alphabetical order.  Spaces have
  5086.       been added to e-mail addresses (around the @ symbols) to minimize
  5087.       the amount of unwanted e-mail via automated harvesters.
  5088.  
  5089.           * Mark Adler, madler @ alumni.caltech.edu
  5090.           * Thomas Boutell, boutell @ boutell.com
  5091.           * John Bowler, jbowler @ acm.org
  5092.           * Christian Brunschen, cb @ df.lth.se
  5093.           * Adam M. Costello, amc @ cs.berkeley.edu
  5094.           * Lee Daniel Crocker, lee @ piclab.com
  5095.           * Andreas Dilger, adilger @ enel.ucalgary.ca
  5096.           * Oliver Fromme, oliver @ fromme.com
  5097.           * Jean-loup Gailly, jloup @ gzip.org
  5098.           * Chris Herborth, chrish @ qnx.com
  5099.           * Alex Jakulin, Aleks.Jakulin @ snet.fri.uni-lj.si
  5100.           * Neal Kettler, neal @ westwood.com
  5101.           * Tom Lane, tgl @ sss.pgh.pa.us
  5102.           * Alexander Lehmann, alex @ hal.rhein-main.de
  5103.           * Chris Lilley, chris @ w3.org
  5104.           * Dave Martindale, davem @ cs.ubc.ca
  5105.           * Owen Mortensen, ojm @ acm.org
  5106.           * Keith S. Pickens, ksp @ swri.edu
  5107.           * Robert P. Poole
  5108.           * Glenn Randers-Pehrson, randeg @ alumni.rpi.edu
  5109.           * Greg Roelofs, newt @ pobox.com
  5110.           * Willem van Schaik, willem @ schaik.com
  5111.           * Guy Schalnat, gschal @ infinet.com
  5112.           * Paul Schmidt, pschmidt @ photodex.com
  5113.           * Michael Stokes, Michael_Stokes @ hp.com
  5114.           * Tim Wegner, twegner @ phoenix.net
  5115.           * Jeremy Wohl, jeremyw @ evantide.com
  5116.  
  5117.       The authors wish to acknowledge the contributions of the Portable
  5118.       Network Graphics mailing list, the readers of comp.graphics, and
  5119.       the members of the World Wide Web Consortium (W3C).
  5120.  
  5121.       The Adam7 interlacing scheme is not patented and it is not the
  5122.       intention of the originator of that scheme to patent it.  The
  5123.       scheme may be freely used by all PNG implementations.  The name
  5124.       "Adam7" may be freely used to describe interlace method 1 of the
  5125.       PNG specification.
  5126.  
  5127.    Trademarks
  5128.  
  5129.       GIF is a service mark of CompuServe Incorporated.  IBM PC is a
  5130.       trademark of International Business Machines Corporation.
  5131.       Macintosh is a trademark of Apple Computer, Inc.  Microsoft,
  5132.       Windows, and MS-DOS are trademarks of Microsoft Corporation.
  5133.       PhotoCD is a trademark of Eastman Kodak Company.  PostScript and
  5134.       TIFF are trademarks of Adobe Systems Incorporated.  SGI is a
  5135.       trademark of Silicon Graphics, Inc.  X Window System is a
  5136.       trademark of the Massachusetts Institute of Technology.
  5137.  
  5138.    Document source
  5139.  
  5140.       This document was built from the file png-master-19990130 on
  5141.       31 January 1999.
  5142.  
  5143.    Copyright notice
  5144.  
  5145.       Copyright (c) 1998, 1999 by:  Glenn Randers-Pehrson
  5146.  
  5147.       This specification is a modification of the PNG 1.0 specification.
  5148.       It is being provided by the copyright holder under the provisions
  5149.       of the 1996 MIT copyright and license:
  5150.  
  5151.       Copyright (c) 1996 by:  Massachusetts Institute of Technology
  5152.       (MIT)
  5153.  
  5154.       This W3C specification is being provided by the copyright holders
  5155.       under the following license.  By obtaining, using and/or copying
  5156.       this specification, you agree that you have read, understood, and
  5157.       will comply with the following terms and conditions:
  5158.  
  5159.       Permission to use, copy, and distribute this specification for any
  5160.       purpose and without fee or royalty is hereby granted, provided
  5161.       that the full text of this NOTICE appears on ALL copies of the
  5162.       specification or portions thereof, including modifications, that
  5163.       you make.
  5164.  
  5165.       THIS SPECIFICATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE
  5166.       NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.  BY WAY OF
  5167.       EXAMPLE, BUT NOT LIMITATION, COPYRIGHT HOLDERS MAKE NO
  5168.       REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS FOR
  5169.       ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SPECIFICATION WILL
  5170.       NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR
  5171.       OTHER RIGHTS.  COPYRIGHT HOLDERS WILL BEAR NO LIABILITY FOR ANY
  5172.       USE OF THIS SPECIFICATION.
  5173.  
  5174.       The name and trademarks of copyright holders may NOT be used in
  5175.       advertising or publicity pertaining to the specification without
  5176.       specific, written prior permission.  Title to copyright in this
  5177.       specification and any associated documentation will at all times
  5178.       remain with copyright holders.
  5179.  
  5180. End of PNG Specification
  5181.  
  5182.  
  5183.