The BIG graph update
[rrdtool.git] / libraries / libpng-1.2.0 / png.h
1
2 /* png.h - header file for PNG reference library
3  *
4  * libpng version 1.2.0 - September 1, 2001
5  * Copyright (c) 1998-2001 Glenn Randers-Pehrson
6  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
7  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
8  *
9  * Authors and maintainers:
10  *  libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
11  *  libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger
12  *  libpng versions 0.97, January 1998, through 1.2.0 - September 1, 2001: Glenn
13  *  See also "Contributing Authors", below.
14  *
15  * Note about libpng version numbers:
16  *
17  *    Due to various miscommunications, unforeseen code incompatibilities
18  *    and occasional factors outside the authors' control, version numbering
19  *    on the library has not always been consistent and straightforward.
20  *    The following table summarizes matters since version 0.89c, which was
21  *    the first widely used release:
22  *
23  *    source                 png.h  png.h  shared-lib
24  *    version                string   int  version
25  *    -------                ------ -----  ----------
26  *    0.89c "1.0 beta 3"     0.89      89  1.0.89
27  *    0.90  "1.0 beta 4"     0.90      90  0.90  [should have been 2.0.90]
28  *    0.95  "1.0 beta 5"     0.95      95  0.95  [should have been 2.0.95]
29  *    0.96  "1.0 beta 6"     0.96      96  0.96  [should have been 2.0.96]
30  *    0.97b "1.00.97 beta 7" 1.00.97   97  1.0.1 [should have been 2.0.97]
31  *    0.97c                  0.97      97  2.0.97
32  *    0.98                   0.98      98  2.0.98
33  *    0.99                   0.99      98  2.0.99
34  *    0.99a-m                0.99      99  2.0.99
35  *    1.00                   1.00     100  2.1.0 [100 should be 10000]
36  *    1.0.0      (from here on, the   100  2.1.0 [100 should be 10000]
37  *    1.0.1       png.h string is   10001  2.1.0
38  *    1.0.1a-e    identical to the  10002  from here on, the shared library
39  *    1.0.2       source version)   10002  is 2.V where V is the source code
40  *    1.0.2a-b                      10003  version, except as noted.
41  *    1.0.3                         10003
42  *    1.0.3a-d                      10004
43  *    1.0.4                         10004
44  *    1.0.4a-f                      10005
45  *    1.0.5 (+ 2 patches)           10005
46  *    1.0.5a-d                      10006
47  *    1.0.5e-r                      10100 (not source compatible)
48  *    1.0.5s-v                      10006 (not binary compatible)
49  *    1.0.6 (+ 3 patches)           10006 (still binary incompatible)
50  *    1.0.6d-f                      10007 (still binary incompatible)
51  *    1.0.6g                        10007
52  *    1.0.6h                        10007  10.6h (testing xy.z so-numbering)
53  *    1.0.6i                        10007  10.6i
54  *    1.0.6j                        10007  2.1.0.6j (incompatible with 1.0.0)
55  *    1.0.7beta11-14        DLLNUM  10007  2.1.0.7beta11-14 (binary compatible)
56  *    1.0.7beta15-18           1    10007  2.1.0.7beta15-18 (binary compatible)
57  *    1.0.7rc1-2               1    10007  2.1.0.7rc1-2 (binary compatible)
58  *    1.0.7                    1    10007  (still compatible)
59  *    1.0.8beta1-4             1    10008  2.1.0.8beta1-4
60  *    1.0.8rc1                 1    10008  2.1.0.8rc1
61  *    1.0.8                    1    10008  2.1.0.8
62  *    1.0.9beta1-6             1    10009  2.1.0.9beta1-6
63  *    1.0.9rc1                 1    10009  2.1.0.9rc1
64  *    1.0.9beta7-10            1    10009  2.1.0.9beta7-10
65  *    1.0.9rc2                 1    10009  2.1.0.9rc2
66  *    1.0.9                    1    10009  2.1.0.9
67  *    1.0.10beta1              1    10010  2.1.0.10beta1
68  *    1.0.10rc1                1    10010  2.1.0.10rc1
69  *    1.0.10                   1    10010  2.1.0.10
70  *    1.0.11beta1-3            1    10011  2.1.0.11beta1-3
71  *    1.0.11rc1                1    10011  2.1.0.11rc1
72  *    1.0.11                   1    10011  2.1.0.11
73  *    1.0.12beta1-2            2    10012  2.1.0.12beta1-2
74  *    1.0.12rc1                2    10012  2.1.0.12rc1
75  *    1.0.12                   2    10012  2.1.0.12
76  *    1.1.0a-f                 -    10100  2.1.1.0a-f (branch abandoned)
77  *    1.2.0beta1-2             2    10200  2.1.2.0beta1-2
78  *    1.2.0beta3-4             3    10200  3.1.2.0beta3-4
79  *
80  *    Henceforth the source version will match the shared-library major
81  *    and minor numbers; the shared-library major version number will be
82  *    used for changes in backward compatibility, as it is intended.  The
83  *    PNG_LIBPNG_VER macro, which is not used within libpng but is available
84  *    for applications, is an unsigned integer of the form xyyzz corresponding
85  *    to the source version x.y.z (leading zeros in y and z).  Beta versions
86  *    were given the previous public release number plus a letter, until
87  *    version 1.0.6j; from then on they were given the upcoming public
88  *    release number plus "betaNN" or "rcN".
89  *
90  *    Binary incompatibility exists only when applications make direct access
91  *    to the info_ptr or png_ptr members through png.h, and the compiled
92  *    application is loaded with a different version of the library.
93  *
94  *    DLLNUM will change each time there are forward or backward changes
95  *    in binary compatibility (e.g., when a new feature is added).
96  *
97  * See libpng.txt or libpng.3 for more information.  The PNG specification
98  * is available as RFC 2083 <ftp://ftp.uu.net/graphics/png/documents/>
99  * and as a W3C Recommendation <http://www.w3.org/TR/REC.png.html>
100  */
101
102 /*
103  * COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
104  *
105  * If you modify libpng you may insert additional notices immediately following
106  * this sentence.
107  *
108  * libpng versions 1.0.7, July 1, 2000, through  1.2.0, September 1, 2001, are
109  * Copyright (c) 2000, 2001 Glenn Randers-Pehrson, and are
110  * distributed according to the same disclaimer and license as libpng-1.0.6
111  * with the following individuals added to the list of Contributing Authors
112  *
113  *    Simon-Pierre Cadieux
114  *    Eric S. Raymond
115  *    Gilles Vollant
116  *
117  * and with the following additions to the disclaimer:
118  *
119  *    There is no warranty against interference with your enjoyment of the
120  *    library or against infringement.  There is no warranty that our
121  *    efforts or the library will fulfill any of your particular purposes
122  *    or needs.  This library is provided with all faults, and the entire
123  *    risk of satisfactory quality, performance, accuracy, and effort is with
124  *    the user.
125  *
126  * libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
127  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
128  * Distributed according to the same disclaimer and license as libpng-0.96,
129  * with the following individuals added to the list of Contributing Authors:
130  *
131  *    Tom Lane
132  *    Glenn Randers-Pehrson
133  *    Willem van Schaik
134  *
135  * libpng versions 0.89, June 1996, through 0.96, May 1997, are
136  * Copyright (c) 1996, 1997 Andreas Dilger
137  * Distributed according to the same disclaimer and license as libpng-0.88,
138  * with the following individuals added to the list of Contributing Authors:
139  *
140  *    John Bowler
141  *    Kevin Bracey
142  *    Sam Bushell
143  *    Magnus Holmgren
144  *    Greg Roelofs
145  *    Tom Tanner
146  *
147  * libpng versions 0.5, May 1995, through 0.88, January 1996, are
148  * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
149  *
150  * For the purposes of this copyright and license, "Contributing Authors"
151  * is defined as the following set of individuals:
152  *
153  *    Andreas Dilger
154  *    Dave Martindale
155  *    Guy Eric Schalnat
156  *    Paul Schmidt
157  *    Tim Wegner
158  *
159  * The PNG Reference Library is supplied "AS IS".  The Contributing Authors
160  * and Group 42, Inc. disclaim all warranties, expressed or implied,
161  * including, without limitation, the warranties of merchantability and of
162  * fitness for any purpose.  The Contributing Authors and Group 42, Inc.
163  * assume no liability for direct, indirect, incidental, special, exemplary,
164  * or consequential damages, which may result from the use of the PNG
165  * Reference Library, even if advised of the possibility of such damage.
166  *
167  * Permission is hereby granted to use, copy, modify, and distribute this
168  * source code, or portions hereof, for any purpose, without fee, subject
169  * to the following restrictions:
170  *
171  * 1. The origin of this source code must not be misrepresented.
172  *
173  * 2. Altered versions must be plainly marked as such and
174  * must not be misrepresented as being the original source.
175  *
176  * 3. This Copyright notice may not be removed or altered from
177  *    any source or altered source distribution.
178  *
179  * The Contributing Authors and Group 42, Inc. specifically permit, without
180  * fee, and encourage the use of this source code as a component to
181  * supporting the PNG file format in commercial products.  If you use this
182  * source code in a product, acknowledgment is not required but would be
183  * appreciated.
184  */
185
186 /*
187  * A "png_get_copyright" function is available, for convenient use in "about"
188  * boxes and the like:
189  *
190  * printf("%s",png_get_copyright(NULL));
191  *
192  * Also, the PNG logo (in PNG format, of course) is supplied in the
193  * files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
194  */
195
196 /*
197  * Libpng is OSI Certified Open Source Software.  OSI Certified is a
198  * certification mark of the Open Source Initiative.
199  */
200
201 /*
202  * The contributing authors would like to thank all those who helped
203  * with testing, bug fixes, and patience.  This wouldn't have been
204  * possible without all of you.
205  *
206  * Thanks to Frank J. T. Wojcik for helping with the documentation.
207  */
208
209 /*
210  * Y2K compliance in libpng:
211  * =========================
212  *
213  *    September 1, 2001
214  *
215  *    Since the PNG Development group is an ad-hoc body, we can't make
216  *    an official declaration.
217  *
218  *    This is your unofficial assurance that libpng from version 0.71 and
219  *    upward through 1.2.0 are Y2K compliant.  It is my belief that earlier
220  *    versions were also Y2K compliant.
221  *
222  *    Libpng only has three year fields.  One is a 2-byte unsigned integer
223  *    that will hold years up to 65535.  The other two hold the date in text
224  *    format, and will hold years up to 9999.
225  *
226  *    The integer is
227  *        "png_uint_16 year" in png_time_struct.
228  *
229  *    The strings are
230  *        "png_charp time_buffer" in png_struct and
231  *        "near_time_buffer", which is a local character string in png.c.
232  *
233  *    There are seven time-related functions:
234  *        png.c: png_convert_to_rfc_1123() in png.c
235  *          (formerly png_convert_to_rfc_1152() in error)
236  *        png_convert_from_struct_tm() in pngwrite.c, called in pngwrite.c
237  *        png_convert_from_time_t() in pngwrite.c
238  *        png_get_tIME() in pngget.c
239  *        png_handle_tIME() in pngrutil.c, called in pngread.c
240  *        png_set_tIME() in pngset.c
241  *        png_write_tIME() in pngwutil.c, called in pngwrite.c
242  *
243  *    All handle dates properly in a Y2K environment.  The
244  *    png_convert_from_time_t() function calls gmtime() to convert from system
245  *    clock time, which returns (year - 1900), which we properly convert to
246  *    the full 4-digit year.  There is a possibility that applications using
247  *    libpng are not passing 4-digit years into the png_convert_to_rfc_1123()
248  *    function, or that they are incorrectly passing only a 2-digit year
249  *    instead of "year - 1900" into the png_convert_from_struct_tm() function,
250  *    but this is not under our control.  The libpng documentation has always
251  *    stated that it works with 4-digit years, and the APIs have been
252  *    documented as such.
253  *
254  *    The tIME chunk itself is also Y2K compliant.  It uses a 2-byte unsigned
255  *    integer to hold the year, and can hold years as large as 65535.
256  *
257  *    zlib, upon which libpng depends, is also Y2K compliant.  It contains
258  *    no date-related code.
259  *
260  *       Glenn Randers-Pehrson
261  *       libpng maintainer
262  *       PNG Development Group
263  */
264
265 #ifndef PNG_H
266 #define PNG_H
267
268 /* This is not the place to learn how to use libpng.  The file libpng.txt
269  * describes how to use libpng, and the file example.c summarizes it
270  * with some code on which to build.  This file is useful for looking
271  * at the actual function definitions and structure components.
272  */
273
274 /* Version information for png.h - this should match the version in png.c */
275 #define PNG_LIBPNG_VER_STRING "1.2.0"
276
277 #define PNG_LIBPNG_VER_SONUM   3
278 #define PNG_LIBPNG_VER_DLLNUM  %DLLNUM%
279
280 /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
281 #define PNG_LIBPNG_VER_MAJOR   1
282 #define PNG_LIBPNG_VER_MINOR   2
283 #define PNG_LIBPNG_VER_RELEASE 0
284 /* This should match the numeric part of the final component of
285  * PNG_LIBPNG_VER_STRING, omitting any leading zero: */
286
287 #define PNG_LIBPNG_VER_BUILD  0
288
289 #define PNG_LIBPNG_BUILD_ALPHA    1
290 #define PNG_LIBPNG_BUILD_BETA     2
291 #define PNG_LIBPNG_BUILD_RC       3
292 #define PNG_LIBPNG_BUILD_STABLE   4
293 #define PNG_LIBPNG_BUILD_TYPEMASK 7
294 #define PNG_LIBPNG_BUILD_PATCH    8 /* Can be OR'ed with STABLE only */
295 #define PNG_LIBPNG_BUILD_TYPE 4
296
297 /* Careful here.  At one time, Guy wanted to use 082, but that would be octal.
298  * We must not include leading zeros.
299  * Versions 0.7 through 1.0.0 were in the range 0 to 100 here (only
300  * version 1.0.0 was mis-numbered 100 instead of 10000).  From
301  * version 1.0.1 it's    xxyyzz, where x=major, y=minor, z=release */
302 #define PNG_LIBPNG_VER 10200 /* 1.2.0 */
303
304 #ifndef PNG_VERSION_INFO_ONLY
305
306 /* include the compression library's header */
307 #include "zlib.h"
308
309 /* include all user configurable info, including optional assembler routines */
310 #include "pngconf.h"
311
312 /* Inhibit C++ name-mangling for libpng functions but not for system calls. */
313 #ifdef __cplusplus
314 extern "C" {
315 #endif /* __cplusplus */
316
317 /* This file is arranged in several sections.  The first section contains
318  * structure and type definitions.  The second section contains the external
319  * library functions, while the third has the internal library functions,
320  * which applications aren't expected to use directly.
321  */
322
323 /* variables declared in png.c - only it needs to define PNG_NO_EXTERN */
324 #if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN)
325 /* Version information for C files, stored in png.c.  This had better match
326  * the version above.
327  */
328 #ifdef PNG_USE_GLOBAL_ARRAYS
329 PNG_EXPORT_VAR (const char) png_libpng_ver[18];
330   /* need room for 99.99.99beta99z*/
331 #else
332 #define png_libpng_ver png_get_header_ver(NULL)
333 #endif
334
335 #ifdef PNG_USE_GLOBAL_ARRAYS
336 /* This was removed in version 1.0.5c */
337 /* Structures to facilitate easy interlacing.  See png.c for more details */
338 PNG_EXPORT_VAR (const int FARDATA) png_pass_start[7];
339 PNG_EXPORT_VAR (const int FARDATA) png_pass_inc[7];
340 PNG_EXPORT_VAR (const int FARDATA) png_pass_ystart[7];
341 PNG_EXPORT_VAR (const int FARDATA) png_pass_yinc[7];
342 PNG_EXPORT_VAR (const int FARDATA) png_pass_mask[7];
343 PNG_EXPORT_VAR (const int FARDATA) png_pass_dsp_mask[7];
344 #ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW
345 PNG_EXPORT_VAR (const int FARDATA) png_pass_width[7];
346 #endif
347 /* This isn't currently used.  If you need it, see png.c for more details.
348 PNG_EXPORT_VAR (const int FARDATA) png_pass_height[7];
349 */
350 #endif
351
352 #endif /* PNG_NO_EXTERN */
353
354 /* Three color definitions.  The order of the red, green, and blue, (and the
355  * exact size) is not important, although the size of the fields need to
356  * be png_byte or png_uint_16 (as defined below).
357  */
358 typedef struct png_color_struct
359 {
360    png_byte red;
361    png_byte green;
362    png_byte blue;
363 } png_color;
364 typedef png_color FAR * png_colorp;
365 typedef png_color FAR * FAR * png_colorpp;
366
367 typedef struct png_color_16_struct
368 {
369    png_byte index;    /* used for palette files */
370    png_uint_16 red;   /* for use in red green blue files */
371    png_uint_16 green;
372    png_uint_16 blue;
373    png_uint_16 gray;  /* for use in grayscale files */
374 } png_color_16;
375 typedef png_color_16 FAR * png_color_16p;
376 typedef png_color_16 FAR * FAR * png_color_16pp;
377
378 typedef struct png_color_8_struct
379 {
380    png_byte red;   /* for use in red green blue files */
381    png_byte green;
382    png_byte blue;
383    png_byte gray;  /* for use in grayscale files */
384    png_byte alpha; /* for alpha channel files */
385 } png_color_8;
386 typedef png_color_8 FAR * png_color_8p;
387 typedef png_color_8 FAR * FAR * png_color_8pp;
388
389 /*
390  * The following two structures are used for the in-core representation
391  * of sPLT chunks.
392  */
393 typedef struct png_sPLT_entry_struct
394 {
395    png_uint_16 red;
396    png_uint_16 green;
397    png_uint_16 blue;
398    png_uint_16 alpha;
399    png_uint_16 frequency;
400 } png_sPLT_entry;
401 typedef png_sPLT_entry FAR * png_sPLT_entryp;
402 typedef png_sPLT_entry FAR * FAR * png_sPLT_entrypp;
403
404 /*  When the depth of the sPLT palette is 8 bits, the color and alpha samples
405  *  occupy the LSB of their respective members, and the MSB of each member
406  *  is zero-filled.  The frequency member always occupies the full 16 bits.
407  */
408
409 typedef struct png_sPLT_struct
410 {
411    png_charp name;           /* palette name */
412    png_byte depth;           /* depth of palette samples */
413    png_sPLT_entryp entries;  /* palette entries */
414    png_int_32 nentries;      /* number of palette entries */
415 } png_sPLT_t;
416 typedef png_sPLT_t FAR * png_sPLT_tp;
417 typedef png_sPLT_t FAR * FAR * png_sPLT_tpp;
418
419 #ifdef PNG_TEXT_SUPPORTED
420 /* png_text holds the contents of a text/ztxt/itxt chunk in a PNG file,
421  * and whether that contents is compressed or not.  The "key" field
422  * points to a regular zero-terminated C string.  The "text", "lang", and
423  * "lang_key" fields can be regular C strings, empty strings, or NULL pointers.
424  * However, the * structure returned by png_get_text() will always contain
425  * regular zero-terminated C strings (possibly empty), never NULL pointers,
426  * so they can be safely used in printf() and other string-handling functions.
427  */
428 typedef struct png_text_struct
429 {
430    int  compression;       /* compression value:
431                              -1: tEXt, none
432                               0: zTXt, deflate
433                               1: iTXt, none
434                               2: iTXt, deflate  */
435    png_charp key;          /* keyword, 1-79 character description of "text" */
436    png_charp text;         /* comment, may be an empty string (ie "")
437                               or a NULL pointer */
438    png_size_t text_length; /* length of the text string */
439 #ifdef PNG_iTXt_SUPPORTED
440    png_size_t itxt_length; /* length of the itxt string */
441    png_charp lang;         /* language code, 0-79 characters
442                               or a NULL pointer */
443    png_charp lang_key;     /* keyword translated UTF-8 string, 0 or more
444                               chars or a NULL pointer */
445 #endif
446 } png_text;
447 typedef png_text FAR * png_textp;
448 typedef png_text FAR * FAR * png_textpp;
449 #endif
450
451 /* Supported compression types for text in PNG files (tEXt, and zTXt).
452  * The values of the PNG_TEXT_COMPRESSION_ defines should NOT be changed. */
453 #define PNG_TEXT_COMPRESSION_NONE_WR -3
454 #define PNG_TEXT_COMPRESSION_zTXt_WR -2
455 #define PNG_TEXT_COMPRESSION_NONE    -1
456 #define PNG_TEXT_COMPRESSION_zTXt     0
457 #define PNG_ITXT_COMPRESSION_NONE     1
458 #define PNG_ITXT_COMPRESSION_zTXt     2
459 #define PNG_TEXT_COMPRESSION_LAST     3  /* Not a valid value */
460
461 /* png_time is a way to hold the time in an machine independent way.
462  * Two conversions are provided, both from time_t and struct tm.  There
463  * is no portable way to convert to either of these structures, as far
464  * as I know.  If you know of a portable way, send it to me.  As a side
465  * note - PNG has always been Year 2000 compliant!
466  */
467 typedef struct png_time_struct
468 {
469    png_uint_16 year; /* full year, as in, 1995 */
470    png_byte month;   /* month of year, 1 - 12 */
471    png_byte day;     /* day of month, 1 - 31 */
472    png_byte hour;    /* hour of day, 0 - 23 */
473    png_byte minute;  /* minute of hour, 0 - 59 */
474    png_byte second;  /* second of minute, 0 - 60 (for leap seconds) */
475 } png_time;
476 typedef png_time FAR * png_timep;
477 typedef png_time FAR * FAR * png_timepp;
478
479 #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
480 /* png_unknown_chunk is a structure to hold queued chunks for which there is
481  * no specific support.  The idea is that we can use this to queue
482  * up private chunks for output even though the library doesn't actually
483  * know about their semantics.
484  */
485 typedef struct png_unknown_chunk_t
486 {
487     png_byte name[5];
488     png_byte *data;
489     png_size_t size;
490
491     /* libpng-using applications should NOT directly modify this byte. */
492     png_byte location; /* mode of operation at read time */
493 }
494 png_unknown_chunk;
495 typedef png_unknown_chunk FAR * png_unknown_chunkp;
496 typedef png_unknown_chunk FAR * FAR * png_unknown_chunkpp;
497 #endif
498
499 /* png_info is a structure that holds the information in a PNG file so
500  * that the application can find out the characteristics of the image.
501  * If you are reading the file, this structure will tell you what is
502  * in the PNG file.  If you are writing the file, fill in the information
503  * you want to put into the PNG file, then call png_write_info().
504  * The names chosen should be very close to the PNG specification, so
505  * consult that document for information about the meaning of each field.
506  *
507  * With libpng < 0.95, it was only possible to directly set and read the
508  * the values in the png_info_struct, which meant that the contents and
509  * order of the values had to remain fixed.  With libpng 0.95 and later,
510  * however, there are now functions that abstract the contents of
511  * png_info_struct from the application, so this makes it easier to use
512  * libpng with dynamic libraries, and even makes it possible to use
513  * libraries that don't have all of the libpng ancillary chunk-handing
514  * functionality.
515  *
516  * In any case, the order of the parameters in png_info_struct should NOT
517  * be changed for as long as possible to keep compatibility with applications
518  * that use the old direct-access method with png_info_struct.
519  *
520  * The following members may have allocated storage attached that should be
521  * cleaned up before the structure is discarded: palette, trans, text,
522  * pcal_purpose, pcal_units, pcal_params, hist, iccp_name, iccp_profile,
523  * splt_palettes, scal_unit, row_pointers, and unknowns.   By default, these
524  * are automatically freed when the info structure is deallocated, if they were
525  * allocated internally by libpng.  This behavior can be changed by means
526  * of the png_data_freer() function.
527  *
528  * More allocation details: all the chunk-reading functions that
529  * change these members go through the corresponding png_set_*
530  * functions.  A function to clear these members is available: see
531  * png_free_data().  The png_set_* functions do not depend on being
532  * able to point info structure members to any of the storage they are
533  * passed (they make their own copies), EXCEPT that the png_set_text
534  * functions use the same storage passed to them in the text_ptr or
535  * itxt_ptr structure argument, and the png_set_rows and png_set_unknowns
536  * functions do not make their own copies.
537  */
538 typedef struct png_info_struct
539 {
540    /* the following are necessary for every PNG file */
541    png_uint_32 width;       /* width of image in pixels (from IHDR) */
542    png_uint_32 height;      /* height of image in pixels (from IHDR) */
543    png_uint_32 valid;       /* valid chunk data (see PNG_INFO_ below) */
544    png_uint_32 rowbytes;    /* bytes needed to hold an untransformed row */
545    png_colorp palette;      /* array of color values (valid & PNG_INFO_PLTE) */
546    png_uint_16 num_palette; /* number of color entries in "palette" (PLTE) */
547    png_uint_16 num_trans;   /* number of transparent palette color (tRNS) */
548    png_byte bit_depth;      /* 1, 2, 4, 8, or 16 bits/channel (from IHDR) */
549    png_byte color_type;     /* see PNG_COLOR_TYPE_ below (from IHDR) */
550    /* The following three should have been named *_method not *_type */
551    png_byte compression_type; /* must be PNG_COMPRESSION_TYPE_BASE (IHDR) */
552    png_byte filter_type;    /* must be PNG_FILTER_TYPE_BASE (from IHDR) */
553    png_byte interlace_type; /* One of PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */
554
555    /* The following is informational only on read, and not used on writes. */
556    png_byte channels;       /* number of data channels per pixel (1, 2, 3, 4)*/
557    png_byte pixel_depth;    /* number of bits per pixel */
558    png_byte spare_byte;     /* to align the data, and for future use */
559    png_byte signature[8];   /* magic bytes read by libpng from start of file */
560
561    /* The rest of the data is optional.  If you are reading, check the
562     * valid field to see if the information in these are valid.  If you
563     * are writing, set the valid field to those chunks you want written,
564     * and initialize the appropriate fields below.
565     */
566
567 #if defined(PNG_gAMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED)
568    /* The gAMA chunk describes the gamma characteristics of the system
569     * on which the image was created, normally in the range [1.0, 2.5].
570     * Data is valid if (valid & PNG_INFO_gAMA) is non-zero.
571     */
572    float gamma; /* gamma value of image, if (valid & PNG_INFO_gAMA) */
573 #endif
574
575 #if defined(PNG_sRGB_SUPPORTED)
576     /* GR-P, 0.96a */
577     /* Data valid if (valid & PNG_INFO_sRGB) non-zero. */
578    png_byte srgb_intent; /* sRGB rendering intent [0, 1, 2, or 3] */
579 #endif
580
581 #if defined(PNG_TEXT_SUPPORTED)
582    /* The tEXt, and zTXt chunks contain human-readable textual data in
583     * uncompressed, compressed, and optionally compressed forms, respectively.
584     * The data in "text" is an array of pointers to uncompressed,
585     * null-terminated C strings. Each chunk has a keyword that describes the
586     * textual data contained in that chunk.  Keywords are not required to be
587     * unique, and the text string may be empty.  Any number of text chunks may
588     * be in an image.
589     */
590    int num_text; /* number of comments read/to write */
591    int max_text; /* current size of text array */
592    png_textp text; /* array of comments read/to write */
593 #endif /* PNG_TEXT_SUPPORTED */
594
595 #if defined(PNG_tIME_SUPPORTED)
596    /* The tIME chunk holds the last time the displayed image data was
597     * modified.  See the png_time struct for the contents of this struct.
598     */
599    png_time mod_time;
600 #endif
601
602 #if defined(PNG_sBIT_SUPPORTED)
603    /* The sBIT chunk specifies the number of significant high-order bits
604     * in the pixel data.  Values are in the range [1, bit_depth], and are
605     * only specified for the channels in the pixel data.  The contents of
606     * the low-order bits is not specified.  Data is valid if
607     * (valid & PNG_INFO_sBIT) is non-zero.
608     */
609    png_color_8 sig_bit; /* significant bits in color channels */
610 #endif
611
612 #if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_EXPAND_SUPPORTED) || \
613 defined(PNG_READ_BACKGROUND_SUPPORTED)
614    /* The tRNS chunk supplies transparency data for paletted images and
615     * other image types that don't need a full alpha channel.  There are
616     * "num_trans" transparency values for a paletted image, stored in the
617     * same order as the palette colors, starting from index 0.  Values
618     * for the data are in the range [0, 255], ranging from fully transparent
619     * to fully opaque, respectively.  For non-paletted images, there is a
620     * single color specified that should be treated as fully transparent.
621     * Data is valid if (valid & PNG_INFO_tRNS) is non-zero.
622     */
623    png_bytep trans; /* transparent values for paletted image */
624    png_color_16 trans_values; /* transparent color for non-palette image */
625 #endif
626
627 #if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
628    /* The bKGD chunk gives the suggested image background color if the
629     * display program does not have its own background color and the image
630     * is needs to composited onto a background before display.  The colors
631     * in "background" are normally in the same color space/depth as the
632     * pixel data.  Data is valid if (valid & PNG_INFO_bKGD) is non-zero.
633     */
634    png_color_16 background;
635 #endif
636
637 #if defined(PNG_oFFs_SUPPORTED)
638    /* The oFFs chunk gives the offset in "offset_unit_type" units rightwards
639     * and downwards from the top-left corner of the display, page, or other
640     * application-specific co-ordinate space.  See the PNG_OFFSET_ defines
641     * below for the unit types.  Valid if (valid & PNG_INFO_oFFs) non-zero.
642     */
643    png_int_32 x_offset; /* x offset on page */
644    png_int_32 y_offset; /* y offset on page */
645    png_byte offset_unit_type; /* offset units type */
646 #endif
647
648 #if defined(PNG_pHYs_SUPPORTED)
649    /* The pHYs chunk gives the physical pixel density of the image for
650     * display or printing in "phys_unit_type" units (see PNG_RESOLUTION_
651     * defines below).  Data is valid if (valid & PNG_INFO_pHYs) is non-zero.
652     */
653    png_uint_32 x_pixels_per_unit; /* horizontal pixel density */
654    png_uint_32 y_pixels_per_unit; /* vertical pixel density */
655    png_byte phys_unit_type; /* resolution type (see PNG_RESOLUTION_ below) */
656 #endif
657
658 #if defined(PNG_hIST_SUPPORTED)
659    /* The hIST chunk contains the relative frequency or importance of the
660     * various palette entries, so that a viewer can intelligently select a
661     * reduced-color palette, if required.  Data is an array of "num_palette"
662     * values in the range [0,65535]. Data valid if (valid & PNG_INFO_hIST)
663     * is non-zero.
664     */
665    png_uint_16p hist;
666 #endif
667
668 #ifdef PNG_cHRM_SUPPORTED
669    /* The cHRM chunk describes the CIE color characteristics of the monitor
670     * on which the PNG was created.  This data allows the viewer to do gamut
671     * mapping of the input image to ensure that the viewer sees the same
672     * colors in the image as the creator.  Values are in the range
673     * [0.0, 0.8].  Data valid if (valid & PNG_INFO_cHRM) non-zero.
674     */
675 #ifdef PNG_FLOATING_POINT_SUPPORTED
676    float x_white;
677    float y_white;
678    float x_red;
679    float y_red;
680    float x_green;
681    float y_green;
682    float x_blue;
683    float y_blue;
684 #endif
685 #endif
686
687 #if defined(PNG_pCAL_SUPPORTED)
688    /* The pCAL chunk describes a transformation between the stored pixel
689     * values and original physical data values used to create the image.
690     * The integer range [0, 2^bit_depth - 1] maps to the floating-point
691     * range given by [pcal_X0, pcal_X1], and are further transformed by a
692     * (possibly non-linear) transformation function given by "pcal_type"
693     * and "pcal_params" into "pcal_units".  Please see the PNG_EQUATION_
694     * defines below, and the PNG-Group's PNG extensions document for a
695     * complete description of the transformations and how they should be
696     * implemented, and for a description of the ASCII parameter strings.
697     * Data values are valid if (valid & PNG_INFO_pCAL) non-zero.
698     */
699    png_charp pcal_purpose;  /* pCAL chunk description string */
700    png_int_32 pcal_X0;      /* minimum value */
701    png_int_32 pcal_X1;      /* maximum value */
702    png_charp pcal_units;    /* Latin-1 string giving physical units */
703    png_charpp pcal_params;  /* ASCII strings containing parameter values */
704    png_byte pcal_type;      /* equation type (see PNG_EQUATION_ below) */
705    png_byte pcal_nparams;   /* number of parameters given in pcal_params */
706 #endif
707
708 /* New members added in libpng-1.0.6 */
709 #ifdef PNG_FREE_ME_SUPPORTED
710    png_uint_32 free_me;     /* flags items libpng is responsible for freeing */
711 #endif
712
713 #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
714    /* storage for unknown chunks that the library doesn't recognize. */
715    png_unknown_chunkp unknown_chunks;
716    png_size_t unknown_chunks_num;
717 #endif
718
719 #if defined(PNG_iCCP_SUPPORTED)
720    /* iCCP chunk data. */
721    png_charp iccp_name;     /* profile name */
722    png_charp iccp_profile;  /* International Color Consortium profile data */
723                             /* Note to maintainer: should be png_bytep */
724    png_uint_32 iccp_proflen;  /* ICC profile data length */
725    png_byte iccp_compression; /* Always zero */
726 #endif
727
728 #if defined(PNG_sPLT_SUPPORTED)
729    /* data on sPLT chunks (there may be more than one). */
730    png_sPLT_tp splt_palettes;
731    png_uint_32 splt_palettes_num;
732 #endif
733
734 #if defined(PNG_sCAL_SUPPORTED)
735    /* The sCAL chunk describes the actual physical dimensions of the
736     * subject matter of the graphic.  The chunk contains a unit specification
737     * a byte value, and two ASCII strings representing floating-point
738     * values.  The values are width and height corresponsing to one pixel
739     * in the image.  This external representation is converted to double
740     * here.  Data values are valid if (valid & PNG_INFO_sCAL) is non-zero.
741     */
742    png_byte scal_unit;         /* unit of physical scale */
743 #ifdef PNG_FLOATING_POINT_SUPPORTED
744    double scal_pixel_width;    /* width of one pixel */
745    double scal_pixel_height;   /* height of one pixel */
746 #endif
747 #ifdef PNG_FIXED_POINT_SUPPORTED
748    png_charp scal_s_width;     /* string containing height */
749    png_charp scal_s_height;    /* string containing width */
750 #endif
751 #endif
752
753 #if defined(PNG_INFO_IMAGE_SUPPORTED)
754    /* Memory has been allocated if (valid & PNG_ALLOCATED_INFO_ROWS) non-zero */
755    /* Data valid if (valid & PNG_INFO_IDAT) non-zero */
756    png_bytepp row_pointers;        /* the image bits */
757 #endif
758
759 #if defined(PNG_FIXED_POINT_SUPPORTED) && defined(PNG_gAMA_SUPPORTED)
760    png_fixed_point int_gamma; /* gamma of image, if (valid & PNG_INFO_gAMA) */
761 #endif
762
763 #if defined(PNG_cHRM_SUPPORTED) && defined(PNG_FIXED_POINT_SUPPORTED)
764    png_fixed_point int_x_white;
765    png_fixed_point int_y_white;
766    png_fixed_point int_x_red;
767    png_fixed_point int_y_red;
768    png_fixed_point int_x_green;
769    png_fixed_point int_y_green;
770    png_fixed_point int_x_blue;
771    png_fixed_point int_y_blue;
772 #endif
773
774 } png_info;
775
776 typedef png_info FAR * png_infop;
777 typedef png_info FAR * FAR * png_infopp;
778
779 /* Maximum positive integer used in PNG is (2^31)-1 */
780 #define PNG_MAX_UINT ((png_uint_32)0x7fffffffL)
781
782 /* These describe the color_type field in png_info. */
783 /* color type masks */
784 #define PNG_COLOR_MASK_PALETTE    1
785 #define PNG_COLOR_MASK_COLOR      2
786 #define PNG_COLOR_MASK_ALPHA      4
787
788 /* color types.  Note that not all combinations are legal */
789 #define PNG_COLOR_TYPE_GRAY 0
790 #define PNG_COLOR_TYPE_PALETTE  (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE)
791 #define PNG_COLOR_TYPE_RGB        (PNG_COLOR_MASK_COLOR)
792 #define PNG_COLOR_TYPE_RGB_ALPHA  (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA)
793 #define PNG_COLOR_TYPE_GRAY_ALPHA (PNG_COLOR_MASK_ALPHA)
794 /* aliases */
795 #define PNG_COLOR_TYPE_RGBA  PNG_COLOR_TYPE_RGB_ALPHA
796 #define PNG_COLOR_TYPE_GA  PNG_COLOR_TYPE_GRAY_ALPHA
797
798 /* This is for compression type. PNG 1.0-1.2 only define the single type. */
799 #define PNG_COMPRESSION_TYPE_BASE 0 /* Deflate method 8, 32K window */
800 #define PNG_COMPRESSION_TYPE_DEFAULT PNG_COMPRESSION_TYPE_BASE
801
802 /* This is for filter type. PNG 1.0-1.2 only define the single type. */
803 #define PNG_FILTER_TYPE_BASE      0 /* Single row per-byte filtering */
804 #define PNG_INTRAPIXEL_DIFFERENCING 64 /* Used only in MNG datastreams */
805 #define PNG_FILTER_TYPE_DEFAULT   PNG_FILTER_TYPE_BASE
806
807 /* These are for the interlacing type.  These values should NOT be changed. */
808 #define PNG_INTERLACE_NONE        0 /* Non-interlaced image */
809 #define PNG_INTERLACE_ADAM7       1 /* Adam7 interlacing */
810 #define PNG_INTERLACE_LAST        2 /* Not a valid value */
811
812 /* These are for the oFFs chunk.  These values should NOT be changed. */
813 #define PNG_OFFSET_PIXEL          0 /* Offset in pixels */
814 #define PNG_OFFSET_MICROMETER     1 /* Offset in micrometers (1/10^6 meter) */
815 #define PNG_OFFSET_LAST           2 /* Not a valid value */
816
817 /* These are for the pCAL chunk.  These values should NOT be changed. */
818 #define PNG_EQUATION_LINEAR       0 /* Linear transformation */
819 #define PNG_EQUATION_BASE_E       1 /* Exponential base e transform */
820 #define PNG_EQUATION_ARBITRARY    2 /* Arbitrary base exponential transform */
821 #define PNG_EQUATION_HYPERBOLIC   3 /* Hyperbolic sine transformation */
822 #define PNG_EQUATION_LAST         4 /* Not a valid value */
823
824 /* These are for the sCAL chunk.  These values should NOT be changed. */
825 #define PNG_SCALE_UNKNOWN         0 /* unknown unit (image scale) */
826 #define PNG_SCALE_METER           1 /* meters per pixel */
827 #define PNG_SCALE_RADIAN          2 /* radians per pixel */
828 #define PNG_SCALE_LAST            3 /* Not a valid value */
829
830 /* These are for the pHYs chunk.  These values should NOT be changed. */
831 #define PNG_RESOLUTION_UNKNOWN    0 /* pixels/unknown unit (aspect ratio) */
832 #define PNG_RESOLUTION_METER      1 /* pixels/meter */
833 #define PNG_RESOLUTION_LAST       2 /* Not a valid value */
834
835 /* These are for the sRGB chunk.  These values should NOT be changed. */
836 #define PNG_sRGB_INTENT_PERCEPTUAL 0
837 #define PNG_sRGB_INTENT_RELATIVE   1
838 #define PNG_sRGB_INTENT_SATURATION 2
839 #define PNG_sRGB_INTENT_ABSOLUTE   3
840 #define PNG_sRGB_INTENT_LAST       4 /* Not a valid value */
841
842 /* This is for text chunks */
843 #define PNG_KEYWORD_MAX_LENGTH     79
844
845 /* Maximum number of entries in PLTE/sPLT/tRNS arrays */
846 #define PNG_MAX_PALETTE_LENGTH     256
847
848 /* These determine if an ancillary chunk's data has been successfully read
849  * from the PNG header, or if the application has filled in the corresponding
850  * data in the info_struct to be written into the output file.  The values
851  * of the PNG_INFO_<chunk> defines should NOT be changed.
852  */
853 #define PNG_INFO_gAMA 0x0001
854 #define PNG_INFO_sBIT 0x0002
855 #define PNG_INFO_cHRM 0x0004
856 #define PNG_INFO_PLTE 0x0008
857 #define PNG_INFO_tRNS 0x0010
858 #define PNG_INFO_bKGD 0x0020
859 #define PNG_INFO_hIST 0x0040
860 #define PNG_INFO_pHYs 0x0080
861 #define PNG_INFO_oFFs 0x0100
862 #define PNG_INFO_tIME 0x0200
863 #define PNG_INFO_pCAL 0x0400
864 #define PNG_INFO_sRGB 0x0800   /* GR-P, 0.96a */
865 #define PNG_INFO_iCCP 0x1000   /* ESR, 1.0.6 */
866 #define PNG_INFO_sPLT 0x2000   /* ESR, 1.0.6 */
867 #define PNG_INFO_sCAL 0x4000   /* ESR, 1.0.6 */
868 #define PNG_INFO_IDAT 0x8000L  /* ESR, 1.0.6 */
869
870 /* This is used for the transformation routines, as some of them
871  * change these values for the row.  It also should enable using
872  * the routines for other purposes.
873  */
874 typedef struct png_row_info_struct
875 {
876    png_uint_32 width; /* width of row */
877    png_uint_32 rowbytes; /* number of bytes in row */
878    png_byte color_type; /* color type of row */
879    png_byte bit_depth; /* bit depth of row */
880    png_byte channels; /* number of channels (1, 2, 3, or 4) */
881    png_byte pixel_depth; /* bits per pixel (depth * channels) */
882 } png_row_info;
883
884 typedef png_row_info FAR * png_row_infop;
885 typedef png_row_info FAR * FAR * png_row_infopp;
886
887 /* These are the function types for the I/O functions and for the functions
888  * that allow the user to override the default I/O functions with his or her
889  * own.  The png_error_ptr type should match that of user-supplied warning
890  * and error functions, while the png_rw_ptr type should match that of the
891  * user read/write data functions.
892  */
893 typedef struct png_struct_def png_struct;
894 typedef png_struct FAR * png_structp;
895
896 typedef void (PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp));
897 typedef void (PNGAPI *png_rw_ptr) PNGARG((png_structp, png_bytep, png_size_t));
898 typedef void (PNGAPI *png_flush_ptr) PNGARG((png_structp));
899 typedef void (PNGAPI *png_read_status_ptr) PNGARG((png_structp, png_uint_32,
900    int));
901 typedef void (PNGAPI *png_write_status_ptr) PNGARG((png_structp, png_uint_32,
902    int));
903
904 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED
905 typedef void (PNGAPI *png_progressive_info_ptr) PNGARG((png_structp, png_infop));
906 typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop));
907 typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep,
908    png_uint_32, int));
909 #endif
910
911 #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
912     defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
913     defined(PNG_LEGACY_SUPPORTED)
914 typedef void (PNGAPI *png_user_transform_ptr) PNGARG((png_structp,
915     png_row_infop, png_bytep));
916 #endif
917
918 #if defined(PNG_USER_CHUNKS_SUPPORTED)
919 typedef int (PNGAPI *png_user_chunk_ptr) PNGARG((png_structp, png_unknown_chunkp));
920 #endif
921 #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
922 typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp));
923 #endif
924
925 /* Transform masks for the high-level interface */
926 #define PNG_TRANSFORM_IDENTITY       0x0000    /* read and write */
927 #define PNG_TRANSFORM_STRIP_16       0x0001    /* read only */
928 #define PNG_TRANSFORM_STRIP_ALPHA    0x0002    /* read only */
929 #define PNG_TRANSFORM_PACKING        0x0004    /* read and write */
930 #define PNG_TRANSFORM_PACKSWAP       0x0008    /* read and write */
931 #define PNG_TRANSFORM_EXPAND         0x0010    /* read only */
932 #define PNG_TRANSFORM_INVERT_MONO    0x0020    /* read and write */
933 #define PNG_TRANSFORM_SHIFT          0x0040    /* read and write */
934 #define PNG_TRANSFORM_BGR            0x0080    /* read and write */
935 #define PNG_TRANSFORM_SWAP_ALPHA     0x0100    /* read and write */
936 #define PNG_TRANSFORM_SWAP_ENDIAN    0x0200    /* read and write */
937 #define PNG_TRANSFORM_INVERT_ALPHA   0x0400    /* read and write */
938 #define PNG_TRANSFORM_STRIP_FILLER   0x0800    /* WRITE only */
939
940 /* Flags for MNG supported features */
941 #define PNG_FLAG_MNG_EMPTY_PLTE     0x01
942 #define PNG_FLAG_MNG_FILTER_64      0x04
943 #define PNG_ALL_MNG_FEATURES        0x05
944
945 typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t));
946 typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp));
947
948 /* The structure that holds the information to read and write PNG files.
949  * The only people who need to care about what is inside of this are the
950  * people who will be modifying the library for their own special needs.
951  * It should NOT be accessed directly by an application, except to store
952  * the jmp_buf.
953  */
954
955 struct png_struct_def
956 {
957 #ifdef PNG_SETJMP_SUPPORTED
958    jmp_buf jmpbuf;            /* used in png_error */
959 #endif
960    png_error_ptr error_fn;    /* function for printing errors and aborting */
961    png_error_ptr warning_fn;  /* function for printing warnings */
962    png_voidp error_ptr;       /* user supplied struct for error functions */
963    png_rw_ptr write_data_fn;  /* function for writing output data */
964    png_rw_ptr read_data_fn;   /* function for reading input data */
965    png_voidp io_ptr;          /* ptr to application struct for I/O functions*/
966
967 #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
968    png_user_transform_ptr read_user_transform_fn; /* user read transform */
969 #endif
970
971 #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
972    png_user_transform_ptr write_user_transform_fn; /* user write transform */
973 #endif
974
975 /* These were added in libpng-1.0.2 */
976 #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
977 #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
978     defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
979    png_voidp user_transform_ptr; /* user supplied struct for user transform */
980    png_byte user_transform_depth;    /* bit depth of user transformed pixels */
981    png_byte user_transform_channels; /* channels in user transformed pixels */
982 #endif
983 #endif
984
985    png_uint_32 mode;          /* tells us where we are in the PNG file */
986    png_uint_32 flags;         /* flags indicating various things to libpng */
987    png_uint_32 transformations; /* which transformations to perform */
988
989    z_stream zstream;          /* pointer to decompression structure (below) */
990    png_bytep zbuf;            /* buffer for zlib */
991    png_size_t zbuf_size;      /* size of zbuf */
992    int zlib_level;            /* holds zlib compression level */
993    int zlib_method;           /* holds zlib compression method */
994    int zlib_window_bits;      /* holds zlib compression window bits */
995    int zlib_mem_level;        /* holds zlib compression memory level */
996    int zlib_strategy;         /* holds zlib compression strategy */
997
998    png_uint_32 width;         /* width of image in pixels */
999    png_uint_32 height;        /* height of image in pixels */
1000    png_uint_32 num_rows;      /* number of rows in current pass */
1001    png_uint_32 usr_width;     /* width of row at start of write */
1002    png_uint_32 rowbytes;      /* size of row in bytes */
1003    png_uint_32 irowbytes;     /* size of current interlaced row in bytes */
1004    png_uint_32 iwidth;        /* width of current interlaced row in pixels */
1005    png_uint_32 row_number;    /* current row in interlace pass */
1006    png_bytep prev_row;        /* buffer to save previous (unfiltered) row */
1007    png_bytep row_buf;         /* buffer to save current (unfiltered) row */
1008    png_bytep sub_row;         /* buffer to save "sub" row when filtering */
1009    png_bytep up_row;          /* buffer to save "up" row when filtering */
1010    png_bytep avg_row;         /* buffer to save "avg" row when filtering */
1011    png_bytep paeth_row;       /* buffer to save "Paeth" row when filtering */
1012    png_row_info row_info;     /* used for transformation routines */
1013
1014    png_uint_32 idat_size;     /* current IDAT size for read */
1015    png_uint_32 crc;           /* current chunk CRC value */
1016    png_colorp palette;        /* palette from the input file */
1017    png_uint_16 num_palette;   /* number of color entries in palette */
1018    png_uint_16 num_trans;     /* number of transparency values */
1019    png_byte chunk_name[5];    /* null-terminated name of current chunk */
1020    png_byte compression;      /* file compression type (always 0) */
1021    png_byte filter;           /* file filter type (always 0) */
1022    png_byte interlaced;       /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */
1023    png_byte pass;             /* current interlace pass (0 - 6) */
1024    png_byte do_filter;        /* row filter flags (see PNG_FILTER_ below ) */
1025    png_byte color_type;       /* color type of file */
1026    png_byte bit_depth;        /* bit depth of file */
1027    png_byte usr_bit_depth;    /* bit depth of users row */
1028    png_byte pixel_depth;      /* number of bits per pixel */
1029    png_byte channels;         /* number of channels in file */
1030    png_byte usr_channels;     /* channels at start of write */
1031    png_byte sig_bytes;        /* magic bytes read/written from start of file */
1032
1033 #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
1034 #ifdef PNG_LEGACY_SUPPORTED
1035    png_byte filler;           /* filler byte for pixel expansion */
1036 #else
1037    png_uint_16 filler;           /* filler bytes for pixel expansion */
1038 #endif
1039 #endif
1040
1041 #if defined(PNG_bKGD_SUPPORTED)
1042    png_byte background_gamma_type;
1043 #  ifdef PNG_FLOATING_POINT_SUPPORTED
1044    float background_gamma;
1045 #  endif
1046    png_color_16 background;   /* background color in screen gamma space */
1047 #  if defined(PNG_READ_GAMMA_SUPPORTED)
1048      png_color_16 background_1; /* background normalized to gamma 1.0 */
1049 #  endif /* PNG_READ_GAMMA && PNG_bKGD_SUPPORTED */
1050 #endif /* PNG_bKGD_SUPPORTED */
1051
1052 #if defined(PNG_WRITE_FLUSH_SUPPORTED)
1053    png_flush_ptr output_flush_fn;/* Function for flushing output */
1054    png_uint_32 flush_dist;    /* how many rows apart to flush, 0 - no flush */
1055    png_uint_32 flush_rows;    /* number of rows written since last flush */
1056 #endif
1057
1058 #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
1059    int gamma_shift;      /* number of "insignificant" bits 16-bit gamma */
1060 #ifdef PNG_FLOATING_POINT_SUPPORTED
1061    float gamma;          /* file gamma value */
1062    float screen_gamma;   /* screen gamma value (display_exponent) */
1063 #endif
1064 #endif
1065
1066 #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
1067    png_bytep gamma_table;     /* gamma table for 8-bit depth files */
1068    png_bytep gamma_from_1;    /* converts from 1.0 to screen */
1069    png_bytep gamma_to_1;      /* converts from file to 1.0 */
1070    png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */
1071    png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */
1072    png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */
1073 #endif
1074
1075 #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED)
1076    png_color_8 sig_bit;       /* significant bits in each available channel */
1077 #endif
1078
1079 #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
1080    png_color_8 shift;         /* shift for significant bit tranformation */
1081 #endif
1082
1083 #if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \
1084  || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
1085    png_bytep trans;           /* transparency values for paletted files */
1086    png_color_16 trans_values; /* transparency values for non-paletted files */
1087 #endif
1088
1089    png_read_status_ptr read_row_fn;   /* called after each row is decoded */
1090    png_write_status_ptr write_row_fn; /* called after each row is encoded */
1091 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED
1092    png_progressive_info_ptr info_fn; /* called after header data fully read */
1093    png_progressive_row_ptr row_fn;   /* called after each prog. row is decoded */
1094    png_progressive_end_ptr end_fn;   /* called after image is complete */
1095    png_bytep save_buffer_ptr;        /* current location in save_buffer */
1096    png_bytep save_buffer;            /* buffer for previously read data */
1097    png_bytep current_buffer_ptr;     /* current location in current_buffer */
1098    png_bytep current_buffer;         /* buffer for recently used data */
1099    png_uint_32 push_length;          /* size of current input chunk */
1100    png_uint_32 skip_length;          /* bytes to skip in input data */
1101    png_size_t save_buffer_size;      /* amount of data now in save_buffer */
1102    png_size_t save_buffer_max;       /* total size of save_buffer */
1103    png_size_t buffer_size;           /* total amount of available input data */
1104    png_size_t current_buffer_size;   /* amount of data now in current_buffer */
1105    int process_mode;                 /* what push library is currently doing */
1106    int cur_palette;                  /* current push library palette index */
1107
1108 #  if defined(PNG_TEXT_SUPPORTED)
1109      png_size_t current_text_size;   /* current size of text input data */
1110      png_size_t current_text_left;   /* how much text left to read in input */
1111      png_charp current_text;         /* current text chunk buffer */
1112      png_charp current_text_ptr;     /* current location in current_text */
1113 #  endif /* PNG_PROGRESSIVE_READ_SUPPORTED && PNG_TEXT_SUPPORTED */
1114
1115 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
1116
1117 #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__)
1118 /* for the Borland special 64K segment handler */
1119    png_bytepp offset_table_ptr;
1120    png_bytep offset_table;
1121    png_uint_16 offset_table_number;
1122    png_uint_16 offset_table_count;
1123    png_uint_16 offset_table_count_free;
1124 #endif
1125
1126 #if defined(PNG_READ_DITHER_SUPPORTED)
1127    png_bytep palette_lookup;         /* lookup table for dithering */
1128    png_bytep dither_index;           /* index translation for palette files */
1129 #endif
1130
1131 #if defined(PNG_READ_DITHER_SUPPORTED) || defined(PNG_hIST_SUPPORTED)
1132    png_uint_16p hist;                /* histogram */
1133 #endif
1134
1135 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
1136    png_byte heuristic_method;        /* heuristic for row filter selection */
1137    png_byte num_prev_filters;        /* number of weights for previous rows */
1138    png_bytep prev_filters;           /* filter type(s) of previous row(s) */
1139    png_uint_16p filter_weights;      /* weight(s) for previous line(s) */
1140    png_uint_16p inv_filter_weights;  /* 1/weight(s) for previous line(s) */
1141    png_uint_16p filter_costs;        /* relative filter calculation cost */
1142    png_uint_16p inv_filter_costs;    /* 1/relative filter calculation cost */
1143 #endif
1144
1145 #if defined(PNG_TIME_RFC1123_SUPPORTED)
1146    png_charp time_buffer;            /* String to hold RFC 1123 time text */
1147 #endif
1148
1149 /* New members added in libpng-1.0.6 */
1150
1151 #ifdef PNG_FREE_ME_SUPPORTED
1152    png_uint_32 free_me;       /* flags items libpng is responsible for freeing */
1153 #endif
1154
1155 #if defined(PNG_USER_CHUNKS_SUPPORTED)
1156    png_voidp user_chunk_ptr;
1157    png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */
1158 #endif
1159
1160 #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
1161    int num_chunk_list;
1162    png_bytep chunk_list;
1163 #endif
1164
1165 /* New members added in libpng-1.0.3 */
1166 #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
1167    png_byte rgb_to_gray_status;
1168    /* These were changed from png_byte in libpng-1.0.6 */
1169    png_uint_16 rgb_to_gray_red_coeff;
1170    png_uint_16 rgb_to_gray_green_coeff;
1171    png_uint_16 rgb_to_gray_blue_coeff;
1172 #endif
1173
1174 /* New member added in libpng-1.0.4 (renamed in 1.0.9) */
1175 #if defined(PNG_MNG_FEATURES_SUPPORTED) || \
1176     defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \
1177     defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED)
1178 /* changed from png_byte to png_uint_32 at version 1.2.0 */
1179    png_uint_32 mng_features_permitted;
1180 #endif
1181
1182 /* New member added in libpng-1.0.7 */
1183 #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
1184    png_fixed_point int_gamma;
1185 #endif
1186
1187 /* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */
1188 #if defined(PNG_MNG_FEATURES_SUPPORTED)
1189    png_byte filter_type;
1190 #endif
1191
1192 #if defined(PNG_DEBUG) && defined(PNG_USE_PNGGCCRD)
1193 /* New member added in libpng-1.0.10, ifdef'ed out in 1.2.0 */
1194    png_uint_32 row_buf_size;
1195 #endif
1196
1197 /* New members added in libpng-1.2.0 */
1198 #if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
1199    png_byte     mmx_bitdepth_threshold;
1200    png_uint_32  mmx_rowbytes_threshold;
1201    png_uint_32  asm_flags;
1202 #endif
1203
1204 /* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */
1205 #ifdef PNG_USER_MEM_SUPPORTED
1206    png_voidp mem_ptr;                /* user supplied struct for mem functions */
1207    png_malloc_ptr malloc_fn;         /* function for allocating memory */
1208    png_free_ptr free_fn;             /* function for freeing memory */
1209 #endif
1210
1211    png_bytep big_row_buf;         /* buffer to save current (unfiltered) row */
1212
1213 };
1214
1215
1216 /* This prevents a compiler error in png_get_copyright() in png.c if png.c
1217    and png.h are both at version 1.2.0
1218  */
1219 typedef png_structp version_1_2_0;
1220
1221 typedef png_struct FAR * FAR * png_structpp;
1222
1223 /* Here are the function definitions most commonly used.  This is not
1224  * the place to find out how to use libpng.  See libpng.txt for the
1225  * full explanation, see example.c for the summary.  This just provides
1226  * a simple one line description of the use of each function.
1227  */
1228
1229 /* Returns the version number of the library */
1230 extern PNG_EXPORT(png_uint_32,png_access_version_number) PNGARG((void));
1231
1232 /* Tell lib we have already handled the first <num_bytes> magic bytes.
1233  * Handling more than 8 bytes from the beginning of the file is an error.
1234  */
1235 extern PNG_EXPORT(void,png_set_sig_bytes) PNGARG((png_structp png_ptr,
1236    int num_bytes));
1237
1238 /* Check sig[start] through sig[start + num_to_check - 1] to see if it's a
1239  * PNG file.  Returns zero if the supplied bytes match the 8-byte PNG
1240  * signature, and non-zero otherwise.  Having num_to_check == 0 or
1241  * start > 7 will always fail (ie return non-zero).
1242  */
1243 extern PNG_EXPORT(int,png_sig_cmp) PNGARG((png_bytep sig, png_size_t start,
1244    png_size_t num_to_check));
1245
1246 /* Simple signature checking function.  This is the same as calling
1247  * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n).
1248  */
1249 extern PNG_EXPORT(int,png_check_sig) PNGARG((png_bytep sig, int num));
1250
1251 /* Allocate and initialize png_ptr struct for reading, and any other memory. */
1252 extern PNG_EXPORT(png_structp,png_create_read_struct)
1253    PNGARG((png_const_charp user_png_ver, png_voidp error_ptr,
1254    png_error_ptr error_fn, png_error_ptr warn_fn));
1255
1256 /* Allocate and initialize png_ptr struct for writing, and any other memory */
1257 extern PNG_EXPORT(png_structp,png_create_write_struct)
1258    PNGARG((png_const_charp user_png_ver, png_voidp error_ptr,
1259    png_error_ptr error_fn, png_error_ptr warn_fn));
1260
1261 extern PNG_EXPORT(png_uint_32,png_get_compression_buffer_size)
1262    PNGARG((png_structp png_ptr));
1263
1264 extern PNG_EXPORT(void,png_set_compression_buffer_size)
1265    PNGARG((png_structp png_ptr, png_uint_32 size));
1266
1267 /* Reset the compression stream */
1268 extern PNG_EXPORT(int,png_reset_zstream) PNGARG((png_structp png_ptr));
1269
1270 /* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */
1271 #ifdef PNG_USER_MEM_SUPPORTED
1272 extern PNG_EXPORT(png_structp,png_create_read_struct_2)
1273    PNGARG((png_const_charp user_png_ver, png_voidp error_ptr,
1274    png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
1275    png_malloc_ptr malloc_fn, png_free_ptr free_fn));
1276 extern PNG_EXPORT(png_structp,png_create_write_struct_2)
1277    PNGARG((png_const_charp user_png_ver, png_voidp error_ptr,
1278    png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
1279    png_malloc_ptr malloc_fn, png_free_ptr free_fn));
1280 #endif
1281
1282 /* Write a PNG chunk - size, type, (optional) data, CRC. */
1283 extern PNG_EXPORT(void,png_write_chunk) PNGARG((png_structp png_ptr,
1284    png_bytep chunk_name, png_bytep data, png_size_t length));
1285
1286 /* Write the start of a PNG chunk - length and chunk name. */
1287 extern PNG_EXPORT(void,png_write_chunk_start) PNGARG((png_structp png_ptr,
1288    png_bytep chunk_name, png_uint_32 length));
1289
1290 /* Write the data of a PNG chunk started with png_write_chunk_start(). */
1291 extern PNG_EXPORT(void,png_write_chunk_data) PNGARG((png_structp png_ptr,
1292    png_bytep data, png_size_t length));
1293
1294 /* Finish a chunk started with png_write_chunk_start() (includes CRC). */
1295 extern PNG_EXPORT(void,png_write_chunk_end) PNGARG((png_structp png_ptr));
1296
1297 /* Allocate and initialize the info structure */
1298 extern PNG_EXPORT(png_infop,png_create_info_struct)
1299    PNGARG((png_structp png_ptr));
1300
1301 /* Initialize the info structure (old interface - DEPRECATED) */
1302 extern PNG_EXPORT(void,png_info_init) PNGARG((png_infop info_ptr));
1303 #define png_info_init(info_ptr) png_info_init_3(&info_ptr, sizeof(png_info));
1304 extern PNG_EXPORT(void,png_info_init_3) PNGARG((png_infopp info_ptr,
1305     png_size_t png_info_struct_size));
1306
1307 /* Writes all the PNG information before the image. */
1308 extern PNG_EXPORT(void,png_write_info_before_PLTE) PNGARG((png_structp png_ptr,
1309    png_infop info_ptr));
1310 extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr,
1311    png_infop info_ptr));
1312
1313 /* read the information before the actual image data. */
1314 extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr,
1315    png_infop info_ptr));
1316
1317 #if defined(PNG_TIME_RFC1123_SUPPORTED)
1318 extern PNG_EXPORT(png_charp,png_convert_to_rfc1123)
1319    PNGARG((png_structp png_ptr, png_timep ptime));
1320 #endif
1321
1322 #if !defined(_WIN32_WCE)
1323 /* "time.h" functions are not supported on WindowsCE */
1324 #if defined(PNG_WRITE_tIME_SUPPORTED)
1325 /* convert from a struct tm to png_time */
1326 extern PNG_EXPORT(void,png_convert_from_struct_tm) PNGARG((png_timep ptime,
1327    struct tm FAR * ttime));
1328
1329 /* convert from time_t to png_time.  Uses gmtime() */
1330 extern PNG_EXPORT(void,png_convert_from_time_t) PNGARG((png_timep ptime,
1331    time_t ttime));
1332 #endif /* PNG_WRITE_tIME_SUPPORTED */
1333 #endif /* _WIN32_WCE */
1334
1335 #if defined(PNG_READ_EXPAND_SUPPORTED)
1336 /* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */
1337 extern PNG_EXPORT(void,png_set_expand) PNGARG((png_structp png_ptr));
1338 extern PNG_EXPORT(void,png_set_gray_1_2_4_to_8) PNGARG((png_structp png_ptr));
1339 extern PNG_EXPORT(void,png_set_palette_to_rgb) PNGARG((png_structp png_ptr));
1340 extern PNG_EXPORT(void,png_set_tRNS_to_alpha) PNGARG((png_structp png_ptr));
1341 #endif
1342
1343 #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
1344 /* Use blue, green, red order for pixels. */
1345 extern PNG_EXPORT(void,png_set_bgr) PNGARG((png_structp png_ptr));
1346 #endif
1347
1348 #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
1349 /* Expand the grayscale to 24-bit RGB if necessary. */
1350 extern PNG_EXPORT(void,png_set_gray_to_rgb) PNGARG((png_structp png_ptr));
1351 #endif
1352
1353 #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
1354 /* Reduce RGB to grayscale. */
1355 #ifdef PNG_FLOATING_POINT_SUPPORTED
1356 extern PNG_EXPORT(void,png_set_rgb_to_gray) PNGARG((png_structp png_ptr,
1357    int error_action, double red, double green ));
1358 #endif
1359 extern PNG_EXPORT(void,png_set_rgb_to_gray_fixed) PNGARG((png_structp png_ptr,
1360    int error_action, png_fixed_point red, png_fixed_point green ));
1361 extern PNG_EXPORT(png_byte,png_get_rgb_to_gray_status) PNGARG((png_structp
1362    png_ptr));
1363 #endif
1364
1365 extern PNG_EXPORT(void,png_build_grayscale_palette) PNGARG((int bit_depth,
1366    png_colorp palette));
1367
1368 #if defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
1369 extern PNG_EXPORT(void,png_set_strip_alpha) PNGARG((png_structp png_ptr));
1370 #endif
1371
1372 #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
1373     defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
1374 extern PNG_EXPORT(void,png_set_swap_alpha) PNGARG((png_structp png_ptr));
1375 #endif
1376
1377 #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
1378     defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
1379 extern PNG_EXPORT(void,png_set_invert_alpha) PNGARG((png_structp png_ptr));
1380 #endif
1381
1382 #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
1383 /* Add a filler byte to 24-bit RGB images. */
1384 extern PNG_EXPORT(void,png_set_filler) PNGARG((png_structp png_ptr,
1385    png_uint_32 filler, int flags));
1386 /* The values of the PNG_FILLER_ defines should NOT be changed */
1387 #define PNG_FILLER_BEFORE 0
1388 #define PNG_FILLER_AFTER 1
1389 #endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */
1390
1391 #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
1392 /* Swap bytes in 16-bit depth files. */
1393 extern PNG_EXPORT(void,png_set_swap) PNGARG((png_structp png_ptr));
1394 #endif
1395
1396 #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
1397 /* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */
1398 extern PNG_EXPORT(void,png_set_packing) PNGARG((png_structp png_ptr));
1399 #endif
1400
1401 #if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED)
1402 /* Swap packing order of pixels in bytes. */
1403 extern PNG_EXPORT(void,png_set_packswap) PNGARG((png_structp png_ptr));
1404 #endif
1405
1406 #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
1407 /* Converts files to legal bit depths. */
1408 extern PNG_EXPORT(void,png_set_shift) PNGARG((png_structp png_ptr,
1409    png_color_8p true_bits));
1410 #endif
1411
1412 #if defined(PNG_READ_INTERLACING_SUPPORTED) || \
1413     defined(PNG_WRITE_INTERLACING_SUPPORTED)
1414 /* Have the code handle the interlacing.  Returns the number of passes. */
1415 extern PNG_EXPORT(int,png_set_interlace_handling) PNGARG((png_structp png_ptr));
1416 #endif
1417
1418 #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
1419 /* Invert monochrome files */
1420 extern PNG_EXPORT(void,png_set_invert_mono) PNGARG((png_structp png_ptr));
1421 #endif
1422
1423 #if defined(PNG_READ_BACKGROUND_SUPPORTED)
1424 /* Handle alpha and tRNS by replacing with a background color. */
1425 #ifdef PNG_FLOATING_POINT_SUPPORTED
1426 extern PNG_EXPORT(void,png_set_background) PNGARG((png_structp png_ptr,
1427    png_color_16p background_color, int background_gamma_code,
1428    int need_expand, double background_gamma));
1429 #endif
1430 #define PNG_BACKGROUND_GAMMA_UNKNOWN 0
1431 #define PNG_BACKGROUND_GAMMA_SCREEN  1
1432 #define PNG_BACKGROUND_GAMMA_FILE    2
1433 #define PNG_BACKGROUND_GAMMA_UNIQUE  3
1434 #endif
1435
1436 #if defined(PNG_READ_16_TO_8_SUPPORTED)
1437 /* strip the second byte of information from a 16-bit depth file. */
1438 extern PNG_EXPORT(void,png_set_strip_16) PNGARG((png_structp png_ptr));
1439 #endif
1440
1441 #if defined(PNG_READ_DITHER_SUPPORTED)
1442 /* Turn on dithering, and reduce the palette to the number of colors available. */
1443 extern PNG_EXPORT(void,png_set_dither) PNGARG((png_structp png_ptr,
1444    png_colorp palette, int num_palette, int maximum_colors,
1445    png_uint_16p histogram, int full_dither));
1446 #endif
1447
1448 #if defined(PNG_READ_GAMMA_SUPPORTED)
1449 /* Handle gamma correction. Screen_gamma=(display_exponent) */
1450 #ifdef PNG_FLOATING_POINT_SUPPORTED
1451 extern PNG_EXPORT(void,png_set_gamma) PNGARG((png_structp png_ptr,
1452    double screen_gamma, double default_file_gamma));
1453 #endif
1454 #endif
1455
1456 #if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \
1457     defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED)
1458 /* Permit or disallow empty PLTE (0: not permitted, 1: permitted) */
1459 /* Deprecated and will be removed.  Use png_permit_mng_features() instead. */
1460 extern PNG_EXPORT(void,png_permit_empty_plte) PNGARG((png_structp png_ptr,
1461    int empty_plte_permitted));
1462 #endif
1463
1464 #if defined(PNG_WRITE_FLUSH_SUPPORTED)
1465 /* Set how many lines between output flushes - 0 for no flushing */
1466 extern PNG_EXPORT(void,png_set_flush) PNGARG((png_structp png_ptr, int nrows));
1467 /* Flush the current PNG output buffer */
1468 extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr));
1469 #endif
1470
1471 /* optional update palette with requested transformations */
1472 extern PNG_EXPORT(void,png_start_read_image) PNGARG((png_structp png_ptr));
1473
1474 /* optional call to update the users info structure */
1475 extern PNG_EXPORT(void,png_read_update_info) PNGARG((png_structp png_ptr,
1476    png_infop info_ptr));
1477
1478 /* read a one or more rows of image data.*/
1479 extern PNG_EXPORT(void,png_read_rows) PNGARG((png_structp png_ptr,
1480    png_bytepp row, png_bytepp display_row, png_uint_32 num_rows));
1481
1482 /* read a row of data.*/
1483 extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr,
1484    png_bytep row,
1485    png_bytep display_row));
1486
1487 /* read the whole image into memory at once. */
1488 extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr,
1489    png_bytepp image));
1490
1491 /* write a row of image data */
1492 extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr,
1493    png_bytep row));
1494
1495 /* write a few rows of image data */
1496 extern PNG_EXPORT(void,png_write_rows) PNGARG((png_structp png_ptr,
1497    png_bytepp row, png_uint_32 num_rows));
1498
1499 /* write the image data */
1500 extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr,
1501    png_bytepp image));
1502
1503 /* writes the end of the PNG file. */
1504 extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr,
1505    png_infop info_ptr));
1506
1507 /* read the end of the PNG file. */
1508 extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr,
1509    png_infop info_ptr));
1510
1511 /* free any memory associated with the png_info_struct */
1512 extern PNG_EXPORT(void,png_destroy_info_struct) PNGARG((png_structp png_ptr,
1513    png_infopp info_ptr_ptr));
1514
1515 /* free any memory associated with the png_struct and the png_info_structs */
1516 extern PNG_EXPORT(void,png_destroy_read_struct) PNGARG((png_structpp
1517    png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr));
1518
1519 /* free all memory used by the read (old method - NOT DLL EXPORTED) */
1520 extern void png_read_destroy PNGARG((png_structp png_ptr, png_infop info_ptr,
1521    png_infop end_info_ptr));
1522
1523 /* free any memory associated with the png_struct and the png_info_structs */
1524 extern PNG_EXPORT(void,png_destroy_write_struct)
1525    PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr));
1526
1527 /* free any memory used in info_ptr struct (old method - NOT DLL EXPORTED) */
1528 extern void png_write_destroy_info PNGARG((png_infop info_ptr));
1529
1530 /* free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */
1531 extern void png_write_destroy PNGARG((png_structp png_ptr));
1532
1533 /* set the libpng method of handling chunk CRC errors */
1534 extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr,
1535    int crit_action, int ancil_action));
1536
1537 /* Values for png_set_crc_action() to say how to handle CRC errors in
1538  * ancillary and critical chunks, and whether to use the data contained
1539  * therein.  Note that it is impossible to "discard" data in a critical
1540  * chunk.  For versions prior to 0.90, the action was always error/quit,
1541  * whereas in version 0.90 and later, the action for CRC errors in ancillary
1542  * chunks is warn/discard.  These values should NOT be changed.
1543  *
1544  *      value                       action:critical     action:ancillary
1545  */
1546 #define PNG_CRC_DEFAULT       0  /* error/quit          warn/discard data */
1547 #define PNG_CRC_ERROR_QUIT    1  /* error/quit          error/quit        */
1548 #define PNG_CRC_WARN_DISCARD  2  /* (INVALID)           warn/discard data */
1549 #define PNG_CRC_WARN_USE      3  /* warn/use data       warn/use data     */
1550 #define PNG_CRC_QUIET_USE     4  /* quiet/use data      quiet/use data    */
1551 #define PNG_CRC_NO_CHANGE     5  /* use current value   use current value */
1552
1553 /* These functions give the user control over the scan-line filtering in
1554  * libpng and the compression methods used by zlib.  These functions are
1555  * mainly useful for testing, as the defaults should work with most users.
1556  * Those users who are tight on memory or want faster performance at the
1557  * expense of compression can modify them.  See the compression library
1558  * header file (zlib.h) for an explination of the compression functions.
1559  */
1560
1561 /* set the filtering method(s) used by libpng.  Currently, the only valid
1562  * value for "method" is 0.
1563  */
1564 extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp png_ptr, int method,
1565    int filters));
1566
1567 /* Flags for png_set_filter() to say which filters to use.  The flags
1568  * are chosen so that they don't conflict with real filter types
1569  * below, in case they are supplied instead of the #defined constants.
1570  * These values should NOT be changed.
1571  */
1572 #define PNG_NO_FILTERS     0x00
1573 #define PNG_FILTER_NONE    0x08
1574 #define PNG_FILTER_SUB     0x10
1575 #define PNG_FILTER_UP      0x20
1576 #define PNG_FILTER_AVG     0x40
1577 #define PNG_FILTER_PAETH   0x80
1578 #define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \
1579                          PNG_FILTER_AVG | PNG_FILTER_PAETH)
1580
1581 /* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now.
1582  * These defines should NOT be changed.
1583  */
1584 #define PNG_FILTER_VALUE_NONE  0
1585 #define PNG_FILTER_VALUE_SUB   1
1586 #define PNG_FILTER_VALUE_UP    2
1587 #define PNG_FILTER_VALUE_AVG   3
1588 #define PNG_FILTER_VALUE_PAETH 4
1589 #define PNG_FILTER_VALUE_LAST  5
1590
1591 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* EXPERIMENTAL */
1592 /* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_
1593  * defines, either the default (minimum-sum-of-absolute-differences), or
1594  * the experimental method (weighted-minimum-sum-of-absolute-differences).
1595  *
1596  * Weights are factors >= 1.0, indicating how important it is to keep the
1597  * filter type consistent between rows.  Larger numbers mean the current
1598  * filter is that many times as likely to be the same as the "num_weights"
1599  * previous filters.  This is cumulative for each previous row with a weight.
1600  * There needs to be "num_weights" values in "filter_weights", or it can be
1601  * NULL if the weights aren't being specified.  Weights have no influence on
1602  * the selection of the first row filter.  Well chosen weights can (in theory)
1603  * improve the compression for a given image.
1604  *
1605  * Costs are factors >= 1.0 indicating the relative decoding costs of a
1606  * filter type.  Higher costs indicate more decoding expense, and are
1607  * therefore less likely to be selected over a filter with lower computational
1608  * costs.  There needs to be a value in "filter_costs" for each valid filter
1609  * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't
1610  * setting the costs.  Costs try to improve the speed of decompression without
1611  * unduly increasing the compressed image size.
1612  *
1613  * A negative weight or cost indicates the default value is to be used, and
1614  * values in the range [0.0, 1.0) indicate the value is to remain unchanged.
1615  * The default values for both weights and costs are currently 1.0, but may
1616  * change if good general weighting/cost heuristics can be found.  If both
1617  * the weights and costs are set to 1.0, this degenerates the WEIGHTED method
1618  * to the UNWEIGHTED method, but with added encoding time/computation.
1619  */
1620 #ifdef PNG_FLOATING_POINT_SUPPORTED
1621 extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr,
1622    int heuristic_method, int num_weights, png_doublep filter_weights,
1623    png_doublep filter_costs));
1624 #endif
1625 #endif /*  PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */
1626
1627 /* Heuristic used for row filter selection.  These defines should NOT be
1628  * changed.
1629  */
1630 #define PNG_FILTER_HEURISTIC_DEFAULT    0  /* Currently "UNWEIGHTED" */
1631 #define PNG_FILTER_HEURISTIC_UNWEIGHTED 1  /* Used by libpng < 0.95 */
1632 #define PNG_FILTER_HEURISTIC_WEIGHTED   2  /* Experimental feature */
1633 #define PNG_FILTER_HEURISTIC_LAST       3  /* Not a valid value */
1634
1635 /* Set the library compression level.  Currently, valid values range from
1636  * 0 - 9, corresponding directly to the zlib compression levels 0 - 9
1637  * (0 - no compression, 9 - "maximal" compression).  Note that tests have
1638  * shown that zlib compression levels 3-6 usually perform as well as level 9
1639  * for PNG images, and do considerably fewer caclulations.  In the future,
1640  * these values may not correspond directly to the zlib compression levels.
1641  */
1642 extern PNG_EXPORT(void,png_set_compression_level) PNGARG((png_structp png_ptr,
1643    int level));
1644
1645 extern PNG_EXPORT(void,png_set_compression_mem_level)
1646    PNGARG((png_structp png_ptr, int mem_level));
1647
1648 extern PNG_EXPORT(void,png_set_compression_strategy)
1649    PNGARG((png_structp png_ptr, int strategy));
1650
1651 extern PNG_EXPORT(void,png_set_compression_window_bits)
1652    PNGARG((png_structp png_ptr, int window_bits));
1653
1654 extern PNG_EXPORT(void,png_set_compression_method) PNGARG((png_structp png_ptr,
1655    int method));
1656
1657 /* These next functions are called for input/output, memory, and error
1658  * handling.  They are in the file pngrio.c, pngwio.c, and pngerror.c,
1659  * and call standard C I/O routines such as fread(), fwrite(), and
1660  * fprintf().  These functions can be made to use other I/O routines
1661  * at run time for those applications that need to handle I/O in a
1662  * different manner by calling png_set_???_fn().  See libpng.txt for
1663  * more information.
1664  */
1665
1666 #if !defined(PNG_NO_STDIO)
1667 /* Initialize the input/output for the PNG file to the default functions. */
1668 extern PNG_EXPORT(void,png_init_io) PNGARG((png_structp png_ptr, png_FILE_p fp));
1669 #endif
1670
1671 /* Replace the (error and abort), and warning functions with user
1672  * supplied functions.  If no messages are to be printed you must still
1673  * write and use replacement functions. The replacement error_fn should
1674  * still do a longjmp to the last setjmp location if you are using this
1675  * method of error handling.  If error_fn or warning_fn is NULL, the
1676  * default function will be used.
1677  */
1678
1679 extern PNG_EXPORT(void,png_set_error_fn) PNGARG((png_structp png_ptr,
1680    png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn));
1681
1682 /* Return the user pointer associated with the error functions */
1683 extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr));
1684
1685 /* Replace the default data output functions with a user supplied one(s).
1686  * If buffered output is not used, then output_flush_fn can be set to NULL.
1687  * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time
1688  * output_flush_fn will be ignored (and thus can be NULL).
1689  */
1690 extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr,
1691    png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn));
1692
1693 /* Replace the default data input function with a user supplied one. */
1694 extern PNG_EXPORT(void,png_set_read_fn) PNGARG((png_structp png_ptr,
1695    png_voidp io_ptr, png_rw_ptr read_data_fn));
1696
1697 /* Return the user pointer associated with the I/O functions */
1698 extern PNG_EXPORT(png_voidp,png_get_io_ptr) PNGARG((png_structp png_ptr));
1699
1700 extern PNG_EXPORT(void,png_set_read_status_fn) PNGARG((png_structp png_ptr,
1701    png_read_status_ptr read_row_fn));
1702
1703 extern PNG_EXPORT(void,png_set_write_status_fn) PNGARG((png_structp png_ptr,
1704    png_write_status_ptr write_row_fn));
1705
1706 #ifdef PNG_USER_MEM_SUPPORTED
1707 /* Replace the default memory allocation functions with user supplied one(s). */
1708 extern PNG_EXPORT(void,png_set_mem_fn) PNGARG((png_structp png_ptr,
1709    png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn));
1710 /* Return the user pointer associated with the memory functions */
1711 extern PNG_EXPORT(png_voidp,png_get_mem_ptr) PNGARG((png_structp png_ptr));
1712 #endif
1713
1714 #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
1715     defined(PNG_LEGACY_SUPPORTED)
1716 extern PNG_EXPORT(void,png_set_read_user_transform_fn) PNGARG((png_structp
1717    png_ptr, png_user_transform_ptr read_user_transform_fn));
1718 #endif
1719
1720 #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
1721     defined(PNG_LEGACY_SUPPORTED)
1722 extern PNG_EXPORT(void,png_set_write_user_transform_fn) PNGARG((png_structp
1723    png_ptr, png_user_transform_ptr write_user_transform_fn));
1724 #endif
1725
1726 #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
1727     defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
1728     defined(PNG_LEGACY_SUPPORTED)
1729 extern PNG_EXPORT(void,png_set_user_transform_info) PNGARG((png_structp
1730    png_ptr, png_voidp user_transform_ptr, int user_transform_depth,
1731    int user_transform_channels));
1732 /* Return the user pointer associated with the user transform functions */
1733 extern PNG_EXPORT(png_voidp,png_get_user_transform_ptr)
1734    PNGARG((png_structp png_ptr));
1735 #endif
1736
1737 #ifdef PNG_USER_CHUNKS_SUPPORTED
1738 extern PNG_EXPORT(void,png_set_read_user_chunk_fn) PNGARG((png_structp png_ptr,
1739    png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn));
1740 extern PNG_EXPORT(png_voidp,png_get_user_chunk_ptr) PNGARG((png_structp
1741    png_ptr));
1742 #endif
1743
1744 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED
1745 /* Sets the function callbacks for the push reader, and a pointer to a
1746  * user-defined structure available to the callback functions.
1747  */
1748 extern PNG_EXPORT(void,png_set_progressive_read_fn) PNGARG((png_structp png_ptr,
1749    png_voidp progressive_ptr,
1750    png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
1751    png_progressive_end_ptr end_fn));
1752
1753 /* returns the user pointer associated with the push read functions */
1754 extern PNG_EXPORT(png_voidp,png_get_progressive_ptr)
1755    PNGARG((png_structp png_ptr));
1756
1757 /* function to be called when data becomes available */
1758 extern PNG_EXPORT(void,png_process_data) PNGARG((png_structp png_ptr,
1759    png_infop info_ptr, png_bytep buffer, png_size_t buffer_size));
1760
1761 /* function that combines rows.  Not very much different than the
1762  * png_combine_row() call.  Is this even used?????
1763  */
1764 extern PNG_EXPORT(void,png_progressive_combine_row) PNGARG((png_structp png_ptr,
1765    png_bytep old_row, png_bytep new_row));
1766 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
1767
1768 extern PNG_EXPORT(png_voidp,png_malloc) PNGARG((png_structp png_ptr,
1769    png_uint_32 size));
1770
1771 /* frees a pointer allocated by png_malloc() */
1772 extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr));
1773
1774 /* Free data that was allocated internally */
1775 extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr,
1776    png_infop info_ptr, png_uint_32 free_me, int num));
1777 #ifdef PNG_FREE_ME_SUPPORTED
1778 /* Reassign responsibility for freeing existing data, whether allocated
1779  * by libpng or by the application */
1780 extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr,
1781    png_infop info_ptr, int freer, png_uint_32 mask));
1782 #endif
1783 /* assignments for png_data_freer */
1784 #define PNG_DESTROY_WILL_FREE_DATA 1
1785 #define PNG_SET_WILL_FREE_DATA 1
1786 #define PNG_USER_WILL_FREE_DATA 2
1787 /* Flags for png_ptr->free_me and info_ptr->free_me */
1788 #define PNG_FREE_HIST 0x0008
1789 #define PNG_FREE_ICCP 0x0010
1790 #define PNG_FREE_SPLT 0x0020
1791 #define PNG_FREE_ROWS 0x0040
1792 #define PNG_FREE_PCAL 0x0080
1793 #define PNG_FREE_SCAL 0x0100
1794 #define PNG_FREE_UNKN 0x0200
1795 #define PNG_FREE_LIST 0x0400
1796 #define PNG_FREE_PLTE 0x1000
1797 #define PNG_FREE_TRNS 0x2000
1798 #define PNG_FREE_TEXT 0x4000
1799 #define PNG_FREE_ALL  0x7fff
1800 #define PNG_FREE_MUL  0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */
1801
1802 #ifdef PNG_USER_MEM_SUPPORTED
1803 extern PNG_EXPORT(png_voidp,png_malloc_default) PNGARG((png_structp png_ptr,
1804    png_uint_32 size));
1805 extern PNG_EXPORT(void,png_free_default) PNGARG((png_structp png_ptr,
1806    png_voidp ptr));
1807 #endif
1808
1809 extern PNG_EXPORT(png_voidp,png_memcpy_check) PNGARG((png_structp png_ptr,
1810    png_voidp s1, png_voidp s2, png_uint_32 size));
1811
1812 extern PNG_EXPORT(png_voidp,png_memset_check) PNGARG((png_structp png_ptr,
1813    png_voidp s1, int value, png_uint_32 size));
1814
1815 #if defined(USE_FAR_KEYWORD)  /* memory model conversion function */
1816 extern void *png_far_to_near PNGARG((png_structp png_ptr,png_voidp ptr,
1817    int check));
1818 #endif /* USE_FAR_KEYWORD */
1819
1820 /* Fatal error in PNG image of libpng - can't continue */
1821 extern PNG_EXPORT(void,png_error) PNGARG((png_structp png_ptr,
1822    png_const_charp error));
1823
1824 /* The same, but the chunk name is prepended to the error string. */
1825 extern PNG_EXPORT(void,png_chunk_error) PNGARG((png_structp png_ptr,
1826    png_const_charp error));
1827
1828 /* Non-fatal error in libpng.  Can continue, but may have a problem. */
1829 extern PNG_EXPORT(void,png_warning) PNGARG((png_structp png_ptr,
1830    png_const_charp message));
1831
1832 /* Non-fatal error in libpng, chunk name is prepended to message. */
1833 extern PNG_EXPORT(void,png_chunk_warning) PNGARG((png_structp png_ptr,
1834    png_const_charp message));
1835
1836 /* The png_set_<chunk> functions are for storing values in the png_info_struct.
1837  * Similarly, the png_get_<chunk> calls are used to read values from the
1838  * png_info_struct, either storing the parameters in the passed variables, or
1839  * setting pointers into the png_info_struct where the data is stored.  The
1840  * png_get_<chunk> functions return a non-zero value if the data was available
1841  * in info_ptr, or return zero and do not change any of the parameters if the
1842  * data was not available.
1843  *
1844  * These functions should be used instead of directly accessing png_info
1845  * to avoid problems with future changes in the size and internal layout of
1846  * png_info_struct.
1847  */
1848 /* Returns "flag" if chunk data is valid in info_ptr. */
1849 extern PNG_EXPORT(png_uint_32,png_get_valid) PNGARG((png_structp png_ptr,
1850 png_infop info_ptr, png_uint_32 flag));
1851
1852 /* Returns number of bytes needed to hold a transformed row. */
1853 extern PNG_EXPORT(png_uint_32,png_get_rowbytes) PNGARG((png_structp png_ptr,
1854 png_infop info_ptr));
1855
1856 #if defined(PNG_INFO_IMAGE_SUPPORTED)
1857 /* Returns row_pointers, which is an array of pointers to scanlines that was
1858 returned from png_read_png(). */
1859 extern PNG_EXPORT(png_bytepp,png_get_rows) PNGARG((png_structp png_ptr,
1860 png_infop info_ptr));
1861 /* Set row_pointers, which is an array of pointers to scanlines for use
1862 by png_write_png(). */
1863 extern PNG_EXPORT(void,png_set_rows) PNGARG((png_structp png_ptr,
1864    png_infop info_ptr, png_bytepp row_pointers));
1865 #endif
1866
1867 /* Returns number of color channels in image. */
1868 extern PNG_EXPORT(png_byte,png_get_channels) PNGARG((png_structp png_ptr,
1869 png_infop info_ptr));
1870
1871 #ifdef PNG_EASY_ACCESS_SUPPORTED
1872 /* Returns image width in pixels. */
1873 extern PNG_EXPORT(png_uint_32, png_get_image_width) PNGARG((png_structp
1874 png_ptr, png_infop info_ptr));
1875
1876 /* Returns image height in pixels. */
1877 extern PNG_EXPORT(png_uint_32, png_get_image_height) PNGARG((png_structp
1878 png_ptr, png_infop info_ptr));
1879
1880 /* Returns image bit_depth. */
1881 extern PNG_EXPORT(png_byte, png_get_bit_depth) PNGARG((png_structp
1882 png_ptr, png_infop info_ptr));
1883
1884 /* Returns image color_type. */
1885 extern PNG_EXPORT(png_byte, png_get_color_type) PNGARG((png_structp
1886 png_ptr, png_infop info_ptr));
1887
1888 /* Returns image filter_type. */
1889 extern PNG_EXPORT(png_byte, png_get_filter_type) PNGARG((png_structp
1890 png_ptr, png_infop info_ptr));
1891
1892 /* Returns image interlace_type. */
1893 extern PNG_EXPORT(png_byte, png_get_interlace_type) PNGARG((png_structp
1894 png_ptr, png_infop info_ptr));
1895
1896 /* Returns image compression_type. */
1897 extern PNG_EXPORT(png_byte, png_get_compression_type) PNGARG((png_structp
1898 png_ptr, png_infop info_ptr));
1899
1900 /* Returns image resolution in pixels per meter, from pHYs chunk data. */
1901 extern PNG_EXPORT(png_uint_32, png_get_pixels_per_meter) PNGARG((png_structp
1902 png_ptr, png_infop info_ptr));
1903 extern PNG_EXPORT(png_uint_32, png_get_x_pixels_per_meter) PNGARG((png_structp
1904 png_ptr, png_infop info_ptr));
1905 extern PNG_EXPORT(png_uint_32, png_get_y_pixels_per_meter) PNGARG((png_structp
1906 png_ptr, png_infop info_ptr));
1907
1908 /* Returns pixel aspect ratio, computed from pHYs chunk data.  */
1909 #ifdef PNG_FLOATING_POINT_SUPPORTED
1910 extern PNG_EXPORT(float, png_get_pixel_aspect_ratio) PNGARG((png_structp
1911 png_ptr, png_infop info_ptr));
1912 #endif
1913
1914 /* Returns image x, y offset in pixels or microns, from oFFs chunk data. */
1915 extern PNG_EXPORT(png_int_32, png_get_x_offset_pixels) PNGARG((png_structp
1916 png_ptr, png_infop info_ptr));
1917 extern PNG_EXPORT(png_int_32, png_get_y_offset_pixels) PNGARG((png_structp
1918 png_ptr, png_infop info_ptr));
1919 extern PNG_EXPORT(png_int_32, png_get_x_offset_microns) PNGARG((png_structp
1920 png_ptr, png_infop info_ptr));
1921 extern PNG_EXPORT(png_int_32, png_get_y_offset_microns) PNGARG((png_structp
1922 png_ptr, png_infop info_ptr));
1923
1924 #endif /* PNG_EASY_ACCESS_SUPPORTED */
1925
1926 /* Returns pointer to signature string read from PNG header */
1927 extern PNG_EXPORT(png_bytep,png_get_signature) PNGARG((png_structp png_ptr,
1928 png_infop info_ptr));
1929
1930 #if defined(PNG_bKGD_SUPPORTED)
1931 extern PNG_EXPORT(png_uint_32,png_get_bKGD) PNGARG((png_structp png_ptr,
1932    png_infop info_ptr, png_color_16p *background));
1933 #endif
1934
1935 #if defined(PNG_bKGD_SUPPORTED)
1936 extern PNG_EXPORT(void,png_set_bKGD) PNGARG((png_structp png_ptr,
1937    png_infop info_ptr, png_color_16p background));
1938 #endif
1939
1940 #if defined(PNG_cHRM_SUPPORTED)
1941 #ifdef PNG_FLOATING_POINT_SUPPORTED
1942 extern PNG_EXPORT(png_uint_32,png_get_cHRM) PNGARG((png_structp png_ptr,
1943    png_infop info_ptr, double *white_x, double *white_y, double *red_x,
1944    double *red_y, double *green_x, double *green_y, double *blue_x,
1945    double *blue_y));
1946 #endif
1947 #ifdef PNG_FIXED_POINT_SUPPORTED
1948 extern PNG_EXPORT(png_uint_32,png_get_cHRM_fixed) PNGARG((png_structp png_ptr,
1949    png_infop info_ptr, png_fixed_point *int_white_x, png_fixed_point
1950    *int_white_y, png_fixed_point *int_red_x, png_fixed_point *int_red_y,
1951    png_fixed_point *int_green_x, png_fixed_point *int_green_y, png_fixed_point
1952    *int_blue_x, png_fixed_point *int_blue_y));
1953 #endif
1954 #endif
1955
1956 #if defined(PNG_cHRM_SUPPORTED)
1957 #ifdef PNG_FLOATING_POINT_SUPPORTED
1958 extern PNG_EXPORT(void,png_set_cHRM) PNGARG((png_structp png_ptr,
1959    png_infop info_ptr, double white_x, double white_y, double red_x,
1960    double red_y, double green_x, double green_y, double blue_x, double blue_y));
1961 #endif
1962 #ifdef PNG_FIXED_POINT_SUPPORTED
1963 extern PNG_EXPORT(void,png_set_cHRM_fixed) PNGARG((png_structp png_ptr,
1964    png_infop info_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y,
1965    png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point
1966    int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x,
1967    png_fixed_point int_blue_y));
1968 #endif
1969 #endif
1970
1971 #if defined(PNG_gAMA_SUPPORTED)
1972 #ifdef PNG_FLOATING_POINT_SUPPORTED
1973 extern PNG_EXPORT(png_uint_32,png_get_gAMA) PNGARG((png_structp png_ptr,
1974    png_infop info_ptr, double *file_gamma));
1975 #endif
1976 extern PNG_EXPORT(png_uint_32,png_get_gAMA_fixed) PNGARG((png_structp png_ptr,
1977    png_infop info_ptr, png_fixed_point *int_file_gamma));
1978 #endif
1979
1980 #if defined(PNG_gAMA_SUPPORTED)
1981 #ifdef PNG_FLOATING_POINT_SUPPORTED
1982 extern PNG_EXPORT(void,png_set_gAMA) PNGARG((png_structp png_ptr,
1983    png_infop info_ptr, double file_gamma));
1984 #endif
1985 extern PNG_EXPORT(void,png_set_gAMA_fixed) PNGARG((png_structp png_ptr,
1986    png_infop info_ptr, png_fixed_point int_file_gamma));
1987 #endif
1988
1989 #if defined(PNG_hIST_SUPPORTED)
1990 extern PNG_EXPORT(png_uint_32,png_get_hIST) PNGARG((png_structp png_ptr,
1991    png_infop info_ptr, png_uint_16p *hist));
1992 #endif
1993
1994 #if defined(PNG_hIST_SUPPORTED)
1995 extern PNG_EXPORT(void,png_set_hIST) PNGARG((png_structp png_ptr,
1996    png_infop info_ptr, png_uint_16p hist));
1997 #endif
1998
1999 extern PNG_EXPORT(png_uint_32,png_get_IHDR) PNGARG((png_structp png_ptr,
2000    png_infop info_ptr, png_uint_32 *width, png_uint_32 *height,
2001    int *bit_depth, int *color_type, int *interlace_method,
2002    int *compression_method, int *filter_method));
2003
2004 extern PNG_EXPORT(void,png_set_IHDR) PNGARG((png_structp png_ptr,
2005    png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth,
2006    int color_type, int interlace_method, int compression_method,
2007    int filter_method));
2008
2009 #if defined(PNG_oFFs_SUPPORTED)
2010 extern PNG_EXPORT(png_uint_32,png_get_oFFs) PNGARG((png_structp png_ptr,
2011    png_infop info_ptr, png_int_32 *offset_x, png_int_32 *offset_y,
2012    int *unit_type));
2013 #endif
2014
2015 #if defined(PNG_oFFs_SUPPORTED)
2016 extern PNG_EXPORT(void,png_set_oFFs) PNGARG((png_structp png_ptr,
2017    png_infop info_ptr, png_int_32 offset_x, png_int_32 offset_y,
2018    int unit_type));
2019 #endif
2020
2021 #if defined(PNG_pCAL_SUPPORTED)
2022 extern PNG_EXPORT(png_uint_32,png_get_pCAL) PNGARG((png_structp png_ptr,
2023    png_infop info_ptr, png_charp *purpose, png_int_32 *X0, png_int_32 *X1,
2024    int *type, int *nparams, png_charp *units, png_charpp *params));
2025 #endif
2026
2027 #if defined(PNG_pCAL_SUPPORTED)
2028 extern PNG_EXPORT(void,png_set_pCAL) PNGARG((png_structp png_ptr,
2029    png_infop info_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1,
2030    int type, int nparams, png_charp units, png_charpp params));
2031 #endif
2032
2033 #if defined(PNG_pHYs_SUPPORTED)
2034 extern PNG_EXPORT(png_uint_32,png_get_pHYs) PNGARG((png_structp png_ptr,
2035    png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type));
2036 #endif
2037
2038 #if defined(PNG_pHYs_SUPPORTED)
2039 extern PNG_EXPORT(void,png_set_pHYs) PNGARG((png_structp png_ptr,
2040    png_infop info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type));
2041 #endif
2042
2043 extern PNG_EXPORT(png_uint_32,png_get_PLTE) PNGARG((png_structp png_ptr,
2044    png_infop info_ptr, png_colorp *palette, int *num_palette));
2045
2046 extern PNG_EXPORT(void,png_set_PLTE) PNGARG((png_structp png_ptr,
2047    png_infop info_ptr, png_colorp palette, int num_palette));
2048
2049 #if defined(PNG_sBIT_SUPPORTED)
2050 extern PNG_EXPORT(png_uint_32,png_get_sBIT) PNGARG((png_structp png_ptr,
2051    png_infop info_ptr, png_color_8p *sig_bit));
2052 #endif
2053
2054 #if defined(PNG_sBIT_SUPPORTED)
2055 extern PNG_EXPORT(void,png_set_sBIT) PNGARG((png_structp png_ptr,
2056    png_infop info_ptr, png_color_8p sig_bit));
2057 #endif
2058
2059 #if defined(PNG_sRGB_SUPPORTED)
2060 extern PNG_EXPORT(png_uint_32,png_get_sRGB) PNGARG((png_structp png_ptr,
2061    png_infop info_ptr, int *intent));
2062 #endif
2063
2064 #if defined(PNG_sRGB_SUPPORTED)
2065 extern PNG_EXPORT(void,png_set_sRGB) PNGARG((png_structp png_ptr,
2066    png_infop info_ptr, int intent));
2067 extern PNG_EXPORT(void,png_set_sRGB_gAMA_and_cHRM) PNGARG((png_structp png_ptr,
2068    png_infop info_ptr, int intent));
2069 #endif
2070
2071 #if defined(PNG_iCCP_SUPPORTED)
2072 extern PNG_EXPORT(png_uint_32,png_get_iCCP) PNGARG((png_structp png_ptr,
2073    png_infop info_ptr, png_charpp name, int *compression_type,
2074    png_charpp profile, png_uint_32 *proflen));
2075    /* Note to maintainer: profile should be png_bytepp */
2076 #endif
2077
2078 #if defined(PNG_iCCP_SUPPORTED)
2079 extern PNG_EXPORT(void,png_set_iCCP) PNGARG((png_structp png_ptr,
2080    png_infop info_ptr, png_charp name, int compression_type,
2081    png_charp profile, png_uint_32 proflen));
2082    /* Note to maintainer: profile should be png_bytep */
2083 #endif
2084
2085 #if defined(PNG_sPLT_SUPPORTED)
2086 extern PNG_EXPORT(png_uint_32,png_get_sPLT) PNGARG((png_structp png_ptr,
2087    png_infop info_ptr, png_sPLT_tpp entries));
2088 #endif
2089
2090 #if defined(PNG_sPLT_SUPPORTED)
2091 extern PNG_EXPORT(void,png_set_sPLT) PNGARG((png_structp png_ptr,
2092    png_infop info_ptr, png_sPLT_tp entries, int nentries));
2093 #endif
2094
2095 #if defined(PNG_TEXT_SUPPORTED)
2096 /* png_get_text also returns the number of text chunks in *num_text */
2097 extern PNG_EXPORT(png_uint_32,png_get_text) PNGARG((png_structp png_ptr,
2098    png_infop info_ptr, png_textp *text_ptr, int *num_text));
2099 #endif
2100
2101 /*
2102  *  Note while png_set_text() will accept a structure whose text,
2103  *  language, and  translated keywords are NULL pointers, the structure
2104  *  returned by png_get_text will always contain regular
2105  *  zero-terminated C strings.  They might be empty strings but
2106  *  they will never be NULL pointers.
2107  */
2108
2109 #if defined(PNG_TEXT_SUPPORTED)
2110 extern PNG_EXPORT(void,png_set_text) PNGARG((png_structp png_ptr,
2111    png_infop info_ptr, png_textp text_ptr, int num_text));
2112 #endif
2113
2114 #if defined(PNG_tIME_SUPPORTED)
2115 extern PNG_EXPORT(png_uint_32,png_get_tIME) PNGARG((png_structp png_ptr,
2116    png_infop info_ptr, png_timep *mod_time));
2117 #endif
2118
2119 #if defined(PNG_tIME_SUPPORTED)
2120 extern PNG_EXPORT(void,png_set_tIME) PNGARG((png_structp png_ptr,
2121    png_infop info_ptr, png_timep mod_time));
2122 #endif
2123
2124 #if defined(PNG_tRNS_SUPPORTED)
2125 extern PNG_EXPORT(png_uint_32,png_get_tRNS) PNGARG((png_structp png_ptr,
2126    png_infop info_ptr, png_bytep *trans, int *num_trans,
2127    png_color_16p *trans_values));
2128 #endif
2129
2130 #if defined(PNG_tRNS_SUPPORTED)
2131 extern PNG_EXPORT(void,png_set_tRNS) PNGARG((png_structp png_ptr,
2132    png_infop info_ptr, png_bytep trans, int num_trans,
2133    png_color_16p trans_values));
2134 #endif
2135
2136 #if defined(PNG_tRNS_SUPPORTED)
2137 #endif
2138
2139 #if defined(PNG_sCAL_SUPPORTED)
2140 #ifdef PNG_FLOATING_POINT_SUPPORTED
2141 extern PNG_EXPORT(png_uint_32,png_get_sCAL) PNGARG((png_structp png_ptr,
2142    png_infop info_ptr, int *unit, double *width, double *height));
2143 #else
2144 #ifdef PNG_FIXED_POINT_SUPPORTED
2145 extern PNG_EXPORT(png_uint_32,png_get_sCAL_s) PNGARG((png_structp png_ptr,
2146    png_infop info_ptr, int *unit, png_charpp swidth, png_charpp sheight));
2147 #endif
2148 #endif
2149 #endif /* PNG_sCAL_SUPPORTED */
2150
2151 #if defined(PNG_sCAL_SUPPORTED)
2152 #ifdef PNG_FLOATING_POINT_SUPPORTED
2153 extern PNG_EXPORT(void,png_set_sCAL) PNGARG((png_structp png_ptr,
2154    png_infop info_ptr, int unit, double width, double height));
2155 #endif
2156 #ifdef PNG_FIXED_POINT_SUPPORTED
2157 extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr,
2158    png_infop info_ptr, int unit, png_charp swidth, png_charp sheight));
2159 #endif
2160 #endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */
2161
2162 #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
2163 /* provide a list of chunks and how they are to be handled, if the built-in
2164    handling or default unknown chunk handling is not desired.  Any chunks not
2165    listed will be handled in the default manner.  The IHDR and IEND chunks
2166    must not be listed.
2167       keep = 0: follow default behavour
2168            = 1: do not keep
2169            = 2: keep only if safe-to-copy
2170            = 3: keep even if unsafe-to-copy
2171 */
2172 extern PNG_EXPORT(void, png_set_keep_unknown_chunks) PNGARG((png_structp
2173    png_ptr, int keep, png_bytep chunk_list, int num_chunks));
2174 extern PNG_EXPORT(void, png_set_unknown_chunks) PNGARG((png_structp png_ptr,
2175    png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns));
2176 extern PNG_EXPORT(void, png_set_unknown_chunk_location)
2177    PNGARG((png_structp png_ptr, png_infop info_ptr, int chunk, int location));
2178 extern PNG_EXPORT(png_uint_32,png_get_unknown_chunks) PNGARG((png_structp
2179    png_ptr, png_infop info_ptr, png_unknown_chunkpp entries));
2180 #endif
2181
2182 /* Png_free_data() will turn off the "valid" flag for anything it frees.
2183    If you need to turn it off for a chunk that your application has freed,
2184    you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); */
2185 extern PNG_EXPORT(void, png_set_invalid) PNGARG((png_structp png_ptr,
2186    png_infop info_ptr, int mask));
2187
2188 #if defined(PNG_INFO_IMAGE_SUPPORTED)
2189 /* The "params" pointer is currently not used and is for future expansion. */
2190 extern PNG_EXPORT(void, png_read_png) PNGARG((png_structp png_ptr,
2191                         png_infop info_ptr,
2192                         int transforms,
2193                         png_voidp params));
2194 extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr,
2195                         png_infop info_ptr,
2196                         int transforms,
2197                         png_voidp params));
2198 #endif
2199
2200 /* Define PNG_DEBUG at compile time for debugging information.  Higher
2201  * numbers for PNG_DEBUG mean more debugging information.  This has
2202  * only been added since version 0.95 so it is not implemented throughout
2203  * libpng yet, but more support will be added as needed.
2204  */
2205 #ifdef PNG_DEBUG
2206 #if (PNG_DEBUG > 0)
2207 #if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER)
2208 #include <crtdbg.h>
2209 #if (PNG_DEBUG > 1)
2210 #define png_debug(l,m)  _RPT0(_CRT_WARN,m)
2211 #define png_debug1(l,m,p1)  _RPT1(_CRT_WARN,m,p1)
2212 #define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m,p1,p2)
2213 #endif
2214 #else /* PNG_DEBUG_FILE || !_MSC_VER */
2215 #ifndef PNG_DEBUG_FILE
2216 #define PNG_DEBUG_FILE stderr
2217 #endif /* PNG_DEBUG_FILE */
2218 #if (PNG_DEBUG > 1)
2219 #define png_debug(l,m) \
2220 { \
2221      int num_tabs=l; \
2222      fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
2223        (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \
2224 }
2225 #define png_debug1(l,m,p1) \
2226 { \
2227      int num_tabs=l; \
2228      fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
2229        (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \
2230 }
2231 #define png_debug2(l,m,p1,p2) \
2232 { \
2233      int num_tabs=l; \
2234      fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
2235        (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \
2236 }
2237 #endif /* (PNG_DEBUG > 1) */
2238 #endif /* _MSC_VER */
2239 #endif /* (PNG_DEBUG > 0) */
2240 #endif /* PNG_DEBUG */
2241 #ifndef png_debug
2242 #define png_debug(l, m)
2243 #endif
2244 #ifndef png_debug1
2245 #define png_debug1(l, m, p1)
2246 #endif
2247 #ifndef png_debug2
2248 #define png_debug2(l, m, p1, p2)
2249 #endif
2250
2251 extern PNG_EXPORT(png_bytep,png_sig_bytes) PNGARG((void));
2252
2253 extern PNG_EXPORT(png_charp,png_get_copyright) PNGARG((png_structp png_ptr));
2254 extern PNG_EXPORT(png_charp,png_get_header_ver) PNGARG((png_structp png_ptr));
2255 extern PNG_EXPORT(png_charp,png_get_header_version) PNGARG((png_structp png_ptr));
2256 extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr));
2257
2258 #ifdef PNG_MNG_FEATURES_SUPPORTED
2259 extern PNG_EXPORT(png_uint_32,png_permit_mng_features) PNGARG((png_structp
2260    png_ptr, png_uint_32 mng_features_permitted));
2261 #endif
2262
2263 /* Added to version 1.2.0 */
2264 #if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
2265 #define PNG_ASM_FLAG_MMX_SUPPORT_COMPILED  0x01         /* not user-settable */
2266 #define PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU    0x02         /* not user-settable */
2267 #define PNG_ASM_FLAG_MMX_READ_COMBINE_ROW  0x04
2268 #define PNG_ASM_FLAG_MMX_READ_INTERLACE    0x08
2269 #define PNG_ASM_FLAG_MMX_READ_FILTER_SUB   0x10
2270 #define PNG_ASM_FLAG_MMX_READ_FILTER_UP    0x20
2271 #define PNG_ASM_FLAG_MMX_READ_FILTER_AVG   0x40
2272 #define PNG_ASM_FLAG_MMX_READ_FILTER_PAETH 0x80
2273 #define PNG_ASM_FLAGS_INITIALIZED          0x80000000   /* not user-settable */
2274
2275 #define PNG_MMX_READ_FLAGS ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW  \
2276                            | PNG_ASM_FLAG_MMX_READ_INTERLACE    \
2277                            | PNG_ASM_FLAG_MMX_READ_FILTER_SUB   \
2278                            | PNG_ASM_FLAG_MMX_READ_FILTER_UP    \
2279                            | PNG_ASM_FLAG_MMX_READ_FILTER_AVG   \
2280                            | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH )
2281 #define PNG_MMX_WRITE_FLAGS ( 0 )
2282
2283 #define PNG_MMX_FLAGS ( PNG_ASM_FLAG_MMX_SUPPORT_COMPILED \
2284                       | PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU   \
2285                       | PNG_MMX_READ_FLAGS                \
2286                       | PNG_MMX_WRITE_FLAGS )
2287
2288 #define PNG_SELECT_READ   1
2289 #define PNG_SELECT_WRITE  2
2290
2291
2292 /* pngget.c */
2293 extern PNG_EXPORT(png_uint_32,png_get_mmx_flagmask)
2294    PNGARG((int flag_select, int *compilerID));
2295
2296 /* pngget.c */
2297 extern PNG_EXPORT(png_uint_32,png_get_asm_flagmask)
2298    PNGARG((int flag_select));
2299
2300 /* pngget.c */
2301 extern PNG_EXPORT(png_uint_32,png_get_asm_flags)
2302    PNGARG((png_structp png_ptr));
2303
2304 /* pngget.c */
2305 extern PNG_EXPORT(png_byte,png_get_mmx_bitdepth_threshold)
2306    PNGARG((png_structp png_ptr));
2307
2308 /* pngget.c */
2309 extern PNG_EXPORT(png_uint_32,png_get_mmx_rowbytes_threshold)
2310    PNGARG((png_structp png_ptr));
2311
2312 /* pngset.c */
2313 extern PNG_EXPORT(void,png_set_asm_flags)
2314    PNGARG((png_structp png_ptr, png_uint_32 asm_flags));
2315
2316 /* pngset.c */
2317 extern PNG_EXPORT(void,png_set_mmx_thresholds)
2318    PNGARG((png_structp png_ptr, png_byte mmx_bitdepth_threshold,
2319    png_uint_32 mmx_rowbytes_threshold));
2320
2321 #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
2322
2323 /* png.c, pnggccrd.c, or pngvcrd.c */
2324 extern PNG_EXPORT(int,png_mmx_support) PNGARG((void));
2325
2326 /* Strip the prepended error numbers ("#nnn ") from error and warning
2327  * messages before passing them to the error or warning handler. */
2328 #ifdef PNG_ERROR_NUMBERS_SUPPORTED
2329 extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp
2330    png_ptr, png_uint_32 strip_mode));
2331 #endif
2332
2333 /* Maintainer: Put new public prototypes here ^, in libpng.3, and project defs */
2334
2335 #define PNG_HEADER_VERSION_STRING \
2336    " libpng version 1.2.0 - September 1, 2001 (header)\n"
2337
2338 #ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED
2339 /* With these routines we avoid an integer divide, which will be slower on
2340  * most machines.  However, it does take more operations than the corresponding
2341  * divide method, so it may be slower on a few RISC systems.  There are two
2342  * shifts (by 8 or 16 bits) and an addition, versus a single integer divide.
2343  *
2344  * Note that the rounding factors are NOT supposed to be the same!  128 and
2345  * 32768 are correct for the NODIV code; 127 and 32767 are correct for the
2346  * standard method.
2347  *
2348  * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ]
2349  */
2350
2351  /* fg and bg should be in `gamma 1.0' space; alpha is the opacity          */
2352
2353 #  define png_composite(composite, fg, alpha, bg)                            \
2354      { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) * (png_uint_16)(alpha) \
2355                         +        (png_uint_16)(bg)*(png_uint_16)(255 -       \
2356                         (png_uint_16)(alpha)) + (png_uint_16)128);           \
2357        (composite) = (png_byte)((temp + (temp >> 8)) >> 8); }
2358
2359 #  define png_composite_16(composite, fg, alpha, bg)                         \
2360      { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) * (png_uint_32)(alpha) \
2361                         + (png_uint_32)(bg)*(png_uint_32)(65535L -           \
2362                         (png_uint_32)(alpha)) + (png_uint_32)32768L);        \
2363        (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); }
2364
2365 #else  /* standard method using integer division */
2366
2367 #  define png_composite(composite, fg, alpha, bg)                            \
2368      (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) +    \
2369        (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) +       \
2370        (png_uint_16)127) / 255)
2371
2372 #  define png_composite_16(composite, fg, alpha, bg)                         \
2373      (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \
2374        (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) +      \
2375        (png_uint_32)32767) / (png_uint_32)65535L)
2376
2377 #endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */
2378
2379 /* These next functions are used internally in the code.  They generally
2380  * shouldn't be used unless you are writing code to add or replace some
2381  * functionality in libpng.  More information about most functions can
2382  * be found in the files where the functions are located.
2383  */
2384
2385 #if defined(PNG_INTERNAL)
2386
2387 /* Various modes of operation.  Note that after an init, mode is set to
2388  * zero automatically when the structure is created.
2389  */
2390 #define PNG_HAVE_IHDR               0x01
2391 #define PNG_HAVE_PLTE               0x02
2392 #define PNG_HAVE_IDAT               0x04
2393 #define PNG_AFTER_IDAT              0x08
2394 #define PNG_HAVE_IEND               0x10
2395 #define PNG_HAVE_gAMA               0x20
2396 #define PNG_HAVE_cHRM               0x40
2397 #define PNG_HAVE_sRGB               0x80
2398 #define PNG_HAVE_CHUNK_HEADER      0x100
2399 #define PNG_WROTE_tIME             0x200
2400 #define PNG_WROTE_INFO_BEFORE_PLTE 0x400
2401 #define PNG_BACKGROUND_IS_GRAY     0x800
2402 #define PNG_HAVE_PNG_SIGNATURE    0x1000
2403
2404 /* flags for the transformations the PNG library does on the image data */
2405 #define PNG_BGR                0x0001
2406 #define PNG_INTERLACE          0x0002
2407 #define PNG_PACK               0x0004
2408 #define PNG_SHIFT              0x0008
2409 #define PNG_SWAP_BYTES         0x0010
2410 #define PNG_INVERT_MONO        0x0020
2411 #define PNG_DITHER             0x0040
2412 #define PNG_BACKGROUND         0x0080
2413 #define PNG_BACKGROUND_EXPAND  0x0100
2414                           /*   0x0200 unused */
2415 #define PNG_16_TO_8            0x0400
2416 #define PNG_RGBA               0x0800
2417 #define PNG_EXPAND             0x1000
2418 #define PNG_GAMMA              0x2000
2419 #define PNG_GRAY_TO_RGB        0x4000
2420 #define PNG_FILLER             0x8000L
2421 #define PNG_PACKSWAP          0x10000L
2422 #define PNG_SWAP_ALPHA        0x20000L
2423 #define PNG_STRIP_ALPHA       0x40000L
2424 #define PNG_INVERT_ALPHA      0x80000L
2425 #define PNG_USER_TRANSFORM   0x100000L
2426 #define PNG_RGB_TO_GRAY_ERR  0x200000L
2427 #define PNG_RGB_TO_GRAY_WARN 0x400000L
2428 #define PNG_RGB_TO_GRAY      0x600000L  /* two bits, RGB_TO_GRAY_ERR|WARN */
2429
2430 /* flags for png_create_struct */
2431 #define PNG_STRUCT_PNG   0x0001
2432 #define PNG_STRUCT_INFO  0x0002
2433
2434 /* Scaling factor for filter heuristic weighting calculations */
2435 #define PNG_WEIGHT_SHIFT 8
2436 #define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT))
2437 #define PNG_COST_SHIFT 3
2438 #define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT))
2439
2440 /* flags for the png_ptr->flags rather than declaring a byte for each one */
2441 #define PNG_FLAG_ZLIB_CUSTOM_STRATEGY     0x0001
2442 #define PNG_FLAG_ZLIB_CUSTOM_LEVEL        0x0002
2443 #define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL    0x0004
2444 #define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS  0x0008
2445 #define PNG_FLAG_ZLIB_CUSTOM_METHOD       0x0010
2446 #define PNG_FLAG_ZLIB_FINISHED            0x0020
2447 #define PNG_FLAG_ROW_INIT                 0x0040
2448 #define PNG_FLAG_FILLER_AFTER             0x0080
2449 #define PNG_FLAG_CRC_ANCILLARY_USE        0x0100
2450 #define PNG_FLAG_CRC_ANCILLARY_NOWARN     0x0200
2451 #define PNG_FLAG_CRC_CRITICAL_USE         0x0400
2452 #define PNG_FLAG_CRC_CRITICAL_IGNORE      0x0800
2453 #define PNG_FLAG_FREE_PLTE                0x1000
2454 #define PNG_FLAG_FREE_TRNS                0x2000
2455 #define PNG_FLAG_FREE_HIST                0x4000
2456 #define PNG_FLAG_KEEP_UNKNOWN_CHUNKS      0x8000L
2457 #define PNG_FLAG_KEEP_UNSAFE_CHUNKS       0x10000L
2458 #define PNG_FLAG_LIBRARY_MISMATCH         0x20000L
2459 #define PNG_FLAG_STRIP_ERROR_NUMBERS      0x40000L
2460 #define PNG_FLAG_STRIP_ERROR_TEXT         0x80000L
2461
2462 /* For use in png_set_keep_unknown, png_handle_as_unknown */
2463 #define HANDLE_CHUNK_AS_DEFAULT   0
2464 #define HANDLE_CHUNK_NEVER        1
2465 #define HANDLE_CHUNK_IF_SAFE      2
2466 #define HANDLE_CHUNK_ALWAYS       3
2467
2468 #define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \
2469                                      PNG_FLAG_CRC_ANCILLARY_NOWARN)
2470
2471 #define PNG_FLAG_CRC_CRITICAL_MASK  (PNG_FLAG_CRC_CRITICAL_USE | \
2472                                      PNG_FLAG_CRC_CRITICAL_IGNORE)
2473
2474 #define PNG_FLAG_CRC_MASK           (PNG_FLAG_CRC_ANCILLARY_MASK | \
2475                                      PNG_FLAG_CRC_CRITICAL_MASK)
2476
2477 /* save typing and make code easier to understand */
2478 #define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \
2479    abs((int)((c1).green) - (int)((c2).green)) + \
2480    abs((int)((c1).blue) - (int)((c2).blue)))
2481
2482 /* variables declared in png.c - only it needs to define PNG_NO_EXTERN */
2483 #if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN)
2484 /* place to hold the signature string for a PNG file. */
2485 #ifdef PNG_USE_GLOBAL_ARRAYS
2486    PNG_EXPORT_VAR (const png_byte FARDATA) png_sig[8];
2487 #else
2488 #define png_sig png_sig_bytes(NULL)
2489 #endif
2490 #endif /* PNG_NO_EXTERN */
2491
2492 /* Constant strings for known chunk types.  If you need to add a chunk,
2493  * define the name here, and add an invocation of the macro in png.c and
2494  * wherever it's needed.
2495  */
2496 #define PNG_IHDR const png_byte png_IHDR[5] = { 73,  72,  68,  82, '\0'}
2497 #define PNG_IDAT const png_byte png_IDAT[5] = { 73,  68,  65,  84, '\0'}
2498 #define PNG_IEND const png_byte png_IEND[5] = { 73,  69,  78,  68, '\0'}
2499 #define PNG_PLTE const png_byte png_PLTE[5] = { 80,  76,  84,  69, '\0'}
2500 #define PNG_bKGD const png_byte png_bKGD[5] = { 98,  75,  71,  68, '\0'}
2501 #define PNG_cHRM const png_byte png_cHRM[5] = { 99,  72,  82,  77, '\0'}
2502 #define PNG_gAMA const png_byte png_gAMA[5] = {103,  65,  77,  65, '\0'}
2503 #define PNG_hIST const png_byte png_hIST[5] = {104,  73,  83,  84, '\0'}
2504 #define PNG_iCCP const png_byte png_iCCP[5] = {105,  67,  67,  80, '\0'}
2505 #define PNG_iTXt const png_byte png_iTXt[5] = {105,  84,  88, 116, '\0'}
2506 #define PNG_oFFs const png_byte png_oFFs[5] = {111,  70,  70, 115, '\0'}
2507 #define PNG_pCAL const png_byte png_pCAL[5] = {112,  67,  65,  76, '\0'}
2508 #define PNG_sCAL const png_byte png_sCAL[5] = {115,  67,  65,  76, '\0'}
2509 #define PNG_pHYs const png_byte png_pHYs[5] = {112,  72,  89, 115, '\0'}
2510 #define PNG_sBIT const png_byte png_sBIT[5] = {115,  66,  73,  84, '\0'}
2511 #define PNG_sPLT const png_byte png_sPLT[5] = {115,  80,  76,  84, '\0'}
2512 #define PNG_sRGB const png_byte png_sRGB[5] = {115,  82,  71,  66, '\0'}
2513 #define PNG_tEXt const png_byte png_tEXt[5] = {116,  69,  88, 116, '\0'}
2514 #define PNG_tIME const png_byte png_tIME[5] = {116,  73,  77,  69, '\0'}
2515 #define PNG_tRNS const png_byte png_tRNS[5] = {116,  82,  78,  83, '\0'}
2516 #define PNG_zTXt const png_byte png_zTXt[5] = {122,  84,  88, 116, '\0'}
2517
2518 #ifdef PNG_USE_GLOBAL_ARRAYS
2519 PNG_EXPORT_VAR (const png_byte FARDATA) png_IHDR[5];
2520 PNG_EXPORT_VAR (const png_byte FARDATA) png_IDAT[5];
2521 PNG_EXPORT_VAR (const png_byte FARDATA) png_IEND[5];
2522 PNG_EXPORT_VAR (const png_byte FARDATA) png_PLTE[5];
2523 PNG_EXPORT_VAR (const png_byte FARDATA) png_bKGD[5];
2524 PNG_EXPORT_VAR (const png_byte FARDATA) png_cHRM[5];
2525 PNG_EXPORT_VAR (const png_byte FARDATA) png_gAMA[5];
2526 PNG_EXPORT_VAR (const png_byte FARDATA) png_hIST[5];
2527 PNG_EXPORT_VAR (const png_byte FARDATA) png_iCCP[5];
2528 PNG_EXPORT_VAR (const png_byte FARDATA) png_iTXt[5];
2529 PNG_EXPORT_VAR (const png_byte FARDATA) png_oFFs[5];
2530 PNG_EXPORT_VAR (const png_byte FARDATA) png_pCAL[5];
2531 PNG_EXPORT_VAR (const png_byte FARDATA) png_sCAL[5];
2532 PNG_EXPORT_VAR (const png_byte FARDATA) png_pHYs[5];
2533 PNG_EXPORT_VAR (const png_byte FARDATA) png_sBIT[5];
2534 PNG_EXPORT_VAR (const png_byte FARDATA) png_sPLT[5];
2535 PNG_EXPORT_VAR (const png_byte FARDATA) png_sRGB[5];
2536 PNG_EXPORT_VAR (const png_byte FARDATA) png_tEXt[5];
2537 PNG_EXPORT_VAR (const png_byte FARDATA) png_tIME[5];
2538 PNG_EXPORT_VAR (const png_byte FARDATA) png_tRNS[5];
2539 PNG_EXPORT_VAR (const png_byte FARDATA) png_zTXt[5];
2540 #endif /* PNG_USE_GLOBAL_ARRAYS */
2541
2542
2543 /* Inline macros to do direct reads of bytes from the input buffer.  These
2544  * require that you are using an architecture that uses PNG byte ordering
2545  * (MSB first) and supports unaligned data storage.  I think that PowerPC
2546  * in big-endian mode and 680x0 are the only ones that will support this.
2547  * The x86 line of processors definitely do not.  The png_get_int_32()
2548  * routine also assumes we are using two's complement format for negative
2549  * values, which is almost certainly true.
2550  */
2551 #if defined(PNG_READ_BIG_ENDIAN_SUPPORTED)
2552 #  if defined(PNG_pCAL_SUPPORTED) || defined(PNG_oFFs_SUPPORTED)
2553 #    define png_get_int_32(buf) ( *((png_int_32p) (buf)))
2554 #  endif
2555 #  define png_get_uint_32(buf) ( *((png_uint_32p) (buf)))
2556 #  define png_get_uint_16(buf) ( *((png_uint_16p) (buf)))
2557 #else
2558 #  if defined(PNG_pCAL_SUPPORTED) || defined(PNG_oFFs_SUPPORTED)
2559 PNG_EXTERN png_int_32 png_get_int_32 PNGARG((png_bytep buf));
2560 #  endif
2561 PNG_EXTERN png_uint_32 png_get_uint_32 PNGARG((png_bytep buf));
2562 PNG_EXTERN png_uint_16 png_get_uint_16 PNGARG((png_bytep buf));
2563 #endif /* !PNG_READ_BIG_ENDIAN_SUPPORTED */
2564
2565 /* Initialize png_ptr struct for reading, and allocate any other memory.
2566  * (old interface - DEPRECATED - use png_create_read_struct instead).
2567  */
2568 extern PNG_EXPORT(void,png_read_init) PNGARG((png_structp png_ptr));
2569 #define png_read_init(png_ptr) png_read_init_3(&png_ptr, \
2570     PNG_LIBPNG_VER_STRING,  sizeof(png_struct));
2571 extern PNG_EXPORT(void,png_read_init_3) PNGARG((png_structpp ptr_ptr,
2572     png_const_charp user_png_ver, png_size_t png_struct_size));
2573 extern PNG_EXPORT(void,png_read_init_2) PNGARG((png_structp png_ptr,
2574     png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t
2575     png_info_size));
2576
2577 /* Initialize png_ptr struct for writing, and allocate any other memory.
2578  * (old interface - DEPRECATED - use png_create_write_struct instead).
2579  */
2580 extern PNG_EXPORT(void,png_write_init) PNGARG((png_structp png_ptr));
2581 #define png_write_init(png_ptr) png_write_init_3(&png_ptr, \
2582     PNG_LIBPNG_VER_STRING, sizeof(png_struct));
2583 extern PNG_EXPORT(void,png_write_init_3) PNGARG((png_structpp ptr_ptr,
2584     png_const_charp user_png_ver, png_size_t png_struct_size));
2585 extern PNG_EXPORT(void,png_write_init_2) PNGARG((png_structp png_ptr,
2586     png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t
2587     png_info_size));
2588
2589 /* Allocate memory for an internal libpng struct */
2590 PNG_EXTERN png_voidp png_create_struct PNGARG((int type));
2591
2592 /* Free memory from internal libpng struct */
2593 PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr));
2594
2595 PNG_EXTERN png_voidp png_create_struct_2 PNGARG((int type, png_malloc_ptr
2596   malloc_fn, png_voidp mem_ptr));
2597 PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr,
2598    png_free_ptr free_fn, png_voidp mem_ptr));
2599
2600 /* Free any memory that info_ptr points to and reset struct. */
2601 PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr,
2602    png_infop info_ptr));
2603
2604 /* Function to allocate memory for zlib. */
2605 PNG_EXTERN voidpf png_zalloc PNGARG((voidpf png_ptr, uInt items, uInt size));
2606
2607 /* Function to free memory for zlib */
2608 PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr));
2609
2610 /* Reset the CRC variable */
2611 PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr));
2612
2613 /* Write the "data" buffer to whatever output you are using. */
2614 PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, png_bytep data,
2615    png_size_t length));
2616
2617 /* Read data from whatever input you are using into the "data" buffer */
2618 PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data,
2619    png_size_t length));
2620
2621 /* Read bytes into buf, and update png_ptr->crc */
2622 PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf,
2623    png_size_t length));
2624
2625 /* Decompress data in a chunk that uses compression */
2626 #if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \
2627     defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED)
2628 PNG_EXTERN png_charp png_decompress_chunk PNGARG((png_structp png_ptr,
2629    int comp_type, png_charp chunkdata, png_size_t chunklength,
2630    png_size_t prefix_length, png_size_t *data_length));
2631 #endif
2632
2633 /* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */
2634 PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip));
2635
2636 /* Read the CRC from the file and compare it to the libpng calculated CRC */
2637 PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr));
2638
2639 /* Calculate the CRC over a section of data.  Note that we are only
2640  * passing a maximum of 64K on systems that have this as a memory limit,
2641  * since this is the maximum buffer size we can specify.
2642  */
2643 PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr,
2644    png_size_t length));
2645
2646 #if defined(PNG_WRITE_FLUSH_SUPPORTED)
2647 PNG_EXTERN void png_flush PNGARG((png_structp png_ptr));
2648 #endif
2649
2650 /* Place a 32-bit number into a buffer in PNG byte order (big-endian).
2651  * The only currently known PNG chunks that use signed numbers are
2652  * the ancillary extension chunks, oFFs and pCAL.
2653  */
2654 PNG_EXTERN void png_save_uint_32 PNGARG((png_bytep buf, png_uint_32 i));
2655
2656 #if defined(PNG_WRITE_pCAL_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED)
2657 PNG_EXTERN void png_save_int_32 PNGARG((png_bytep buf, png_int_32 i));
2658 #endif
2659
2660 /* Place a 16-bit number into a buffer in PNG byte order.
2661  * The parameter is declared unsigned int, not png_uint_16,
2662  * just to avoid potential problems on pre-ANSI C compilers.
2663  */
2664 PNG_EXTERN void png_save_uint_16 PNGARG((png_bytep buf, unsigned int i));
2665
2666 /* simple function to write the signature */
2667 PNG_EXTERN void png_write_sig PNGARG((png_structp png_ptr));
2668
2669 /* write various chunks */
2670
2671 /* Write the IHDR chunk, and update the png_struct with the necessary
2672  * information.
2673  */
2674 PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width,
2675    png_uint_32 height,
2676    int bit_depth, int color_type, int compression_method, int filter_method,
2677    int interlace_method));
2678
2679 PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, png_colorp palette,
2680    png_uint_32 num_pal));
2681
2682 PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data,
2683    png_size_t length));
2684
2685 PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr));
2686
2687 #if defined(PNG_WRITE_gAMA_SUPPORTED)
2688 #ifdef PNG_FLOATING_POINT_SUPPORTED
2689 PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma));
2690 #endif
2691 #ifdef PNG_FIXED_POINT_SUPPORTED
2692 PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, png_fixed_point
2693     file_gamma));
2694 #endif
2695 #endif
2696
2697 #if defined(PNG_WRITE_sBIT_SUPPORTED)
2698 PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, png_color_8p sbit,
2699    int color_type));
2700 #endif
2701
2702 #if defined(PNG_WRITE_cHRM_SUPPORTED)
2703 #ifdef PNG_FLOATING_POINT_SUPPORTED
2704 PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr,
2705    double white_x, double white_y,
2706    double red_x, double red_y, double green_x, double green_y,
2707    double blue_x, double blue_y));
2708 #endif
2709 #ifdef PNG_FIXED_POINT_SUPPORTED
2710 PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr,
2711    png_fixed_point int_white_x, png_fixed_point int_white_y,
2712    png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point
2713    int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x,
2714    png_fixed_point int_blue_y));
2715 #endif
2716 #endif
2717
2718 #if defined(PNG_WRITE_sRGB_SUPPORTED)
2719 PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr,
2720    int intent));
2721 #endif
2722
2723 #if defined(PNG_WRITE_iCCP_SUPPORTED)
2724 PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr,
2725    png_charp name, int compression_type,
2726    png_charp profile, int proflen));
2727    /* Note to maintainer: profile should be png_bytep */
2728 #endif
2729
2730 #if defined(PNG_WRITE_sPLT_SUPPORTED)
2731 PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr,
2732    png_sPLT_tp palette));
2733 #endif
2734
2735 #if defined(PNG_WRITE_tRNS_SUPPORTED)
2736 PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, png_bytep trans,
2737    png_color_16p values, int number, int color_type));
2738 #endif
2739
2740 #if defined(PNG_WRITE_bKGD_SUPPORTED)
2741 PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr,
2742    png_color_16p values, int color_type));
2743 #endif
2744
2745 #if defined(PNG_WRITE_hIST_SUPPORTED)
2746 PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, png_uint_16p hist,
2747    int num_hist));
2748 #endif
2749
2750 #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \
2751     defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
2752 PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr,
2753    png_charp key, png_charpp new_key));
2754 #endif
2755
2756 #if defined(PNG_WRITE_tEXt_SUPPORTED)
2757 PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_charp key,
2758    png_charp text, png_size_t text_len));
2759 #endif
2760
2761 #if defined(PNG_WRITE_zTXt_SUPPORTED)
2762 PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_charp key,
2763    png_charp text, png_size_t text_len, int compression));
2764 #endif
2765
2766 #if defined(PNG_WRITE_iTXt_SUPPORTED)
2767 PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr,
2768    int compression, png_charp key, png_charp lang, png_charp lang_key,
2769    png_charp text));
2770 #endif
2771
2772 #if defined(PNG_WRITE_oFFs_SUPPORTED)
2773 PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr,
2774    png_int_32 x_offset, png_int_32 y_offset, int unit_type));
2775 #endif
2776
2777 #if defined(PNG_WRITE_pCAL_SUPPORTED)
2778 PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose,
2779    png_int_32 X0, png_int_32 X1, int type, int nparams,
2780    png_charp units, png_charpp params));
2781 #endif
2782
2783 #if defined(PNG_WRITE_pHYs_SUPPORTED)
2784 PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr,
2785    png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit,
2786    int unit_type));
2787 #endif
2788
2789 #if defined(PNG_WRITE_tIME_SUPPORTED)
2790 PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr,
2791    png_timep mod_time));
2792 #endif
2793
2794 #if defined(PNG_WRITE_sCAL_SUPPORTED)
2795 #if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO)
2796 PNG_EXTERN void png_write_sCAL PNGARG((png_structp png_ptr,
2797    int unit, double width, double height));
2798 #else
2799 #ifdef PNG_FIXED_POINT_SUPPORTED
2800 PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr,
2801    int unit, png_charp width, png_charp height));
2802 #endif
2803 #endif
2804 #endif
2805
2806 /* Called when finished processing a row of data */
2807 PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr));
2808
2809 /* Internal use only.   Called before first row of data */
2810 PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr));
2811
2812 #if defined(PNG_READ_GAMMA_SUPPORTED)
2813 PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr));
2814 #endif
2815
2816 /* combine a row of data, dealing with alpha, etc. if requested */
2817 PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row,
2818    int mask));
2819
2820 #if defined(PNG_READ_INTERLACING_SUPPORTED)
2821 /* expand an interlaced row */
2822 /* OLD pre-1.0.9 interface:
2823 PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info,
2824    png_bytep row, int pass, png_uint_32 transformations));
2825  */
2826 PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr));
2827 #endif
2828
2829 /* GRR TO DO (2.0 or whenever):  simplify other internal calling interfaces */
2830
2831 #if defined(PNG_WRITE_INTERLACING_SUPPORTED)
2832 /* grab pixels out of a row for an interlaced pass */
2833 PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info,
2834    png_bytep row, int pass));
2835 #endif
2836
2837 /* unfilter a row */
2838 PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr,
2839    png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter));
2840
2841 /* Choose the best filter to use and filter the row data */
2842 PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr,
2843    png_row_infop row_info));
2844
2845 /* Write out the filtered row. */
2846 PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr,
2847    png_bytep filtered_row));
2848 /* finish a row while reading, dealing with interlacing passes, etc. */
2849 PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr));
2850
2851 /* initialize the row buffers, etc. */
2852 PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr));
2853 /* optional call to update the users info structure */
2854 PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr,
2855    png_infop info_ptr));
2856
2857 /* these are the functions that do the transformations */
2858 #if defined(PNG_READ_FILLER_SUPPORTED)
2859 PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info,
2860    png_bytep row, png_uint_32 filler, png_uint_32 flags));
2861 #endif
2862
2863 #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED)
2864 PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info,
2865    png_bytep row));
2866 #endif
2867
2868 #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
2869 PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info,
2870    png_bytep row));
2871 #endif
2872
2873 #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED)
2874 PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info,
2875    png_bytep row));
2876 #endif
2877
2878 #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
2879 PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info,
2880    png_bytep row));
2881 #endif
2882
2883 #if defined(PNG_WRITE_FILLER_SUPPORTED) || \
2884     defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
2885 PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info,
2886    png_bytep row, png_uint_32 flags));
2887 #endif
2888
2889 #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
2890 PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, png_bytep row));
2891 #endif
2892
2893 #if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED)
2894 PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, png_bytep row));
2895 #endif
2896
2897 #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
2898 PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, png_row_infop
2899    row_info, png_bytep row));
2900 #endif
2901
2902 #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
2903 PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info,
2904    png_bytep row));
2905 #endif
2906
2907 #if defined(PNG_READ_PACK_SUPPORTED)
2908 PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, png_bytep row));
2909 #endif
2910
2911 #if defined(PNG_READ_SHIFT_SUPPORTED)
2912 PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, png_bytep row,
2913    png_color_8p sig_bits));
2914 #endif
2915
2916 #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
2917 PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, png_bytep row));
2918 #endif
2919
2920 #if defined(PNG_READ_16_TO_8_SUPPORTED)
2921 PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, png_bytep row));
2922 #endif
2923
2924 #if defined(PNG_READ_DITHER_SUPPORTED)
2925 PNG_EXTERN void png_do_dither PNGARG((png_row_infop row_info,
2926    png_bytep row, png_bytep palette_lookup, png_bytep dither_lookup));
2927
2928 #  if defined(PNG_CORRECT_PALETTE_SUPPORTED)
2929 PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr,
2930    png_colorp palette, int num_palette));
2931 #  endif
2932 #endif
2933
2934 #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
2935 PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, png_bytep row));
2936 #endif
2937
2938 #if defined(PNG_WRITE_PACK_SUPPORTED)
2939 PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info,
2940    png_bytep row, png_uint_32 bit_depth));
2941 #endif
2942
2943 #if defined(PNG_WRITE_SHIFT_SUPPORTED)
2944 PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, png_bytep row,
2945    png_color_8p bit_depth));
2946 #endif
2947
2948 #if defined(PNG_READ_BACKGROUND_SUPPORTED)
2949 PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row,
2950    png_color_16p trans_values, png_color_16p background,
2951    png_color_16p background_1,
2952    png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1,
2953    png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1,
2954    png_uint_16pp gamma_16_to_1, int gamma_shift));
2955 #endif
2956
2957 #if defined(PNG_READ_GAMMA_SUPPORTED)
2958 PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, png_bytep row,
2959    png_bytep gamma_table, png_uint_16pp gamma_16_table,
2960    int gamma_shift));
2961 #endif
2962
2963 #if defined(PNG_READ_EXPAND_SUPPORTED)
2964 PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info,
2965    png_bytep row, png_colorp palette, png_bytep trans, int num_trans));
2966 PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info,
2967    png_bytep row, png_color_16p trans_value));
2968 #endif
2969
2970 /* The following decodes the appropriate chunks, and does error correction,
2971  * then calls the appropriate callback for the chunk if it is valid.
2972  */
2973
2974 /* decode the IHDR chunk */
2975 PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr,
2976    png_uint_32 length));
2977 PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr,
2978    png_uint_32 length));
2979 PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr,
2980    png_uint_32 length));
2981
2982 #if defined(PNG_READ_bKGD_SUPPORTED)
2983 PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr,
2984    png_uint_32 length));
2985 #endif
2986
2987 #if defined(PNG_READ_cHRM_SUPPORTED)
2988 PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr,
2989    png_uint_32 length));
2990 #endif
2991
2992 #if defined(PNG_READ_gAMA_SUPPORTED)
2993 PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr,
2994    png_uint_32 length));
2995 #endif
2996
2997 #if defined(PNG_READ_hIST_SUPPORTED)
2998 PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr,
2999    png_uint_32 length));
3000 #endif
3001
3002 #if defined(PNG_READ_iCCP_SUPPORTED)
3003 extern void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr,
3004    png_uint_32 length));
3005 #endif /* PNG_READ_iCCP_SUPPORTED */
3006
3007 #if defined(PNG_READ_iTXt_SUPPORTED)
3008 PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr,
3009    png_uint_32 length));
3010 #endif
3011
3012 #if defined(PNG_READ_oFFs_SUPPORTED)
3013 PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr,
3014    png_uint_32 length));
3015 #endif
3016
3017 #if defined(PNG_READ_pCAL_SUPPORTED)
3018 PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr,
3019    png_uint_32 length));
3020 #endif
3021
3022 #if defined(PNG_READ_pHYs_SUPPORTED)
3023 PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr,
3024    png_uint_32 length));
3025 #endif
3026
3027 #if defined(PNG_READ_sBIT_SUPPORTED)
3028 PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr,
3029    png_uint_32 length));
3030 #endif
3031
3032 #if defined(PNG_READ_sCAL_SUPPORTED)
3033 PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr,
3034    png_uint_32 length));
3035 #endif
3036
3037 #if defined(PNG_READ_sPLT_SUPPORTED)
3038 extern void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr,
3039    png_uint_32 length));
3040 #endif /* PNG_READ_sPLT_SUPPORTED */
3041
3042 #if defined(PNG_READ_sRGB_SUPPORTED)
3043 PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr,
3044    png_uint_32 length));
3045 #endif
3046
3047 #if defined(PNG_READ_tEXt_SUPPORTED)
3048 PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr,
3049    png_uint_32 length));
3050 #endif
3051
3052 #if defined(PNG_READ_tIME_SUPPORTED)
3053 PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr,
3054    png_uint_32 length));
3055 #endif
3056
3057 #if defined(PNG_READ_tRNS_SUPPORTED)
3058 PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr,
3059    png_uint_32 length));
3060 #endif
3061
3062 #if defined(PNG_READ_zTXt_SUPPORTED)
3063 PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr,
3064    png_uint_32 length));
3065 #endif
3066
3067 #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
3068 PNG_EXTERN int png_handle_as_unknown PNGARG((png_structp png_ptr, png_bytep
3069    chunk_name));
3070 #endif
3071
3072 PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr,
3073    png_infop info_ptr, png_uint_32 length));
3074
3075 PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr,
3076    png_bytep chunk_name));
3077
3078 /* handle the transformations for reading and writing */
3079 PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr));
3080 PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr));
3081
3082 PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr));
3083
3084 #ifdef PNG_PROGRESSIVE_READ_SUPPORTED
3085 PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr,
3086    png_infop info_ptr));
3087 PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr,
3088    png_infop info_ptr));
3089 PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr));
3090 PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr,
3091    png_uint_32 length));
3092 PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr));
3093 PNG_EXTERN void png_push_fill_buffer PNGARG((png_structp png_ptr,
3094    png_bytep buffer, png_size_t length));
3095 PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr));
3096 PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr,
3097    png_bytep buffer, png_size_t buffer_length));
3098 PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr));
3099 PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr,
3100    png_bytep buffer, png_size_t buffer_length));
3101 PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr));
3102 PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr,
3103    png_infop info_ptr, png_uint_32 length));
3104 PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr,
3105    png_infop info_ptr));
3106 PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr,
3107    png_infop info_ptr));
3108 PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row));
3109 PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr,
3110    png_infop info_ptr));
3111 PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr,
3112    png_infop info_ptr));
3113 PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr));
3114 #if defined(PNG_READ_tEXt_SUPPORTED)
3115 PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr,
3116    png_infop info_ptr, png_uint_32 length));
3117 PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr,
3118    png_infop info_ptr));
3119 #endif
3120 #if defined(PNG_READ_zTXt_SUPPORTED)
3121 PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr,
3122    png_infop info_ptr, png_uint_32 length));
3123 PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr,
3124    png_infop info_ptr));
3125 #endif
3126 #if defined(PNG_READ_iTXt_SUPPORTED)
3127 PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr,
3128    png_infop info_ptr, png_uint_32 length));
3129 PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr,
3130    png_infop info_ptr));
3131 #endif
3132
3133 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
3134
3135 #ifdef PNG_MNG_FEATURES_SUPPORTED
3136 PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info,
3137    png_bytep row));
3138 PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info,
3139    png_bytep row));
3140 #endif
3141
3142 #if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
3143 /* png.c */ /* PRIVATE */
3144 PNG_EXTERN void png_init_mmx_flags PNGARG((png_structp png_ptr));
3145 #endif
3146 /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */
3147
3148 #endif /* PNG_INTERNAL */
3149
3150 #ifdef __cplusplus
3151 }
3152 #endif
3153
3154 #endif /* PNG_VERSION_INFO_ONLY */
3155 /* do not put anything past this line */
3156 #endif /* PNG_H */