mirror of
				https://git.code.sf.net/p/libpng/code.git
				synced 2025-07-10 18:04:09 +02:00 
			
		
		
		
	 86499967c3
			
		
	
	
		86499967c3
		
	
	
	
	
		
			
			This checkpoint is to allow the massive merge with the recent mainline libpng17 changes. Signed-off-by: John Bowler <jbowler@acm.org>
		
			
				
	
	
		
			785 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			785 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| /* pngstruct.h - header file for PNG reference library
 | |
|  *
 | |
|  * Last changed in libpng 1.7.0 [(PENDING RELEASE)]
 | |
|  * Copyright (c) 1998-2015 Glenn Randers-Pehrson
 | |
|  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
 | |
|  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
 | |
|  *
 | |
|  * This code is released under the libpng license.
 | |
|  * For conditions of distribution and use, see the disclaimer
 | |
|  * and license in png.h
 | |
|  */
 | |
| 
 | |
| /* The structure that holds the information to read and write PNG files.
 | |
|  * The only people who need to care about what is inside of this are the
 | |
|  * people who will be modifying the library for their own special needs.
 | |
|  * It should NOT be accessed directly by an application.
 | |
|  */
 | |
| 
 | |
| #ifndef PNGSTRUCT_H
 | |
| #define PNGSTRUCT_H
 | |
| /* zlib.h defines the structure z_stream, an instance of which is included
 | |
|  * in this structure and is required for decompressing the LZ compressed
 | |
|  * data in PNG files.
 | |
|  */
 | |
| #ifndef ZLIB_CONST
 | |
|    /* We must ensure that zlib uses 'const' in declarations. */
 | |
| #  define ZLIB_CONST
 | |
| #endif
 | |
| 
 | |
| #include PNG_ZLIB_HEADER
 | |
| 
 | |
| #ifdef const
 | |
|    /* zlib.h sometimes #defines const to nothing, undo this. */
 | |
| #  undef const
 | |
| #endif
 | |
| 
 | |
| /* zlib.h has mediocre z_const use before 1.2.6, this stuff is for compatibility
 | |
|  * with older builds.
 | |
|  */
 | |
| #if ZLIB_VERNUM < 0x1260
 | |
| #  define PNGZ_MSG_CAST(s) png_constcast(char*,s)
 | |
| #  define PNGZ_INPUT_CAST(b) png_constcast(png_bytep,b)
 | |
| #else
 | |
| #  define PNGZ_MSG_CAST(s) (s)
 | |
| #  define PNGZ_INPUT_CAST(b) (b)
 | |
| #endif
 | |
| 
 | |
| /* zlib.h declares a magic type 'uInt' that limits the amount of data that zlib
 | |
|  * can handle at once.  This type need be no larger than 16 bits (so maximum of
 | |
|  * 65535), this define allows us to discover how big it is, but limited by the
 | |
|  * maximum for size_t. The value can be overridden in a library build (pngusr.h,
 | |
|  * or set it in CPPFLAGS) and it works to set it to a considerably lower value
 | |
|  * (e.g. 255 works).  A lower value may help memory usage (slightly) and may
 | |
|  * even improve performance on some systems (and degrade it on others.)
 | |
|  */
 | |
| #ifndef ZLIB_IO_MAX
 | |
| #  ifdef __COVERITY__
 | |
| #     define ZLIB_IO_MAX ((uInt)255U) /* else COVERITY whines */
 | |
| #  else
 | |
| #     define ZLIB_IO_MAX ((uInt)-1)
 | |
| #  endif /* COVERITY */
 | |
| #endif
 | |
| 
 | |
| #ifdef PNG_WRITE_SUPPORTED
 | |
| /* The type of a compression buffer list used by the write code. */
 | |
| typedef struct png_compression_buffer *png_compression_bufferp;
 | |
| #endif
 | |
| 
 | |
| #ifdef PNG_SELECT_FILTER_METHODICALLY_SUPPORTED
 | |
| /* Type of the data cache used when selecting filters methodicially */
 | |
| typedef struct png_filter_select *png_filter_selectp;
 | |
| #endif
 | |
| 
 | |
| /* Colorspace support; structures used in png_struct, png_info and in internal
 | |
|  * functions to hold and communicate information about the color space.
 | |
|  *
 | |
|  * PNG_COLORSPACE_SUPPORTED is only required if the application will perform
 | |
|  * colorspace corrections, otherwise all the colorspace information can be
 | |
|  * skipped and the size of libpng can be reduced (significantly) by compiling
 | |
|  * out the colorspace support.
 | |
|  */
 | |
| #ifdef PNG_COLORSPACE_SUPPORTED
 | |
| /* The chromaticities of the red, green and blue colorants and the chromaticity
 | |
|  * of the corresponding white point (i.e. of rgb(1.0,1.0,1.0)).
 | |
|  */
 | |
| typedef struct png_xy
 | |
| {
 | |
|    png_fixed_point redx, redy;
 | |
|    png_fixed_point greenx, greeny;
 | |
|    png_fixed_point bluex, bluey;
 | |
|    png_fixed_point whitex, whitey;
 | |
| } png_xy;
 | |
| 
 | |
| /* The same data as above but encoded as CIE XYZ values.  When this data comes
 | |
|  * from chromaticities the sum of the Y values is assumed to be 1.0
 | |
|  */
 | |
| typedef struct png_XYZ
 | |
| {
 | |
|    png_fixed_point red_X, red_Y, red_Z;
 | |
|    png_fixed_point green_X, green_Y, green_Z;
 | |
|    png_fixed_point blue_X, blue_Y, blue_Z;
 | |
| } png_XYZ;
 | |
| #endif /* COLORSPACE */
 | |
| 
 | |
| #if defined(PNG_COLORSPACE_SUPPORTED) || defined(PNG_GAMMA_SUPPORTED)
 | |
| /* A colorspace is all the above plus, potentially, profile information;
 | |
|  * however at present libpng does not use the profile internally so it is only
 | |
|  * stored in the png_info struct (if iCCP is supported.)  The rendering intent
 | |
|  * is retained here and is checked.
 | |
|  *
 | |
|  * The file gamma encoding information is also stored here and gamma correction
 | |
|  * is done by libpng, whereas color correction must currently be done by the
 | |
|  * application.
 | |
|  */
 | |
| typedef struct png_colorspace
 | |
| {
 | |
| #ifdef PNG_GAMMA_SUPPORTED
 | |
|    png_fixed_point gamma;        /* File gamma */
 | |
| #endif
 | |
| 
 | |
| #ifdef PNG_COLORSPACE_SUPPORTED
 | |
|    png_xy      end_points_xy;    /* End points as chromaticities */
 | |
|    png_XYZ     end_points_XYZ;   /* End points as CIE XYZ colorant values */
 | |
|    png_uint_16 rendering_intent; /* Rendering intent of a profile */
 | |
| #endif
 | |
| 
 | |
|    /* Flags are always defined to simplify the code. */
 | |
|    png_uint_16 flags;            /* As defined below */
 | |
| } png_colorspace, * PNG_RESTRICT png_colorspacerp;
 | |
| 
 | |
| typedef const png_colorspace * PNG_RESTRICT png_const_colorspacerp;
 | |
| 
 | |
| /* General flags for the 'flags' field */
 | |
| #define PNG_COLORSPACE_HAVE_GAMMA           0x0001U
 | |
| #define PNG_COLORSPACE_HAVE_ENDPOINTS       0x0002U
 | |
| #define PNG_COLORSPACE_HAVE_INTENT          0x0004U
 | |
| #define PNG_COLORSPACE_FROM_gAMA            0x0008U
 | |
| #define PNG_COLORSPACE_FROM_cHRM            0x0010U
 | |
| #define PNG_COLORSPACE_FROM_sRGB            0x0020U
 | |
| #define PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB 0x0040U
 | |
| #define PNG_COLORSPACE_MATCHES_sRGB         0x0080U /* exact match on profile */
 | |
| #define PNG_COLORSPACE_RGB_TO_GRAY_SET      0x0100U /* user specified coeffs */
 | |
| #define PNG_COLORSPACE_INVALID              0x8000U
 | |
| #define PNG_COLORSPACE_CANCEL(flags)        (0xffffU - (flags))
 | |
| #endif /* COLORSPACE || GAMMA */
 | |
| 
 | |
| #ifdef PNG_TRANSFORM_MECH_SUPPORTED
 | |
| /***************************** READ and WRITE TRANSFORMS ***********************
 | |
|  * These structures are used in pngrtran.c, pngwtran.c and pngtrans.c to hold
 | |
|  * information about transforms in progress.  This mechanism was introduced in
 | |
|  * libpng 1.7.0 to ensure reliable transform code and to fix multiple bugs in
 | |
|  * the pre-1.7 transform handling.
 | |
|  *
 | |
|  * Prior to 1.7.0 the internal transform routines took a png_row_infop, like the
 | |
|  * user transform function, but without the png_ptr because it was never used.
 | |
|  * In 1.7.0 a separate internal structure is used in place of this to allow both
 | |
|  * future development to change the structure.
 | |
|  *
 | |
|  * The values in this structure will normally be changed by transformation
 | |
|  * implementations.
 | |
|  ***************************** READ and WRITE TRANSFORMS **********************/
 | |
| typedef struct
 | |
| {
 | |
|    png_structp        png_ptr;      /* png_struct for error handling and some
 | |
|                                      * transform parameters.  May be aliased.
 | |
|                                      */
 | |
|    png_const_voidp    sp;           /* Source; the input row. */
 | |
|    png_voidp          dp;           /* Output buffer for the transformed row,
 | |
|                                      * this may be the same as sp.
 | |
|                                      */
 | |
|       /* If the row is changed the tranform routine must write the result to
 | |
|        * dp[] and set sp to dp, otherwise it must not write to dp and must leave
 | |
|        * sp unchanged.  dp[] and sp[] are both 'malloc' aligned; i.e. they have
 | |
|        * the system alignment, so the data can be read as any valid ANSI-C
 | |
|        * type.
 | |
|        */
 | |
|    png_uint_32        width;        /* width of row */
 | |
| #  ifdef PNG_READ_GAMMA_SUPPORTED
 | |
|       png_fixed_point gamma;        /* Current gamma of the row data */
 | |
|       /* When a row is being transformed this contains the current gamma of the
 | |
|        * data if known.  During initialization the value is used to accumulate
 | |
|        * information for png_struct::row_gamma in the first step,
 | |
|        * PNG_TC_INIT_FORMAT, then used to insert the correct gamma transforms
 | |
|        * during PNG_TC_INIT_FINAL.  The field is only used on read; write
 | |
|        * transforms do not modify the gamma of the data.
 | |
|        */
 | |
| #  endif
 | |
|    unsigned int       format;       /* As pngstruct::row_format below */
 | |
|    unsigned int       range;        /* Count of range transforms */
 | |
| #  define PNG_TC_CHANNELS(tc) PNG_FORMAT_CHANNELS((tc).format)
 | |
|    unsigned int       bit_depth;    /* bit depth of row */
 | |
|    png_byte           sBIT_R;
 | |
|    png_byte           sBIT_G;
 | |
|    png_byte           sBIT_B;
 | |
|    png_byte           sBIT_A;       /* Signnificant bits in the row channels. */
 | |
|    /* The above four values are initially set to the number of bits significant
 | |
|     * in the input PNG data, R/G/B are set to the same (gray) value for
 | |
|     * grayscale input.  All values are set to the bit depth if there is no sBIT
 | |
|     * chunk, if there is no alpha channel sBIT_A is set to the bit depth.
 | |
|     *
 | |
|     * When any potentially spurious bits have been cleared PNG_INFO_sBIT will be
 | |
|     * set in invalid_info.  From this point on the above values record the
 | |
|     * approximate number of bits of accuracy in the channels and the lower bits
 | |
|     * should be preserved; they potentially contain useful information.
 | |
|     */
 | |
| #  define PNG_TC_PIXEL_DEPTH(tc) (PNG_TC_CHANNELS(tc) * (tc).bit_depth)
 | |
| #  define PNG_TC_ROWBYTES(tc) PNG_ROWBYTES(PNG_TC_PIXEL_DEPTH(tc), (tc).width)
 | |
|    unsigned int       invalid_info; /* PNG_INFO_* for invalidated chunks */
 | |
|    unsigned int       cost;         /* Cache cost */
 | |
| #  define PNG_CACHE_COST_LIMIT 0x100U
 | |
|    /* This is a runtime structure, so size doesn't matter much, and it helps
 | |
|     * code reliability to use real member names here.  Feel free to experiment
 | |
|     * with integer values rather than bitfields.
 | |
|     */
 | |
|    unsigned int       init :2;      /* 0 for processing, non zero for init: */
 | |
| #  define PNG_TC_INIT_FORMAT  0x01U /* Initialization step 1: just set 'format',
 | |
|                                      * 'bit_depth' and 'gamma' to the output
 | |
|                                      * values iff the transform corresponds to
 | |
|                                      * a user requested change to those values.
 | |
|                                      */
 | |
| #  define PNG_TC_INIT_FINAL   0x03U /* Initialization step 2; set the 'format'
 | |
|                                      * 'bit_depth' and 'gamma' to the values the
 | |
|                                      * transform will actually produce (which
 | |
|                                      * need not be the same as the above).
 | |
|                                      */
 | |
|    /* During initialization 'init' must be set and sp and dp may be NULL.  If
 | |
|     * neither flag is set sp and dp must be non-NULL.
 | |
|     *
 | |
|     * When the transform runs it must update 'format', 'bit_depth' and 'gamma'
 | |
|     * to the values previously reported during PNG_TC_INIT_FINAL; not doing so
 | |
|     * may result in an affirm from a later transform.
 | |
|     */
 | |
|    unsigned int       caching     :1; /* The color values are being used to
 | |
|                                        * generate a cache of the transforms.
 | |
|                                        */
 | |
|    unsigned int       palette     :1; /* The values come from a PNG palette and
 | |
|                                        * the palette will not be expanded.  The
 | |
|                                        * CACHE flag must be set too.  A
 | |
|                                        * transform which causes the palette to
 | |
|                                        * be expanded must clear this flag.
 | |
|                                        */
 | |
| #if 0 /* NYI */
 | |
|    unsigned int       interchannel:1; /* Set by a transform that combines two or
 | |
|                                        * more channels together; for example
 | |
|                                        * alpha composition or RGB to gray.
 | |
|                                        */
 | |
| #endif /* NYI */
 | |
|    unsigned int       channel_add :1; /* A channel (alpha/filler) was added */
 | |
|    unsigned int       strip_alpha :1; /* Set if the alpha channel will be
 | |
|                                        * stripped on read, this also prevents
 | |
|                                        * the tRNS chunk being expanded.  Only
 | |
|                                        * some transforms check this, depending
 | |
|                                        * on the handling order and checks in
 | |
|                                        * pre-1.7 versions.
 | |
|                                        */
 | |
|    unsigned int       expand_tRNS :1; /* Set if the tRNS chunk should be
 | |
|                                        * expanded (ignored if read_strip_alpha
 | |
|                                        * is set).  If this is *not* set
 | |
|                                        * transforms which do not use alpha/tRNS
 | |
|                                        * but would invalidate it (such as
 | |
|                                        * simple gamma correction) will simply
 | |
|                                        * mark the tRNS info as invalid.
 | |
|                                        */
 | |
|    unsigned int       transparent_alpha :1; /* Indicates that the alpha channel
 | |
|                                        * consists entirely of opaque (1.0 alpha)
 | |
|                                        * or completely transparent (0.0 alpha)
 | |
|                                        * pixels.  Set when tRNS is expanded to
 | |
|                                        * alpha.
 | |
|                                        */
 | |
|    unsigned int       optimized_alpha :1; /* Meaningful only when bit_depth is
 | |
|                                        * 16 and gamma is 1 or unknown (0).
 | |
|                                        * Indicates that pixels which are opaque
 | |
|                                        * (alpha 1.0) have not been expanded to
 | |
|                                        * 16-bit linear; instead these pixels
 | |
|                                        * are encoded in the final format in
 | |
|                                        * png_struct::row_bit_depth and
 | |
|                                        * png_struct::row_gamma.  This will
 | |
|                                        * invariably match the file format.
 | |
|                                        */
 | |
| } png_transform_control, *png_transform_controlp;
 | |
| 
 | |
| typedef const png_transform_control *png_const_transform_controlp;
 | |
| typedef const png_row_info *png_const_row_infop;
 | |
| 
 | |
| typedef struct png_transform *png_transformp; /* Forward declaration */
 | |
| typedef void (*png_transform_free_fn)(/* Function to free a transform */
 | |
|    png_const_structrp png_ptr,
 | |
|    png_transformp     transform); /* pointer to this transform */
 | |
|    /* This function need not exist in a transform, it must free all the data
 | |
|     * allocated within the transform but not the transform itself.  It is called
 | |
|     * from png_transform_free.
 | |
|     */
 | |
| typedef void (*png_transform_fn)(/* Function to implement a transform */
 | |
|    png_transformp        *transform, /* pointer to this transform */
 | |
|    png_transform_controlp control);  /* row information */
 | |
|    /* The transform function has two modes of operation:
 | |
|     *
 | |
|     * 1) Initialization.  The list of transforms is processed from the start to
 | |
|     *    the end and each function is called with one of hte PNG_TC_INIT_ flags
 | |
|     *    set in control->flags, control->dp and control->sp may be NULL.
 | |
|     *
 | |
|     *    For read the control structure contains the input row format and bit
 | |
|     *    depth, the transform function changes this to represent what the
 | |
|     *    transform will produce when it runs.
 | |
|     *
 | |
|     *    For write the control structure contains the *required* output format
 | |
|     *    and bit depth.  The transform function changes this to the values that
 | |
|     *    it needs to produce the required values.
 | |
|     *
 | |
|     *    In both cases the transform function may update the 'fn' function to a
 | |
|     *    new function to perform the desired transform; this allows considerable
 | |
|     *    optimization on multi-row images.
 | |
|     *
 | |
|     *    In both cases the caller considers the pixel bit depth changes and
 | |
|     *    records the maximum required so that it can allocate a suitably sized
 | |
|     *    buffer.
 | |
|     *
 | |
|     * 2) Execution.
 | |
|     *
 | |
|     *    In the read case the transforms are processed in the stored order and
 | |
|     *    must transform the row data appropriately *and* update the bit depth
 | |
|     *    and format as before.
 | |
|     *
 | |
|     *    In the write case the transforms are called in the reverse order and
 | |
|     *    the input bit depth and format should match the required values.
 | |
|     *
 | |
|     * It is valid during initialization for the transform function to push
 | |
|     * another transform into the list in either the read or the write case if
 | |
|     * the transform cannot handle (read) or produce (write) the required format.    * The transform pushes another transform into the list ahead of itself (at
 | |
|     * *transform) and runs that initialization; when control is returned to the
 | |
|     * caller the caller will re-run the transform initialization.
 | |
|     *
 | |
|     * It is also valid (during initialization) to push new transforms onto the
 | |
|     * list, just so long as the order of the transform is greater than the
 | |
|     * current transform (so that the caller will still call the new transform
 | |
|     * initialization.)
 | |
|     *
 | |
|     * In the write case the user transform callback might still end up producing
 | |
|     * an unexpected format, but at present this is unavoidable; the libpng API
 | |
|     * is extremely inconsistent in how a user transform reports the changes it
 | |
|     * made.
 | |
|     *
 | |
|     * TODO: fix this, probably with an API change in 1.7.0
 | |
|     */
 | |
| typedef struct png_transform /* Linked list of transform functions */
 | |
| {
 | |
|    png_transformp        next;   /* Next transform in the list */
 | |
|    png_transform_fn      fn;     /* Function to implement the transform */
 | |
|    png_transform_free_fn free;   /* Free allocated data, normally NULL */
 | |
|    unsigned int          order;  /* Order of the transform in the list. */
 | |
|    unsigned int          size;   /* Size of this structure (max 65535) */
 | |
|    png_uint_32           args;   /* Optional transform arguments. */
 | |
| }  png_transform;
 | |
| #endif /* TRANSFORM_MECH */
 | |
| 
 | |
| struct png_struct_def
 | |
| {
 | |
|    /* Rearranged in libpng 1.7 to attempt to lessen padding; in general
 | |
|     * (char), (short), (int) and pointer types are kept separate; however
 | |
|     * associated members under the control of the same #define are still
 | |
|     * together.
 | |
|     */
 | |
| #ifdef PNG_SETJMP_SUPPORTED
 | |
|    /* jmp_buf can have very high alignment requirements on some systems, so put
 | |
|     * it first (the other setjmp members are later as they are infrequently
 | |
|     * accessed.)
 | |
|     */
 | |
|    jmp_buf jmp_buf_local;
 | |
| #endif
 | |
| 
 | |
|    /* Next the frequently accessed fields.  Many processors perform arithmetic
 | |
|     * in the address pipeline, but frequently the amount of addition or
 | |
|     * subtraction is limited.  By putting these fields at the head of png_struct
 | |
|     * the hope is that such processors will generate code that is both smaller
 | |
|     * and faster.
 | |
|     */
 | |
| #ifdef PNG_READ_SUPPORTED
 | |
|    png_colorp  palette;        /* palette from the input file */
 | |
| #endif /* READ */
 | |
| #ifdef PNG_READ_tRNS_SUPPORTED
 | |
|    png_bytep   trans_alpha;    /* alpha values for paletted files */
 | |
| #endif /* READ_tRNS */
 | |
| 
 | |
|    png_uint_32 width;          /* width of image in pixels */
 | |
|    png_uint_32 height;         /* height of image in pixels */
 | |
|    png_uint_32 chunk_name;     /* PNG_CHUNK() id of current chunk */
 | |
|    png_uint_32 chunk_length;   /* Length (possibly remaining) in said chunk. */
 | |
|    png_uint_32 crc;            /* current chunk CRC value */
 | |
| 
 | |
|    unsigned int flags;                  /* flags (should be bit fields) */
 | |
|    unsigned int mode                :6; /* where we are in the PNG file */
 | |
|    unsigned int read_struct         :1; /* this is a read (not write) struct */
 | |
|    unsigned int num_palette         :9; /* number of color entries in palette */
 | |
| #ifdef PNG_READ_tRNS_SUPPORTED
 | |
|    unsigned int num_trans           :9; /* number of transparency values */
 | |
|    unsigned int transparent_palette :1; /* if they are all 0 or 255 */
 | |
| #endif /* READ_tRNS */
 | |
| #ifdef PNG_GET_PALETTE_MAX_SUPPORTED
 | |
|    unsigned int palette_index_max :9; /* maximum palette index found in IDAT */
 | |
| #endif /* GET_PALETTE_MAX */
 | |
| #ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED
 | |
|    unsigned int palette_index_check_disabled :1; /* defaults to 0, 'enabled' */
 | |
|    unsigned int palette_index_check_issued :1;   /* error message output */
 | |
| #endif /* CHECK_FOR_INVALID_INDEX */
 | |
| #ifdef PNG_READ_tRNS_SUPPORTED
 | |
|    png_color_16 trans_color;   /* transparent color for non-paletted files */
 | |
| #endif /* READ_tRNS */
 | |
| #ifdef PNG_READ_sBIT_SUPPORTED
 | |
|    png_color_8 sig_bit;        /* significant bits in each channel */
 | |
| #endif /* READ_sBIT */
 | |
| 
 | |
|    /* Single byte values, typically used either to save space or to hold 1-byte
 | |
|     * values from the PNG chunk specifications.
 | |
|     */
 | |
|    png_byte compression_type; /* file compression type (always 0) */
 | |
|    png_byte filter_method;    /* file filter type (only non-0 with MNG) */
 | |
|    png_byte interlaced;       /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */
 | |
|    png_byte color_type;       /* color type of file */
 | |
|    png_byte bit_depth;        /* bit depth of file */
 | |
|    png_byte sig_bytes;        /* magic bytes read/written at start of file */
 | |
| 
 | |
|    /* Options */
 | |
| #ifdef PNG_SET_OPTION_SUPPORTED
 | |
|    png_byte options;          /* On/off state (up to 4 options) */
 | |
| #endif
 | |
| 
 | |
| #ifdef PNG_READ_SUPPORTED
 | |
| #if defined(PNG_COLORSPACE_SUPPORTED) || defined(PNG_GAMMA_SUPPORTED)
 | |
|    /* The png_struct colorspace structure is only required on read - on write it
 | |
|     * is in (just) the info_struct.
 | |
|     */
 | |
|    png_colorspace   colorspace;
 | |
| #endif
 | |
| #endif /* READ */
 | |
| 
 | |
|    /* Transform handling */
 | |
| #ifdef PNG_TRANSFORM_MECH_SUPPORTED
 | |
|    png_transformp transform_list; /* List of transformation to perform. */
 | |
| #endif
 | |
| 
 | |
|    /* ROW BUFFERS and CONTROL
 | |
|     *
 | |
|     * Members used for image row compression (write) or decompression (read).
 | |
|     * filter byte (which is in next_filter.)  All fields are only used during
 | |
|     * IDAT processing and start of 0.
 | |
|     */
 | |
| #if defined(PNG_WRITE_FILTER_SUPPORTED) || defined(PNG_READ_SUPPORTED)
 | |
|    png_bytep        row_buffer;          /* primary row buffer */
 | |
| #endif /* WRITE_FILTER || READ */
 | |
| #if (defined(PNG_PROGRESSIVE_READ_SUPPORTED) ||\
 | |
|      defined(PNG_READ_INTERLACING_SUPPORTED)) &&\
 | |
|     defined(PNG_TRANSFORM_MECH_SUPPORTED)
 | |
|    png_bytep        transformed_row;     /* pointer to the transformed row, if
 | |
|                                           * required.  May point to row_buffer.
 | |
|                                           */
 | |
| #endif /* (PROGRESSIVE_READ || READ_INTERLACING) && TRANSFORM_MECH */
 | |
| 
 | |
| #ifdef PNG_READ_SUPPORTED
 | |
|    png_alloc_size_t row_bytes_read;   /* Total read in row */
 | |
| #endif /* READ */
 | |
| 
 | |
|    png_uint_32      row_number;       /* current row in pass */
 | |
| #ifdef PNG_READ_GAMMA_SUPPORTED
 | |
|    png_fixed_point  row_gamma;        /* Gamma of final output */
 | |
| #if 0 /* NYI */
 | |
|    unsigned int     gamma_accuracy;
 | |
|       /* LINEAR gamma cache table size (in bits) times 100; for non-linear
 | |
|        * tables the value used is gamma_accuracy/gamma where 'gamma' is the
 | |
|        * encoding value of the data (typically less than 1).
 | |
|        *
 | |
|        * default: PNG_DEFAULT_GAMMA_ACCURACY (665)
 | |
|        */
 | |
| #endif /* NYI */
 | |
|    png_uint_16      gamma_threshold;
 | |
|       /* Gamma threshold value as a fixed-point value in the range 0..1; the
 | |
|        * threshold at or below which gamma correction is skipped.  '0' forces
 | |
|        * gamma correction even when there is none because the input and output
 | |
|        * gammas are equal.
 | |
|        *
 | |
|        * default: PNG_GAMMA_THRESHOLD_FIXED (153)
 | |
|        */
 | |
| #endif /* READ_GAMMA */
 | |
| #ifdef PNG_READ_TRANSFORMS_SUPPORTED
 | |
|    unsigned int     invalid_info;     /* PNG_INFO_* for invalidated chunks */
 | |
| #endif /* READ_TRANSFORMS */
 | |
| 
 | |
| #ifdef PNG_SEQUENTIAL_READ_SUPPORTED
 | |
|    unsigned int read_started   :1; /* at least one call to png_read_row */
 | |
| #endif
 | |
| #if defined (PNG_READ_INTERLACING_SUPPORTED) ||\
 | |
|     defined (PNG_WRITE_INTERLACING_SUPPORTED)
 | |
|    unsigned int do_interlace   :1; /* libpng handles the interlace */
 | |
| #  endif /* R/W INTERLACING */
 | |
|    unsigned int pass           :3; /* current (interlace) pass (0 - 6) */
 | |
| 
 | |
|    /* The next two fields are just used by the IDAT process functions to store
 | |
|     * the state of IDAT processing; they should not be altered or used by other
 | |
|     * functions.
 | |
|     */
 | |
|    unsigned int row_state      :2; /* state of row parsing (internal) */
 | |
| 
 | |
|    /* The following fields are set by png_row_init to the pixel depths of the
 | |
|     * pixels at various states.  If transforms are not supported they will
 | |
|     * always be the same value:
 | |
|     *
 | |
|     *              READ               WRITE
 | |
|     * input:        PNG          From application
 | |
|     * output:  To application         PNG
 | |
|     * max:           Largest in transform
 | |
|     */
 | |
|    unsigned int row_input_pixel_depth  :8;
 | |
|    unsigned int row_output_pixel_depth :8;
 | |
|    unsigned int row_max_pixel_depth    :8;
 | |
| #ifdef PNG_WRITE_FILTER_SUPPORTED
 | |
|    unsigned int filter_mask    :8; /* mask of filters to consider on write */
 | |
| #endif /* WRITE_FILTER */
 | |
| 
 | |
| #  define PNG_RF_BITS 9 /* Number of bits required for the row format (below) */
 | |
| #ifdef PNG_TRANSFORM_MECH_SUPPORTED
 | |
|    /* The following fields describe the format of the user row; the output on
 | |
|     * read or the input on write, and give the maximum pixel depth, which
 | |
|     * controls the row buffer allocation size (row_allocated_bytes) above.
 | |
|     */
 | |
|    unsigned int row_range       :3;    /* range error count */
 | |
|    unsigned int row_bit_depth   :6;    /* bits per channel (up to 32) */
 | |
|    unsigned int row_format:PNG_RF_BITS;/* format of output(R)/input(W) row: */
 | |
|    /*     PNG_FORMAT_FLAG_ALPHA    0x01U    format with an alpha channel
 | |
|     *     PNG_FORMAT_FLAG_COLOR    0x02U    color format: otherwise grayscale
 | |
|     *     PNG_FORMAT_FLAG_LINEAR   0x04U    NOT used (informational)
 | |
|     *     PNG_FORMAT_FLAG_COLORMAP 0x08U    image data is color-mapped
 | |
|     *     PNG_FORMAT_FLAG_BGR      0x10U    BGR colors, else order is RGB
 | |
|     *     PNG_FORMAT_FLAG_AFIRST   0x20U    alpha channel comes first *
 | |
|     *     PNG_FORAMT_FLAG_AFILLER  0x40U    The 'alpha' channel is a filler:
 | |
|     *       PNG_FORMAT_FLAG_ALPHA is set however the value in the alpha channel
 | |
|     *       is not an alpha value and (therefore) cannot be used for alpha
 | |
|     *       computations, it is just a filler value.  PNG_COLOR_TYPE_FROM_FORMAT
 | |
|     *       will return a color type *without* PNG_COLOR_MASK_ALPHA, however
 | |
|     *       PNG_FORMAT_CHANNELS will return the correct number, including the
 | |
|     *       filler channel.
 | |
|     *     PNG_FORMAT_FLAG_SWAPPED  0x80U    bytes or bits swapped:
 | |
|     *       When the bit depth is 16 this means that the bytes within the
 | |
|     *       components have been swapped, when the bit depth is less than 8
 | |
|     *       it means the pixels within the bytes have been swapped.  It should
 | |
|     *       not be set for 8-bit compononents (it is meaningless).
 | |
|     *     PNG_FORMAT_FLAG_RANGE   0x100U    component range not 0..bit-depth:
 | |
|     *       Low-bit-depth grayscale components have been unpacked into bytes
 | |
|     *       without scaling, or RGB[A] pixels have been shifted back to the
 | |
|     *       significant-bit range from the sBIT chunk or channels (currently
 | |
|     *       alpha or gray) have been inverted.
 | |
|     *     PNG_FORMAT_FLAG_INVALID           NOT STORED HERE
 | |
|     */
 | |
| #ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
 | |
|    unsigned int info_format:PNG_RF_BITS;
 | |
|       /* This field is used to validate the png_info used to write the
 | |
|        * IHDR.  This is a new check in 1.7.0; previously it was possible to pass
 | |
|        * a png_info from a png_read with the read tranform information in the
 | |
|        * format having manually removed the required transforms from the rows
 | |
|        * passed to png_write_row.
 | |
|        */
 | |
| #endif /* WRITE_TRANSFORMS */
 | |
| #ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
 | |
|    unsigned int write_invert_alpha :1;
 | |
|       /* This indicates the png_set_invert_alpha was called, it is used by the
 | |
|        * write code to implement the transform without needing to run the whole
 | |
|        * transform mechanism on the PNG palette data.
 | |
|        */
 | |
| #endif /* WRITE_INVERT_ALPHA */
 | |
| #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
 | |
|    unsigned int rgb_to_gray_status :1;
 | |
|       /* If set an RGB pixel was encountered by the RGB to gray transform
 | |
|        * wherein !(r==g==b).
 | |
|        */
 | |
| #endif /* RGB_TO_GRAY */
 | |
| #endif /* TRANSFORM_MECH */
 | |
| 
 | |
| #ifdef PNG_READ_SUPPORTED
 | |
|    /* These, and IDAT_size below, control how much input and output (at most) is
 | |
|     * available to zlib during read decompression.
 | |
|     */
 | |
|    png_alloc_size_t read_buffer_size; /* current size of the buffer */
 | |
| #endif
 | |
| 
 | |
| #if defined(PNG_SEQUENTIAL_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
 | |
|    uInt IDAT_size; /* limit on IDAT read and write IDAT size */
 | |
| #endif /* SEQUENTIAL_READ || WRITE */
 | |
| 
 | |
| #ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
 | |
|    int zlib_text_level;       /* holds zlib compression level */
 | |
|    int zlib_text_method;      /* holds zlib compression method */
 | |
|    int zlib_text_window_bits; /* holds zlib compression window bits */
 | |
|    int zlib_text_mem_level;   /* holds zlib compression memory level */
 | |
|    int zlib_text_strategy;    /* holds zlib compression strategy */
 | |
| #endif
 | |
| 
 | |
| #ifdef PNG_WRITE_SUPPORTED
 | |
|    int zlib_level;            /* holds zlib compression level */
 | |
|    int zlib_method;           /* holds zlib compression method */
 | |
|    int zlib_window_bits;      /* holds zlib compression window bits */
 | |
|    int zlib_mem_level;        /* holds zlib compression memory level */
 | |
|    int zlib_strategy;         /* holds zlib compression strategy */
 | |
| 
 | |
|    int zlib_set_level;        /* Actual values set into the zstream on write */
 | |
|    int zlib_set_method;
 | |
|    int zlib_set_window_bits;
 | |
|    int zlib_set_mem_level;
 | |
|    int zlib_set_strategy;
 | |
| #endif /* WRITE */
 | |
| 
 | |
|    /* ERROR HANDLING */
 | |
| #ifdef PNG_SETJMP_SUPPORTED
 | |
|    jmp_buf        *jmp_buf_ptr;   /* passed to longjmp_fn */
 | |
|    png_longjmp_ptr longjmp_fn;    /* setjmp non-local goto function. */
 | |
|    size_t          jmp_buf_size;  /* size of *jmp_buf_ptr, if allocated */
 | |
| #endif
 | |
| 
 | |
|    /* Error/warning callbacks */
 | |
|    png_error_ptr error_fn;        /* print an error message and abort */
 | |
| #ifdef PNG_WARNINGS_SUPPORTED
 | |
|    png_error_ptr warning_fn;      /* print a warning and continue */
 | |
| #endif
 | |
|    png_voidp     error_ptr;       /* user supplied data for the above */
 | |
| 
 | |
|    /* MEMORY ALLOCATION */
 | |
| #ifdef PNG_USER_MEM_SUPPORTED
 | |
|    png_malloc_ptr malloc_fn; /* allocate memory */
 | |
|    png_free_ptr   free_fn;   /* free memory */
 | |
|    png_voidp      mem_ptr;   /* user supplied data for the above */
 | |
| #endif
 | |
| 
 | |
|    /* IO and BASIC READ/WRITE SUPPORT */
 | |
|    png_voidp            io_ptr;       /* user supplied data for IO callbacks */
 | |
|    png_rw_ptr           rw_data_fn;   /* read/write some bytes (must succeed) */
 | |
| 
 | |
| #ifdef PNG_READ_SUPPORTED
 | |
|    png_read_status_ptr read_row_fn;   /* called after each row is decoded */
 | |
|    png_bytep           read_buffer;   /* buffer for reading chunk data */
 | |
| 
 | |
|    /* During read the following array is set up to point to the appropriate
 | |
|     * un-filter function, this allows per-image and per-processor optimization.
 | |
|     */
 | |
|    void (*read_filter[PNG_FILTER_VALUE_LAST-1])(png_alloc_size_t row_bytes,
 | |
|       unsigned int bpp, png_bytep row, png_const_bytep prev_row,
 | |
|       png_const_bytep prev_pixels);
 | |
| #endif /* READ */
 | |
| 
 | |
| #ifdef PNG_WRITE_SUPPORTED
 | |
|    png_write_status_ptr    write_row_fn; /* called after each row is encoded */
 | |
| 
 | |
| #ifdef PNG_WRITE_FLUSH_SUPPORTED
 | |
|    png_flush_ptr output_flush_fn; /* Function for flushing output */
 | |
|    png_uint_32   flush_dist; /* how many rows apart to flush, 0 - no flush */
 | |
|    png_uint_32   flush_rows; /* number of rows written since last flush */
 | |
| #endif
 | |
| 
 | |
| #endif /* WRITE */
 | |
| 
 | |
| #ifdef PNG_SET_USER_LIMITS_SUPPORTED
 | |
|    png_uint_32 user_width_max;        /* Maximum width on read */
 | |
|    png_uint_32 user_height_max;       /* Maximum height on read */
 | |
|    /* Total memory that a single zTXt, sPLT, iTXt, iCCP, or unknown chunk
 | |
|     * can occupy when decompressed.  0 means unlimited.  This field is a counter
 | |
|     * - it is decremented as memory is allocated.
 | |
|     */
 | |
|    png_alloc_size_t user_chunk_malloc_max;
 | |
| #endif
 | |
| #ifdef PNG_USER_LIMITS_SUPPORTED
 | |
|    /* limit on total *number* of sPLT, text and unknown chunks that can be
 | |
|     * stored.  0 means unlimited.  This field is a counter - it is decremented
 | |
|     * as chunks are encountered.
 | |
|     */
 | |
|    png_uint_32 user_chunk_cache_max;
 | |
| #endif
 | |
| 
 | |
|    /* The progressive reader gets passed data and calls application handling
 | |
|     * functions when appropriate.
 | |
|     */
 | |
| #ifdef PNG_PROGRESSIVE_READ_SUPPORTED
 | |
|    png_progressive_info_ptr info_fn; /* called after header data fully read */
 | |
|    png_progressive_row_ptr  row_fn;  /* called after a row is decoded */
 | |
|    png_progressive_end_ptr  end_fn;  /* called after image is complete */
 | |
| 
 | |
|    /* Progressive read control data */
 | |
|    png_bytep   save_buffer_ptr;      /* current location in save_buffer */
 | |
|    png_bytep   save_buffer;          /* buffer for previously read data */
 | |
|    png_bytep   current_buffer_ptr;   /* current location in current_buffer */
 | |
| 
 | |
|    size_t      save_buffer_size;     /* amount of data now in save_buffer */
 | |
|    size_t      save_buffer_max;      /* total size of save_buffer */
 | |
|    size_t      current_buffer_size;  /* amount of data now in current_buffer */
 | |
|    size_t      buffer_size;          /* total amount of available input data */
 | |
| 
 | |
|    unsigned int process_mode :8;
 | |
|       /* This is one or two four bit codes describing the current state of the
 | |
|        * 'push' reader.  Normally the low four bits are a state code, however in
 | |
|        * some cases this may be pushed to the top four bits and replaced by a
 | |
|        * different temporary state code.  The value is, in effect, a two entry
 | |
|        * stack.
 | |
|        */
 | |
| #endif /* PROGRESSIVE_READ */
 | |
| 
 | |
| #ifdef PNG_IO_STATE_SUPPORTED
 | |
|    png_uint_32          io_state;     /* tells the app read/write progress */
 | |
| #endif
 | |
| 
 | |
|    /* UNKNOWN CHUNK HANDLING */
 | |
|    /* TODO: this is excessively complicated, there are multiple ways of doing
 | |
|     * the same thing.  It should be cleaned up, possibly by finding out which
 | |
|     * APIs applications really use.
 | |
|     */
 | |
| #ifdef PNG_USER_CHUNKS_SUPPORTED
 | |
|    /* General purpose pointer for all user/unknown chunk handling; points to
 | |
|     * application supplied data for use in the read_user_chunk_fn callback
 | |
|     * (currently there is no write side support - the write side must use the
 | |
|     * set_unknown_chunks interface.)
 | |
|     */
 | |
|    png_voidp user_chunk_ptr;
 | |
| #endif
 | |
| 
 | |
| #ifdef PNG_READ_USER_CHUNKS_SUPPORTED
 | |
|    /* This is called back from the unknown chunk handling */
 | |
|    png_user_chunk_ptr     read_user_chunk_fn; /* user read chunk handler */
 | |
| #endif
 | |
| 
 | |
| #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
 | |
|    png_uint_32  known_unknown;   /* Bit mask of known chunks to be treated as
 | |
|                                   * unknown in the read code.
 | |
|                                   */
 | |
| #ifdef PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
 | |
|    png_uint_32  save_unknown;    /* Whether to save or skip these chunks:
 | |
|                                   * 'save' is 'known & save', 'skip' is
 | |
|                                   * 'known & ~save'.
 | |
|                                   */
 | |
| #  define png_IDATs_skipped(pp) (((pp)->known_unknown & ~(pp)->save_unknown)&1U)
 | |
| #else
 | |
| #  define png_IDATs_skipped(pp) ((pp)->known_unknown & 1U)
 | |
| #endif /* !SAVE_UNKNOWN_CHUNKS */
 | |
| #endif /* HANDLE_AS_UNKNOWN */
 | |
| 
 | |
| #ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
 | |
|    png_bytep    chunk_list;      /* List of png_byte[5]; the textual chunk name
 | |
|                                   * followed by a PNG_HANDLE_* byte */
 | |
|    unsigned int unknown_default :2; /* As PNG_HANDLE_* */
 | |
|    unsigned int num_chunk_list;  /* Number of entries in the list */
 | |
| #endif
 | |
| 
 | |
|    /* COMPRESSION AND DECOMPRESSION SUPPORT.
 | |
|     *
 | |
|     * zlib expects a 'zstream' as the fundamental control structure, it allows
 | |
|     * all the parameters to be passed as one pointer.
 | |
|     */
 | |
|    z_stream     zstream;       /* decompression structure */
 | |
|    png_uint_32  zowner;        /* ID (chunk type) of zstream owner, 0 if none */
 | |
| #  ifdef PNG_WRITE_SUPPORTED
 | |
|    png_compression_bufferp  zbuffer_list;  /* Created on demand during write */
 | |
|    png_compression_bufferp *zbuffer_end;   /* 'next' field of current buffer */
 | |
|    png_uint_32              zbuffer_len;   /* Length of data in list */
 | |
|    unsigned int             zbuffer_start; /* Bytes written from start */
 | |
|    unsigned int             zbuffer_filters;/*Filters for this row */
 | |
| #     ifdef PNG_SELECT_FILTER_METHODICALLY_SUPPORTED
 | |
|          png_filter_selectp zbuffer_select;
 | |
| #     endif /* SELECT_FILTER_METHODICALLY */
 | |
| #  endif /* WRITE */
 | |
| #  ifdef PNG_READ_SUPPORTED
 | |
|    unsigned int zstream_ended:1; /* no more zlib output available [read] */
 | |
|    unsigned int zstream_error:1; /* zlib error message has been output [read] */
 | |
| #  endif /* READ */
 | |
| #  ifdef PNG_PROGRESSIVE_READ_SUPPORTED
 | |
|    unsigned int zstream_eod  :1; /* all the required uncompressed data has been
 | |
|                                   * received; set by the zstream using code for
 | |
|                                   * its own purposes. [progressive read] */
 | |
| #  endif /* PROGRESSIVE_READ */
 | |
| 
 | |
|    /* MNG SUPPORT */
 | |
| #ifdef PNG_MNG_FEATURES_SUPPORTED
 | |
|    unsigned int mng_features_permitted :3;
 | |
| #endif
 | |
| 
 | |
|    /* SCRATCH buffers, used when control returns to the application or a read
 | |
|     * loop.
 | |
|     */
 | |
|    png_byte scratch[PNG_ROW_BUFFER_SIZE+16U];
 | |
| };
 | |
| #endif /* PNGSTRUCT_H */
 |