1 module libpng.png;
2 /* png.h - header file for PNG reference library
3  *
4  * libpng version 1.5.14 - January 24, 2013
5  * Copyright (c) 1998-2013 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  * This code is released under the libpng license (See LICENSE, below)
10  *
11  * Authors and maintainers:
12  *   libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
13  *   libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger
14  *   libpng versions 0.97, January 1998, through 1.5.14 - January 24, 2013: Glenn
15  *   See also "Contributing Authors", below.
16  *
17  * Note about libpng version numbers:
18  *
19  *   Due to various miscommunications, unforeseen code incompatibilities
20  *   and occasional factors outside the authors' control, version numbering
21  *   on the library has not always been consistent and straightforward.
22  *   The following table summarizes matters since version 0.89c, which was
23  *   the first widely used release:
24  *
25  *    source                 png.h  png.h  shared-lib
26  *    version                string   int  version
27  *    -------                ------ -----  ----------
28  *    0.89c "1.0 beta 3"     0.89      89  1.0.89
29  *    0.90  "1.0 beta 4"     0.90      90  0.90  [should have been 2.0.90]
30  *    0.95  "1.0 beta 5"     0.95      95  0.95  [should have been 2.0.95]
31  *    0.96  "1.0 beta 6"     0.96      96  0.96  [should have been 2.0.96]
32  *    0.97b "1.00.97 beta 7" 1.00.97   97  1.0.1 [should have been 2.0.97]
33  *    0.97c                  0.97      97  2.0.97
34  *    0.98                   0.98      98  2.0.98
35  *    0.99                   0.99      98  2.0.99
36  *    0.99a-m                0.99      99  2.0.99
37  *    1.00                   1.00     100  2.1.0 [100 should be 10000]
38  *    1.0.0      (from here on, the   100  2.1.0 [100 should be 10000]
39  *    1.0.1       png.h string is   10001  2.1.0
40  *    1.0.1a-e    identical to the  10002  from here on, the shared library
41  *    1.0.2       source version)   10002  is 2.V where V is the source code
42  *    1.0.2a-b                      10003  version, except as noted.
43  *    1.0.3                         10003
44  *    1.0.3a-d                      10004
45  *    1.0.4                         10004
46  *    1.0.4a-f                      10005
47  *    1.0.5 (+ 2 patches)           10005
48  *    1.0.5a-d                      10006
49  *    1.0.5e-r                      10100 (not source compatible)
50  *    1.0.5s-v                      10006 (not binary compatible)
51  *    1.0.6 (+ 3 patches)           10006 (still binary incompatible)
52  *    1.0.6d-f                      10007 (still binary incompatible)
53  *    1.0.6g                        10007
54  *    1.0.6h                        10007  10.6h (testing xy.z so-numbering)
55  *    1.0.6i                        10007  10.6i
56  *    1.0.6j                        10007  2.1.0.6j (incompatible with 1.0.0)
57  *    1.0.7beta11-14        DLLNUM  10007  2.1.0.7beta11-14 (binary compatible)
58  *    1.0.7beta15-18           1    10007  2.1.0.7beta15-18 (binary compatible)
59  *    1.0.7rc1-2               1    10007  2.1.0.7rc1-2 (binary compatible)
60  *    1.0.7                    1    10007  (still compatible)
61  *    1.0.8beta1-4             1    10008  2.1.0.8beta1-4
62  *    1.0.8rc1                 1    10008  2.1.0.8rc1
63  *    1.0.8                    1    10008  2.1.0.8
64  *    1.0.9beta1-6             1    10009  2.1.0.9beta1-6
65  *    1.0.9rc1                 1    10009  2.1.0.9rc1
66  *    1.0.9beta7-10            1    10009  2.1.0.9beta7-10
67  *    1.0.9rc2                 1    10009  2.1.0.9rc2
68  *    1.0.9                    1    10009  2.1.0.9
69  *    1.0.10beta1              1    10010  2.1.0.10beta1
70  *    1.0.10rc1                1    10010  2.1.0.10rc1
71  *    1.0.10                   1    10010  2.1.0.10
72  *    1.0.11beta1-3            1    10011  2.1.0.11beta1-3
73  *    1.0.11rc1                1    10011  2.1.0.11rc1
74  *    1.0.11                   1    10011  2.1.0.11
75  *    1.0.12beta1-2            2    10012  2.1.0.12beta1-2
76  *    1.0.12rc1                2    10012  2.1.0.12rc1
77  *    1.0.12                   2    10012  2.1.0.12
78  *    1.1.0a-f                 -    10100  2.1.1.0a-f (branch abandoned)
79  *    1.2.0beta1-2             2    10200  2.1.2.0beta1-2
80  *    1.2.0beta3-5             3    10200  3.1.2.0beta3-5
81  *    1.2.0rc1                 3    10200  3.1.2.0rc1
82  *    1.2.0                    3    10200  3.1.2.0
83  *    1.2.1beta1-4             3    10201  3.1.2.1beta1-4
84  *    1.2.1rc1-2               3    10201  3.1.2.1rc1-2
85  *    1.2.1                    3    10201  3.1.2.1
86  *    1.2.2beta1-6            12    10202  12.so.0.1.2.2beta1-6
87  *    1.0.13beta1             10    10013  10.so.0.1.0.13beta1
88  *    1.0.13rc1               10    10013  10.so.0.1.0.13rc1
89  *    1.2.2rc1                12    10202  12.so.0.1.2.2rc1
90  *    1.0.13                  10    10013  10.so.0.1.0.13
91  *    1.2.2                   12    10202  12.so.0.1.2.2
92  *    1.2.3rc1-6              12    10203  12.so.0.1.2.3rc1-6
93  *    1.2.3                   12    10203  12.so.0.1.2.3
94  *    1.2.4beta1-3            13    10204  12.so.0.1.2.4beta1-3
95  *    1.0.14rc1               13    10014  10.so.0.1.0.14rc1
96  *    1.2.4rc1                13    10204  12.so.0.1.2.4rc1
97  *    1.0.14                  10    10014  10.so.0.1.0.14
98  *    1.2.4                   13    10204  12.so.0.1.2.4
99  *    1.2.5beta1-2            13    10205  12.so.0.1.2.5beta1-2
100  *    1.0.15rc1-3             10    10015  10.so.0.1.0.15rc1-3
101  *    1.2.5rc1-3              13    10205  12.so.0.1.2.5rc1-3
102  *    1.0.15                  10    10015  10.so.0.1.0.15
103  *    1.2.5                   13    10205  12.so.0.1.2.5
104  *    1.2.6beta1-4            13    10206  12.so.0.1.2.6beta1-4
105  *    1.0.16                  10    10016  10.so.0.1.0.16
106  *    1.2.6                   13    10206  12.so.0.1.2.6
107  *    1.2.7beta1-2            13    10207  12.so.0.1.2.7beta1-2
108  *    1.0.17rc1               10    10017  12.so.0.1.0.17rc1
109  *    1.2.7rc1                13    10207  12.so.0.1.2.7rc1
110  *    1.0.17                  10    10017  12.so.0.1.0.17
111  *    1.2.7                   13    10207  12.so.0.1.2.7
112  *    1.2.8beta1-5            13    10208  12.so.0.1.2.8beta1-5
113  *    1.0.18rc1-5             10    10018  12.so.0.1.0.18rc1-5
114  *    1.2.8rc1-5              13    10208  12.so.0.1.2.8rc1-5
115  *    1.0.18                  10    10018  12.so.0.1.0.18
116  *    1.2.8                   13    10208  12.so.0.1.2.8
117  *    1.2.9beta1-3            13    10209  12.so.0.1.2.9beta1-3
118  *    1.2.9beta4-11           13    10209  12.so.0.9[.0]
119  *    1.2.9rc1                13    10209  12.so.0.9[.0]
120  *    1.2.9                   13    10209  12.so.0.9[.0]
121  *    1.2.10beta1-7           13    10210  12.so.0.10[.0]
122  *    1.2.10rc1-2             13    10210  12.so.0.10[.0]
123  *    1.2.10                  13    10210  12.so.0.10[.0]
124  *    1.4.0beta1-5            14    10400  14.so.0.0[.0]
125  *    1.2.11beta1-4           13    10211  12.so.0.11[.0]
126  *    1.4.0beta7-8            14    10400  14.so.0.0[.0]
127  *    1.2.11                  13    10211  12.so.0.11[.0]
128  *    1.2.12                  13    10212  12.so.0.12[.0]
129  *    1.4.0beta9-14           14    10400  14.so.0.0[.0]
130  *    1.2.13                  13    10213  12.so.0.13[.0]
131  *    1.4.0beta15-36          14    10400  14.so.0.0[.0]
132  *    1.4.0beta37-87          14    10400  14.so.14.0[.0]
133  *    1.4.0rc01               14    10400  14.so.14.0[.0]
134  *    1.4.0beta88-109         14    10400  14.so.14.0[.0]
135  *    1.4.0rc02-08            14    10400  14.so.14.0[.0]
136  *    1.4.0                   14    10400  14.so.14.0[.0]
137  *    1.4.1beta01-03          14    10401  14.so.14.1[.0]
138  *    1.4.1rc01               14    10401  14.so.14.1[.0]
139  *    1.4.1beta04-12          14    10401  14.so.14.1[.0]
140  *    1.4.1                   14    10401  14.so.14.1[.0]
141  *    1.4.2                   14    10402  14.so.14.2[.0]
142  *    1.4.3                   14    10403  14.so.14.3[.0]
143  *    1.4.4                   14    10404  14.so.14.4[.0]
144  *    1.5.0beta01-58          15    10500  15.so.15.0[.0]
145  *    1.5.0rc01-07            15    10500  15.so.15.0[.0]
146  *    1.5.0                   15    10500  15.so.15.0[.0]
147  *    1.5.1beta01-11          15    10501  15.so.15.1[.0]
148  *    1.5.1rc01-02            15    10501  15.so.15.1[.0]
149  *    1.5.1                   15    10501  15.so.15.1[.0]
150  *    1.5.2beta01-03          15    10502  15.so.15.2[.0]
151  *    1.5.2rc01-03            15    10502  15.so.15.2[.0]
152  *    1.5.2                   15    10502  15.so.15.2[.0]
153  *    1.5.3beta01-10          15    10503  15.so.15.3[.0]
154  *    1.5.3rc01-02            15    10503  15.so.15.3[.0]
155  *    1.5.3beta11             15    10503  15.so.15.3[.0]
156  *    1.5.3 [omitted]
157  *    1.5.4beta01-08          15    10504  15.so.15.4[.0]
158  *    1.5.4rc01               15    10504  15.so.15.4[.0]
159  *    1.5.4                   15    10504  15.so.15.4[.0]
160  *    1.5.5beta01-08          15    10505  15.so.15.5[.0]
161  *    1.5.5rc01               15    10505  15.so.15.5[.0]
162  *    1.5.5                   15    10505  15.so.15.5[.0]
163  *    1.5.6beta01-07          15    10506  15.so.15.6[.0]
164  *    1.5.6rc01-03            15    10506  15.so.15.6[.0]
165  *    1.5.6                   15    10506  15.so.15.6[.0]
166  *    1.5.7beta01-05          15    10507  15.so.15.7[.0]
167  *    1.5.7rc01-03            15    10507  15.so.15.7[.0]
168  *    1.5.7                   15    10507  15.so.15.7[.0]
169  *    1.5.8beta01             15    10508  15.so.15.8[.0]
170  *    1.5.8rc01               15    10508  15.so.15.8[.0]
171  *    1.5.8                   15    10508  15.so.15.8[.0]
172  *    1.5.9beta01-02          15    10509  15.so.15.9[.0]
173  *    1.5.9rc01               15    10509  15.so.15.9[.0]
174  *    1.5.9                   15    10509  15.so.15.9[.0]
175  *    1.5.10beta01-05         15    10510  15.so.15.10[.0]
176  *    1.5.10                  15    10510  15.so.15.10[.0]
177  *    1.5.11beta01            15    10511  15.so.15.11[.0]
178  *    1.5.11rc01-05           15    10511  15.so.15.11[.0]
179  *    1.5.11                  15    10511  15.so.15.11[.0]
180  *    1.5.12                  15    10512  15.so.15.12[.0]
181  *    1.5.13beta01-02         15    10513  15.so.15.13[.0]
182  *    1.5.13rc01              15    10513  15.so.15.13[.0]
183  *    1.5.13                  15    10513  15.so.15.13[.0]
184  *    1.5.14beta01-08         15    10514  15.so.15.14[.0]
185  *    1.5.14rc01-03           15    10514  15.so.15.14[.0]
186  *    1.5.14                  15    10514  15.so.15.14[.0]
187  *
188  *   Henceforth the source version will match the shared-library major
189  *   and minor numbers; the shared-library major version number will be
190  *   used for changes in backward compatibility, as it is intended.  The
191  *   PNG_LIBPNG_VER macro, which is not used within libpng but is available
192  *   for applications, is an unsigned integer of the form xyyzz corresponding
193  *   to the source version x.y.z (leading zeros in y and z).  Beta versions
194  *   were given the previous public release number plus a letter, until
195  *   version 1.0.6j; from then on they were given the upcoming public
196  *   release number plus "betaNN" or "rcNN".
197  *
198  *   Binary incompatibility exists only when applications make direct access
199  *   to the info_ptr or png_ptr members through png.h, and the compiled
200  *   application is loaded with a different version of the library.
201  *
202  *   DLLNUM will change each time there are forward or backward changes
203  *   in binary compatibility (e.g., when a new feature is added).
204  *
205  * See libpng-manual.txt or libpng.3 for more information.  The PNG
206  * specification is available as a W3C Recommendation and as an ISO
207  * Specification, <http://www.w3.org/TR/2003/REC-PNG-20031110/
208  */
209 
210 /*
211  * COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
212  *
213  * If you modify libpng you may insert additional notices immediately following
214  * this sentence.
215  *
216  * This code is released under the libpng license.
217  *
218  * libpng versions 1.2.6, August 15, 2004, through 1.5.14, January 24, 2013, are
219  * Copyright (c) 2004, 2006-2013 Glenn Randers-Pehrson, and are
220  * distributed according to the same disclaimer and license as libpng-1.2.5
221  * with the following individual added to the list of Contributing Authors:
222  *
223  *    Cosmin Truta
224  *
225  * libpng versions 1.0.7, July 1, 2000, through 1.2.5, October 3, 2002, are
226  * Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
227  * distributed according to the same disclaimer and license as libpng-1.0.6
228  * with the following individuals added to the list of Contributing Authors:
229  *
230  *    Simon-Pierre Cadieux
231  *    Eric S. Raymond
232  *    Gilles Vollant
233  *
234  * and with the following additions to the disclaimer:
235  *
236  *    There is no warranty against interference with your enjoyment of the
237  *    library or against infringement.  There is no warranty that our
238  *    efforts or the library will fulfill any of your particular purposes
239  *    or needs.  This library is provided with all faults, and the entire
240  *    risk of satisfactory quality, performance, accuracy, and effort is with
241  *    the user.
242  *
243  * libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
244  * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson, and are
245  * distributed according to the same disclaimer and license as libpng-0.96,
246  * with the following individuals added to the list of Contributing Authors:
247  *
248  *    Tom Lane
249  *    Glenn Randers-Pehrson
250  *    Willem van Schaik
251  *
252  * libpng versions 0.89, June 1996, through 0.96, May 1997, are
253  * Copyright (c) 1996, 1997 Andreas Dilger
254  * Distributed according to the same disclaimer and license as libpng-0.88,
255  * with the following individuals added to the list of Contributing Authors:
256  *
257  *    John Bowler
258  *    Kevin Bracey
259  *    Sam Bushell
260  *    Magnus Holmgren
261  *    Greg Roelofs
262  *    Tom Tanner
263  *
264  * libpng versions 0.5, May 1995, through 0.88, January 1996, are
265  * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
266  *
267  * For the purposes of this copyright and license, "Contributing Authors"
268  * is defined as the following set of individuals:
269  *
270  *    Andreas Dilger
271  *    Dave Martindale
272  *    Guy Eric Schalnat
273  *    Paul Schmidt
274  *    Tim Wegner
275  *
276  * The PNG Reference Library is supplied "AS IS".  The Contributing Authors
277  * and Group 42, Inc. disclaim all warranties, expressed or implied,
278  * including, without limitation, the warranties of merchantability and of
279  * fitness for any purpose.  The Contributing Authors and Group 42, Inc.
280  * assume no liability for direct, indirect, incidental, special, exemplary,
281  * or consequential damages, which may result from the use of the PNG
282  * Reference Library, even if advised of the possibility of such damage.
283  *
284  * Permission is hereby granted to use, copy, modify, and distribute this
285  * source code, or portions hereof, for any purpose, without fee, subject
286  * to the following restrictions:
287  *
288  *   1. The origin of this source code must not be misrepresented.
289  *
290  *   2. Altered versions must be plainly marked as such and must not
291  *      be misrepresented as being the original source.
292  *
293  *   3. This Copyright notice may not be removed or altered from
294  *      any source or altered source distribution.
295  *
296  * The Contributing Authors and Group 42, Inc. specifically permit, without
297  * fee, and encourage the use of this source code as a component to
298  * supporting the PNG file format in commercial products.  If you use this
299  * source code in a product, acknowledgment is not required but would be
300  * appreciated.
301  */
302 
303 /*
304  * A "png_get_copyright" function is available, for convenient use in "about"
305  * boxes and the like:
306  *
307  *     printf("%s", png_get_copyright(NULL);
308  *
309  * Also, the PNG logo (in PNG format, of course) is supplied in the
310  * files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
311  */
312 
313 /*
314  * Libpng is OSI Certified Open Source Software.  OSI Certified is a
315  * certification mark of the Open Source Initiative.
316  */
317 
318 /*
319  * The contributing authors would like to thank all those who helped
320  * with testing, bug fixes, and patience.  This wouldn't have been
321  * possible without all of you.
322  *
323  * Thanks to Frank J. T. Wojcik for helping with the documentation.
324  */
325 
326 /*
327  * Y2K compliance in libpng:
328  * =========================
329  *
330  *    January 24, 2013
331  *
332  *    Since the PNG Development group is an ad-hoc body, we can't make
333  *    an official declaration.
334  *
335  *    This is your unofficial assurance that libpng from version 0.71 and
336  *    upward through 1.5.14 are Y2K compliant.  It is my belief that
337  *    earlier versions were also Y2K compliant.
338  *
339  *    Libpng only has two year fields.  One is a 2-byte unsigned integer
340  *    that will hold years up to 65535.  The other holds the date in text
341  *    format, and will hold years up to 9999.
342  *
343  *    The integer is
344  *        "png_uint_16 year" in png_time_struct.
345  *
346  *    The string is
347  *        "char time_buffer[29]" in png_struct.  This will be no
348  *    longer used in libpng-1.6.0 and will be removed from libpng-1.7.0.
349  *
350  *    There are seven time-related functions:
351  *        png.c: png_convert_to_rfc_1123() in png.c
352  *          (formerly png_convert_to_rfc_1152() in error)
353  *        png_convert_from_struct_tm() in pngwrite.c, called in pngwrite.c
354  *        png_convert_from_time_t() in pngwrite.c
355  *        png_get_tIME() in pngget.c
356  *        png_handle_tIME() in pngrutil.c, called in pngread.c
357  *        png_set_tIME() in pngset.c
358  *        png_write_tIME() in pngwutil.c, called in pngwrite.c
359  *
360  *    All handle dates properly in a Y2K environment.  The
361  *    png_convert_from_time_t() function calls gmtime() to convert from system
362  *    clock time, which returns (year - 1900), which we properly convert to
363  *    the full 4-digit year.  There is a possibility that applications using
364  *    libpng are not passing 4-digit years into the png_convert_to_rfc_1123()
365  *    function, or that they are incorrectly passing only a 2-digit year
366  *    instead of "year - 1900" into the png_convert_from_struct_tm() function,
367  *    but this is not under our control.  The libpng documentation has always
368  *    stated that it works with 4-digit years, and the APIs have been
369  *    documented as such.
370  *
371  *    The tIME chunk itself is also Y2K compliant.  It uses a 2-byte unsigned
372  *    integer to hold the year, and can hold years as large as 65535.
373  *
374  *    zlib, upon which libpng depends, is also Y2K compliant.  It contains
375  *    no date-related code.
376  *
377  *       Glenn Randers-Pehrson
378  *       libpng maintainer
379  *       PNG Development Group
380  */
381 
382 /* This is not the place to learn how to use libpng. The file libpng-manual.txt
383  * describes how to use libpng, and the file example.c summarizes it
384  * with some code on which to build.  This file is useful for looking
385  * at the actual function definitions and structure components.
386  *
387  * If you just need to read a PNG file and don't want to read the documentation
388  * skip to the end of this file and read the section entitled 'simplified API'.
389  */
390 
391 /* Version information for png.h - this should match the version in png.c */
392 enum PNG_LIBPNG_VER_STRING = "1.5.14";
393 enum PNG_HEADER_VERSION_STRING =
394      " libpng version 1.5.14 - January 24, 2013\n";
395 
396 enum PNG_LIBPNG_VER_SONUM = 15;
397 enum PNG_LIBPNG_VER_DLLNUM = 15;
398 
399 /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
400 enum PNG_LIBPNG_VER_MAJOR = 1;
401 enum PNG_LIBPNG_VER_MINOR = 5;
402 enum PNG_LIBPNG_VER_RELEASE = 14;
403 
404 /* This should match the numeric part of the final component of
405  * PNG_LIBPNG_VER_STRING, omitting any leading zero:
406  */
407 
408 enum PNG_LIBPNG_VER_BUILD = 0;
409 
410 /* Release Status */
411 enum PNG_LIBPNG_BUILD_ALPHA = 1;
412 enum PNG_LIBPNG_BUILD_BETA = 2;
413 enum PNG_LIBPNG_BUILD_RC = 3;
414 enum PNG_LIBPNG_BUILD_STABLE = 4;
415 enum PNG_LIBPNG_BUILD_RELEASE_STATUS_MASK = 7;
416 
417 /* Release-Specific Flags */
418 enum PNG_LIBPNG_BUILD_PATCH = 8; /* Can be OR'ed with
419                                        PNG_LIBPNG_BUILD_STABLE only */
420 enum PNG_LIBPNG_BUILD_PRIVATE = 16; /* Cannot be OR'ed with
421                                        PNG_LIBPNG_BUILD_SPECIAL */
422 enum PNG_LIBPNG_BUILD_SPECIAL = 32; /* Cannot be OR'ed with
423                                        PNG_LIBPNG_BUILD_PRIVATE */
424 
425 alias PNG_LIBPNG_BUILD_BASE_TYPE = PNG_LIBPNG_BUILD_STABLE;
426 
427 /* Careful here.  At one time, Guy wanted to use 082, but that would be octal.
428  * We must not include leading zeros.
429  * Versions 0.7 through 1.0.0 were in the range 0 to 100 here (only
430  * version 1.0.0 was mis-numbered 100 instead of 10000).  From
431  * version 1.0.1 it's    xxyyzz, where x=major, y=minor, z=release
432  */
433 enum PNG_LIBPNG_VER = 10514; /* 1.5.14 */
434 
435 /* Library configuration: these options cannot be changed after
436  * the library has been built.
437  */
438     /* If pnglibconf.h is missing, you can
439      * copy scripts/pnglibconf.h.prebuilt to pnglibconf.h
440      */
441 import libpng.pnglibconf;
442 
443 static if (PNG_CONVERT_tIME_SUPPORTED){
444 import core.stdc.time;
445 }
446 
447 /* Machine specific configuration. */
448 public import libpng.pngconf;
449 
450 /*
451  * Added at libpng-1.2.8
452  *
453  * Ref MSDN: Private as priority over Special
454  * VS_FF_PRIVATEBUILD File *was not* built using standard release
455  * procedures. If this value is given, the StringFileInfo block must
456  * contain a PrivateBuild string.
457  *
458  * VS_FF_SPECIALBUILD File *was* built by the original company using
459  * standard release procedures but is a variation of the standard
460  * file of the same version number. If this value is given, the
461  * StringFileInfo block must contain a SpecialBuild string.
462  */
463 
464 version(PNG_USER_PRIVATEBUILD) {/* From pnglibconf.h */
465 	enum PNG_LIBPNG_BUILD_TYPE =
466        (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_PRIVATE);
467 }
468 else {
469 	version(PNG_LIBPNG_SPECIALBUILD) {
470 		enum PNG_LIBPNG_BUILD_TYPE =
471          (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_SPECIAL);
472 	}
473 	else {
474 		enum PNG_LIBPNG_BUILD_TYPE = (PNG_LIBPNG_BUILD_BASE_TYPE);
475 	}
476 }
477 
478 version(PNG_VERSION_INFO_ONLY) {}
479 else {
480 
481 /* Inhibit C++ name-mangling for libpng functions but not for system calls. */
482 extern (C) {
483 
484 /* Version information for C files, stored in png.c.  This had better match
485  * the version above.
486  */
487 @property auto png_libpng_ver() { return png_get_header_ver(null); }
488 
489 /* This file is arranged in several sections:
490  *
491  * 1. Any configuration options that can be specified by for the application
492  *    code when it is built.  (Build time configuration is in pnglibconf.h)
493  * 2. Type definitions (base types are defined in pngconf.h), structure
494  *    definitions.
495  * 3. Exported library functions.
496  *
497  * The library source code has additional files (principally pngpriv.h) that
498  * allow configuration of the library.
499  */
500 /* Section 1: run time configuration
501  * See pnglibconf.h for build time configuration
502  *
503  * Run time configuration allows the application to choose between
504  * implementations of certain arithmetic APIs.  The default is set
505  * at build time and recorded in pnglibconf.h, but it is safe to
506  * override these (and only these) settings.  Note that this won't
507  * change what the library does, only application code, and the
508  * settings can (and probably should) be made on a per-file basis
509  * by setting the #defines before including png.h
510  *
511  * Use macros to read integers from PNG data or use the exported
512  * functions?
513  *   PNG_USE_READ_MACROS: use the macros (see below)  Note that
514  *     the macros evaluate their argument multiple times.
515  *   PNG_NO_USE_READ_MACROS: call the relevant library function.
516  *
517  * Use the alternative algorithm for compositing alpha samples that
518  * does not use division?
519  *   PNG_READ_COMPOSITE_NODIV_SUPPORTED: use the 'no division'
520  *      algorithm.
521  *   PNG_NO_READ_COMPOSITE_NODIV: use the 'division' algorithm.
522  *
523  * How to handle benign errors if PNG_ALLOW_BENIGN_ERRORS is
524  * false?
525  *   PNG_ALLOW_BENIGN_ERRORS: map calls to the benign error
526  *      APIs to png_warning.
527  * Otherwise the calls are mapped to png_error.
528  */
529 
530 /* Section 2: type definitions, including structures and compile time
531  * constants.
532  * See pngconf.h for base types that vary by machine/system
533  */
534 
535 /* This triggers a compiler error in png.c, if png.c and png.h
536  * do not agree upon the version number.
537  */
538 alias char* png_libpng_version_1_5_14;
539 
540 /* Three color definitions.  The order of the red, green, and blue, (and the
541  * exact size) is not important, although the size of the fields need to
542  * be png_byte or png_uint_16 (as defined below).
543  */
544 struct png_color
545 {
546    png_byte red;
547    png_byte green;
548    png_byte blue;
549 }
550 alias png_color * png_colorp;
551 alias const(png_color) * png_const_colorp;
552 alias png_color * * png_colorpp;
553 
554 struct png_color_16
555 {
556    png_byte index;    /* used for palette files */
557    png_uint_16 red;   /* for use in red green blue files */
558    png_uint_16 green;
559    png_uint_16 blue;
560    png_uint_16 gray;  /* for use in grayscale files */
561 }
562 alias png_color_16 * png_color_16p;
563 alias const(png_color_16) * png_const_color_16p;
564 alias png_color_16 * * png_color_16pp;
565 
566 struct png_color_8
567 {
568    png_byte red;   /* for use in red green blue files */
569    png_byte green;
570    png_byte blue;
571    png_byte gray;  /* for use in grayscale files */
572    png_byte alpha; /* for alpha channel files */
573 }
574 alias png_color_8 * png_color_8p;
575 alias const(png_color_8) * png_const_color_8p;
576 alias png_color_8 * * png_color_8pp;
577 
578 /*
579  * The following two structures are used for the in-core representation
580  * of sPLT chunks.
581  */
582 struct png_sPLT_entry
583 {
584    png_uint_16 red;
585    png_uint_16 green;
586    png_uint_16 blue;
587    png_uint_16 alpha;
588    png_uint_16 frequency;
589 }
590 alias png_sPLT_entry * png_sPLT_entryp;
591 alias const(png_sPLT_entry) * png_const_sPLT_entryp;
592 alias png_sPLT_entry * * png_sPLT_entrypp;
593 
594 /*  When the depth of the sPLT palette is 8 bits, the color and alpha samples
595  *  occupy the LSB of their respective members, and the MSB of each member
596  *  is zero-filled.  The frequency member always occupies the full 16 bits.
597  */
598 
599 struct png_sPLT_t
600 {
601    png_charp name;           /* palette name */
602    png_byte depth;           /* depth of palette samples */
603    png_sPLT_entryp entries;  /* palette entries */
604    png_int_32 nentries;      /* number of palette entries */
605 }
606 alias png_sPLT_t * png_sPLT_tp;
607 alias const(png_sPLT_t) * png_const_sPLT_tp;
608 alias png_sPLT_t * * png_sPLT_tpp;
609 
610 static if(PNG_TEXT_SUPPORTED) {
611 /* png_text holds the contents of a text/ztxt/itxt chunk in a PNG file,
612  * and whether that contents is compressed or not.  The "key" field
613  * points to a regular zero-terminated C string.  The "text" fields can be a
614  * regular C string, an empty string, or a NULL pointer.
615  * However, the structure returned by png_get_text() will always contain
616  * the "text" field as a regular zero-terminated C string (possibly
617  * empty), never a NULL pointer, so it can be safely used in printf() and
618  * other string-handling functions.  Note that the "itxt_length", "lang", and
619  * "lang_key" members of the structure only exist when the library is built
620  * with iTXt chunk support.  Prior to libpng-1.4.0 the library was built by
621  * default without iTXt support. Also note that when iTXt *is* supported,
622  * the "lang" and "lang_key" fields contain NULL pointers when the
623  * "compression" field contains * PNG_TEXT_COMPRESSION_NONE or
624  * PNG_TEXT_COMPRESSION_zTXt. Note that the "compression value" is not the
625  * same as what appears in the PNG tEXt/zTXt/iTXt chunk's "compression flag"
626  * which is always 0 or 1, or its "compression method" which is always 0.
627  */
628 struct png_text
629 {
630    int  compression;       /* compression value:
631                              -1: tEXt, none
632                               0: zTXt, deflate
633                               1: iTXt, none
634                               2: iTXt, deflate  */
635    png_charp key;          /* keyword, 1-79 character description of "text" */
636    png_charp text;         /* comment, may be an empty string (ie "")
637                               or a NULL pointer */
638    size_t text_length; /* length of the text string */
639    size_t itxt_length; /* length of the itxt string */
640    png_charp lang;         /* language code, 0-79 characters
641                               or a NULL pointer */
642    png_charp lang_key;     /* keyword translated UTF-8 string, 0 or more
643                               chars or a NULL pointer */
644 }
645 alias png_text * png_textp;
646 alias const(png_text) * png_const_textp;
647 alias png_text * * png_textpp;
648 }
649 
650 /* Supported compression types for text in PNG files (tEXt, and zTXt).
651  * The values of the PNG_TEXT_COMPRESSION_ defines should NOT be changed. */
652 enum PNG_TEXT_COMPRESSION_NONE_WR = -3;
653 enum PNG_TEXT_COMPRESSION_zTXt_WR = -2;
654 enum PNG_TEXT_COMPRESSION_NONE = -1;
655 enum PNG_TEXT_COMPRESSION_zTXt = 0;
656 enum PNG_ITXT_COMPRESSION_NONE = 1;
657 enum PNG_ITXT_COMPRESSION_zTXt = 2;
658 enum PNG_TEXT_COMPRESSION_LAST = 3;  /* Not a valid value */
659 
660 /* png_time is a way to hold the time in an machine independent way.
661  * Two conversions are provided, both from time_t and struct tm.  There
662  * is no portable way to convert to either of these structures, as far
663  * as I know.  If you know of a portable way, send it to me.  As a side
664  * note - PNG has always been Year 2000 compliant!
665  */
666 struct png_time
667 {
668    png_uint_16 year; /* full year, as in, 1995 */
669    png_byte month;   /* month of year, 1 - 12 */
670    png_byte day;     /* day of month, 1 - 31 */
671    png_byte hour;    /* hour of day, 0 - 23 */
672    png_byte minute;  /* minute of hour, 0 - 59 */
673    png_byte second;  /* second of minute, 0 - 60 (for leap seconds) */
674 }
675 alias png_time * png_timep;
676 alias const(png_time) * png_const_timep;
677 alias png_time * * png_timepp;
678 
679 static if(PNG_UNKNOWN_CHUNKS_SUPPORTED) {//(PNG_HANDLE_AS_UNKNOWN_SUPPORTED)
680 /* png_unknown_chunk is a structure to hold queued chunks for which there is
681  * no specific support.  The idea is that we can use this to queue
682  * up private chunks for output even though the library doesn't actually
683  * know about their semantics.
684  */
685 struct png_unknown_chunk
686 {
687     png_byte name[5];
688     png_byte *data;
689     size_t size;
690 
691     /* libpng-using applications should NOT directly modify this byte. */
692     png_byte location; /* mode of operation at read time */
693 }
694 alias png_unknown_chunk * png_unknown_chunkp;
695 alias const(png_unknown_chunk) * png_const_unknown_chunkp;
696 alias png_unknown_chunk * * png_unknown_chunkpp;
697 }
698 
699 /* Values for the unknown chunk location byte */
700 
701 enum PNG_HAVE_IHDR = 0x01;
702 enum PNG_HAVE_PLTE = 0x02;
703 enum PNG_AFTER_IDAT = 0x08;
704 
705 /* The complete definition of png_info has, as of libpng-1.5.0,
706  * been moved into a separate header file that is not accessible to
707  * applications.  Read libpng-manual.txt or libpng.3 for more info.
708  */
709 struct png_info{}
710 alias png_info * png_infop;
711 alias const(png_info) * png_const_infop;
712 alias png_info * * png_infopp;
713 
714 /* Maximum positive integer used in PNG is (2^31)-1 */
715 enum PNG_UINT_31_MAX = cast(uint)0x7fffffffL;
716 enum PNG_UINT_32_MAX = cast(uint)(-1);
717 enum PNG_SIZE_MAX = cast(size_t)(-1);
718 
719 /* These are constants for fixed point values encoded in the
720  * PNG specification manner (x100000)
721  */
722 enum PNG_FP_1 = 100000;
723 enum PNG_FP_HALF = 50000;
724 enum PNG_FP_MAX = (cast(png_fixed_point)0x7fffffffL);
725 enum PNG_FP_MIN = (-PNG_FP_MAX);
726 
727 /* These describe the color_type field in png_info. */
728 /* color type masks */
729 enum PNG_COLOR_MASK_PALETTE = 1;
730 enum PNG_COLOR_MASK_COLOR = 2;
731 enum PNG_COLOR_MASK_ALPHA = 4;
732 
733 /* color types.  Note that not all combinations are legal */
734 enum PNG_COLOR_TYPE_GRAY = 0;
735 enum PNG_COLOR_TYPE_PALETTE = (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE);
736 enum PNG_COLOR_TYPE_RGB        = (PNG_COLOR_MASK_COLOR);
737 enum PNG_COLOR_TYPE_RGB_ALPHA  = (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA);
738 enum PNG_COLOR_TYPE_GRAY_ALPHA = (PNG_COLOR_MASK_ALPHA);
739 /* aliases */
740 alias PNG_COLOR_TYPE_RGBA = PNG_COLOR_TYPE_RGB_ALPHA;
741 alias PNG_COLOR_TYPE_GA = PNG_COLOR_TYPE_GRAY_ALPHA;
742 
743 /* This is for compression type. PNG 1.0-1.2 only define the single type. */
744 enum PNG_COMPRESSION_TYPE_BASE = 0; /* Deflate method 8, 32K window */
745 alias PNG_COMPRESSION_TYPE_DEFAULT = PNG_COMPRESSION_TYPE_BASE;
746 
747 /* This is for filter type. PNG 1.0-1.2 only define the single type. */
748 enum PNG_FILTER_TYPE_BASE = 0; /* Single row per-byte filtering */
749 enum PNG_INTRAPIXEL_DIFFERENCING = 64; /* Used only in MNG datastreams */
750 alias PNG_FILTER_TYPE_DEFAULT = PNG_FILTER_TYPE_BASE;
751 
752 /* These are for the interlacing type.  These values should NOT be changed. */
753 enum PNG_INTERLACE_NONE = 0; /* Non-interlaced image */
754 enum PNG_INTERLACE_ADAM7 = 1; /* Adam7 interlacing */
755 enum PNG_INTERLACE_LAST = 2; /* Not a valid value */
756 
757 /* These are for the oFFs chunk.  These values should NOT be changed. */
758 enum PNG_OFFSET_PIXEL = 0; /* Offset in pixels */
759 enum PNG_OFFSET_MICROMETER = 1; /* Offset in micrometers (1/10^6 meter) */
760 enum PNG_OFFSET_LAST = 2; /* Not a valid value */
761 
762 /* These are for the pCAL chunk.  These values should NOT be changed. */
763 enum PNG_EQUATION_LINEAR = 0; /* Linear transformation */
764 enum PNG_EQUATION_BASE_E = 1; /* Exponential base e transform */
765 enum PNG_EQUATION_ARBITRARY = 2; /* Arbitrary base exponential transform */
766 enum PNG_EQUATION_HYPERBOLIC = 3; /* Hyperbolic sine transformation */
767 enum PNG_EQUATION_LAST = 4; /* Not a valid value */
768 
769 /* These are for the sCAL chunk.  These values should NOT be changed. */
770 enum PNG_SCALE_UNKNOWN = 0; /* unknown unit (image scale) */
771 enum PNG_SCALE_METER = 1; /* meters per pixel */
772 enum PNG_SCALE_RADIAN = 2; /* radians per pixel */
773 enum PNG_SCALE_LAST = 3; /* Not a valid value */
774 
775 /* These are for the pHYs chunk.  These values should NOT be changed. */
776 enum PNG_RESOLUTION_UNKNOWN = 0; /* pixels/unknown unit (aspect ratio) */
777 enum PNG_RESOLUTION_METER = 1; /* pixels/meter */
778 enum PNG_RESOLUTION_LAST = 2; /* Not a valid value */
779 
780 /* These are for the sRGB chunk.  These values should NOT be changed. */
781 enum PNG_sRGB_INTENT_PERCEPTUAL = 0;
782 enum PNG_sRGB_INTENT_RELATIVE = 1;
783 enum PNG_sRGB_INTENT_SATURATION = 2;
784 enum PNG_sRGB_INTENT_ABSOLUTE = 3;
785 enum PNG_sRGB_INTENT_LAST = 4; /* Not a valid value */
786 
787 /* This is for text chunks */
788 enum PNG_KEYWORD_MAX_LENGTH = 79;
789 
790 /* Maximum number of entries in PLTE/sPLT/tRNS arrays */
791 enum PNG_MAX_PALETTE_LENGTH = 256;
792 
793 /* These determine if an ancillary chunk's data has been successfully read
794  * from the PNG header, or if the application has filled in the corresponding
795  * data in the info_struct to be written into the output file.  The values
796  * of the PNG_INFO_<chunk> defines should NOT be changed.
797  */
798 enum PNG_INFO_gAMA = 0x0001;
799 enum PNG_INFO_sBIT = 0x0002;
800 enum PNG_INFO_cHRM = 0x0004;
801 enum PNG_INFO_PLTE = 0x0008;
802 enum PNG_INFO_tRNS = 0x0010;
803 enum PNG_INFO_bKGD = 0x0020;
804 enum PNG_INFO_hIST = 0x0040;
805 enum PNG_INFO_pHYs = 0x0080;
806 enum PNG_INFO_oFFs = 0x0100;
807 enum PNG_INFO_tIME = 0x0200;
808 enum PNG_INFO_pCAL = 0x0400;
809 enum PNG_INFO_sRGB = 0x0800;   /* GR-P, 0.96a */
810 enum PNG_INFO_iCCP = 0x1000;   /* ESR, 1.0.6 */
811 enum PNG_INFO_sPLT = 0x2000;   /* ESR, 1.0.6 */
812 enum PNG_INFO_sCAL = 0x4000;   /* ESR, 1.0.6 */
813 enum PNG_INFO_IDAT = 0x8000;   /* ESR, 1.0.6 */
814 
815 /* This is used for the transformation routines, as some of them
816  * change these values for the row.  It also should enable using
817  * the routines for other purposes.
818  */
819 struct png_row_info
820 {
821    uint width;    /* width of row */
822    size_t rowbytes;  /* number of bytes in row */
823    png_byte color_type;  /* color type of row */
824    png_byte bit_depth;   /* bit depth of row */
825    png_byte channels;    /* number of channels (1, 2, 3, or 4) */
826    png_byte pixel_depth; /* bits per pixel (depth * channels) */
827 }
828 
829 alias png_row_info * png_row_infop;
830 alias png_row_info * * png_row_infopp;
831 
832 /* The complete definition of png_struct has, as of libpng-1.5.0,
833  * been moved into a separate header file that is not accessible to
834  * applications.  Read libpng-manual.txt or libpng.3 for more info.
835  */
836 struct png_struct {}
837 alias const(png_struct) * png_const_structp;
838 alias png_struct * png_structp;
839 
840 /* These are the function types for the I/O functions and for the functions
841  * that allow the user to override the default I/O functions with his or her
842  * own.  The png_error_ptr type should match that of user-supplied warning
843  * and error functions, while the png_rw_ptr type should match that of the
844  * user read/write data functions.  Note that the 'write' function must not
845  * modify the buffer it is passed. The 'read' function, on the other hand, is
846  * expected to return the read data in the buffer.
847  */
848 alias void function(png_structp, png_const_charp) png_error_ptr;
849 alias void function(png_structp, png_bytep, size_t) png_rw_ptr;
850 alias void function(png_structp) png_flush_ptr;
851 alias void function(png_structp, uint, int) png_read_status_ptr;
852 alias void function(png_structp, uint, int) png_write_status_ptr;
853 
854 static if(PNG_PROGRESSIVE_READ_SUPPORTED) {
855 alias void function(png_structp, png_infop) png_progressive_info_ptr;
856 alias void function(png_structp, png_infop) png_progressive_end_ptr;
857 
858 /* The following callback receives uint row_number, int pass for the
859  * png_bytep data of the row.  When transforming an interlaced image the
860  * row number is the row number within the sub-image of the interlace pass, so
861  * the value will increase to the height of the sub-image (not the full image)
862  * then reset to 0 for the next pass.
863  *
864  * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to
865  * find the output pixel (x,y) given an interlaced sub-image pixel
866  * (row,col,pass).  (See below for these macros.)
867  */
868 alias void function(png_structp, png_bytep, uint, int) png_progressive_row_ptr;
869 }
870 
871 static if(PNG_READ_USER_TRANSFORM_SUPPORTED || PNG_WRITE_USER_TRANSFORM_SUPPORTED){
872 alias void function(png_structp, png_row_infop, png_bytep) png_user_transform_ptr;
873 }
874 
875 static if(PNG_USER_CHUNKS_SUPPORTED) {
876 alias int function(png_structp, png_unknown_chunkp) png_user_chunk_ptr;
877 }
878 static if(PNG_UNKNOWN_CHUNKS_SUPPORTED) {
879 alias void function(png_structp) png_unknown_chunk_ptr;
880 }
881 
882 static if(PNG_SETJMP_SUPPORTED) {
883 /* This must match the function definition in <setjmp.h>, and the application
884  * must include this before png.h to obtain the definition of jmp_buf.  The
885  * function is required, but this is not checked.  If the
886  * function does return the application will crash via an abort() or similar
887  * system level call.
888  *
889  * If you get a warning here while building the library you may need to make
890  * changes to ensure that pnglibconf.h records the calling convention used by
891  * your compiler.  This may be very difficult - try using a different compiler
892  * to build the library!
893  */
894 //alias void function(PNGARG((jmp_buf, int)), alias) png_longjmp_ptr;
895 }
896 
897 /* Transform masks for the high-level interface */
898 enum PNG_TRANSFORM_IDENTITY = 0x0000;    /* read and write */
899 enum PNG_TRANSFORM_STRIP_16 = 0x0001;    /* read only */
900 enum PNG_TRANSFORM_STRIP_ALPHA = 0x0002;    /* read only */
901 enum PNG_TRANSFORM_PACKING = 0x0004;    /* read and write */
902 enum PNG_TRANSFORM_PACKSWAP = 0x0008;    /* read and write */
903 enum PNG_TRANSFORM_EXPAND = 0x0010;    /* read only */
904 enum PNG_TRANSFORM_INVERT_MONO = 0x0020;    /* read and write */
905 enum PNG_TRANSFORM_SHIFT = 0x0040;    /* read and write */
906 enum PNG_TRANSFORM_BGR = 0x0080;    /* read and write */
907 enum PNG_TRANSFORM_SWAP_ALPHA = 0x0100;    /* read and write */
908 enum PNG_TRANSFORM_SWAP_ENDIAN = 0x0200;    /* read and write */
909 enum PNG_TRANSFORM_INVERT_ALPHA = 0x0400;    /* read and write */
910 enum PNG_TRANSFORM_STRIP_FILLER = 0x0800;    /* write only */
911 /* Added to libpng-1.2.34 */
912 alias PNG_TRANSFORM_STRIP_FILLER_BEFORE = PNG_TRANSFORM_STRIP_FILLER;
913 enum PNG_TRANSFORM_STRIP_FILLER_AFTER = 0x1000; /* write only */
914 /* Added to libpng-1.4.0 */
915 enum PNG_TRANSFORM_GRAY_TO_RGB = 0x2000;      /* read only */
916 /* Added to libpng-1.5.4 */
917 enum PNG_TRANSFORM_EXPAND_16 = 0x4000;      /* read only */
918 enum PNG_TRANSFORM_SCALE_16 = 0x8000;      /* read only */
919 
920 /* Flags for MNG supported features */
921 enum PNG_FLAG_MNG_EMPTY_PLTE = 0x01;
922 enum PNG_FLAG_MNG_FILTER_64 = 0x04;
923 enum PNG_ALL_MNG_FEATURES = 0x05;
924 
925 /* NOTE: prior to 1.5 these functions had no 'API' style declaration,
926  * this allowed the zlib default functions to be used on Windows
927  * platforms.  In 1.5 the zlib default malloc (which just calls malloc and
928  * ignores the first argument) should be completely compatible with the
929  * following.
930  */
931 alias png_voidp function(png_structp, png_alloc_size_t) png_malloc_ptr;
932 alias void function(png_structp, png_voidp) png_free_ptr;
933 
934 alias png_struct * * png_structpp;
935 
936 /* Section 3: exported functions
937  * Here are the function definitions most commonly used.  This is not
938  * the place to find out how to use libpng.  See libpng-manual.txt for the
939  * full explanation, see example.c for the summary.  This just provides
940  * a simple one line description of the use of each function.
941  *
942  * The PNG_EXPORT() and PNG_EXPORTA() macros used below are defined in
943  * pngconf.h and in the *.dfn files in the scripts directory.
944  *
945  *   PNG_EXPORT(ordinal, type, name, (args);
946  *
947  *       ordinal:    ordinal that is used while building
948  *                   *.def files. The ordinal value is only
949  *                   relevant when preprocessing png.h with
950  *                   the *.dfn files for building symbol table
951  *                   entries, and are removed by pngconf.h.
952  *       type:       return type of the function
953  *       name:       function name
954  *       args:       function arguments, with types
955  *
956  * When we wish to append attributes to a function prototype we use
957  * the PNG_EXPORTA() macro instead.
958  *
959  *   PNG_EXPORTA(ordinal, type, name, (args), attributes);
960  *
961  *       ordinal, type, name, and args: same as in PNG_EXPORT().
962  *       attributes: function attributes
963  */
964 
965 /* Returns the version number of the library */
966 uint png_access_version_number();
967 
968 /* Tell lib we have already handled the first <num_bytes> magic bytes.
969  * Handling more than 8 bytes from the beginning of the file is an error.
970  */
971 void png_set_sig_bytes(png_structp png_ptr, int num_bytes);
972 
973 /* Check sig[start] through sig[start + num_to_check - 1] to see if it's a
974  * PNG file.  Returns zero if the supplied bytes match the 8-byte PNG
975  * signature, and non-zero otherwise.  Having num_to_check == 0 or
976  * start > 7 will always fail (ie return non-zero).
977  */
978 int png_sig_cmp(png_const_bytep sig, size_t start,
979     size_t num_to_check);
980 
981 /* Simple signature checking function.  This is the same as calling
982  * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n).
983  */
984 auto png_check_sig(S,N)(S sig, N n) { return !png_sig_cmp((sig), 0, (n)); }
985 
986 /* Allocate and initialize png_ptr struct for reading, and any other memory. */
987 extern(C)
988 png_structp png_create_read_struct
989     (png_const_charp user_png_ver, png_voidp error_ptr,
990     png_error_ptr error_fn, png_error_ptr warn_fn);
991 
992 /* Allocate and initialize png_ptr struct for writing, and any other memory */
993 png_structp png_create_write_struct
994     (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn,
995     png_error_ptr warn_fn);
996 
997 size_t png_get_compression_buffer_size
998     (png_const_structp png_ptr);
999 
1000 void png_set_compression_buffer_size(png_structp png_ptr,
1001     size_t size);
1002 
1003 /* Moved from pngconf.h in 1.4.0 and modified to ensure setjmp/longjmp
1004  * match up.
1005  */
1006 static if(PNG_SETJMP_SUPPORTED){
1007 /* This function returns the jmp_buf built in to *png_ptr.  It must be
1008  * supplied with an appropriate 'longjmp' function to use on that jmp_buf
1009  * unless the default error function is overridden in which case NULL is
1010  * acceptable.  The size of the jmp_buf is checked against the actual size
1011  * allocated by the library - the call will return NULL on a mismatch
1012  * indicating an ABI mismatch.
1013  */
1014 //jmp_buf* png_set_longjmp_fn(png_structp png_ptr,
1015 //    png_longjmp_ptr longjmp_fn, size_t jmp_buf_size);
1016 //#  define png_jmpbuf(png_ptr) \
1017 //      (*png_set_longjmp_fn((png_ptr), longjmp, sizeof (jmp_buf)))
1018 }else{
1019 //#  define png_jmpbuf(png_ptr) \
1020 //      (LIBPNG_WAS_COMPILED_WITH__PNG_NO_SETJMP)
1021 }
1022 /* This function should be used by libpng applications in place of
1023  * longjmp(png_ptr->jmpbuf, val).  If longjmp_fn() has been set, it
1024  * will use it; otherwise it will call PNG_ABORT().  This function was
1025  * added in libpng-1.5.0.
1026  */
1027 void png_longjmp(png_structp png_ptr, int val);
1028 
1029 static if(PNG_READ_SUPPORTED){
1030 /* Reset the compression stream */
1031 int png_reset_zstream(png_structp png_ptr);
1032 }
1033 
1034 /* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */
1035 static if(PNG_USER_MEM_SUPPORTED){
1036 png_structp png_create_read_struct_2
1037     (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn,
1038     png_error_ptr warn_fn,
1039     png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn);
1040 png_structp png_create_write_struct_2
1041     (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn,
1042     png_error_ptr warn_fn,
1043     png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn);
1044 }
1045 
1046 /* Write the PNG file signature. */
1047 void png_write_sig(png_structp png_ptr);
1048 
1049 /* Write a PNG chunk - size, type, (optional) data, CRC. */
1050 void png_write_chunk(png_structp png_ptr, png_const_bytep
1051     chunk_name, png_const_bytep data, size_t length);
1052 
1053 /* Write the start of a PNG chunk - length and chunk name. */
1054 void png_write_chunk_start(png_structp png_ptr,
1055     png_const_bytep chunk_name, uint length);
1056 
1057 /* Write the data of a PNG chunk started with png_write_chunk_start(). */
1058 void png_write_chunk_data(png_structp png_ptr,
1059     png_const_bytep data, size_t length);
1060 
1061 /* Finish a chunk started with png_write_chunk_start() (includes CRC). */
1062 void png_write_chunk_end(png_structp png_ptr);
1063 
1064 /* Allocate and initialize the info structure */
1065 png_infop png_create_info_struct(png_structp png_ptr);
1066 
1067 void png_info_init_3(png_infopp info_ptr,
1068     size_t png_info_struct_size);
1069 
1070 /* Writes all the PNG information before the image. */
1071 void png_write_info_before_PLTE
1072     (png_structp png_ptr, png_infop info_ptr);
1073 void png_write_info
1074     (png_structp png_ptr, png_infop info_ptr);
1075 
1076 static if(PNG_SEQUENTIAL_READ_SUPPORTED){
1077 /* Read the information before the actual image data. */
1078 void png_read_info
1079     (png_structp png_ptr, png_infop info_ptr);
1080 }
1081 
1082 static if(PNG_TIME_RFC1123_SUPPORTED){
1083 png_const_charp png_convert_to_rfc1123
1084     (png_structp png_ptr,
1085     png_const_timep ptime);
1086 }
1087 
1088 static if(PNG_CONVERT_tIME_SUPPORTED){
1089 /* Convert from a struct tm to png_time */
1090 void png_convert_from_struct_tm(png_timep ptime,
1091     const(tm) * ttime);
1092 
1093 /* Convert from time_t to png_time.  Uses gmtime() */
1094 void png_convert_from_time_t
1095     (png_timep ptime, time_t ttime);
1096 } /* PNG_CONVERT_tIME_SUPPORTED */
1097 
1098 static if(PNG_READ_EXPAND_SUPPORTED){
1099 /* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */
1100 void png_set_expand(png_structp png_ptr);
1101 void png_set_expand_gray_1_2_4_to_8(png_structp png_ptr);
1102 void png_set_palette_to_rgb(png_structp png_ptr);
1103 void png_set_tRNS_to_alpha(png_structp png_ptr);
1104 }
1105 
1106 static if(PNG_READ_EXPAND_16_SUPPORTED){
1107 /* Expand to 16-bit channels, forces conversion of palette to RGB and expansion
1108  * of a tRNS chunk if present.
1109  */
1110 void png_set_expand_16(png_structp png_ptr);
1111 }
1112 
1113 static if(PNG_READ_BGR_SUPPORTED || PNG_WRITE_BGR_SUPPORTED){
1114 /* Use blue, green, red order for pixels. */
1115 void png_set_bgr(png_structp png_ptr);
1116 }
1117 
1118 static if(PNG_READ_GRAY_TO_RGB_SUPPORTED){
1119 /* Expand the grayscale to 24-bit RGB if necessary. */
1120 void png_set_gray_to_rgb(png_structp png_ptr);
1121 }
1122 
1123 static if(PNG_READ_RGB_TO_GRAY_SUPPORTED){
1124 /* Reduce RGB to grayscale. */
1125 enum PNG_ERROR_ACTION_NONE = 1;
1126 enum PNG_ERROR_ACTION_WARN = 2;
1127 enum PNG_ERROR_ACTION_ERROR = 3;
1128 enum PNG_RGB_TO_GRAY_DEFAULT = (-1);/*for red/green coefficients*/
1129 
1130 void png_set_rgb_to_gray(png_structp png_ptr,
1131     int error_action, double red, double green);
1132 void png_set_rgb_to_gray_fixed(png_structp png_ptr,
1133     int error_action, png_fixed_point red, png_fixed_point green);
1134 
1135 png_byte png_get_rgb_to_gray_status(png_const_structp
1136     png_ptr);
1137 }
1138 
1139 static if(PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED){
1140 void png_build_grayscale_palette(int bit_depth,
1141     png_colorp palette);
1142 }
1143 
1144 static if(PNG_READ_ALPHA_MODE_SUPPORTED){
1145 /* How the alpha channel is interpreted - this affects how the color channels of
1146  * a PNG file are returned when an alpha channel, or tRNS chunk in a palette
1147  * file, is present.
1148  *
1149  * This has no effect on the way pixels are written into a PNG output
1150  * datastream. The color samples in a PNG datastream are never premultiplied
1151  * with the alpha samples.
1152  *
1153  * The default is to return data according to the PNG specification: the alpha
1154  * channel is a linear measure of the contribution of the pixel to the
1155  * corresponding composited pixel.  The gamma encoded color channels must be
1156  * scaled according to the contribution and to do this it is necessary to undo
1157  * the encoding, scale the color values, perform the composition and reencode
1158  * the values.  This is the 'PNG' mode.
1159  *
1160  * The alternative is to 'associate' the alpha with the color information by
1161  * storing color channel values that have been scaled by the alpha.  The
1162  * advantage is that the color channels can be resampled (the image can be
1163  * scaled) in this form.  The disadvantage is that normal practice is to store
1164  * linear, not (gamma) encoded, values and this requires 16-bit channels for
1165  * still images rather than the 8-bit channels that are just about sufficient if
1166  * gamma encoding is used.  In addition all non-transparent pixel values,
1167  * including completely opaque ones, must be gamma encoded to produce the final
1168  * image.  This is the 'STANDARD', 'ASSOCIATED' or 'PREMULTIPLIED' mode (the
1169  * latter being the two common names for associated alpha color channels.)
1170  *
1171  * Since it is not necessary to perform arithmetic on opaque color values so
1172  * long as they are not to be resampled and are in the final color space it is
1173  * possible to optimize the handling of alpha by storing the opaque pixels in
1174  * the PNG format (adjusted for the output color space) while storing partially
1175  * opaque pixels in the standard, linear, format.  The accuracy required for
1176  * standard alpha composition is relatively low, because the pixels are
1177  * isolated, therefore typically the accuracy loss in storing 8-bit linear
1178  * values is acceptable.  (This is not true if the alpha channel is used to
1179  * simulate transparency over large areas - use 16 bits or the PNG mode in
1180  * this case!)  This is the 'OPTIMIZED' mode.  For this mode a pixel is
1181  * treated as opaque only if the alpha value is equal to the maximum value.
1182  *
1183  * The final choice is to gamma encode the alpha channel as well.  This is
1184  * broken because, in practice, no implementation that uses this choice
1185  * correctly undoes the encoding before handling alpha composition.  Use this
1186  * choice only if other serious errors in the software or hardware you use
1187  * mandate it; the typical serious error is for dark halos to appear around
1188  * opaque areas of the composited PNG image because of arithmetic overflow.
1189  *
1190  * The API function png_set_alpha_mode specifies which of these choices to use
1191  * with an enumerated 'mode' value and the gamma of the required output:
1192  */
1193 enum PNG_ALPHA_PNG = 0; /* according to the PNG standard */
1194 enum PNG_ALPHA_STANDARD = 1; /* according to Porter/Duff */
1195 enum PNG_ALPHA_ASSOCIATED = 1; /* as above; this is the normal practice */
1196 enum PNG_ALPHA_PREMULTIPLIED = 1; /* as above */
1197 enum PNG_ALPHA_OPTIMIZED = 2; /* 'PNG' for opaque pixels, else 'STANDARD' */
1198 enum PNG_ALPHA_BROKEN = 3; /* the alpha channel is gamma encoded */
1199 
1200 void png_set_alpha_mode(png_structp png_ptr, int mode,
1201     double output_gamma);
1202 void png_set_alpha_mode_fixed(png_structp png_ptr,
1203     int mode, png_fixed_point output_gamma);
1204 }
1205 
1206 static if(PNG_READ_GAMMA_SUPPORTED || PNG_READ_ALPHA_MODE_SUPPORTED){
1207 /* The output_gamma value is a screen gamma in libpng terminology: it expresses
1208  * how to decode the output values, not how they are encoded.  The values used
1209  * correspond to the normal numbers used to describe the overall gamma of a
1210  * computer display system; for example 2.2 for an sRGB conformant system.  The
1211  * values are scaled by 100000 in the _fixed version of the API (so 220000 for
1212  * sRGB.)
1213  *
1214  * The inverse of the value is always used to provide a default for the PNG file
1215  * encoding if it has no gAMA chunk and if png_set_gamma() has not been called
1216  * to override the PNG gamma information.
1217  *
1218  * When the ALPHA_OPTIMIZED mode is selected the output gamma is used to encode
1219  * opaque pixels however pixels with lower alpha values are not encoded,
1220  * regardless of the output gamma setting.
1221  *
1222  * When the standard Porter Duff handling is requested with mode 1 the output
1223  * encoding is set to be linear and the output_gamma value is only relevant
1224  * as a default for input data that has no gamma information.  The linear output
1225  * encoding will be overridden if png_set_gamma() is called - the results may be
1226  * highly unexpected!
1227  *
1228  * The following numbers are derived from the sRGB standard and the research
1229  * behind it.  sRGB is defined to be approximated by a PNG gAMA chunk value of
1230  * 0.45455 (1/2.2) for PNG.  The value implicitly includes any viewing
1231  * correction required to take account of any differences in the color
1232  * environment of the original scene and the intended display environment; the
1233  * value expresses how to *decode* the image for display, not how the original
1234  * data was *encoded*.
1235  *
1236  * sRGB provides a peg for the PNG standard by defining a viewing environment.
1237  * sRGB itself, and earlier TV standards, actually use a more complex transform
1238  * (a linear portion then a gamma 2.4 power law) than PNG can express.  (PNG is
1239  * limited to simple power laws.)  By saying that an image for direct display on
1240  * an sRGB conformant system should be stored with a gAMA chunk value of 45455
1241  * (11.3.3.2 and 11.3.3.5 of the ISO PNG specification) the PNG specification
1242  * makes it possible to derive values for other display systems and
1243  * environments.
1244  *
1245  * The Mac value is deduced from the sRGB based on an assumption that the actual
1246  * extra viewing correction used in early Mac display systems was implemented as
1247  * a power 1.45 lookup table.
1248  *
1249  * Any system where a programmable lookup table is used or where the behavior of
1250  * the final display device characteristics can be changed requires system
1251  * specific code to obtain the current characteristic.  However this can be
1252  * difficult and most PNG gamma correction only requires an approximate value.
1253  *
1254  * By default, if png_set_alpha_mode() is not called, libpng assumes that all
1255  * values are unencoded, linear, values and that the output device also has a
1256  * linear characteristic.  This is only very rarely correct - it is invariably
1257  * better to call png_set_alpha_mode() with PNG_DEFAULT_sRGB than rely on the
1258  * default if you don't know what the right answer is!
1259  *
1260  * The special value PNG_GAMMA_MAC_18 indicates an older Mac system (pre Mac OS
1261  * 10.6) which used a correction table to implement a somewhat lower gamma on an
1262  * otherwise sRGB system.
1263  *
1264  * Both these values are reserved (not simple gamma values) in order to allow
1265  * more precise correction internally in the future.
1266  *
1267  * NOTE: the following values can be passed to either the fixed or floating
1268  * point APIs, but the floating point API will also accept floating point
1269  * values.
1270  */
1271 enum PNG_DEFAULT_sRGB = -1;       /* sRGB gamma and color space */
1272 enum PNG_GAMMA_MAC_18 = -2;       /* Old Mac '1.8' gamma and color space */
1273 enum PNG_GAMMA_sRGB = 220000;   /* Television standards--matches sRGB gamma */
1274 alias PNG_GAMMA_LINEAR = PNG_FP_1; /* Linear */
1275 }
1276 
1277 /* The following are examples of calls to png_set_alpha_mode to achieve the
1278  * required overall gamma correction and, where necessary, alpha
1279  * premultiplication.
1280  *
1281  * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB);
1282  *    This is the default libpng handling of the alpha channel - it is not
1283  *    pre-multiplied into the color components.  In addition the call states
1284  *    that the output is for a sRGB system and causes all PNG files without gAMA
1285  *    chunks to be assumed to be encoded using sRGB.
1286  *
1287  * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC);
1288  *    In this case the output is assumed to be something like an sRGB conformant
1289  *    display preceeded by a power-law lookup table of power 1.45.  This is how
1290  *    early Mac systems behaved.
1291  *
1292  * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_GAMMA_LINEAR);
1293  *    This is the classic Jim Blinn approach and will work in academic
1294  *    environments where everything is done by the book.  It has the shortcoming
1295  *    of assuming that input PNG data with no gamma information is linear - this
1296  *    is unlikely to be correct unless the PNG files where generated locally.
1297  *    Most of the time the output precision will be so low as to show
1298  *    significant banding in dark areas of the image.
1299  *
1300  * png_set_expand_16(pp);
1301  * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_DEFAULT_sRGB);
1302  *    This is a somewhat more realistic Jim Blinn inspired approach.  PNG files
1303  *    are assumed to have the sRGB encoding if not marked with a gamma value and
1304  *    the output is always 16 bits per component.  This permits accurate scaling
1305  *    and processing of the data.  If you know that your input PNG files were
1306  *    generated locally you might need to replace PNG_DEFAULT_sRGB with the
1307  *    correct value for your system.
1308  *
1309  * png_set_alpha_mode(pp, PNG_ALPHA_OPTIMIZED, PNG_DEFAULT_sRGB);
1310  *    If you just need to composite the PNG image onto an existing background
1311  *    and if you control the code that does this you can use the optimization
1312  *    setting.  In this case you just copy completely opaque pixels to the
1313  *    output.  For pixels that are not completely transparent (you just skip
1314  *    those) you do the composition math using png_composite or png_composite_16
1315  *    below then encode the resultant 8-bit or 16-bit values to match the output
1316  *    encoding.
1317  *
1318  * Other cases
1319  *    If neither the PNG nor the standard linear encoding work for you because
1320  *    of the software or hardware you use then you have a big problem.  The PNG
1321  *    case will probably result in halos around the image.  The linear encoding
1322  *    will probably result in a washed out, too bright, image (it's actually too
1323  *    contrasty.)  Try the ALPHA_OPTIMIZED mode above - this will probably
1324  *    substantially reduce the halos.  Alternatively try:
1325  *
1326  * png_set_alpha_mode(pp, PNG_ALPHA_BROKEN, PNG_DEFAULT_sRGB);
1327  *    This option will also reduce the halos, but there will be slight dark
1328  *    halos round the opaque parts of the image where the background is light.
1329  *    In the OPTIMIZED mode the halos will be light halos where the background
1330  *    is dark.  Take your pick - the halos are unavoidable unless you can get
1331  *    your hardware/software fixed!  (The OPTIMIZED approach is slightly
1332  *    faster.)
1333  *
1334  * When the default gamma of PNG files doesn't match the output gamma.
1335  *    If you have PNG files with no gamma information png_set_alpha_mode allows
1336  *    you to provide a default gamma, but it also sets the ouput gamma to the
1337  *    matching value.  If you know your PNG files have a gamma that doesn't
1338  *    match the output you can take advantage of the fact that
1339  *    png_set_alpha_mode always sets the output gamma but only sets the PNG
1340  *    default if it is not already set:
1341  *
1342  * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB);
1343  * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC);
1344  *    The first call sets both the default and the output gamma values, the
1345  *    second call overrides the output gamma without changing the default.  This
1346  *    is easier than achieving the same effect with png_set_gamma.  You must use
1347  *    PNG_ALPHA_PNG for the first call - internal checking in png_set_alpha will
1348  *    fire if more than one call to png_set_alpha_mode and png_set_background is
1349  *    made in the same read operation, however multiple calls with PNG_ALPHA_PNG
1350  *    are ignored.
1351  */
1352 
1353 static if(PNG_READ_STRIP_ALPHA_SUPPORTED){
1354 void png_set_strip_alpha(png_structp png_ptr);
1355 }
1356 
1357 static if(PNG_READ_SWAP_ALPHA_SUPPORTED || PNG_WRITE_SWAP_ALPHA_SUPPORTED){
1358 void png_set_swap_alpha(png_structp png_ptr);
1359 }
1360 
1361 static if(PNG_READ_INVERT_ALPHA_SUPPORTED || PNG_WRITE_INVERT_ALPHA_SUPPORTED){
1362 void png_set_invert_alpha(png_structp png_ptr);
1363 }
1364 
1365 static if(PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED){
1366 /* Add a filler byte to 8-bit Gray or 24-bit RGB images. */
1367 void png_set_filler(png_structp png_ptr, uint filler,
1368     int flags);
1369 /* The values of the PNG_FILLER_ defines should NOT be changed */
1370 enum PNG_FILLER_BEFORE = 0;
1371 enum PNG_FILLER_AFTER = 1;
1372 /* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */
1373 void png_set_add_alpha
1374     (png_structp png_ptr, uint filler,
1375     int flags);
1376 } /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */
1377 
1378 static if(PNG_READ_SWAP_SUPPORTED || PNG_WRITE_SWAP_SUPPORTED){
1379 /* Swap bytes in 16-bit depth files. */
1380 void png_set_swap(png_structp png_ptr);
1381 }
1382 
1383 static if(PNG_READ_PACK_SUPPORTED || PNG_WRITE_PACK_SUPPORTED){
1384 /* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */
1385 void png_set_packing(png_structp png_ptr);
1386 }
1387 
1388 static if(PNG_READ_PACKSWAP_SUPPORTED || PNG_WRITE_PACKSWAP_SUPPORTED){
1389 /* Swap packing order of pixels in bytes. */
1390 void png_set_packswap(png_structp png_ptr);
1391 }
1392 
1393 static if(PNG_READ_SHIFT_SUPPORTED || PNG_WRITE_SHIFT_SUPPORTED){
1394 /* Converts files to legal bit depths. */
1395 void png_set_shift(png_structp png_ptr, png_const_color_8p
1396     true_bits);
1397 }
1398 
1399 static if(PNG_READ_INTERLACING_SUPPORTED || PNG_WRITE_INTERLACING_SUPPORTED){
1400 /* Have the code handle the interlacing.  Returns the number of passes.
1401  * MUST be called before png_read_update_info or png_start_read_image,
1402  * otherwise it will not have the desired effect.  Note that it is still
1403  * necessary to call png_read_row or png_read_rows png_get_image_height
1404  * times for each pass.
1405 */
1406 int png_set_interlace_handling(png_structp png_ptr);
1407 }
1408 
1409 static if(PNG_READ_INVERT_SUPPORTED || PNG_WRITE_INVERT_SUPPORTED){
1410 /* Invert monochrome files */
1411 void png_set_invert_mono(png_structp png_ptr);
1412 }
1413 
1414 static if(PNG_READ_BACKGROUND_SUPPORTED){
1415 /* Handle alpha and tRNS by replacing with a background color.  Prior to
1416  * libpng-1.5.4 this API must not be called before the PNG file header has been
1417  * read.  Doing so will result in unexpected behavior and possible warnings or
1418  * errors if the PNG file contains a bKGD chunk.
1419  */
1420 void png_set_background(png_structp png_ptr,
1421     png_const_color_16p background_color, int background_gamma_code,
1422     int need_expand, double background_gamma);
1423 void png_set_background_fixed (png_structp png_ptr,
1424     png_const_color_16p background_color, int background_gamma_code,
1425     int need_expand, png_fixed_point background_gamma);
1426 }
1427 static if(PNG_READ_BACKGROUND_SUPPORTED){
1428 enum PNG_BACKGROUND_GAMMA_UNKNOWN = 0;
1429 enum PNG_BACKGROUND_GAMMA_SCREEN  = 1;
1430 enum PNG_BACKGROUND_GAMMA_FILE    = 2;
1431 enum PNG_BACKGROUND_GAMMA_UNIQUE  = 3;
1432 }
1433 
1434 static if(PNG_READ_SCALE_16_TO_8_SUPPORTED){
1435 /* Scale a 16-bit depth file down to 8-bit, accurately. */
1436 void png_set_scale_16(png_structp png_ptr);
1437 }
1438 
1439 static if(PNG_READ_STRIP_16_TO_8_SUPPORTED){
1440 //alias PNG_READ_16_TO_8 = SUPPORTED; /* Name prior to 1.5.4 */
1441 /* Strip the second byte of information from a 16-bit depth file. */
1442 void png_set_strip_16(png_structp png_ptr);
1443 }
1444 
1445 static if(PNG_READ_QUANTIZE_SUPPORTED){
1446 /* Turn on quantizing, and reduce the palette to the number of colors
1447  * available.
1448  */
1449 void png_set_quantize
1450     (png_structp png_ptr, png_colorp palette,
1451     int num_palette, int maximum_colors, png_const_uint_16p histogram,
1452     int full_quantize);
1453 }
1454 
1455 static if(PNG_READ_GAMMA_SUPPORTED){
1456 /* The threshold on gamma processing is configurable but hard-wired into the
1457  * library.  The following is the floating point variant.
1458  */
1459 enum PNG_GAMMA_THRESHOLD = (PNG_GAMMA_THRESHOLD_FIXED*0.00001);
1460 
1461 /* Handle gamma correction. Screen_gamma=(display_exponent).
1462  * NOTE: this API simply sets the screen and file gamma values. It will
1463  * therefore override the value for gamma in a PNG file if it is called after
1464  * the file header has been read - use with care  - call before reading the PNG
1465  * file for best results!
1466  *
1467  * These routines accept the same gamma values as png_set_alpha_mode (described
1468  * above).  The PNG_GAMMA_ defines and PNG_DEFAULT_sRGB can be passed to either
1469  * API (floating point or fixed.)  Notice, however, that the 'file_gamma' value
1470  * is the inverse of a 'screen gamma' value.
1471  */
1472 void png_set_gamma
1473     (png_structp png_ptr, double screen_gamma,
1474     double override_file_gamma);
1475 void png_set_gamma_fixed(png_structp png_ptr,
1476     png_fixed_point screen_gamma, png_fixed_point override_file_gamma);
1477 }
1478 
1479 static if(PNG_WRITE_FLUSH_SUPPORTED){
1480 /* Set how many lines between output flushes - 0 for no flushing */
1481 void png_set_flush(png_structp png_ptr, int nrows);
1482 /* Flush the current PNG output buffer */
1483 void png_write_flush(png_structp png_ptr);
1484 }
1485 
1486 /* Optional update palette with requested transformations */
1487 void png_start_read_image(png_structp png_ptr);
1488 
1489 /* Optional call to update the users info structure */
1490 void png_read_update_info
1491     (png_structp png_ptr, png_infop info_ptr);
1492 
1493 static if(PNG_SEQUENTIAL_READ_SUPPORTED){
1494 /* Read one or more rows of image data. */
1495 void png_read_rows(png_structp png_ptr, png_bytepp row,
1496     png_bytepp display_row, uint num_rows);
1497 }
1498 
1499 static if(PNG_SEQUENTIAL_READ_SUPPORTED){
1500 /* Read a row of data. */
1501 void png_read_row(png_structp png_ptr, png_bytep row,
1502     png_bytep display_row);
1503 }
1504 
1505 static if(PNG_SEQUENTIAL_READ_SUPPORTED){
1506 /* Read the whole image into memory at once. */
1507 void png_read_image(png_structp png_ptr, png_bytepp image);
1508 }
1509 
1510 /* Write a row of image data */
1511 void png_write_row
1512     (png_structp png_ptr, png_const_bytep row);
1513 
1514 /* Write a few rows of image data: (*row) is not written; however, the type
1515  * is declared as writeable to maintain compatibility with previous versions
1516  * of libpng and to allow the 'display_row' array from read_rows to be passed
1517  * unchanged to write_rows.
1518  */
1519 void png_write_rows(png_structp png_ptr, in png_bytepp row,
1520     uint num_rows);
1521 
1522 /* Write the image data */
1523 void png_write_image
1524     (png_structp png_ptr, in png_bytepp image);
1525 
1526 /* Write the end of the PNG file. */
1527 void png_write_end
1528     (png_structp png_ptr, png_infop info_ptr);
1529 
1530 static if(PNG_SEQUENTIAL_READ_SUPPORTED){
1531 /* Read the end of the PNG file. */
1532 void png_read_end(png_structp png_ptr, png_infop info_ptr);
1533 }
1534 
1535 /* Free any memory associated with the png_info_struct */
1536 void png_destroy_info_struct(png_structp png_ptr,
1537     png_infopp info_ptr_ptr);
1538 
1539 /* Free any memory associated with the png_struct and the png_info_structs */
1540 void png_destroy_read_struct(png_structpp png_ptr_ptr,
1541     png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr);
1542 
1543 /* Free any memory associated with the png_struct and the png_info_structs */
1544 void png_destroy_write_struct(png_structpp png_ptr_ptr,
1545     png_infopp info_ptr_ptr);
1546 
1547 /* Set the libpng method of handling chunk CRC errors */
1548 void png_set_crc_action
1549     (png_structp png_ptr, int crit_action, int ancil_action);
1550 
1551 /* Values for png_set_crc_action() say how to handle CRC errors in
1552  * ancillary and critical chunks, and whether to use the data contained
1553  * therein.  Note that it is impossible to "discard" data in a critical
1554  * chunk.  For versions prior to 0.90, the action was always error/quit,
1555  * whereas in version 0.90 and later, the action for CRC errors in ancillary
1556  * chunks is warn/discard.  These values should NOT be changed.
1557  *
1558  *      value                       action:critical     action:ancillary
1559  */
1560 enum PNG_CRC_DEFAULT = 0;  /* error/quit          warn/discard data */
1561 enum PNG_CRC_ERROR_QUIT = 1;  /* error/quit          error/quit        */
1562 enum PNG_CRC_WARN_DISCARD = 2;  /* (INVALID)           warn/discard data */
1563 enum PNG_CRC_WARN_USE = 3;  /* warn/use data       warn/use data     */
1564 enum PNG_CRC_QUIET_USE = 4;  /* quiet/use data      quiet/use data    */
1565 enum PNG_CRC_NO_CHANGE = 5;  /* use current value   use current value */
1566 
1567 /* These functions give the user control over the scan-line filtering in
1568  * libpng and the compression methods used by zlib.  These functions are
1569  * mainly useful for testing, as the defaults should work with most users.
1570  * Those users who are tight on memory or want faster performance at the
1571  * expense of compression can modify them.  See the compression library
1572  * header file (zlib.h) for an explination of the compression functions.
1573  */
1574 
1575 /* Set the filtering method(s) used by libpng.  Currently, the only valid
1576  * value for "method" is 0.
1577  */
1578 void png_set_filter
1579     (png_structp png_ptr, int method, int filters);
1580 
1581 /* Flags for png_set_filter() to say which filters to use.  The flags
1582  * are chosen so that they don't conflict with real filter types
1583  * below, in case they are supplied instead of the #defined constants.
1584  * These values should NOT be changed.
1585  */
1586 enum PNG_NO_FILTERS = 0x00;
1587 enum PNG_FILTER_NONE = 0x08;
1588 enum PNG_FILTER_SUB = 0x10;
1589 enum PNG_FILTER_UP = 0x20;
1590 enum PNG_FILTER_AVG = 0x40;
1591 enum PNG_FILTER_PAETH = 0x80;
1592 enum PNG_ALL_FILTERS = (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP |
1593                          PNG_FILTER_AVG | PNG_FILTER_PAETH);
1594 
1595 /* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now.
1596  * These defines should NOT be changed.
1597  */
1598 enum PNG_FILTER_VALUE_NONE = 0;
1599 enum PNG_FILTER_VALUE_SUB = 1;
1600 enum PNG_FILTER_VALUE_UP = 2;
1601 enum PNG_FILTER_VALUE_AVG = 3;
1602 enum PNG_FILTER_VALUE_PAETH = 4;
1603 enum PNG_FILTER_VALUE_LAST = 5;
1604 
1605 static if(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED){ /* EXPERIMENTAL */
1606 /* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_
1607  * defines, either the default (minimum-sum-of-absolute-differences), or
1608  * the experimental method (weighted-minimum-sum-of-absolute-differences).
1609  *
1610  * Weights are factors >= 1.0, indicating how important it is to keep the
1611  * filter type consistent between rows.  Larger numbers mean the current
1612  * filter is that many times as likely to be the same as the "num_weights"
1613  * previous filters.  This is cumulative for each previous row with a weight.
1614  * There needs to be "num_weights" values in "filter_weights", or it can be
1615  * NULL if the weights aren't being specified.  Weights have no influence on
1616  * the selection of the first row filter.  Well chosen weights can (in theory)
1617  * improve the compression for a given image.
1618  *
1619  * Costs are factors >= 1.0 indicating the relative decoding costs of a
1620  * filter type.  Higher costs indicate more decoding expense, and are
1621  * therefore less likely to be selected over a filter with lower computational
1622  * costs.  There needs to be a value in "filter_costs" for each valid filter
1623  * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't
1624  * setting the costs.  Costs try to improve the speed of decompression without
1625  * unduly increasing the compressed image size.
1626  *
1627  * A negative weight or cost indicates the default value is to be used, and
1628  * values in the range [0.0, 1.0) indicate the value is to remain unchanged.
1629  * The default values for both weights and costs are currently 1.0, but may
1630  * change if good general weighting/cost heuristics can be found.  If both
1631  * the weights and costs are set to 1.0, this degenerates the WEIGHTED method
1632  * to the UNWEIGHTED method, but with added encoding time/computation.
1633  */
1634 void png_set_filter_heuristics(png_structp png_ptr,
1635     int heuristic_method, int num_weights, png_const_doublep filter_weights,
1636     png_const_doublep filter_costs);
1637 void png_set_filter_heuristics_fixed
1638     (png_structp png_ptr,
1639     int heuristic_method, int num_weights, png_const_fixed_point_p
1640     filter_weights, png_const_fixed_point_p filter_costs);
1641 } /*  PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */
1642 
1643 /* Heuristic used for row filter selection.  These defines should NOT be
1644  * changed.
1645  */
1646 enum PNG_FILTER_HEURISTIC_DEFAULT = 0;  /* Currently "UNWEIGHTED" */
1647 enum PNG_FILTER_HEURISTIC_UNWEIGHTED = 1;  /* Used by libpng < 0.95 */
1648 enum PNG_FILTER_HEURISTIC_WEIGHTED = 2;  /* Experimental feature */
1649 enum PNG_FILTER_HEURISTIC_LAST = 3;  /* Not a valid value */
1650 
1651 static if(PNG_WRITE_SUPPORTED){
1652 /* Set the library compression level.  Currently, valid values range from
1653  * 0 - 9, corresponding directly to the zlib compression levels 0 - 9
1654  * (0 - no compression, 9 - "maximal" compression).  Note that tests have
1655  * shown that zlib compression levels 3-6 usually perform as well as level 9
1656  * for PNG images, and do considerably fewer caclulations.  In the future,
1657  * these values may not correspond directly to the zlib compression levels.
1658  */
1659 void png_set_compression_level
1660     (png_structp png_ptr, int level);
1661 
1662 void png_set_compression_mem_level(png_structp png_ptr,
1663     int mem_level);
1664 
1665 void png_set_compression_strategy(png_structp png_ptr,
1666     int strategy);
1667 
1668 /* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a
1669  * smaller value of window_bits if it can do so safely.
1670  */
1671 void png_set_compression_window_bits(png_structp png_ptr,
1672     int window_bits);
1673 
1674 void png_set_compression_method(png_structp png_ptr,
1675     int method);
1676 }
1677 
1678 static if(PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED){
1679 /* Also set zlib parameters for compressing non-IDAT chunks */
1680 void png_set_text_compression_level
1681     (png_structp png_ptr, int level);
1682 
1683 void png_set_text_compression_mem_level(png_structp png_ptr,
1684     int mem_level);
1685 
1686 void png_set_text_compression_strategy(png_structp png_ptr,
1687     int strategy);
1688 
1689 /* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a
1690  * smaller value of window_bits if it can do so safely.
1691  */
1692 void png_set_text_compression_window_bits(png_structp
1693     png_ptr, int window_bits);
1694 
1695 void png_set_text_compression_method(png_structp png_ptr,
1696     int method);
1697 } /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */
1698 
1699 /* These next functions are called for input/output, memory, and error
1700  * handling.  They are in the file pngrio.c, pngwio.c, and pngerror.c,
1701  * and call standard C I/O routines such as fread(), fwrite(), and
1702  * fprintf().  These functions can be made to use other I/O routines
1703  * at run time for those applications that need to handle I/O in a
1704  * different manner by calling png_set_???_fn().  See libpng-manual.txt for
1705  * more information.
1706  */
1707 
1708 static if(PNG_STDIO_SUPPORTED){
1709 /* Initialize the input/output for the PNG file to the default functions. */
1710 void png_init_io(png_structp png_ptr, png_FILE_p fp);
1711 }
1712 
1713 /* Replace the (error and abort), and warning functions with user
1714  * supplied functions.  If no messages are to be printed you must still
1715  * write and use replacement functions. The replacement error_fn should
1716  * still do a longjmp to the last setjmp location if you are using this
1717  * method of error handling.  If error_fn or warning_fn is NULL, the
1718  * default function will be used.
1719  */
1720 
1721 void png_set_error_fn
1722     (png_structp png_ptr, png_voidp error_ptr,
1723     png_error_ptr error_fn, png_error_ptr warning_fn);
1724 
1725 /* Return the user pointer associated with the error functions */
1726 png_voidp png_get_error_ptr(png_const_structp png_ptr);
1727 
1728 /* Replace the default data output functions with a user supplied one(s).
1729  * If buffered output is not used, then output_flush_fn can be set to NULL.
1730  * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time
1731  * output_flush_fn will be ignored (and thus can be NULL).
1732  * It is probably a mistake to use NULL for output_flush_fn if
1733  * write_data_fn is not also NULL unless you have built libpng with
1734  * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's
1735  * default flush function, which uses the standard *FILE structure, will
1736  * be used.
1737  */
1738 void png_set_write_fn(png_structp png_ptr, png_voidp io_ptr,
1739     png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn);
1740 
1741 /* Replace the default data input function with a user supplied one. */
1742 void png_set_read_fn(png_structp png_ptr, png_voidp io_ptr,
1743     png_rw_ptr read_data_fn);
1744 
1745 /* Return the user pointer associated with the I/O functions */
1746 png_voidp png_get_io_ptr(png_structp png_ptr);
1747 
1748 void png_set_read_status_fn(png_structp png_ptr,
1749     png_read_status_ptr read_row_fn);
1750 
1751 void png_set_write_status_fn(png_structp png_ptr,
1752     png_write_status_ptr write_row_fn);
1753 
1754 static if(PNG_USER_MEM_SUPPORTED){
1755 /* Replace the default memory allocation functions with user supplied one(s). */
1756 void png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr,
1757     png_malloc_ptr malloc_fn, png_free_ptr free_fn);
1758 /* Return the user pointer associated with the memory functions */
1759 png_voidp png_get_mem_ptr(png_const_structp png_ptr);
1760 }
1761 
1762 static if(PNG_READ_USER_TRANSFORM_SUPPORTED){
1763 void png_set_read_user_transform_fn(png_structp png_ptr,
1764     png_user_transform_ptr read_user_transform_fn);
1765 }
1766 
1767 static if(PNG_WRITE_USER_TRANSFORM_SUPPORTED){
1768 void png_set_write_user_transform_fn(png_structp png_ptr,
1769     png_user_transform_ptr write_user_transform_fn);
1770 }
1771 
1772 static if(PNG_USER_TRANSFORM_PTR_SUPPORTED){
1773 void png_set_user_transform_info(png_structp png_ptr,
1774     png_voidp user_transform_ptr, int user_transform_depth,
1775     int user_transform_channels);
1776 /* Return the user pointer associated with the user transform functions */
1777 png_voidp png_get_user_transform_ptr
1778     (png_const_structp png_ptr);
1779 }
1780 
1781 static if(PNG_USER_TRANSFORM_INFO_SUPPORTED){
1782 /* Return information about the row currently being processed.  Note that these
1783  * APIs do not fail but will return unexpected results if called outside a user
1784  * transform callback.  Also note that when transforming an interlaced image the
1785  * row number is the row number within the sub-image of the interlace pass, so
1786  * the value will increase to the height of the sub-image (not the full image)
1787  * then reset to 0 for the next pass.
1788  *
1789  * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to
1790  * find the output pixel (x,y) given an interlaced sub-image pixel
1791  * (row,col,pass).  (See below for these macros.)
1792  */
1793 uint png_get_current_row_number(png_const_structp);
1794 png_byte png_get_current_pass_number(png_const_structp);
1795 }
1796 
1797 static if(PNG_USER_CHUNKS_SUPPORTED){
1798 void png_set_read_user_chunk_fn(png_structp png_ptr,
1799     png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn);
1800 png_voidp png_get_user_chunk_ptr(png_const_structp png_ptr);
1801 }
1802 
1803 static if(PNG_PROGRESSIVE_READ_SUPPORTED){
1804 /* Sets the function callbacks for the push reader, and a pointer to a
1805  * user-defined structure available to the callback functions.
1806  */
1807 void png_set_progressive_read_fn(png_structp png_ptr,
1808     png_voidp progressive_ptr, png_progressive_info_ptr info_fn,
1809     png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn);
1810 
1811 /* Returns the user pointer associated with the push read functions */
1812 png_voidp png_get_progressive_ptr(png_const_structp png_ptr);
1813 
1814 /* Function to be called when data becomes available */
1815 void png_process_data
1816     (png_structp png_ptr, png_infop info_ptr,
1817     png_bytep buffer, size_t buffer_size);
1818 
1819 /* A function which may be called *only* within png_process_data to stop the
1820  * processing of any more data.  The function returns the number of bytes
1821  * remaining, excluding any that libpng has cached internally.  A subsequent
1822  * call to png_process_data must supply these bytes again.  If the argument
1823  * 'save' is set to true the routine will first save all the pending data and
1824  * will always return 0.
1825  */
1826 size_t png_process_data_pause(png_structp, int save);
1827 
1828 /* A function which may be called *only* outside (after) a call to
1829  * png_process_data.  It returns the number of bytes of data to skip in the
1830  * input.  Normally it will return 0, but if it returns a non-zero value the
1831  * application must skip than number of bytes of input data and pass the
1832  * following data to the next call to png_process_data.
1833  */
1834 uint png_process_data_skip(png_structp);
1835 
1836 static if(PNG_READ_INTERLACING_SUPPORTED){
1837 /* Function that combines rows.  'new_row' is a flag that should come from
1838  * the callback and be non-NULL if anything needs to be done; the library
1839  * stores its own version of the new data internally and ignores the passed
1840  * in value.
1841  */
1842 void png_progressive_combine_row(png_structp png_ptr,
1843     png_bytep old_row, png_const_bytep new_row);
1844 } /* PNG_READ_INTERLACING_SUPPORTED */
1845 } /* PNG_PROGRESSIVE_READ_SUPPORTED */
1846 
1847 png_voidp png_malloc
1848     (png_structp png_ptr, png_alloc_size_t size);
1849 /* Added at libpng version 1.4.0 */
1850 png_voidp png_calloc
1851     (png_structp png_ptr, png_alloc_size_t size);
1852 
1853 /* Added at libpng version 1.2.4 */
1854 png_voidp png_malloc_warn(png_structp png_ptr,
1855     png_alloc_size_t size);
1856 
1857 /* Frees a pointer allocated by png_malloc() */
1858 void png_free(png_structp png_ptr, png_voidp ptr);
1859 
1860 /* Free data that was allocated internally */
1861 void png_free_data
1862     (png_structp png_ptr, png_infop info_ptr, uint free_me, int num);
1863 
1864 /* Reassign responsibility for freeing existing data, whether allocated
1865  * by libpng or by the application */
1866 void png_data_freer
1867     (png_structp png_ptr, png_infop info_ptr, int freer, uint mask);
1868 
1869 /* Assignments for png_data_freer */
1870 enum PNG_DESTROY_WILL_FREE_DATA = 1;
1871 enum PNG_SET_WILL_FREE_DATA = 1;
1872 enum PNG_USER_WILL_FREE_DATA = 2;
1873 /* Flags for png_ptr->free_me and info_ptr->free_me */
1874 enum PNG_FREE_HIST = 0x0008;
1875 enum PNG_FREE_ICCP = 0x0010;
1876 enum PNG_FREE_SPLT = 0x0020;
1877 enum PNG_FREE_ROWS = 0x0040;
1878 enum PNG_FREE_PCAL = 0x0080;
1879 enum PNG_FREE_SCAL = 0x0100;
1880 enum PNG_FREE_UNKN = 0x0200;
1881 enum PNG_FREE_LIST = 0x0400;
1882 enum PNG_FREE_PLTE = 0x1000;
1883 enum PNG_FREE_TRNS = 0x2000;
1884 enum PNG_FREE_TEXT = 0x4000;
1885 enum PNG_FREE_ALL = 0x7fff;
1886 enum PNG_FREE_MUL = 0x4220; /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */
1887 
1888 static if(PNG_USER_MEM_SUPPORTED){
1889 png_voidp png_malloc_default(png_structp png_ptr,
1890     png_alloc_size_t size);
1891 void png_free_default(png_structp png_ptr, png_voidp ptr);
1892 }
1893 
1894 static if(PNG_ERROR_TEXT_SUPPORTED){
1895 /* Fatal error in PNG image of libpng - can't continue */
1896 void png_error
1897     (png_structp png_ptr, png_const_charp error_message);
1898 
1899 /* The same, but the chunk name is prepended to the error string. */
1900 void png_chunk_error(png_structp png_ptr,
1901     png_const_charp error_mes);
1902 
1903 }else{
1904 /* Fatal error in PNG image of libpng - can't continue */
1905 void png_err(png_structp png);
1906 }
1907 
1908 static if(PNG_WARNINGS_SUPPORTED){
1909 /* Non-fatal error in libpng.  Can continue, but may have a problem. */
1910 void png_warning(png_structp png_ptr,
1911     png_const_charp warning_message);
1912 
1913 /* Non-fatal error in libpng, chunk name is prepended to message. */
1914 void png_chunk_warning(png_structp png_ptr,
1915     png_const_charp warning_message);
1916 }
1917 
1918 static if(PNG_BENIGN_ERRORS_SUPPORTED){
1919 /* Benign error in libpng.  Can continue, but may have a problem.
1920  * User can choose whether to handle as a fatal error or as a warning. */
1921 //#  undef png_benign_error
1922 void png_benign_error(png_structp png_ptr,
1923     png_const_charp warning_message);
1924 
1925 /* Same, chunk name is prepended to message. */
1926 //#  undef png_chunk_benign_error
1927 void png_chunk_benign_error(png_structp png_ptr,
1928     png_const_charp warning_message);
1929 
1930 void png_set_benign_errors
1931     (png_structp png_ptr, int allowed);
1932 }else{
1933   version(PNG_ALLOW_BENIGN_ERRORS){
1934     alias png_benign_error = png_warning;
1935     alias png_chunk_benign_error = png_chunk_warning;
1936   }else{
1937     alias png_benign_error = png_error;
1938     alias png_chunk_benign_error = png_chunk_error;
1939   }
1940 }
1941 
1942 /* The png_set_<chunk> functions are for storing values in the png_info_struct.
1943  * Similarly, the png_get_<chunk> calls are used to read values from the
1944  * png_info_struct, either storing the parameters in the passed variables, or
1945  * setting pointers into the png_info_struct where the data is stored.  The
1946  * png_get_<chunk> functions return a non-zero value if the data was available
1947  * in info_ptr, or return zero and do not change any of the parameters if the
1948  * data was not available.
1949  *
1950  * These functions should be used instead of directly accessing png_info
1951  * to avoid problems with future changes in the size and internal layout of
1952  * png_info_struct.
1953  */
1954 /* Returns "flag" if chunk data is valid in info_ptr. */
1955 uint png_get_valid
1956     (png_const_structp png_ptr, png_const_infop info_ptr,
1957     uint flag);
1958 
1959 /* Returns number of bytes needed to hold a transformed row. */
1960 size_t png_get_rowbytes(png_const_structp png_ptr,
1961     png_const_infop info_ptr);
1962 
1963 static if(PNG_INFO_IMAGE_SUPPORTED){
1964 /* Returns row_pointers, which is an array of pointers to scanlines that was
1965  * returned from png_read_png().
1966  */
1967 png_bytepp png_get_rows
1968     (png_const_structp png_ptr, png_const_infop info_ptr);
1969 /* Set row_pointers, which is an array of pointers to scanlines for use
1970  * by png_write_png().
1971  */
1972 void png_set_rows(png_structp png_ptr,
1973     png_infop info_ptr, png_bytepp row_pointers);
1974 }
1975 
1976 /* Returns number of color channels in image. */
1977 png_byte png_get_channels
1978     (png_const_structp png_ptr, png_const_infop info_ptr);
1979 
1980 static if(PNG_EASY_ACCESS_SUPPORTED){
1981 /* Returns image width in pixels. */
1982 uint png_get_image_width(png_const_structp png_ptr,
1983     png_const_infop info_ptr);
1984 
1985 /* Returns image height in pixels. */
1986 uint png_get_image_height(png_const_structp png_ptr,
1987     png_const_infop info_ptr);
1988 
1989 /* Returns image bit_depth. */
1990 png_byte png_get_bit_depth
1991     (png_const_structp png_ptr, png_const_infop info_ptr);
1992 
1993 /* Returns image color_type. */
1994 png_byte png_get_color_type(png_const_structp png_ptr,
1995     png_const_infop info_ptr);
1996 
1997 /* Returns image filter_type. */
1998 png_byte png_get_filter_type(png_const_structp png_ptr,
1999     png_const_infop info_ptr);
2000 
2001 /* Returns image interlace_type. */
2002 png_byte png_get_interlace_type(png_const_structp png_ptr,
2003     png_const_infop info_ptr);
2004 
2005 /* Returns image compression_type. */
2006 png_byte png_get_compression_type(png_const_structp png_ptr,
2007     png_const_infop info_ptr);
2008 
2009 /* Returns image resolution in pixels per meter, from pHYs chunk data. */
2010 uint png_get_pixels_per_meter
2011     (png_const_structp png_ptr, png_const_infop info_ptr);
2012 uint png_get_x_pixels_per_meter
2013     (png_const_structp png_ptr, png_const_infop info_ptr);
2014 uint png_get_y_pixels_per_meter
2015     (png_const_structp png_ptr, png_const_infop info_ptr);
2016 
2017 /* Returns pixel aspect ratio, computed from pHYs chunk data.  */
2018 float png_get_pixel_aspect_ratio
2019     (png_const_structp png_ptr, png_const_infop info_ptr);
2020 png_fixed_point png_get_pixel_aspect_ratio_fixed
2021     (png_const_structp png_ptr, png_const_infop info_ptr);
2022 
2023 /* Returns image x, y offset in pixels or microns, from oFFs chunk data. */
2024 png_int_32 png_get_x_offset_pixels
2025     (png_const_structp png_ptr, png_const_infop info_ptr);
2026 png_int_32 png_get_y_offset_pixels
2027     (png_const_structp png_ptr, png_const_infop info_ptr);
2028 png_int_32 png_get_x_offset_microns
2029     (png_const_structp png_ptr, png_const_infop info_ptr);
2030 png_int_32 png_get_y_offset_microns
2031     (png_const_structp png_ptr, png_const_infop info_ptr);
2032 
2033 } /* PNG_EASY_ACCESS_SUPPORTED */
2034 
2035 /* Returns pointer to signature string read from PNG header */
2036 png_const_bytep png_get_signature
2037     (png_const_structp png_ptr, png_infop info_ptr);
2038 
2039 static if(PNG_bKGD_SUPPORTED){
2040 uint png_get_bKGD
2041     (png_const_structp png_ptr, png_infop info_ptr,
2042     png_color_16p *background);
2043 }
2044 
2045 static if(PNG_bKGD_SUPPORTED){
2046 void png_set_bKGD(png_structp png_ptr, png_infop info_ptr,
2047     png_const_color_16p background);
2048 }
2049 
2050 static if(PNG_cHRM_SUPPORTED){
2051 png_uint_32 png_get_cHRM(png_const_structp png_ptr,
2052    png_const_infop info_ptr, double *white_x, double *white_y, double *red_x,
2053     double *red_y, double *green_x, double *green_y, double *blue_x,
2054     double *blue_y);
2055 png_uint_32 png_get_cHRM_XYZ(png_structp png_ptr,
2056     png_const_infop info_ptr, double *red_X, double *red_Y, double *red_Z,
2057     double *green_X, double *green_Y, double *green_Z, double *blue_X,
2058     double *blue_Y, double *blue_Z);
2059 static if(PNG_FIXED_POINT_SUPPORTED){ /* Otherwise not implemented */
2060 uint png_get_cHRM_fixed
2061     (png_const_structp png_ptr,
2062     png_const_infop info_ptr, png_fixed_point *int_white_x,
2063     png_fixed_point *int_white_y, png_fixed_point *int_red_x,
2064     png_fixed_point *int_red_y, png_fixed_point *int_green_x,
2065     png_fixed_point *int_green_y, png_fixed_point *int_blue_x,
2066     png_fixed_point *int_blue_y);
2067 }
2068 uint png_get_cHRM_XYZ_fixed
2069     (png_structp png_ptr, png_const_infop info_ptr,
2070     png_fixed_point *int_red_X, png_fixed_point *int_red_Y,
2071     png_fixed_point *int_red_Z, png_fixed_point *int_green_X,
2072     png_fixed_point *int_green_Y, png_fixed_point *int_green_Z,
2073     png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y,
2074     png_fixed_point *int_blue_Z);
2075 }
2076 
2077 static if(PNG_cHRM_SUPPORTED){
2078 void png_set_cHRM
2079     (png_structp png_ptr, png_infop info_ptr,
2080     double white_x, double white_y, double red_x, double red_y, double green_x,
2081     double green_y, double blue_x, double blue_y);
2082 void png_set_cHRM_XYZ(png_structp png_ptr,
2083     png_infop info_ptr, double red_X, double red_Y, double red_Z,
2084     double green_X, double green_Y, double green_Z, double blue_X,
2085     double blue_Y, double blue_Z);
2086 void png_set_cHRM_fixed(png_structp png_ptr,
2087     png_infop info_ptr, png_fixed_point int_white_x,
2088     png_fixed_point int_white_y, png_fixed_point int_red_x,
2089     png_fixed_point int_red_y, png_fixed_point int_green_x,
2090     png_fixed_point int_green_y, png_fixed_point int_blue_x,
2091     png_fixed_point int_blue_y);
2092 void png_set_cHRM_XYZ_fixed(png_structp png_ptr,
2093     png_infop info_ptr, png_fixed_point int_red_X, png_fixed_point int_red_Y,
2094     png_fixed_point int_red_Z, png_fixed_point int_green_X,
2095     png_fixed_point int_green_Y, png_fixed_point int_green_Z,
2096     png_fixed_point int_blue_X, png_fixed_point int_blue_Y,
2097     png_fixed_point int_blue_Z);
2098 }
2099 
2100 static if(PNG_gAMA_SUPPORTED){
2101 png_uint_32 png_get_gAMA
2102     (png_const_structp png_ptr, png_const_infop info_ptr,
2103     double *file_gamma);
2104 uint png_get_gAMA_fixed
2105     (png_const_structp png_ptr, png_const_infop info_ptr,
2106     png_fixed_point *int_file_gamma);
2107 }
2108 
2109 static if(PNG_gAMA_SUPPORTED){
2110 void png_set_gAMA(png_structp png_ptr,
2111     png_infop info_ptr, double file_gamma);
2112 void png_set_gAMA_fixed(png_structp png_ptr,
2113     png_infop info_ptr, png_fixed_point int_file_gamma);
2114 }
2115 
2116 static if(PNG_hIST_SUPPORTED){
2117 uint png_get_hIST
2118     (png_const_structp png_ptr, png_const_infop info_ptr,
2119     png_uint_16p *hist);
2120 }
2121 
2122 static if(PNG_hIST_SUPPORTED){
2123 void png_set_hIST(png_structp png_ptr,
2124     png_infop info_ptr, png_const_uint_16p hist);
2125 }
2126 
2127 uint png_get_IHDR
2128     (png_structp png_ptr, png_infop info_ptr,
2129     uint *width, uint *height, int *bit_depth, int *color_type,
2130     int *interlace_method, int *compression_method, int *filter_method);
2131 
2132 void png_set_IHDR
2133     (png_structp png_ptr, png_infop info_ptr,
2134     uint width, uint height, int bit_depth, int color_type,
2135     int interlace_method, int compression_method, int filter_method);
2136 
2137 static if(PNG_oFFs_SUPPORTED){
2138 uint png_get_oFFs
2139     (png_const_structp png_ptr, png_const_infop info_ptr,
2140     png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type);
2141 }
2142 
2143 static if(PNG_oFFs_SUPPORTED){
2144 void png_set_oFFs
2145     (png_structp png_ptr, png_infop info_ptr,
2146     png_int_32 offset_x, png_int_32 offset_y, int unit_type);
2147 }
2148 
2149 static if(PNG_pCAL_SUPPORTED){
2150 uint png_get_pCAL
2151     (png_const_structp png_ptr, png_const_infop info_ptr,
2152     png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type,
2153     int *nparams,
2154     png_charp *units, png_charpp *params);
2155 }
2156 
2157 static if(PNG_pCAL_SUPPORTED){
2158 void png_set_pCAL(png_structp png_ptr,
2159     png_infop info_ptr,
2160     png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type,
2161     int nparams, png_const_charp units, png_charpp params);
2162 }
2163 
2164 static if(PNG_pHYs_SUPPORTED){
2165 uint png_get_pHYs
2166     (png_const_structp png_ptr, png_const_infop info_ptr,
2167     uint *res_x, uint *res_y, int *unit_type);
2168 }
2169 
2170 static if(PNG_pHYs_SUPPORTED){
2171 void png_set_pHYs
2172     (png_structp png_ptr, png_infop info_ptr,
2173     uint res_x, uint res_y, int unit_type);
2174 }
2175 
2176 uint png_get_PLTE
2177     (png_const_structp png_ptr, png_const_infop info_ptr,
2178     png_colorp *palette, int *num_palette);
2179 
2180 void png_set_PLTE
2181     (png_structp png_ptr, png_infop info_ptr,
2182     png_const_colorp palette, int num_palette);
2183 
2184 static if(PNG_sBIT_SUPPORTED){
2185 uint png_get_sBIT
2186     (png_const_structp png_ptr, png_infop info_ptr,
2187     png_color_8p *sig_bit);
2188 }
2189 
2190 static if(PNG_sBIT_SUPPORTED){
2191 void png_set_sBIT
2192     (png_structp png_ptr, png_infop info_ptr, png_const_color_8p sig_bit);
2193 }
2194 
2195 static if(PNG_sRGB_SUPPORTED){
2196 uint png_get_sRGB(png_const_structp png_ptr,
2197     png_const_infop info_ptr, int *file_srgb_intent);
2198 }
2199 
2200 static if(PNG_sRGB_SUPPORTED){
2201 void png_set_sRGB
2202     (png_structp png_ptr, png_infop info_ptr, int srgb_intent);
2203 void png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr,
2204     png_infop info_ptr, int srgb_intent);
2205 }
2206 
2207 static if(PNG_iCCP_SUPPORTED){
2208 uint png_get_iCCP
2209     (png_const_structp png_ptr, png_const_infop info_ptr,
2210     png_charpp name, int *compression_type, png_bytepp profile,
2211     uint *proflen);
2212 }
2213 
2214 static if(PNG_iCCP_SUPPORTED){
2215 void png_set_iCCP
2216     (png_structp png_ptr, png_infop info_ptr,
2217     png_const_charp name, int compression_type, png_const_bytep profile,
2218     uint proflen);
2219 }
2220 
2221 static if(PNG_sPLT_SUPPORTED){
2222 uint png_get_sPLT
2223     (png_const_structp png_ptr, png_const_infop info_ptr,
2224     png_sPLT_tpp entries);
2225 }
2226 
2227 static if(PNG_sPLT_SUPPORTED){
2228 void png_set_sPLT
2229     (png_structp png_ptr, png_infop info_ptr,
2230     png_const_sPLT_tp entries, int nentries);
2231 }
2232 
2233 static if(PNG_TEXT_SUPPORTED){
2234 /* png_get_text also returns the number of text chunks in *num_text */
2235 uint png_get_text
2236     (png_const_structp png_ptr, png_const_infop info_ptr,
2237     png_textp *text_ptr, int *num_text);
2238 }
2239 
2240 /* Note while png_set_text() will accept a structure whose text,
2241  * language, and  translated keywords are NULL pointers, the structure
2242  * returned by png_get_text will always contain regular
2243  * zero-terminated C strings.  They might be empty strings but
2244  * they will never be NULL pointers.
2245  */
2246 
2247 static if(PNG_TEXT_SUPPORTED){
2248 void png_set_text
2249     (png_structp png_ptr, png_infop info_ptr,
2250     png_const_textp text_ptr, int num_text);
2251 }
2252 
2253 static if(PNG_tIME_SUPPORTED){
2254 uint png_get_tIME
2255     (png_const_structp png_ptr, png_infop info_ptr, png_timep *mod_time);
2256 }
2257 
2258 static if(PNG_tIME_SUPPORTED){
2259 void png_set_tIME
2260     (png_structp png_ptr, png_infop info_ptr, png_const_timep mod_time);
2261 }
2262 
2263 static if(PNG_tRNS_SUPPORTED){
2264 uint png_get_tRNS
2265     (png_const_structp png_ptr, png_infop info_ptr,
2266     png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color);
2267 }
2268 
2269 static if(PNG_tRNS_SUPPORTED){
2270 void png_set_tRNS
2271     (png_structp png_ptr, png_infop info_ptr,
2272     png_const_bytep trans_alpha, int num_trans,
2273     png_const_color_16p trans_color);
2274 }
2275 
2276 static if(PNG_sCAL_SUPPORTED){
2277 png_uint_32 png_get_sCAL
2278     (png_const_structp png_ptr, png_const_infop info_ptr,
2279     int *unit, double *width, double *height);
2280 static if(PNG_FLOATING_ARITHMETIC_SUPPORTED){
2281 /* NOTE: this API is currently implemented using floating point arithmetic,
2282  * consequently it can only be used on systems with floating point support.
2283  * In any case the range of values supported by png_fixed_point is small and it
2284  * is highly recommended that png_get_sCAL_s be used instead.
2285  */
2286 uint png_get_sCAL_fixed
2287     (png_structp png_ptr, png_const_infop info_ptr, int *unit,
2288     png_fixed_point *width,
2289     png_fixed_point *height);
2290 }
2291 uint png_get_sCAL_s
2292     (png_const_structp png_ptr, png_const_infop info_ptr,
2293     int *unit, png_charpp swidth, png_charpp sheight);
2294 
2295 void png_set_sCAL
2296     (png_structp png_ptr, png_infop info_ptr,
2297     int unit, double width, double height);
2298 void png_set_sCAL_fixed (png_structp png_ptr,
2299    png_infop info_ptr, int unit, png_fixed_point width,
2300    png_fixed_point height);
2301 void png_set_sCAL_s
2302     (png_structp png_ptr, png_infop info_ptr,
2303     int unit, png_const_charp swidth, png_const_charp sheight);
2304 } /* PNG_sCAL_SUPPORTED */
2305 
2306 static if(PNG_HANDLE_AS_UNKNOWN_SUPPORTED){
2307 /* Provide a list of chunks and how they are to be handled, if the built-in
2308    handling or default unknown chunk handling is not desired.  Any chunks not
2309    listed will be handled in the default manner.  The IHDR and IEND chunks
2310    must not be listed.  Because this turns off the default handling for chunks
2311    that would otherwise be recognized the behavior of libpng transformations may
2312    well become incorrect!
2313       keep = 0: PNG_HANDLE_CHUNK_AS_DEFAULT: follow default behavior
2314            = 1: PNG_HANDLE_CHUNK_NEVER:      do not keep
2315            = 2: PNG_HANDLE_CHUNK_IF_SAFE:    keep only if safe-to-copy
2316            = 3: PNG_HANDLE_CHUNK_ALWAYS:     keep even if unsafe-to-copy
2317 */
2318 void png_set_keep_unknown_chunks
2319     (png_structp png_ptr, int keep,
2320     png_const_bytep chunk_list, int num_chunks);
2321 
2322 /* The handling code is returned; the result is therefore true (non-zero) if
2323  * special handling is required, false for the default handling.
2324  */
2325 int png_handle_as_unknown(png_structp png_ptr,
2326     png_const_bytep chunk_name);
2327 }
2328 static if(PNG_UNKNOWN_CHUNKS_SUPPORTED){
2329 void png_set_unknown_chunks(png_structp png_ptr,
2330     png_infop info_ptr, png_const_unknown_chunkp unknowns,
2331     int num_unknowns);
2332 void png_set_unknown_chunk_location
2333     (png_structp png_ptr, png_infop info_ptr, int chunk, int location);
2334 int png_get_unknown_chunks(png_const_structp png_ptr,
2335     png_const_infop info_ptr, png_unknown_chunkpp entries);
2336 }
2337 
2338 /* Png_free_data() will turn off the "valid" flag for anything it frees.
2339  * If you need to turn it off for a chunk that your application has freed,
2340  * you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK);
2341  */
2342 void png_set_invalid
2343     (png_structp png_ptr, png_infop info_ptr, int mask);
2344 
2345 static if(PNG_INFO_IMAGE_SUPPORTED){
2346 /* The "params" pointer is currently not used and is for future expansion. */
2347 void png_read_png(png_structp png_ptr, png_infop info_ptr,
2348     int transforms, png_voidp params);
2349 void png_write_png(png_structp png_ptr, png_infop info_ptr,
2350     int transforms, png_voidp params);
2351 }
2352 
2353 png_const_charp png_get_copyright
2354     (png_const_structp png_ptr);
2355 png_const_charp png_get_header_ver
2356     (png_const_structp png_ptr);
2357 png_const_charp png_get_header_version
2358     (png_const_structp png_ptr);
2359 png_const_charp png_get_libpng_ver
2360     (png_const_structp png_ptr);
2361 
2362 static if(PNG_MNG_FEATURES_SUPPORTED){
2363 uint png_permit_mng_features(png_structp png_ptr,
2364     uint mng_features_permitted);
2365 }
2366 
2367 /* For use in png_set_keep_unknown, added to version 1.2.6 */
2368 enum PNG_HANDLE_CHUNK_AS_DEFAULT = 0;
2369 enum PNG_HANDLE_CHUNK_NEVER = 1;
2370 enum PNG_HANDLE_CHUNK_IF_SAFE = 2;
2371 enum PNG_HANDLE_CHUNK_ALWAYS = 3;
2372 
2373 /* Strip the prepended error numbers ("#nnn ") from error and warning
2374  * messages before passing them to the error or warning handler.
2375  */
2376 static if(PNG_ERROR_NUMBERS_SUPPORTED){
2377 void png_set_strip_error_numbers
2378     (png_structp png_ptr,
2379     uint strip_mode);
2380 }
2381 
2382 /* Added in libpng-1.2.6 */
2383 static if(PNG_SET_USER_LIMITS_SUPPORTED){
2384 void png_set_user_limits(png_structp png_ptr,
2385     uint user_width_max, uint user_height_max);
2386 uint png_get_user_width_max
2387     (png_const_structp png_ptr);
2388 uint png_get_user_height_max
2389     (png_const_structp png_ptr);
2390 /* Added in libpng-1.4.0 */
2391 void png_set_chunk_cache_max(png_structp png_ptr,
2392     uint user_chunk_cache_max);
2393 uint png_get_chunk_cache_max
2394     (png_const_structp png_ptr);
2395 /* Added in libpng-1.4.1 */
2396 void png_set_chunk_malloc_max(png_structp png_ptr,
2397     png_alloc_size_t user_chunk_cache_max);
2398 png_alloc_size_t png_get_chunk_malloc_max
2399     (png_const_structp png_ptr);
2400 }
2401 
2402 static if(PNG_INCH_CONVERSIONS_SUPPORTED){
2403 uint png_get_pixels_per_inch
2404     (png_const_structp png_ptr, png_const_infop info_ptr);
2405 
2406 uint png_get_x_pixels_per_inch
2407     (png_const_structp png_ptr, png_const_infop info_ptr);
2408 
2409 uint png_get_y_pixels_per_inch
2410     (png_const_structp png_ptr, png_const_infop info_ptr);
2411 
2412 float png_get_x_offset_inches
2413     (png_const_structp png_ptr, png_const_infop info_ptr);
2414 static if(PNG_FIXED_POINT_SUPPORTED){ /* otherwise not implemented. */
2415 png_fixed_point png_get_x_offset_inches_fixed
2416     (png_structp png_ptr, png_const_infop info_ptr);
2417 }
2418 
2419 float png_get_y_offset_inches(png_const_structp png_ptr,
2420     png_const_infop info_ptr);
2421 static if(PNG_FIXED_POINT_SUPPORTED){ /* otherwise not implemented. */
2422 png_fixed_point png_get_y_offset_inches_fixed
2423     (png_structp png_ptr, png_const_infop info_ptr);
2424 }
2425 
2426 static if(PNG_pHYs_SUPPORTED){
2427 uint png_get_pHYs_dpi(png_const_structp png_ptr,
2428     png_const_infop info_ptr, uint *res_x, uint *res_y,
2429     int *unit_type);
2430 } /* PNG_pHYs_SUPPORTED */
2431 }  /* PNG_INCH_CONVERSIONS_SUPPORTED */
2432 
2433 /* Added in libpng-1.4.0 */
2434 static if(PNG_IO_STATE_SUPPORTED){
2435 uint png_get_io_state(png_structp png_ptr);
2436 
2437 png_const_bytep png_get_io_chunk_name
2438     (png_structp png_ptr);
2439 uint png_get_io_chunk_type
2440     (png_const_structp png_ptr);
2441 
2442 /* The flags returned by png_get_io_state() are the following: */
2443 enum PNG_IO_NONE = 0x0000;   /* no I/O at this moment */
2444 enum PNG_IO_READING = 0x0001;   /* currently reading */
2445 enum PNG_IO_WRITING = 0x0002;   /* currently writing */
2446 enum PNG_IO_SIGNATURE = 0x0010;   /* currently at the file signature */
2447 enum PNG_IO_CHUNK_HDR = 0x0020;   /* currently at the chunk header */
2448 enum PNG_IO_CHUNK_DATA = 0x0040;   /* currently at the chunk data */
2449 enum PNG_IO_CHUNK_CRC = 0x0080;   /* currently at the chunk crc */
2450 enum PNG_IO_MASK_OP = 0x000f;   /* current operation: reading/writing */
2451 enum PNG_IO_MASK_LOC = 0x00f0;   /* current location: sig/hdr/data/crc */
2452 } /* ?PNG_IO_STATE_SUPPORTED */
2453 
2454 /* Interlace support.  The following macros are always defined so that if
2455  * libpng interlace handling is turned off the macros may be used to handle
2456  * interlaced images within the application.
2457  */
2458 enum PNG_INTERLACE_ADAM7_PASSES = 7;
2459 
2460 /* Two macros to return the first row and first column of the original,
2461  * full, image which appears in a given pass.  'pass' is in the range 0
2462  * to 6 and the result is in the range 0 to 7.
2463  */
2464 auto PNG_PASS_START_ROW(T)(T pass) { return (((1&~(pass))<<(3-((pass)>>1)))&7); }
2465 auto PNG_PASS_START_COL(T)(T pass) { return (((1& (pass))<<(3-(((pass)+1)>>1)))&7); }
2466 
2467 /* A macro to return the offset between pixels in the output row for a pair of
2468  * pixels in the input - effectively the inverse of the 'COL_SHIFT' macro that
2469  * follows.  Note that ROW_OFFSET is the offset from one row to the next whereas
2470  * COL_OFFSET is from one column to the next, within a row.
2471  */
2472 auto PNG_PASS_ROW_OFFSET(T)(T pass) { return ((pass)>2?(8>>(((pass)-1)>>1)):8); }
2473 auto PNG_PASS_COL_OFFSET(T)(T pass) { return (1<<((7-(pass))>>1)); }
2474 
2475 /* Two macros to help evaluate the number of rows or columns in each
2476  * pass.  This is expressed as a shift - effectively log2 of the number or
2477  * rows or columns in each 8x8 tile of the original image.
2478  */
2479 auto PNG_PASS_ROW_SHIFT(T)(T pass) { return ((pass)>2?(8-(pass))>>1:3); }
2480 auto PNG_PASS_COL_SHIFT(T)(T pass) { return ((pass)>1?(7-(pass))>>1:3); }
2481 
2482 /* Hence two macros to determine the number of rows or columns in a given
2483  * pass of an image given its height or width.  In fact these macros may
2484  * return non-zero even though the sub-image is empty, because the other
2485  * dimension may be empty for a small image.
2486  */
2487 auto PNG_PASS_ROWS(S,T)(S height, T pass) { return (((height)+(((1<<PNG_PASS_ROW_SHIFT(pass))
2488    -1)-PNG_PASS_START_ROW(pass)))>>PNG_PASS_ROW_SHIFT(pass)); }
2489 auto PNG_PASS_COLS(S,T)(S width, T pass) { return (((width)+(((1<<PNG_PASS_COL_SHIFT(pass))
2490    -1)-PNG_PASS_START_COL(pass)))>>PNG_PASS_COL_SHIFT(pass)); }
2491 
2492 /* For the reader row callbacks (both progressive and sequential) it is
2493  * necessary to find the row in the output image given a row in an interlaced
2494  * image, so two more macros:
2495  */
2496 auto PNG_ROW_FROM_PASS_ROW(S,T)(S yIn, T pass) { return 
2497    (((yIn)<<PNG_PASS_ROW_SHIFT(pass))+PNG_PASS_START_ROW(pass)); }
2498 auto PNG_COL_FROM_PASS_COL(S,T)(S xIn, T pass) { return
2499    (((xIn)<<PNG_PASS_COL_SHIFT(pass))+PNG_PASS_START_COL(pass)); }
2500 
2501 /* Two macros which return a boolean (0 or 1) saying whether the given row
2502  * or column is in a particular pass.  These use a common utility macro that
2503  * returns a mask for a given pass - the offset 'off' selects the row or
2504  * column version.  The mask has the appropriate bit set for each column in
2505  * the tile.
2506  */
2507 auto PNG_PASS_MASK(S,T)(S pass,T off) { return ( 
2508    ((0x110145AF>>(((7-(off))-(pass))<<2)) & 0xF) |
2509    ((0x01145AF0>>(((7-(off))-(pass))<<2)) & 0xF0)); }
2510 
2511 auto PNG_ROW_IN_INTERLACE_PASS(T)(y, pass) { return 
2512    ((PNG_PASS_MASK(pass,0) >> ((y)&7)) & 1); }
2513 auto PNG_COL_IN_INTERLACE_PASS(T)(x, pass) { return 
2514    ((PNG_PASS_MASK(pass,1) >> ((x)&7)) & 1); }
2515 
2516 static if(PNG_READ_COMPOSITE_NODIV_SUPPORTED){
2517 /* With these routines we avoid an integer divide, which will be slower on
2518  * most machines.  However, it does take more operations than the corresponding
2519  * divide method, so it may be slower on a few RISC systems.  There are two
2520  * shifts (by 8 or 16 bits) and an addition, versus a single integer divide.
2521  *
2522  * Note that the rounding factors are NOT supposed to be the same!  128 and
2523  * 32768 are correct for the NODIV code; 127 and 32767 are correct for the
2524  * standard method.
2525  *
2526  * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ]
2527  */
2528 
2529  /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */
2530 
2531 static assert(0);
2532 
2533 }else{  /* Standard method using integer division */
2534 
2535   auto png_composite(T)(out T composite, png_uint_16 fg, png_uint_16 alpha, png_uint_16 bg) {
2536      return (composite) = cast(png_byte)(((fg) * (alpha) +  
2537      (bg) * (255 - (alpha)) +       
2538      127) / 255); }
2539 
2540   auto png_composite_16(T)(out T composite, uint fg, uint alpha, uint bg) {
2541      return (composite) = cast(png_uint_16)(((fg) * (alpha) + 
2542      (bg)*(65535 - (alpha)) +         
2543      32767) / 65535); }
2544 } /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */
2545 
2546 static if(PNG_READ_INT_FUNCTIONS_SUPPORTED){
2547 uint png_get_uint_32(png_const_bytep buf);
2548 png_uint_16 png_get_uint_16(png_const_bytep buf);
2549 png_int_32 png_get_int_32(png_const_bytep buf);
2550 }
2551 
2552 uint png_get_uint_31(png_structp png_ptr,
2553     png_const_bytep buf);
2554 /* No png_get_int_16 -- may be added if there's a real need for it. */
2555 
2556 /* Place a 32-bit number into a buffer in PNG byte order (big-endian). */
2557 static if(PNG_WRITE_INT_FUNCTIONS_SUPPORTED){
2558 void png_save_uint_32(png_bytep buf, uint i);
2559 }
2560 static if(PNG_SAVE_INT_32_SUPPORTED){
2561 void png_save_int_32(png_bytep buf, png_int_32 i);
2562 }
2563 
2564 /* Place a 16-bit number into a buffer in PNG byte order.
2565  * The parameter is declared unsigned int, not png_uint_16,
2566  * just to avoid potential problems on pre-ANSI C compilers.
2567  */
2568 static if(PNG_WRITE_INT_FUNCTIONS_SUPPORTED){
2569 void png_save_uint_16(png_bytep buf, uint i);
2570 /* No png_save_int_16 -- may be added if there's a real need for it. */
2571 }
2572 
2573 version(PNG_USE_READ_MACROS){
2574 /* Inline macros to do direct reads of bytes from the input buffer.
2575  * The png_get_int_32() routine assumes we are using two's complement
2576  * format for negative values, which is almost certainly true.
2577  */
2578 auto png_get_uint_32(png_const_bytep buf) pure { return
2579      ((cast(uint)(*(buf)) << 24) + 
2580       (cast(uint)(*((buf) + 1)) << 16) + 
2581       (cast(uint)(*((buf) + 2)) << 8) + 
2582       (cast(uint)(*((buf) + 3)))); }
2583 
2584    /* From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
2585     * function) incorrectly returned a value of type uint.
2586     */
2587 	auto png_get_uint_16(png_const_bytep buf) pure { return
2588      (cast(png_uint_16)
2589       ((cast(uint)(*(buf)) << 8) + 
2590        (cast(uint)(*((buf) + 1))))); }
2591 
2592 	auto png_get_int_32(T)(png_const_bytep buf) pure { return 
2593      (cast(png_int_32)((*(buf) & 0x80) 
2594       ? -(cast(png_int_32)((png_get_uint_32(buf) ^ 0xffffffffL) + 1)) 
2595       : cast(png_int_32)png_get_uint_32(buf))); }
2596 }
2597 
2598 static if(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED ||
2599 	PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED){
2600 void png_set_check_for_invalid_index(png_structp png_ptr, int allowed);
2601 }
2602 
2603 /* Maintainer: Put new public prototypes here ^, in libpng.3, and project
2604  * defs
2605  */
2606 
2607 /* The last ordinal number (this is the *last* one already used; the next
2608  * one to use is one more than this.)  Maintainer, remember to add an entry to
2609  * scripts/symbols.def as well.
2610  */
2611 //  PNG_EXPORT_LAST_ORDINAL(234);
2612 
2613 }//extern (C)
2614 
2615 } /* PNG_VERSION_INFO_ONLY */
2616 /* Do not put anything past this line */