blob: 7ab324562abd8c5c94d70d8fd14f177f419d3251 [file] [log] [blame]
Glenn Randers-Pehrsone6474622006-03-04 16:50:47 -06001
Andreas Dilger47a0c421997-05-16 02:46:07 -05002/* png.h - header file for PNG reference library
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -06003 *
Glenn Randers-Pehrson42ed02e2012-03-16 23:17:27 -05004 * libpng version 1.6.0beta19 - March 17, 2012
Glenn Randers-Pehrson1531bd62012-01-01 14:45:04 -06005 * Copyright (c) 1998-2012 Glenn Randers-Pehrson
Glenn Randers-Pehrsond4366722000-06-04 14:29:29 -05006 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
7 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
Glenn Randers-Pehrsonc4a2ae61998-01-16 22:06:18 -06008 *
Glenn Randers-Pehrsonbfbf8652009-06-26 21:46:52 -05009 * This code is released under the libpng license (See LICENSE, below)
Glenn Randers-Pehrson3e61d792009-06-24 09:31:28 -050010 *
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050011 * Authors and maintainers:
Glenn Randers-Pehrsoneae8e362010-03-12 17:36:53 -060012 * 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
Glenn Randers-Pehrson42ed02e2012-03-16 23:17:27 -050014 * libpng versions 0.97, January 1998, through 1.6.0beta19 - March 17, 2012: Glenn
Glenn Randers-Pehrsoneae8e362010-03-12 17:36:53 -060015 * See also "Contributing Authors", below.
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050016 *
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -060017 * Note about libpng version numbers:
18 *
Glenn Randers-Pehrsoneae8e362010-03-12 17:36:53 -060019 * 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:
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -060024 *
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -050025 * 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)
Glenn Randers-Pehrsonbe9de0f2001-01-22 08:52:16 -060057 * 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
Glenn Randers-Pehrsond4e81092001-01-31 05:56:52 -060068 * 1.0.9 1 10009 2.1.0.9
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -060069 * 1.0.10beta1 1 10010 2.1.0.10beta1
Glenn Randers-Pehrsone1644472001-03-23 05:06:56 -060070 * 1.0.10rc1 1 10010 2.1.0.10rc1
Glenn Randers-Pehrson13cfbac2001-03-30 06:42:28 -060071 * 1.0.10 1 10010 2.1.0.10
Glenn Randers-Pehrsone1eff582001-04-14 20:15:41 -050072 * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3
Glenn Randers-Pehrson82ae3832001-04-20 10:32:10 -050073 * 1.0.11rc1 1 10011 2.1.0.11rc1
Glenn Randers-Pehrson32835392001-04-27 08:29:32 -050074 * 1.0.11 1 10011 2.1.0.11
Glenn Randers-Pehrsonb1828932001-06-23 08:03:17 -050075 * 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)
Glenn Randers-Pehrson8b6a8892001-05-18 04:54:50 -050079 * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2
Glenn Randers-Pehrson5a0be342001-10-18 20:55:13 -050080 * 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
Glenn Randers-Pehrson5cded0b2001-11-07 07:10:08 -060083 * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4
Glenn Randers-Pehrsondb3b88d2001-12-04 06:30:43 -060084 * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2
85 * 1.2.1 3 10201 3.1.2.1
Glenn Randers-Pehrson25228ab2002-03-31 07:33:55 -060086 * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6
Glenn Randers-Pehrsonfcbd7872002-04-07 16:35:38 -050087 * 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
Glenn Randers-Pehrson4fb046a2002-04-15 09:25:51 -050090 * 1.0.13 10 10013 10.so.0.1.0.13
91 * 1.2.2 12 10202 12.so.0.1.2.2
Glenn Randers-Pehrson22f28962002-05-13 18:17:09 -050092 * 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
Glenn Randers-Pehrsond020e9d2002-06-28 09:34:00 -050094 * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3
Glenn Randers-Pehrson2ae022d2002-07-01 22:23:46 -050095 * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1
96 * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1
Glenn Randers-Pehrson484a8a12002-07-07 19:15:20 -050097 * 1.0.14 10 10014 10.so.0.1.0.14
98 * 1.2.4 13 10204 12.so.0.1.2.4
Glenn Randers-Pehrson51d92502002-08-23 23:07:42 -050099 * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2
Glenn Randers-Pehrson5ff38d32002-09-17 23:38:46 -0500100 * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3
Glenn Randers-Pehrson0cc2f952002-10-03 06:32:37 -0500101 * 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
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -0500104 * 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4
Glenn Randers-Pehrson37f116a2004-08-15 07:15:39 -0500105 * 1.0.16 10 10016 10.so.0.1.0.16
106 * 1.2.6 13 10206 12.so.0.1.2.6
Glenn Randers-Pehrson67864af2004-08-28 23:30:07 -0500107 * 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2
Glenn Randers-Pehrson5b779162004-09-04 13:25:08 -0500108 * 1.0.17rc1 10 10017 12.so.0.1.0.17rc1
109 * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1
Glenn Randers-Pehrson250dfe12004-09-11 21:19:54 -0500110 * 1.0.17 10 10017 12.so.0.1.0.17
111 * 1.2.7 13 10207 12.so.0.1.2.7
Glenn Randers-Pehrson40936072004-11-20 11:18:40 -0600112 * 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5
Glenn Randers-Pehrson584b96e2004-11-29 15:08:00 -0600113 * 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
Glenn Randers-Pehrson917648e2004-12-02 18:14:51 -0600115 * 1.0.18 10 10018 12.so.0.1.0.18
116 * 1.2.8 13 10208 12.so.0.1.2.8
Glenn Randers-Pehrsone6474622006-03-04 16:50:47 -0600117 * 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3
Glenn Randers-Pehrson4deeb792006-03-22 16:21:59 -0600118 * 1.2.9beta4-11 13 10209 12.so.0.9[.0]
Glenn Randers-Pehrson3a512032006-03-31 05:29:33 -0600119 * 1.2.9rc1 13 10209 12.so.0.9[.0]
Glenn Randers-Pehrsona7d0c942006-04-14 06:22:52 -0500120 * 1.2.9 13 10209 12.so.0.9[.0]
Glenn Randers-Pehrsond60b8fa2006-04-20 21:31:14 -0500121 * 1.2.10beta1-7 13 10210 12.so.0.10[.0]
Glenn Randers-Pehrson17218292006-04-20 07:20:46 -0500122 * 1.2.10rc1-2 13 10210 12.so.0.10[.0]
Glenn Randers-Pehrson86dc9812006-05-10 07:27:44 -0500123 * 1.2.10 13 10210 12.so.0.10[.0]
Glenn Randers-Pehrson73b064c2006-05-15 06:44:21 -0500124 * 1.4.0beta1-5 14 10400 14.so.0.0[.0]
Glenn Randers-Pehrson7824a702009-06-13 10:05:05 -0500125 * 1.2.11beta1-4 13 10211 12.so.0.11[.0]
Glenn Randers-Pehrson3424ee72006-07-12 13:33:47 -0500126 * 1.4.0beta7-8 14 10400 14.so.0.0[.0]
Glenn Randers-Pehrson7aa18342009-06-05 17:24:17 -0500127 * 1.2.11 13 10211 12.so.0.11[.0]
128 * 1.2.12 13 10212 12.so.0.12[.0]
Glenn Randers-Pehrson701dbaa2006-11-17 09:36:54 -0600129 * 1.4.0beta9-14 14 10400 14.so.0.0[.0]
Glenn Randers-Pehrson7aa18342009-06-05 17:24:17 -0500130 * 1.2.13 13 10213 12.so.0.13[.0]
Glenn Randers-Pehrson97a9b482008-10-25 20:03:28 -0500131 * 1.4.0beta15-36 14 10400 14.so.0.0[.0]
Glenn Randers-Pehrsonfa028102009-10-10 06:15:21 -0500132 * 1.4.0beta37-87 14 10400 14.so.14.0[.0]
Glenn Randers-Pehrson733da8c2009-10-30 00:00:15 -0500133 * 1.4.0rc01 14 10400 14.so.14.0[.0]
Glenn Randers-Pehrson62ca98e2009-12-20 15:14:57 -0600134 * 1.4.0beta88-109 14 10400 14.so.14.0[.0]
Glenn Randers-Pehrson67a83db2010-01-01 18:26:18 -0600135 * 1.4.0rc02-08 14 10400 14.so.14.0[.0]
Glenn Randers-Pehrson75202242009-12-25 14:25:29 -0600136 * 1.4.0 14 10400 14.so.14.0[.0]
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -0600137 * 1.4.1beta01-03 14 10401 14.so.14.1[.0]
138 * 1.4.1rc01 14 10401 14.so.14.1[.0]
Glenn Randers-Pehrson7a5be532010-02-14 07:16:19 -0600139 * 1.4.1beta04-12 14 10401 14.so.14.1[.0]
Glenn Randers-Pehrsonaaf377c2010-03-08 11:20:30 -0600140 * 1.4.1 14 10401 14.so.14.1[.0]
Glenn Randers-Pehrson5b3d5542010-06-18 21:55:53 -0500141 * 1.4.2 14 10402 14.so.14.2[.0]
142 * 1.4.3 14 10403 14.so.14.3[.0]
Glenn Randers-Pehrson2776d5e2010-11-21 15:18:02 -0600143 * 1.4.4 14 10404 14.so.14.4[.0]
Glenn Randers-Pehrsonfd20a5a2010-12-27 08:53:08 -0600144 * 1.5.0beta01-58 15 10500 15.so.15.0[.0]
Glenn Randers-Pehrson64b863c2011-01-04 09:57:06 -0600145 * 1.5.0rc01-07 15 10500 15.so.15.0[.0]
Glenn Randers-Pehrsonf5ea1b72011-01-06 06:42:51 -0600146 * 1.5.0 15 10500 15.so.15.0[.0]
Glenn Randers-Pehrsonef123cc2011-01-28 15:20:34 -0600147 * 1.5.1beta01-11 15 10501 15.so.15.1[.0]
Glenn Randers-Pehrson3d3aae12011-02-02 22:58:27 -0600148 * 1.5.1rc01-02 15 10501 15.so.15.1[.0]
149 * 1.5.1 15 10501 15.so.15.1[.0]
Glenn Randers-Pehrsonf3dd1cc2011-03-18 22:02:20 -0500150 * 1.5.2beta01-03 15 10502 15.so.15.2[.0]
Glenn Randers-Pehrson77fd0832011-03-24 08:59:48 -0500151 * 1.5.2rc01-03 15 10502 15.so.15.2[.0]
Glenn Randers-Pehrsondcc35052011-03-31 11:23:49 -0500152 * 1.5.2 15 10502 15.so.15.2[.0]
Glenn Randers-Pehrson36edbb52011-06-03 07:15:04 -0500153 * 1.5.3beta01-10 15 10503 15.so.15.3[.0]
Glenn Randers-Pehrsonfb278732011-06-10 20:43:39 -0500154 * 1.5.3rc01-02 15 10503 15.so.15.3[.0]
Glenn Randers-Pehrson413138a2011-06-13 22:07:37 -0500155 * 1.5.3beta11 15 10503 15.so.15.3[.0]
156 * 1.5.3 [omitted]
Glenn Randers-Pehrson9daf91e2011-06-22 23:10:36 -0500157 * 1.5.4beta01-08 15 10504 15.so.15.4[.0]
Glenn Randers-Pehrson78bb9da2011-06-30 18:59:45 -0500158 * 1.5.4rc01 15 10504 15.so.15.4[.0]
Glenn Randers-Pehrsond404b6d2011-07-07 06:24:57 -0500159 * 1.5.4 15 10504 15.so.15.4[.0]
Glenn Randers-Pehrson3c2ae602011-09-09 06:02:09 -0500160 * 1.5.5beta01-08 15 10505 15.so.15.5[.0]
161 * 1.5.5rc01 15 10505 15.so.15.5[.0]
Glenn Randers-Pehrson3e2263a2011-09-22 08:40:32 -0500162 * 1.5.5 15 10505 15.so.15.5[.0]
Glenn Randers-Pehrson93254f62011-10-26 08:36:21 -0500163 * 1.5.6beta01-07 15 10506 15.so.15.6[.0]
Glenn Randers-Pehrsonbc6726b2011-11-02 22:43:00 -0500164 * 1.5.6rc01-03 15 10506 15.so.15.6[.0]
165 * 1.5.6 15 10506 15.so.15.6[.0]
Glenn Randers-Pehrson36251d32011-11-17 21:14:34 -0600166 * 1.5.7beta01-05 15 10507 15.so.15.7[.0]
Glenn Randers-Pehrsonb74fb4e2011-12-21 08:37:46 -0600167 * 1.5.7rc01-03 15 10507 15.so.15.7[.0]
168 * 1.5.7 15 10507 15.so.15.7[.0]
Glenn Randers-Pehrsond15d1242012-03-16 08:23:38 -0500169 * 1.6.0beta01-19 16 10600 16.so.16.0[.0]
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600170 *
Glenn Randers-Pehrsoneae8e362010-03-12 17:36:53 -0600171 * Henceforth the source version will match the shared-library major
172 * and minor numbers; the shared-library major version number will be
173 * used for changes in backward compatibility, as it is intended. The
174 * PNG_LIBPNG_VER macro, which is not used within libpng but is available
175 * for applications, is an unsigned integer of the form xyyzz corresponding
176 * to the source version x.y.z (leading zeros in y and z). Beta versions
177 * were given the previous public release number plus a letter, until
178 * version 1.0.6j; from then on they were given the upcoming public
Glenn Randers-Pehrson8e92cd52012-03-02 13:57:45 -0600179 * release number plus "betaNN" or "rcNN".
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600180 *
Glenn Randers-Pehrsoneae8e362010-03-12 17:36:53 -0600181 * Binary incompatibility exists only when applications make direct access
182 * to the info_ptr or png_ptr members through png.h, and the compiled
183 * application is loaded with a different version of the library.
Glenn Randers-Pehrson326320e2000-04-24 07:43:17 -0500184 *
Glenn Randers-Pehrsoneae8e362010-03-12 17:36:53 -0600185 * DLLNUM will change each time there are forward or backward changes
186 * in binary compatibility (e.g., when a new feature is added).
Glenn Randers-Pehrsonbe9de0f2001-01-22 08:52:16 -0600187 *
Glenn Randers-Pehrsonf3abb2c2010-10-17 12:51:53 -0500188 * See libpng-manual.txt or libpng.3 for more information. The PNG
189 * specification is available as a W3C Recommendation and as an ISO
190 * Specification, <http://www.w3.org/TR/2003/REC-PNG-20031110/
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600191 */
192
193/*
Glenn Randers-Pehrson68ea2432000-04-01 21:10:05 -0600194 * COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
195 *
Glenn Randers-Pehrsond4366722000-06-04 14:29:29 -0500196 * If you modify libpng you may insert additional notices immediately following
197 * this sentence.
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600198 *
Glenn Randers-Pehrsonbfbf8652009-06-26 21:46:52 -0500199 * This code is released under the libpng license.
200 *
Glenn Randers-Pehrson42ed02e2012-03-16 23:17:27 -0500201 * libpng versions 1.2.6, August 15, 2004, through 1.6.0beta19, March 17, 2012, are
Glenn Randers-Pehrson1531bd62012-01-01 14:45:04 -0600202 * Copyright (c) 2004, 2006-2012 Glenn Randers-Pehrson, and are
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -0500203 * distributed according to the same disclaimer and license as libpng-1.2.5
Glenn Randers-Pehrsona4981d42004-08-25 22:00:45 -0500204 * with the following individual added to the list of Contributing Authors:
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -0500205 *
206 * Cosmin Truta
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -0500207 *
Glenn Randers-Pehrsona4981d42004-08-25 22:00:45 -0500208 * libpng versions 1.0.7, July 1, 2000, through 1.2.5, October 3, 2002, are
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -0500209 * Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
Glenn Randers-Pehrson32fc5ce2000-07-24 06:34:14 -0500210 * distributed according to the same disclaimer and license as libpng-1.0.6
Glenn Randers-Pehrsona4981d42004-08-25 22:00:45 -0500211 * with the following individuals added to the list of Contributing Authors:
Glenn Randers-Pehrsond4366722000-06-04 14:29:29 -0500212 *
213 * Simon-Pierre Cadieux
214 * Eric S. Raymond
215 * Gilles Vollant
216 *
Glenn Randers-Pehrson3d5a5202000-07-01 15:37:28 -0500217 * and with the following additions to the disclaimer:
218 *
219 * There is no warranty against interference with your enjoyment of the
220 * library or against infringement. There is no warranty that our
221 * efforts or the library will fulfill any of your particular purposes
222 * or needs. This library is provided with all faults, and the entire
223 * risk of satisfactory quality, performance, accuracy, and effort is with
224 * the user.
225 *
226 * libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
Glenn Randers-Pehrsona4981d42004-08-25 22:00:45 -0500227 * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson, and are
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -0600228 * distributed according to the same disclaimer and license as libpng-0.96,
Glenn Randers-Pehrsond4366722000-06-04 14:29:29 -0500229 * with the following individuals added to the list of Contributing Authors:
230 *
231 * Tom Lane
232 * Glenn Randers-Pehrson
233 * Willem van Schaik
234 *
235 * libpng versions 0.89, June 1996, through 0.96, May 1997, are
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600236 * Copyright (c) 1996, 1997 Andreas Dilger
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -0600237 * Distributed according to the same disclaimer and license as libpng-0.88,
Glenn Randers-Pehrsond4366722000-06-04 14:29:29 -0500238 * with the following individuals added to the list of Contributing Authors:
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600239 *
240 * John Bowler
241 * Kevin Bracey
242 * Sam Bushell
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600243 * Magnus Holmgren
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600244 * Greg Roelofs
Glenn Randers-Pehrsond4366722000-06-04 14:29:29 -0500245 * Tom Tanner
246 *
247 * libpng versions 0.5, May 1995, through 0.88, January 1996, are
248 * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
249 *
250 * For the purposes of this copyright and license, "Contributing Authors"
251 * is defined as the following set of individuals:
252 *
253 * Andreas Dilger
254 * Dave Martindale
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600255 * Guy Eric Schalnat
256 * Paul Schmidt
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600257 * Tim Wegner
258 *
259 * The PNG Reference Library is supplied "AS IS". The Contributing Authors
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -0600260 * and Group 42, Inc. disclaim all warranties, expressed or implied,
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600261 * including, without limitation, the warranties of merchantability and of
262 * fitness for any purpose. The Contributing Authors and Group 42, Inc.
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -0600263 * assume no liability for direct, indirect, incidental, special, exemplary,
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600264 * or consequential damages, which may result from the use of the PNG
265 * Reference Library, even if advised of the possibility of such damage.
266 *
267 * Permission is hereby granted to use, copy, modify, and distribute this
268 * source code, or portions hereof, for any purpose, without fee, subject
269 * to the following restrictions:
270 *
Glenn Randers-Pehrsoneae8e362010-03-12 17:36:53 -0600271 * 1. The origin of this source code must not be misrepresented.
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600272 *
Glenn Randers-Pehrson53c07f52010-06-18 18:55:55 -0500273 * 2. Altered versions must be plainly marked as such and must not
274 * be misrepresented as being the original source.
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600275 *
Glenn Randers-Pehrsoneae8e362010-03-12 17:36:53 -0600276 * 3. This Copyright notice may not be removed or altered from
277 * any source or altered source distribution.
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600278 *
279 * The Contributing Authors and Group 42, Inc. specifically permit, without
280 * fee, and encourage the use of this source code as a component to
281 * supporting the PNG file format in commercial products. If you use this
282 * source code in a product, acknowledgment is not required but would be
283 * appreciated.
284 */
285
286/*
287 * A "png_get_copyright" function is available, for convenient use in "about"
288 * boxes and the like:
289 *
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -0600290 * printf("%s", png_get_copyright(NULL));
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600291 *
292 * Also, the PNG logo (in PNG format, of course) is supplied in the
Glenn Randers-Pehrsona4d54bd2000-07-14 08:15:12 -0500293 * files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600294 */
295
296/*
297 * Libpng is OSI Certified Open Source Software. OSI Certified is a
298 * certification mark of the Open Source Initiative.
299 */
300
301/*
302 * The contributing authors would like to thank all those who helped
303 * with testing, bug fixes, and patience. This wouldn't have been
304 * possible without all of you.
305 *
306 * Thanks to Frank J. T. Wojcik for helping with the documentation.
307 */
308
309/*
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -0600310 * Y2K compliance in libpng:
311 * =========================
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600312 *
Glenn Randers-Pehrson42ed02e2012-03-16 23:17:27 -0500313 * March 17, 2012
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600314 *
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -0600315 * Since the PNG Development group is an ad-hoc body, we can't make
316 * an official declaration.
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600317 *
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500318 * This is your unofficial assurance that libpng from version 0.71 and
Glenn Randers-Pehrsond15d1242012-03-16 08:23:38 -0500319 * upward through 1.6.0beta19 are Y2K compliant. It is my belief that
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -0500320 * earlier versions were also Y2K compliant.
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600321 *
John Bowler88b77cc2011-05-05 06:49:55 -0500322 * Libpng only has two year fields. One is a 2-byte unsigned integer
323 * that will hold years up to 65535. The other holds the date in text
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -0600324 * format, and will hold years up to 9999.
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600325 *
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -0600326 * The integer is
327 * "png_uint_16 year" in png_time_struct.
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600328 *
John Bowler88b77cc2011-05-05 06:49:55 -0500329 * The string is
330 * "png_char time_buffer" in png_struct
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600331 *
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -0600332 * There are seven time-related functions:
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600333 * png.c: png_convert_to_rfc_1123() in png.c
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -0600334 * (formerly png_convert_to_rfc_1152() in error)
335 * png_convert_from_struct_tm() in pngwrite.c, called in pngwrite.c
336 * png_convert_from_time_t() in pngwrite.c
337 * png_get_tIME() in pngget.c
338 * png_handle_tIME() in pngrutil.c, called in pngread.c
339 * png_set_tIME() in pngset.c
340 * png_write_tIME() in pngwutil.c, called in pngwrite.c
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600341 *
342 * All handle dates properly in a Y2K environment. The
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -0600343 * png_convert_from_time_t() function calls gmtime() to convert from system
344 * clock time, which returns (year - 1900), which we properly convert to
345 * the full 4-digit year. There is a possibility that applications using
346 * libpng are not passing 4-digit years into the png_convert_to_rfc_1123()
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500347 * function, or that they are incorrectly passing only a 2-digit year
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -0600348 * instead of "year - 1900" into the png_convert_from_struct_tm() function,
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500349 * but this is not under our control. The libpng documentation has always
350 * stated that it works with 4-digit years, and the APIs have been
351 * documented as such.
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600352 *
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -0600353 * The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned
354 * integer to hold the year, and can hold years as large as 65535.
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600355 *
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500356 * zlib, upon which libpng depends, is also Y2K compliant. It contains
357 * no date-related code.
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600358 *
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -0600359 * Glenn Randers-Pehrson
360 * libpng maintainer
361 * PNG Development Group
Glenn Randers-Pehrsonbcfd15d1999-10-01 14:22:25 -0500362 */
363
Glenn Randers-Pehrson13944802000-06-24 07:42:42 -0500364#ifndef PNG_H
365#define PNG_H
Guy Schalnat0d580581995-07-20 02:43:20 -0500366
Glenn Randers-Pehrsonf3abb2c2010-10-17 12:51:53 -0500367/* This is not the place to learn how to use libpng. The file libpng-manual.txt
Andreas Dilger47a0c421997-05-16 02:46:07 -0500368 * describes how to use libpng, and the file example.c summarizes it
369 * with some code on which to build. This file is useful for looking
370 * at the actual function definitions and structure components.
John Bowler7875d532011-11-07 22:33:49 -0600371 *
372 * If you just need to read a PNG file and don't want to read the documentation
373 * skip to the end of this file and read the section entitled 'simplified API'.
Andreas Dilger47a0c421997-05-16 02:46:07 -0500374 */
Guy Schalnat0d580581995-07-20 02:43:20 -0500375
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -0500376/* Version information for png.h - this should match the version in png.c */
Glenn Randers-Pehrsond15d1242012-03-16 08:23:38 -0500377#define PNG_LIBPNG_VER_STRING "1.6.0beta19"
Glenn Randers-Pehrson5b5dcf82004-07-17 22:45:44 -0500378#define PNG_HEADER_VERSION_STRING \
Glenn Randers-Pehrson42ed02e2012-03-16 23:17:27 -0500379 " libpng version 1.6.0beta19 - March 17, 2012\n"
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -0500380
Glenn Randers-Pehrson7455cbf2011-11-24 14:40:36 -0600381#define PNG_LIBPNG_VER_SONUM 16
382#define PNG_LIBPNG_VER_DLLNUM 16
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -0500383
384/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
385#define PNG_LIBPNG_VER_MAJOR 1
Glenn Randers-Pehrson87fadd52011-11-24 14:35:13 -0600386#define PNG_LIBPNG_VER_MINOR 6
387#define PNG_LIBPNG_VER_RELEASE 0
388
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -0500389/* This should match the numeric part of the final component of
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -0500390 * PNG_LIBPNG_VER_STRING, omitting any leading zero:
391 */
Glenn Randers-Pehrsond56aca72000-11-23 11:51:42 -0600392
Glenn Randers-Pehrsond15d1242012-03-16 08:23:38 -0500393#define PNG_LIBPNG_VER_BUILD 19
Glenn Randers-Pehrsond56aca72000-11-23 11:51:42 -0600394
Glenn Randers-Pehrson40936072004-11-20 11:18:40 -0600395/* Release Status */
Glenn Randers-Pehrsond56aca72000-11-23 11:51:42 -0600396#define PNG_LIBPNG_BUILD_ALPHA 1
397#define PNG_LIBPNG_BUILD_BETA 2
398#define PNG_LIBPNG_BUILD_RC 3
399#define PNG_LIBPNG_BUILD_STABLE 4
Glenn Randers-Pehrson40936072004-11-20 11:18:40 -0600400#define PNG_LIBPNG_BUILD_RELEASE_STATUS_MASK 7
Glenn Randers-Pehrsonbeb572e2006-08-19 13:59:24 -0500401
Glenn Randers-Pehrson40936072004-11-20 11:18:40 -0600402/* Release-Specific Flags */
403#define PNG_LIBPNG_BUILD_PATCH 8 /* Can be OR'ed with
404 PNG_LIBPNG_BUILD_STABLE only */
405#define PNG_LIBPNG_BUILD_PRIVATE 16 /* Cannot be OR'ed with
406 PNG_LIBPNG_BUILD_SPECIAL */
407#define PNG_LIBPNG_BUILD_SPECIAL 32 /* Cannot be OR'ed with
408 PNG_LIBPNG_BUILD_PRIVATE */
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -0500409
Glenn Randers-Pehrson17218292006-04-20 07:20:46 -0500410#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_BETA
Glenn Randers-Pehrson5dd2b8e2004-11-24 07:50:16 -0600411
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -0500412/* Careful here. At one time, Guy wanted to use 082, but that would be octal.
413 * We must not include leading zeros.
414 * Versions 0.7 through 1.0.0 were in the range 0 to 100 here (only
415 * version 1.0.0 was mis-numbered 100 instead of 10000). From
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -0500416 * version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release
417 */
Glenn Randers-Pehrson87fadd52011-11-24 14:35:13 -0600418#define PNG_LIBPNG_VER 10600 /* 1.6.0 */
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -0500419
Glenn Randers-Pehrson862cb202010-04-16 22:12:51 -0500420/* Library configuration: these options cannot be changed after
421 * the library has been built.
422 */
423#ifndef PNGLCONF_H
Glenn Randers-Pehrson8c667862010-08-24 16:16:35 -0500424 /* If pnglibconf.h is missing, you can
425 * copy scripts/pnglibconf.h.prebuilt to pnglibconf.h
426 */
Glenn Randers-Pehrson98b4f002010-04-16 22:30:26 -0500427# include "pnglibconf.h"
Glenn Randers-Pehrson5dd2b8e2004-11-24 07:50:16 -0600428#endif
Guy Schalnat0d580581995-07-20 02:43:20 -0500429
Glenn Randers-Pehrson862cb202010-04-16 22:12:51 -0500430#ifndef PNG_VERSION_INFO_ONLY
John Bowlerbaeb6d12011-11-26 18:21:02 -0600431 /* Machine specific configuration. */
Glenn Randers-Pehrson862cb202010-04-16 22:12:51 -0500432# include "pngconf.h"
433#endif
Guy Schalnat0d580581995-07-20 02:43:20 -0500434
Glenn Randers-Pehrson5dd2b8e2004-11-24 07:50:16 -0600435/*
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -0500436 * Added at libpng-1.2.8
437 *
438 * Ref MSDN: Private as priority over Special
Glenn Randers-Pehrson5dd2b8e2004-11-24 07:50:16 -0600439 * VS_FF_PRIVATEBUILD File *was not* built using standard release
440 * procedures. If this value is given, the StringFileInfo block must
Glenn Randers-Pehrsonbeb572e2006-08-19 13:59:24 -0500441 * contain a PrivateBuild string.
Glenn Randers-Pehrson5dd2b8e2004-11-24 07:50:16 -0600442 *
443 * VS_FF_SPECIALBUILD File *was* built by the original company using
444 * standard release procedures but is a variation of the standard
445 * file of the same version number. If this value is given, the
Glenn Randers-Pehrsonbeb572e2006-08-19 13:59:24 -0500446 * StringFileInfo block must contain a SpecialBuild string.
Glenn Randers-Pehrson5dd2b8e2004-11-24 07:50:16 -0600447 */
448
Glenn Randers-Pehrson98b4f002010-04-16 22:30:26 -0500449#ifdef PNG_USER_PRIVATEBUILD /* From pnglibconf.h */
Glenn Randers-Pehrson9c3ab682006-02-20 22:09:05 -0600450# define PNG_LIBPNG_BUILD_TYPE \
Glenn Randers-Pehrsoneae8e362010-03-12 17:36:53 -0600451 (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_PRIVATE)
Glenn Randers-Pehrson5dd2b8e2004-11-24 07:50:16 -0600452#else
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -0500453# ifdef PNG_LIBPNG_SPECIALBUILD
Glenn Randers-Pehrson9c3ab682006-02-20 22:09:05 -0600454# define PNG_LIBPNG_BUILD_TYPE \
Glenn Randers-Pehrsoneae8e362010-03-12 17:36:53 -0600455 (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_SPECIAL)
Glenn Randers-Pehrson5dd2b8e2004-11-24 07:50:16 -0600456# else
Glenn Randers-Pehrson9c3ab682006-02-20 22:09:05 -0600457# define PNG_LIBPNG_BUILD_TYPE (PNG_LIBPNG_BUILD_BASE_TYPE)
Glenn Randers-Pehrson5dd2b8e2004-11-24 07:50:16 -0600458# endif
459#endif
460
461#ifndef PNG_VERSION_INFO_ONLY
462
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500463/* Inhibit C++ name-mangling for libpng functions but not for system calls. */
464#ifdef __cplusplus
465extern "C" {
466#endif /* __cplusplus */
467
Andreas Dilger47a0c421997-05-16 02:46:07 -0500468/* Version information for C files, stored in png.c. This had better match
469 * the version above.
470 */
Glenn Randers-Pehrson4c8f7262010-03-16 19:30:01 -0500471#define png_libpng_ver png_get_header_ver(NULL)
Andreas Dilger47a0c421997-05-16 02:46:07 -0500472
Glenn Randers-Pehrson862cb202010-04-16 22:12:51 -0500473/* This file is arranged in several sections:
474 *
475 * 1. Any configuration options that can be specified by for the application
Glenn Randers-Pehrson98b4f002010-04-16 22:30:26 -0500476 * code when it is built. (Build time configuration is in pnglibconf.h)
Glenn Randers-Pehrson862cb202010-04-16 22:12:51 -0500477 * 2. Type definitions (base types are defined in pngconf.h), structure
478 * definitions.
479 * 3. Exported library functions.
John Bowler7875d532011-11-07 22:33:49 -0600480 * 4. Simplified API.
Glenn Randers-Pehrson862cb202010-04-16 22:12:51 -0500481 *
482 * The library source code has additional files (principally pngpriv.h) that
483 * allow configuration of the library.
484 */
485/* Section 1: run time configuration
Glenn Randers-Pehrson98b4f002010-04-16 22:30:26 -0500486 * See pnglibconf.h for build time configuration
Glenn Randers-Pehrson862cb202010-04-16 22:12:51 -0500487 *
488 * Run time configuration allows the application to choose between
489 * implementations of certain arithmetic APIs. The default is set
Glenn Randers-Pehrson98b4f002010-04-16 22:30:26 -0500490 * at build time and recorded in pnglibconf.h, but it is safe to
Glenn Randers-Pehrson862cb202010-04-16 22:12:51 -0500491 * override these (and only these) settings. Note that this won't
492 * change what the library does, only application code, and the
493 * settings can (and probably should) be made on a per-file basis
494 * by setting the #defines before including png.h
495 *
496 * Use macros to read integers from PNG data or use the exported
497 * functions?
498 * PNG_USE_READ_MACROS: use the macros (see below) Note that
499 * the macros evaluate their argument multiple times.
500 * PNG_NO_USE_READ_MACROS: call the relevant library function.
501 *
502 * Use the alternative algorithm for compositing alpha samples that
503 * does not use division?
504 * PNG_READ_COMPOSITE_NODIV_SUPPORTED: use the 'no division'
505 * algorithm.
506 * PNG_NO_READ_COMPOSITE_NODIV: use the 'division' algorithm.
507 *
508 * How to handle benign errors if PNG_ALLOW_BENIGN_ERRORS is
509 * false?
510 * PNG_ALLOW_BENIGN_ERRORS: map calls to the benign error
511 * APIs to png_warning.
512 * Otherwise the calls are mapped to png_error.
513 */
514
515/* Section 2: type definitions, including structures and compile time
516 * constants.
517 * See pngconf.h for base types that vary by machine/system
518 */
Glenn Randers-Pehrson88910f52010-10-16 20:38:45 -0500519
520/* This triggers a compiler error in png.c, if png.c and png.h
521 * do not agree upon the version number.
522 */
Glenn Randers-Pehrsond15d1242012-03-16 08:23:38 -0500523typedef char* png_libpng_version_1_6_0beta19;
Glenn Randers-Pehrson88910f52010-10-16 20:38:45 -0500524
John Bowler5d567862011-12-24 09:12:00 -0600525/* Basic control structions. Read libpng-manual.txt or libpng.3 for more info.
526 *
527 * png_struct is the cache of information used while reading or writing a single
528 * PNG file. One of these is always required, although the simplified API
529 * (below) hides the creation and destruction of it.
530 */
531typedef struct png_struct_def png_struct;
532typedef const png_struct * png_const_structp;
533typedef png_struct * png_structp;
534typedef png_struct * * png_structpp;
535
536/* png_info contains information read from or to be written to a PNG file. One
537 * or more of these must exist while reading or creating a PNG file. The
538 * information is not used by libpng during read but is used to control what
539 * gets written when a PNG file is created. "png_get_" function calls read
540 * information during read and "png_set_" functions calls write information
541 * when creating a PNG.
542 * been moved into a separate header file that is not accessible to
543 * applications. Read libpng-manual.txt or libpng.3 for more info.
544 */
545typedef struct png_info_def png_info;
546typedef png_info * png_infop;
547typedef const png_info * png_const_infop;
548typedef png_info * * png_infopp;
549
550/* Types with names ending 'p' are pointer types. The corresponding types with
551 * names ending 'rp' are identical pointer types except that the pointer is
552 * marked 'restrict', which means that it is the only pointer to the object
553 * passed to the function. Applications should not use the 'restrict' types;
554 * it is always valid to pass 'p' to a pointer with a function argument of the
555 * corresponding 'rp' type. Different compilers have different rules with
556 * regard to type matching in the presence of 'restrict'. For backward
557 * compatibility libpng callbacks never have 'restrict' in their parameters and,
558 * consequentially, writing portable application code is extremely difficult if
559 * an attempt is made to use 'restrict'.
560 */
561typedef png_struct * PNG_RESTRICT png_structrp;
562typedef const png_struct * PNG_RESTRICT png_const_structrp;
563typedef png_info * PNG_RESTRICT png_inforp;
564typedef const png_info * PNG_RESTRICT png_const_inforp;
565
Andreas Dilger47a0c421997-05-16 02:46:07 -0500566/* Three color definitions. The order of the red, green, and blue, (and the
567 * exact size) is not important, although the size of the fields need to
568 * be png_byte or png_uint_16 (as defined below).
569 */
Guy Schalnat0d580581995-07-20 02:43:20 -0500570typedef struct png_color_struct
571{
Guy Schalnat4ee97b01996-01-16 01:51:56 -0600572 png_byte red;
Guy Schalnat0d580581995-07-20 02:43:20 -0500573 png_byte green;
574 png_byte blue;
575} png_color;
John Bowlerbaeb6d12011-11-26 18:21:02 -0600576typedef png_color * png_colorp;
577typedef const png_color * png_const_colorp;
578typedef png_color * * png_colorpp;
Guy Schalnat0d580581995-07-20 02:43:20 -0500579
580typedef struct png_color_16_struct
581{
Andreas Dilger47a0c421997-05-16 02:46:07 -0500582 png_byte index; /* used for palette files */
583 png_uint_16 red; /* for use in red green blue files */
Guy Schalnat0d580581995-07-20 02:43:20 -0500584 png_uint_16 green;
585 png_uint_16 blue;
Andreas Dilger47a0c421997-05-16 02:46:07 -0500586 png_uint_16 gray; /* for use in grayscale files */
Guy Schalnat0d580581995-07-20 02:43:20 -0500587} png_color_16;
John Bowlerbaeb6d12011-11-26 18:21:02 -0600588typedef png_color_16 * png_color_16p;
589typedef const png_color_16 * png_const_color_16p;
590typedef png_color_16 * * png_color_16pp;
Guy Schalnat0d580581995-07-20 02:43:20 -0500591
592typedef struct png_color_8_struct
593{
Andreas Dilger47a0c421997-05-16 02:46:07 -0500594 png_byte red; /* for use in red green blue files */
Guy Schalnat0d580581995-07-20 02:43:20 -0500595 png_byte green;
596 png_byte blue;
Andreas Dilger47a0c421997-05-16 02:46:07 -0500597 png_byte gray; /* for use in grayscale files */
Guy Schalnat0d580581995-07-20 02:43:20 -0500598 png_byte alpha; /* for alpha channel files */
599} png_color_8;
John Bowlerbaeb6d12011-11-26 18:21:02 -0600600typedef png_color_8 * png_color_8p;
601typedef const png_color_8 * png_const_color_8p;
602typedef png_color_8 * * png_color_8pp;
Guy Schalnat0d580581995-07-20 02:43:20 -0500603
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600604/*
605 * The following two structures are used for the in-core representation
606 * of sPLT chunks.
607 */
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600608typedef struct png_sPLT_entry_struct
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600609{
610 png_uint_16 red;
611 png_uint_16 green;
612 png_uint_16 blue;
613 png_uint_16 alpha;
614 png_uint_16 frequency;
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600615} png_sPLT_entry;
John Bowlerbaeb6d12011-11-26 18:21:02 -0600616typedef png_sPLT_entry * png_sPLT_entryp;
617typedef const png_sPLT_entry * png_const_sPLT_entryp;
618typedef png_sPLT_entry * * png_sPLT_entrypp;
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600619
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -0500620/* When the depth of the sPLT palette is 8 bits, the color and alpha samples
621 * occupy the LSB of their respective members, and the MSB of each member
622 * is zero-filled. The frequency member always occupies the full 16 bits.
623 */
624
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600625typedef struct png_sPLT_struct
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600626{
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -0500627 png_charp name; /* palette name */
628 png_byte depth; /* depth of palette samples */
629 png_sPLT_entryp entries; /* palette entries */
630 png_int_32 nentries; /* number of palette entries */
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600631} png_sPLT_t;
John Bowlerbaeb6d12011-11-26 18:21:02 -0600632typedef png_sPLT_t * png_sPLT_tp;
633typedef const png_sPLT_t * png_const_sPLT_tp;
634typedef png_sPLT_t * * png_sPLT_tpp;
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600635
636#ifdef PNG_TEXT_SUPPORTED
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -0600637/* png_text holds the contents of a text/ztxt/itxt chunk in a PNG file,
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600638 * and whether that contents is compressed or not. The "key" field
Glenn Randers-Pehrson680da022011-11-21 17:05:41 -0600639 * points to a regular zero-terminated C string. The "text" fields can be a
640 * regular C string, an empty string, or a NULL pointer.
Glenn Randers-Pehrson140504b2011-06-15 08:10:13 -0500641 * However, the structure returned by png_get_text() will always contain
Glenn Randers-Pehrson680da022011-11-21 17:05:41 -0600642 * the "text" field as a regular zero-terminated C string (possibly
643 * empty), never a NULL pointer, so it can be safely used in printf() and
644 * other string-handling functions. Note that the "itxt_length", "lang", and
645 * "lang_key" members of the structure only exist when the library is built
646 * with iTXt chunk support. Prior to libpng-1.4.0 the library was built by
647 * default without iTXt support. Also note that when iTXt *is* supported,
648 * the "lang" and "lang_key" fields contain NULL pointers when the
649 * "compression" field contains * PNG_TEXT_COMPRESSION_NONE or
Glenn Randers-Pehrson12fb29f2011-11-22 11:53:49 -0600650 * PNG_TEXT_COMPRESSION_zTXt. Note that the "compression value" is not the
651 * same as what appears in the PNG tEXt/zTXt/iTXt chunk's "compression flag"
652 * which is always 0 or 1, or its "compression method" which is always 0.
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -0500653 */
Guy Schalnat0d580581995-07-20 02:43:20 -0500654typedef struct png_text_struct
655{
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -0500656 int compression; /* compression value:
657 -1: tEXt, none
658 0: zTXt, deflate
659 1: iTXt, none
660 2: iTXt, deflate */
Andreas Dilger47a0c421997-05-16 02:46:07 -0500661 png_charp key; /* keyword, 1-79 character description of "text" */
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -0500662 png_charp text; /* comment, may be an empty string (ie "")
663 or a NULL pointer */
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600664 png_size_t text_length; /* length of the text string */
665 png_size_t itxt_length; /* length of the itxt string */
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -0500666 png_charp lang; /* language code, 0-79 characters
667 or a NULL pointer */
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600668 png_charp lang_key; /* keyword translated UTF-8 string, 0 or more
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -0500669 chars or a NULL pointer */
Guy Schalnat0d580581995-07-20 02:43:20 -0500670} png_text;
John Bowlerbaeb6d12011-11-26 18:21:02 -0600671typedef png_text * png_textp;
672typedef const png_text * png_const_textp;
673typedef png_text * * png_textpp;
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600674#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -0500675
676/* Supported compression types for text in PNG files (tEXt, and zTXt).
677 * The values of the PNG_TEXT_COMPRESSION_ defines should NOT be changed. */
678#define PNG_TEXT_COMPRESSION_NONE_WR -3
679#define PNG_TEXT_COMPRESSION_zTXt_WR -2
680#define PNG_TEXT_COMPRESSION_NONE -1
681#define PNG_TEXT_COMPRESSION_zTXt 0
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600682#define PNG_ITXT_COMPRESSION_NONE 1
683#define PNG_ITXT_COMPRESSION_zTXt 2
684#define PNG_TEXT_COMPRESSION_LAST 3 /* Not a valid value */
Guy Schalnat0d580581995-07-20 02:43:20 -0500685
686/* png_time is a way to hold the time in an machine independent way.
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -0600687 * Two conversions are provided, both from time_t and struct tm. There
688 * is no portable way to convert to either of these structures, as far
689 * as I know. If you know of a portable way, send it to me. As a side
Glenn Randers-Pehrson231e6872001-01-12 15:13:06 -0600690 * note - PNG has always been Year 2000 compliant!
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -0600691 */
Guy Schalnat0d580581995-07-20 02:43:20 -0500692typedef struct png_time_struct
693{
694 png_uint_16 year; /* full year, as in, 1995 */
Andreas Dilger47a0c421997-05-16 02:46:07 -0500695 png_byte month; /* month of year, 1 - 12 */
696 png_byte day; /* day of month, 1 - 31 */
697 png_byte hour; /* hour of day, 0 - 23 */
698 png_byte minute; /* minute of hour, 0 - 59 */
699 png_byte second; /* second of minute, 0 - 60 (for leap seconds) */
Guy Schalnat0d580581995-07-20 02:43:20 -0500700} png_time;
John Bowlerbaeb6d12011-11-26 18:21:02 -0600701typedef png_time * png_timep;
702typedef const png_time * png_const_timep;
703typedef png_time * * png_timepp;
Guy Schalnat0d580581995-07-20 02:43:20 -0500704
Glenn Randers-Pehrson38674ec2009-06-16 13:33:01 -0500705#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) || \
Glenn Randers-Pehrsone8b1aa02010-03-06 11:39:29 -0600706 defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED)
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600707/* png_unknown_chunk is a structure to hold queued chunks for which there is
708 * no specific support. The idea is that we can use this to queue
709 * up private chunks for output even though the library doesn't actually
710 * know about their semantics.
711 */
712typedef struct png_unknown_chunk_t
713{
714 png_byte name[5];
715 png_byte *data;
716 png_size_t size;
717
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600718 /* libpng-using applications should NOT directly modify this byte. */
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600719 png_byte location; /* mode of operation at read time */
720}
721png_unknown_chunk;
John Bowler40b26032011-12-22 08:09:15 -0600722
John Bowlerbaeb6d12011-11-26 18:21:02 -0600723typedef png_unknown_chunk * png_unknown_chunkp;
724typedef const png_unknown_chunk * png_const_unknown_chunkp;
725typedef png_unknown_chunk * * png_unknown_chunkpp;
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600726#endif
727
Glenn Randers-Pehrsonfd73d042011-06-13 13:25:21 -0500728/* Values for the unknown chunk location byte */
Glenn Randers-Pehrson2d3fc1c2011-05-10 23:48:00 -0500729
Glenn Randers-Pehrsonfd73d042011-06-13 13:25:21 -0500730#define PNG_HAVE_IHDR 0x01
731#define PNG_HAVE_PLTE 0x02
732#define PNG_AFTER_IDAT 0x08
Glenn Randers-Pehrson2d3fc1c2011-05-10 23:48:00 -0500733
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500734/* Maximum positive integer used in PNG is (2^31)-1 */
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -0500735#define PNG_UINT_31_MAX ((png_uint_32)0x7fffffffL)
Glenn Randers-Pehrson78067772004-11-02 21:49:39 -0600736#define PNG_UINT_32_MAX ((png_uint_32)(-1))
737#define PNG_SIZE_MAX ((png_size_t)(-1))
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500738
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -0500739/* These are constants for fixed point values encoded in the
740 * PNG specification manner (x100000)
741 */
742#define PNG_FP_1 100000
743#define PNG_FP_HALF 50000
John Bowlerd273ad22011-05-07 21:00:28 -0500744#define PNG_FP_MAX ((png_fixed_point)0x7fffffffL)
745#define PNG_FP_MIN (-PNG_FP_MAX)
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -0500746
Andreas Dilger47a0c421997-05-16 02:46:07 -0500747/* These describe the color_type field in png_info. */
Guy Schalnat0d580581995-07-20 02:43:20 -0500748/* color type masks */
Andreas Dilger47a0c421997-05-16 02:46:07 -0500749#define PNG_COLOR_MASK_PALETTE 1
750#define PNG_COLOR_MASK_COLOR 2
751#define PNG_COLOR_MASK_ALPHA 4
Guy Schalnat0d580581995-07-20 02:43:20 -0500752
753/* color types. Note that not all combinations are legal */
Guy Schalnate5a37791996-06-05 15:50:50 -0500754#define PNG_COLOR_TYPE_GRAY 0
Andreas Dilger47a0c421997-05-16 02:46:07 -0500755#define PNG_COLOR_TYPE_PALETTE (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE)
756#define PNG_COLOR_TYPE_RGB (PNG_COLOR_MASK_COLOR)
757#define PNG_COLOR_TYPE_RGB_ALPHA (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA)
Guy Schalnat0d580581995-07-20 02:43:20 -0500758#define PNG_COLOR_TYPE_GRAY_ALPHA (PNG_COLOR_MASK_ALPHA)
Glenn Randers-Pehrson5e5c1e12000-11-10 12:26:19 -0600759/* aliases */
760#define PNG_COLOR_TYPE_RGBA PNG_COLOR_TYPE_RGB_ALPHA
761#define PNG_COLOR_TYPE_GA PNG_COLOR_TYPE_GRAY_ALPHA
Guy Schalnat0d580581995-07-20 02:43:20 -0500762
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500763/* This is for compression type. PNG 1.0-1.2 only define the single type. */
Andreas Dilger47a0c421997-05-16 02:46:07 -0500764#define PNG_COMPRESSION_TYPE_BASE 0 /* Deflate method 8, 32K window */
765#define PNG_COMPRESSION_TYPE_DEFAULT PNG_COMPRESSION_TYPE_BASE
766
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500767/* This is for filter type. PNG 1.0-1.2 only define the single type. */
Andreas Dilger47a0c421997-05-16 02:46:07 -0500768#define PNG_FILTER_TYPE_BASE 0 /* Single row per-byte filtering */
Glenn Randers-Pehrson2ad31ae2000-12-15 08:54:42 -0600769#define PNG_INTRAPIXEL_DIFFERENCING 64 /* Used only in MNG datastreams */
Andreas Dilger47a0c421997-05-16 02:46:07 -0500770#define PNG_FILTER_TYPE_DEFAULT PNG_FILTER_TYPE_BASE
771
772/* These are for the interlacing type. These values should NOT be changed. */
773#define PNG_INTERLACE_NONE 0 /* Non-interlaced image */
774#define PNG_INTERLACE_ADAM7 1 /* Adam7 interlacing */
775#define PNG_INTERLACE_LAST 2 /* Not a valid value */
776
777/* These are for the oFFs chunk. These values should NOT be changed. */
778#define PNG_OFFSET_PIXEL 0 /* Offset in pixels */
779#define PNG_OFFSET_MICROMETER 1 /* Offset in micrometers (1/10^6 meter) */
780#define PNG_OFFSET_LAST 2 /* Not a valid value */
781
782/* These are for the pCAL chunk. These values should NOT be changed. */
783#define PNG_EQUATION_LINEAR 0 /* Linear transformation */
784#define PNG_EQUATION_BASE_E 1 /* Exponential base e transform */
785#define PNG_EQUATION_ARBITRARY 2 /* Arbitrary base exponential transform */
786#define PNG_EQUATION_HYPERBOLIC 3 /* Hyperbolic sine transformation */
787#define PNG_EQUATION_LAST 4 /* Not a valid value */
788
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600789/* These are for the sCAL chunk. These values should NOT be changed. */
790#define PNG_SCALE_UNKNOWN 0 /* unknown unit (image scale) */
791#define PNG_SCALE_METER 1 /* meters per pixel */
792#define PNG_SCALE_RADIAN 2 /* radians per pixel */
793#define PNG_SCALE_LAST 3 /* Not a valid value */
794
Andreas Dilger47a0c421997-05-16 02:46:07 -0500795/* These are for the pHYs chunk. These values should NOT be changed. */
796#define PNG_RESOLUTION_UNKNOWN 0 /* pixels/unknown unit (aspect ratio) */
797#define PNG_RESOLUTION_METER 1 /* pixels/meter */
798#define PNG_RESOLUTION_LAST 2 /* Not a valid value */
799
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -0600800/* These are for the sRGB chunk. These values should NOT be changed. */
Glenn Randers-Pehrson5379b241999-11-27 10:22:33 -0600801#define PNG_sRGB_INTENT_PERCEPTUAL 0
802#define PNG_sRGB_INTENT_RELATIVE 1
803#define PNG_sRGB_INTENT_SATURATION 2
804#define PNG_sRGB_INTENT_ABSOLUTE 3
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -0600805#define PNG_sRGB_INTENT_LAST 4 /* Not a valid value */
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -0600806
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600807/* This is for text chunks */
808#define PNG_KEYWORD_MAX_LENGTH 79
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -0600809
Glenn Randers-Pehrson76e5fd62000-12-28 07:50:05 -0600810/* Maximum number of entries in PLTE/sPLT/tRNS arrays */
Glenn Randers-Pehrsond1e8c862002-06-20 06:54:34 -0500811#define PNG_MAX_PALETTE_LENGTH 256
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -0600812
Andreas Dilger47a0c421997-05-16 02:46:07 -0500813/* These determine if an ancillary chunk's data has been successfully read
814 * from the PNG header, or if the application has filled in the corresponding
815 * data in the info_struct to be written into the output file. The values
816 * of the PNG_INFO_<chunk> defines should NOT be changed.
817 */
Guy Schalnat0d580581995-07-20 02:43:20 -0500818#define PNG_INFO_gAMA 0x0001
819#define PNG_INFO_sBIT 0x0002
820#define PNG_INFO_cHRM 0x0004
821#define PNG_INFO_PLTE 0x0008
822#define PNG_INFO_tRNS 0x0010
823#define PNG_INFO_bKGD 0x0020
824#define PNG_INFO_hIST 0x0040
825#define PNG_INFO_pHYs 0x0080
826#define PNG_INFO_oFFs 0x0100
827#define PNG_INFO_tIME 0x0200
Andreas Dilger47a0c421997-05-16 02:46:07 -0500828#define PNG_INFO_pCAL 0x0400
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -0600829#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600830#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */
831#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */
832#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */
John Bowlerf3f7e142011-09-09 07:32:37 -0500833#define PNG_INFO_IDAT 0x8000 /* ESR, 1.0.6 */
Guy Schalnat0d580581995-07-20 02:43:20 -0500834
Andreas Dilger47a0c421997-05-16 02:46:07 -0500835/* This is used for the transformation routines, as some of them
836 * change these values for the row. It also should enable using
837 * the routines for other purposes.
838 */
Guy Schalnat0d580581995-07-20 02:43:20 -0500839typedef struct png_row_info_struct
840{
Glenn Randers-Pehrson9f044c12010-12-07 14:59:43 -0600841 png_uint_32 width; /* width of row */
842 png_size_t rowbytes; /* number of bytes in row */
843 png_byte color_type; /* color type of row */
844 png_byte bit_depth; /* bit depth of row */
845 png_byte channels; /* number of channels (1, 2, 3, or 4) */
Guy Schalnat4ee97b01996-01-16 01:51:56 -0600846 png_byte pixel_depth; /* bits per pixel (depth * channels) */
Guy Schalnat0d580581995-07-20 02:43:20 -0500847} png_row_info;
848
John Bowlerbaeb6d12011-11-26 18:21:02 -0600849typedef png_row_info * png_row_infop;
850typedef png_row_info * * png_row_infopp;
Guy Schalnat0f716451995-11-28 11:22:13 -0600851
Glenn Randers-Pehrson8686fff1998-05-21 09:27:50 -0500852/* These are the function types for the I/O functions and for the functions
853 * that allow the user to override the default I/O functions with his or her
854 * own. The png_error_ptr type should match that of user-supplied warning
855 * and error functions, while the png_rw_ptr type should match that of the
Glenn Randers-Pehrsone600c512010-08-18 07:25:46 -0500856 * user read/write data functions. Note that the 'write' function must not
Glenn Randers-Pehrsonea2f7e02010-08-18 08:14:54 -0500857 * modify the buffer it is passed. The 'read' function, on the other hand, is
Glenn Randers-Pehrsone600c512010-08-18 07:25:46 -0500858 * expected to return the read data in the buffer.
Guy Schalnat0f716451995-11-28 11:22:13 -0600859 */
John Bowler9c693602011-02-12 08:58:21 -0600860typedef PNG_CALLBACK(void, *png_error_ptr, (png_structp, png_const_charp));
861typedef PNG_CALLBACK(void, *png_rw_ptr, (png_structp, png_bytep, png_size_t));
862typedef PNG_CALLBACK(void, *png_flush_ptr, (png_structp));
863typedef PNG_CALLBACK(void, *png_read_status_ptr, (png_structp, png_uint_32,
864 int));
865typedef PNG_CALLBACK(void, *png_write_status_ptr, (png_structp, png_uint_32,
866 int));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600867
Guy Schalnat69b14481996-01-10 02:56:49 -0600868#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
John Bowler9c693602011-02-12 08:58:21 -0600869typedef PNG_CALLBACK(void, *png_progressive_info_ptr, (png_structp, png_infop));
870typedef PNG_CALLBACK(void, *png_progressive_end_ptr, (png_structp, png_infop));
John Bowler9616ad92011-02-16 06:13:46 -0600871
872/* The following callback receives png_uint_32 row_number, int pass for the
873 * png_bytep data of the row. When transforming an interlaced image the
874 * row number is the row number within the sub-image of the interlace pass, so
875 * the value will increase to the height of the sub-image (not the full image)
876 * then reset to 0 for the next pass.
877 *
878 * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to
879 * find the output pixel (x,y) given an interlaced sub-image pixel
880 * (row,col,pass). (See below for these macros.)
881 */
John Bowler9c693602011-02-12 08:58:21 -0600882typedef PNG_CALLBACK(void, *png_progressive_row_ptr, (png_structp, png_bytep,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -0600883 png_uint_32, int));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600884#endif
Guy Schalnat6d764711995-12-19 03:22:19 -0600885
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -0600886#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
Glenn Randers-Pehrson33188ac2009-06-16 14:12:35 -0500887 defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
John Bowler9c693602011-02-12 08:58:21 -0600888typedef PNG_CALLBACK(void, *png_user_transform_ptr, (png_structp, png_row_infop,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -0600889 png_bytep));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600890#endif
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -0600891
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -0500892#ifdef PNG_USER_CHUNKS_SUPPORTED
John Bowler9c693602011-02-12 08:58:21 -0600893typedef PNG_CALLBACK(int, *png_user_chunk_ptr, (png_structp,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -0600894 png_unknown_chunkp));
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600895#endif
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -0500896#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
John Bowler9c693602011-02-12 08:58:21 -0600897typedef PNG_CALLBACK(void, *png_unknown_chunk_ptr, (png_structp));
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600898#endif
Glenn Randers-Pehrson9f044c12010-12-07 14:59:43 -0600899
Glenn Randers-Pehrsonf4ea2242009-11-20 21:38:24 -0600900#ifdef PNG_SETJMP_SUPPORTED
John Bowlerb302c472011-04-15 06:37:34 -0500901/* This must match the function definition in <setjmp.h>, and the application
902 * must include this before png.h to obtain the definition of jmp_buf. The
903 * function is required to be PNG_NORETURN, but this is not checked. If the
904 * function does return the application will crash via an abort() or similar
905 * system level call.
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -0500906 *
John Bowlerb302c472011-04-15 06:37:34 -0500907 * If you get a warning here while building the library you may need to make
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -0500908 * changes to ensure that pnglibconf.h records the calling convention used by
909 * your compiler. This may be very difficult - try using a different compiler
910 * to build the library!
Glenn Randers-Pehrsonf4ea2242009-11-20 21:38:24 -0600911 */
John Bowlerb302c472011-04-15 06:37:34 -0500912PNG_FUNCTION(void, (PNGCAPI *png_longjmp_ptr), PNGARG((jmp_buf, int)), typedef);
Glenn Randers-Pehrsonf4ea2242009-11-20 21:38:24 -0600913#endif
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600914
915/* Transform masks for the high-level interface */
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -0600916#define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */
917#define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600918#define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */
919#define PNG_TRANSFORM_PACKING 0x0004 /* read and write */
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -0600920#define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */
921#define PNG_TRANSFORM_EXPAND 0x0010 /* read only */
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600922#define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -0600923#define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */
924#define PNG_TRANSFORM_BGR 0x0080 /* read and write */
925#define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600926#define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */
Glenn Randers-Pehrsondb66d442000-06-23 21:38:16 -0500927#define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */
Glenn Randers-Pehrson99708d52009-06-29 17:30:00 -0500928#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* write only */
Glenn Randers-Pehrson1eb14e92008-12-10 07:14:45 -0600929/* Added to libpng-1.2.34 */
Glenn Randers-Pehrson0ffb71a2009-02-28 06:08:20 -0600930#define PNG_TRANSFORM_STRIP_FILLER_BEFORE PNG_TRANSFORM_STRIP_FILLER
Glenn Randers-Pehrson99708d52009-06-29 17:30:00 -0500931#define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* write only */
932/* Added to libpng-1.4.0 */
933#define PNG_TRANSFORM_GRAY_TO_RGB 0x2000 /* read only */
Glenn Randers-Pehrsonef217b72011-06-15 12:58:27 -0500934/* Added to libpng-1.5.4 */
John Bowlera9b34192011-05-08 19:46:51 -0500935#define PNG_TRANSFORM_EXPAND_16 0x4000 /* read only */
Glenn Randers-Pehrsonab63dd02011-06-17 20:04:17 -0500936#define PNG_TRANSFORM_SCALE_16 0x8000 /* read only */
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600937
Glenn Randers-Pehrson5e5c1e12000-11-10 12:26:19 -0600938/* Flags for MNG supported features */
Glenn Randers-Pehrsond56aca72000-11-23 11:51:42 -0600939#define PNG_FLAG_MNG_EMPTY_PLTE 0x01
Glenn Randers-Pehrsond56aca72000-11-23 11:51:42 -0600940#define PNG_FLAG_MNG_FILTER_64 0x04
Glenn Randers-Pehrson408b4212000-12-18 09:33:57 -0600941#define PNG_ALL_MNG_FEATURES 0x05
Glenn Randers-Pehrson5e5c1e12000-11-10 12:26:19 -0600942
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -0600943/* NOTE: prior to 1.5 these functions had no 'API' style declaration,
Glenn Randers-Pehrsoneae8e362010-03-12 17:36:53 -0600944 * this allowed the zlib default functions to be used on Windows
945 * platforms. In 1.5 the zlib default malloc (which just calls malloc and
946 * ignores the first argument) should be completely compatible with the
947 * following.
948 */
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -0600949typedef PNG_CALLBACK(png_voidp, *png_malloc_ptr, (png_structp,
John Bowler9c693602011-02-12 08:58:21 -0600950 png_alloc_size_t));
951typedef PNG_CALLBACK(void, *png_free_ptr, (png_structp, png_voidp));
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -0500952
Glenn Randers-Pehrson862cb202010-04-16 22:12:51 -0500953/* Section 3: exported functions
954 * Here are the function definitions most commonly used. This is not
Glenn Randers-Pehrsonf3abb2c2010-10-17 12:51:53 -0500955 * the place to find out how to use libpng. See libpng-manual.txt for the
Andreas Dilger47a0c421997-05-16 02:46:07 -0500956 * full explanation, see example.c for the summary. This just provides
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600957 * a simple one line description of the use of each function.
Glenn Randers-Pehrsona4517252010-12-06 08:54:55 -0600958 *
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -0600959 * The PNG_EXPORT() and PNG_EXPORTA() macros used below are defined in
960 * pngconf.h and in the *.dfn files in the scripts directory.
Glenn Randers-Pehrsona4517252010-12-06 08:54:55 -0600961 *
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -0600962 * PNG_EXPORT(ordinal, type, name, (args));
Glenn Randers-Pehrson27df3a42010-12-06 12:38:42 -0600963 *
964 * ordinal: ordinal that is used while building
965 * *.def files. The ordinal value is only
966 * relevant when preprocessing png.h with
967 * the *.dfn files for building symbol table
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -0600968 * entries, and are removed by pngconf.h.
Glenn Randers-Pehrson27df3a42010-12-06 12:38:42 -0600969 * type: return type of the function
970 * name: function name
971 * args: function arguments, with types
972 *
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -0600973 * When we wish to append attributes to a function prototype we use
974 * the PNG_EXPORTA() macro instead.
975 *
Glenn Randers-Pehrson27df3a42010-12-06 12:38:42 -0600976 * PNG_EXPORTA(ordinal, type, name, (args), attributes);
977 *
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -0600978 * ordinal, type, name, and args: same as in PNG_EXPORT().
Glenn Randers-Pehrson27df3a42010-12-06 12:38:42 -0600979 * attributes: function attributes
Andreas Dilger47a0c421997-05-16 02:46:07 -0500980 */
Guy Schalnat0d580581995-07-20 02:43:20 -0500981
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -0500982/* Returns the version number of the library */
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -0600983PNG_EXPORT(1, png_uint_32, png_access_version_number, (void));
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -0500984
Andreas Dilger02ad0ef1997-01-17 01:34:35 -0600985/* Tell lib we have already handled the first <num_bytes> magic bytes.
Andreas Dilger47a0c421997-05-16 02:46:07 -0500986 * Handling more than 8 bytes from the beginning of the file is an error.
987 */
John Bowler5d567862011-12-24 09:12:00 -0600988PNG_EXPORT(2, void, png_set_sig_bytes, (png_structrp png_ptr, int num_bytes));
Andreas Dilger02ad0ef1997-01-17 01:34:35 -0600989
Andreas Dilger47a0c421997-05-16 02:46:07 -0500990/* Check sig[start] through sig[start + num_to_check - 1] to see if it's a
991 * PNG file. Returns zero if the supplied bytes match the 8-byte PNG
992 * signature, and non-zero otherwise. Having num_to_check == 0 or
993 * start > 7 will always fail (ie return non-zero).
994 */
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -0600995PNG_EXPORT(3, int, png_sig_cmp, (png_const_bytep sig, png_size_t start,
Glenn Randers-Pehrson27df3a42010-12-06 12:38:42 -0600996 png_size_t num_to_check));
Andreas Dilger02ad0ef1997-01-17 01:34:35 -0600997
Glenn Randers-Pehrson3e42a992010-03-31 22:16:07 -0500998/* Simple signature checking function. This is the same as calling
999 * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n).
1000 */
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001001#define png_check_sig(sig, n) !png_sig_cmp((sig), 0, (n))
Glenn Randers-Pehrson3e42a992010-03-31 22:16:07 -05001002
Andreas Dilger47a0c421997-05-16 02:46:07 -05001003/* Allocate and initialize png_ptr struct for reading, and any other memory. */
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001004PNG_EXPORTA(4, png_structp, png_create_read_struct,
1005 (png_const_charp user_png_ver, png_voidp error_ptr,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001006 png_error_ptr error_fn, png_error_ptr warn_fn),
Glenn Randers-Pehrson27df3a42010-12-06 12:38:42 -06001007 PNG_ALLOCATED);
Guy Schalnat0d580581995-07-20 02:43:20 -05001008
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05001009/* Allocate and initialize png_ptr struct for writing, and any other memory */
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001010PNG_EXPORTA(5, png_structp, png_create_write_struct,
1011 (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001012 png_error_ptr warn_fn),
Glenn Randers-Pehrson27df3a42010-12-06 12:38:42 -06001013 PNG_ALLOCATED);
Guy Schalnate5a37791996-06-05 15:50:50 -05001014
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001015PNG_EXPORT(6, png_size_t, png_get_compression_buffer_size,
John Bowler5d567862011-12-24 09:12:00 -06001016 (png_const_structrp png_ptr));
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05001017
John Bowler5d567862011-12-24 09:12:00 -06001018PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structrp png_ptr,
Glenn Randers-Pehrson27df3a42010-12-06 12:38:42 -06001019 png_size_t size));
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05001020
Glenn Randers-Pehrsonf4ea2242009-11-20 21:38:24 -06001021/* Moved from pngconf.h in 1.4.0 and modified to ensure setjmp/longjmp
1022 * match up.
1023 */
1024#ifdef PNG_SETJMP_SUPPORTED
1025/* This function returns the jmp_buf built in to *png_ptr. It must be
1026 * supplied with an appropriate 'longjmp' function to use on that jmp_buf
1027 * unless the default error function is overridden in which case NULL is
1028 * acceptable. The size of the jmp_buf is checked against the actual size
1029 * allocated by the library - the call will return NULL on a mismatch
1030 * indicating an ABI mismatch.
1031 */
John Bowler5d567862011-12-24 09:12:00 -06001032PNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structrp png_ptr,
Glenn Randers-Pehrson27df3a42010-12-06 12:38:42 -06001033 png_longjmp_ptr longjmp_fn, size_t jmp_buf_size));
Glenn Randers-Pehrsonf4ea2242009-11-20 21:38:24 -06001034# define png_jmpbuf(png_ptr) \
Glenn Randers-Pehrsone8b1aa02010-03-06 11:39:29 -06001035 (*png_set_longjmp_fn((png_ptr), longjmp, sizeof (jmp_buf)))
Glenn Randers-Pehrsonf4ea2242009-11-20 21:38:24 -06001036#else
1037# define png_jmpbuf(png_ptr) \
Glenn Randers-Pehrsone8b1aa02010-03-06 11:39:29 -06001038 (LIBPNG_WAS_COMPILED_WITH__PNG_NO_SETJMP)
Glenn Randers-Pehrsonf4ea2242009-11-20 21:38:24 -06001039#endif
Glenn Randers-Pehrsonf98726a2010-02-19 09:54:53 -06001040/* This function should be used by libpng applications in place of
1041 * longjmp(png_ptr->jmpbuf, val). If longjmp_fn() has been set, it
1042 * will use it; otherwise it will call PNG_ABORT(). This function was
1043 * added in libpng-1.5.0.
1044 */
John Bowler5d567862011-12-24 09:12:00 -06001045PNG_EXPORTA(9, void, png_longjmp, (png_const_structrp png_ptr, int val),
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001046 PNG_NORETURN);
Glenn Randers-Pehrsonf4ea2242009-11-20 21:38:24 -06001047
Glenn Randers-Pehrson2b8bef12010-04-29 11:50:24 -05001048#ifdef PNG_READ_SUPPORTED
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05001049/* Reset the compression stream */
John Bowlerb5d00512012-03-09 09:15:18 -06001050PNG_EXPORTA(10, int, png_reset_zstream, (png_structrp png_ptr), PNG_DEPRECATED);
Glenn Randers-Pehrson2b8bef12010-04-29 11:50:24 -05001051#endif
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05001052
Glenn Randers-Pehrson8b6a8892001-05-18 04:54:50 -05001053/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05001054#ifdef PNG_USER_MEM_SUPPORTED
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001055PNG_EXPORTA(11, png_structp, png_create_read_struct_2,
1056 (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001057 png_error_ptr warn_fn,
1058 png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn),
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001059 PNG_ALLOCATED);
1060PNG_EXPORTA(12, png_structp, png_create_write_struct_2,
1061 (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001062 png_error_ptr warn_fn,
1063 png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn),
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001064 PNG_ALLOCATED);
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05001065#endif
1066
Glenn Randers-Pehrson6bc53be2006-06-16 07:52:03 -05001067/* Write the PNG file signature. */
John Bowler5d567862011-12-24 09:12:00 -06001068PNG_EXPORT(13, void, png_write_sig, (png_structrp png_ptr));
Glenn Randers-Pehrson6bc53be2006-06-16 07:52:03 -05001069
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06001070/* Write a PNG chunk - size, type, (optional) data, CRC. */
John Bowler5d567862011-12-24 09:12:00 -06001071PNG_EXPORT(14, void, png_write_chunk, (png_structrp png_ptr, png_const_bytep
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001072 chunk_name, png_const_bytep data, png_size_t length));
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06001073
1074/* Write the start of a PNG chunk - length and chunk name. */
John Bowler5d567862011-12-24 09:12:00 -06001075PNG_EXPORT(15, void, png_write_chunk_start, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001076 png_const_bytep chunk_name, png_uint_32 length));
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06001077
1078/* Write the data of a PNG chunk started with png_write_chunk_start(). */
John Bowler5d567862011-12-24 09:12:00 -06001079PNG_EXPORT(16, void, png_write_chunk_data, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001080 png_const_bytep data, png_size_t length));
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06001081
1082/* Finish a chunk started with png_write_chunk_start() (includes CRC). */
John Bowler5d567862011-12-24 09:12:00 -06001083PNG_EXPORT(17, void, png_write_chunk_end, (png_structrp png_ptr));
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06001084
Andreas Dilger47a0c421997-05-16 02:46:07 -05001085/* Allocate and initialize the info structure */
John Bowler5d567862011-12-24 09:12:00 -06001086PNG_EXPORTA(18, png_infop, png_create_info_struct, (png_const_structrp png_ptr),
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001087 PNG_ALLOCATED);
Guy Schalnat0d580581995-07-20 02:43:20 -05001088
John Bowler40b26032011-12-22 08:09:15 -06001089/* DEPRECATED: this function allowed init structures to be created using the
1090 * default allocation method (typically malloc). Use is deprecated in 1.6.0 and
1091 * the API will be removed in the future.
1092 */
John Bowlerd332c672011-12-21 17:36:12 -06001093PNG_EXPORTA(19, void, png_info_init_3, (png_infopp info_ptr,
1094 png_size_t png_info_struct_size), PNG_DEPRECATED);
Guy Schalnat0d580581995-07-20 02:43:20 -05001095
Andreas Dilger47a0c421997-05-16 02:46:07 -05001096/* Writes all the PNG information before the image. */
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001097PNG_EXPORT(20, void, png_write_info_before_PLTE,
John Bowler5d567862011-12-24 09:12:00 -06001098 (png_structrp png_ptr, png_inforp info_ptr));
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001099PNG_EXPORT(21, void, png_write_info,
John Bowler5d567862011-12-24 09:12:00 -06001100 (png_structrp png_ptr, png_inforp info_ptr));
Guy Schalnat0d580581995-07-20 02:43:20 -05001101
Glenn Randers-Pehrsondbd40142009-08-31 08:42:02 -05001102#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001103/* Read the information before the actual image data. */
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001104PNG_EXPORT(22, void, png_read_info,
John Bowler5d567862011-12-24 09:12:00 -06001105 (png_structrp png_ptr, png_inforp info_ptr));
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -05001106#endif
Guy Schalnat0d580581995-07-20 02:43:20 -05001107
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05001108#ifdef PNG_TIME_RFC1123_SUPPORTED
John Bowler40b26032011-12-22 08:09:15 -06001109 /* Convert to a US string format: there is no localization support in this
1110 * routine. The original implementation used a 29 character buffer in
1111 * png_struct, this will be removed in future versions.
1112 */
1113#if PNG_LIBPNG_VER < 10700
John Bowler5d567862011-12-24 09:12:00 -06001114PNG_EXPORTA(23, png_const_charp, png_convert_to_rfc1123, (png_structrp png_ptr,
John Bowler40b26032011-12-22 08:09:15 -06001115 png_const_timep ptime),PNG_DEPRECATED);
1116#endif
1117PNG_EXPORT(241, int, png_convert_to_rfc1123_buffer, (char out[29],
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001118 png_const_timep ptime));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001119#endif
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -06001120
Glenn Randers-Pehrson0cb46e22009-11-02 11:24:33 -06001121#ifdef PNG_CONVERT_tIME_SUPPORTED
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001122/* Convert from a struct tm to png_time */
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001123PNG_EXPORT(24, void, png_convert_from_struct_tm, (png_timep ptime,
John Bowlerbaeb6d12011-11-26 18:21:02 -06001124 const struct tm * ttime));
Guy Schalnat0d580581995-07-20 02:43:20 -05001125
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001126/* Convert from time_t to png_time. Uses gmtime() */
John Bowler40b26032011-12-22 08:09:15 -06001127PNG_EXPORT(25, void, png_convert_from_time_t, (png_timep ptime, time_t ttime));
Glenn Randers-Pehrson0cb46e22009-11-02 11:24:33 -06001128#endif /* PNG_CONVERT_tIME_SUPPORTED */
Guy Schalnat0d580581995-07-20 02:43:20 -05001129
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05001130#ifdef PNG_READ_EXPAND_SUPPORTED
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05001131/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */
John Bowler5d567862011-12-24 09:12:00 -06001132PNG_EXPORT(26, void, png_set_expand, (png_structrp png_ptr));
1133PNG_EXPORT(27, void, png_set_expand_gray_1_2_4_to_8, (png_structrp png_ptr));
1134PNG_EXPORT(28, void, png_set_palette_to_rgb, (png_structrp png_ptr));
1135PNG_EXPORT(29, void, png_set_tRNS_to_alpha, (png_structrp png_ptr));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001136#endif
Guy Schalnat0d580581995-07-20 02:43:20 -05001137
John Bowler4d562962011-02-12 09:01:20 -06001138#ifdef PNG_READ_EXPAND_16_SUPPORTED
Glenn Randers-Pehrsond768d102011-05-08 23:26:19 -05001139/* Expand to 16-bit channels, forces conversion of palette to RGB and expansion
John Bowler4d562962011-02-12 09:01:20 -06001140 * of a tRNS chunk if present.
1141 */
John Bowler5d567862011-12-24 09:12:00 -06001142PNG_EXPORT(221, void, png_set_expand_16, (png_structrp png_ptr));
John Bowler4d562962011-02-12 09:01:20 -06001143#endif
1144
Guy Schalnat51f0eb41995-09-26 05:22:39 -05001145#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
Guy Schalnat0d580581995-07-20 02:43:20 -05001146/* Use blue, green, red order for pixels. */
John Bowler5d567862011-12-24 09:12:00 -06001147PNG_EXPORT(30, void, png_set_bgr, (png_structrp png_ptr));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001148#endif
Guy Schalnat51f0eb41995-09-26 05:22:39 -05001149
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05001150#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05001151/* Expand the grayscale to 24-bit RGB if necessary. */
John Bowler5d567862011-12-24 09:12:00 -06001152PNG_EXPORT(31, void, png_set_gray_to_rgb, (png_structrp png_ptr));
John Bowlerf21a0d02011-01-23 23:55:19 -06001153#endif
Guy Schalnat69b14481996-01-10 02:56:49 -06001154
John Bowlerf21a0d02011-01-23 23:55:19 -06001155#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06001156/* Reduce RGB to grayscale. */
John Bowler7875d532011-11-07 22:33:49 -06001157#define PNG_ERROR_ACTION_NONE 1
1158#define PNG_ERROR_ACTION_WARN 2
1159#define PNG_ERROR_ACTION_ERROR 3
1160#define PNG_RGB_TO_GRAY_DEFAULT (-1)/*for red/green coefficients*/
1161
John Bowler5d567862011-12-24 09:12:00 -06001162PNG_FP_EXPORT(32, void, png_set_rgb_to_gray, (png_structrp png_ptr,
John Bowlerbce79882012-02-13 11:45:22 -06001163 int error_action, double red, double green))
John Bowler5d567862011-12-24 09:12:00 -06001164PNG_FIXED_EXPORT(33, void, png_set_rgb_to_gray_fixed, (png_structrp png_ptr,
John Bowlerbce79882012-02-13 11:45:22 -06001165 int error_action, png_fixed_point red, png_fixed_point green))
Glenn Randers-Pehrsona272d8f2010-06-25 21:45:31 -05001166
John Bowler5d567862011-12-24 09:12:00 -06001167PNG_EXPORT(34, png_byte, png_get_rgb_to_gray_status, (png_const_structrp
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06001168 png_ptr));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001169#endif
Andreas Dilger02ad0ef1997-01-17 01:34:35 -06001170
John Bowler4a12f4a2011-04-17 18:34:22 -05001171#ifdef PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001172PNG_EXPORT(35, void, png_build_grayscale_palette, (int bit_depth,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001173 png_colorp palette));
John Bowler4a12f4a2011-04-17 18:34:22 -05001174#endif
Andreas Dilger02ad0ef1997-01-17 01:34:35 -06001175
John Bowlerd273ad22011-05-07 21:00:28 -05001176#ifdef PNG_READ_ALPHA_MODE_SUPPORTED
1177/* How the alpha channel is interpreted - this affects how the color channels of
Glenn Randers-Pehrson44e26d42011-05-08 22:56:42 -05001178 * a PNG file are returned when an alpha channel, or tRNS chunk in a palette
1179 * file, is present.
John Bowlerd273ad22011-05-07 21:00:28 -05001180 *
Glenn Randers-Pehrson44e26d42011-05-08 22:56:42 -05001181 * This has no effect on the way pixels are written into a PNG output
1182 * datastream. The color samples in a PNG datastream are never premultiplied
1183 * with the alpha samples.
1184 *
1185 * The default is to return data according to the PNG specification: the alpha
John Bowlerd273ad22011-05-07 21:00:28 -05001186 * channel is a linear measure of the contribution of the pixel to the
Glenn Randers-Pehrson44e26d42011-05-08 22:56:42 -05001187 * corresponding composited pixel. The gamma encoded color channels must be
1188 * scaled according to the contribution and to do this it is necessary to undo
1189 * the encoding, scale the color values, perform the composition and reencode
1190 * the values. This is the 'PNG' mode.
John Bowlerd273ad22011-05-07 21:00:28 -05001191 *
1192 * The alternative is to 'associate' the alpha with the color information by
1193 * storing color channel values that have been scaled by the alpha. The
1194 * advantage is that the color channels can be resampled (the image can be
1195 * scaled) in this form. The disadvantage is that normal practice is to store
Glenn Randers-Pehrsond768d102011-05-08 23:26:19 -05001196 * linear, not (gamma) encoded, values and this requires 16-bit channels for
1197 * still images rather than the 8-bit channels that are just about sufficient if
John Bowlerd273ad22011-05-07 21:00:28 -05001198 * gamma encoding is used. In addition all non-transparent pixel values,
1199 * including completely opaque ones, must be gamma encoded to produce the final
Glenn Randers-Pehrsond768d102011-05-08 23:26:19 -05001200 * image. This is the 'STANDARD', 'ASSOCIATED' or 'PREMULTIPLIED' mode (the
John Bowlerd273ad22011-05-07 21:00:28 -05001201 * latter being the two common names for associated alpha color channels.)
1202 *
1203 * Since it is not necessary to perform arithmetic on opaque color values so
1204 * long as they are not to be resampled and are in the final color space it is
1205 * possible to optimize the handling of alpha by storing the opaque pixels in
1206 * the PNG format (adjusted for the output color space) while storing partially
1207 * opaque pixels in the standard, linear, format. The accuracy required for
1208 * standard alpha composition is relatively low, because the pixels are
Glenn Randers-Pehrsond768d102011-05-08 23:26:19 -05001209 * isolated, therefore typically the accuracy loss in storing 8-bit linear
John Bowlerd273ad22011-05-07 21:00:28 -05001210 * values is acceptable. (This is not true if the alpha channel is used to
Glenn Randers-Pehrsond768d102011-05-08 23:26:19 -05001211 * simulate transparency over large areas - use 16 bits or the PNG mode in
1212 * this case!) This is the 'OPTIMIZED' mode. For this mode a pixel is
John Bowlerd273ad22011-05-07 21:00:28 -05001213 * treated as opaque only if the alpha value is equal to the maximum value.
1214 *
1215 * The final choice is to gamma encode the alpha channel as well. This is
1216 * broken because, in practice, no implementation that uses this choice
1217 * correctly undoes the encoding before handling alpha composition. Use this
1218 * choice only if other serious errors in the software or hardware you use
1219 * mandate it; the typical serious error is for dark halos to appear around
1220 * opaque areas of the composited PNG image because of arithmetic overflow.
1221 *
1222 * The API function png_set_alpha_mode specifies which of these choices to use
Glenn Randers-Pehrsond768d102011-05-08 23:26:19 -05001223 * with an enumerated 'mode' value and the gamma of the required output:
John Bowlerd273ad22011-05-07 21:00:28 -05001224 */
1225#define PNG_ALPHA_PNG 0 /* according to the PNG standard */
1226#define PNG_ALPHA_STANDARD 1 /* according to Porter/Duff */
1227#define PNG_ALPHA_ASSOCIATED 1 /* as above; this is the normal practice */
1228#define PNG_ALPHA_PREMULTIPLIED 1 /* as above */
1229#define PNG_ALPHA_OPTIMIZED 2 /* 'PNG' for opaque pixels, else 'STANDARD' */
1230#define PNG_ALPHA_BROKEN 3 /* the alpha channel is gamma encoded */
1231
John Bowler5d567862011-12-24 09:12:00 -06001232PNG_FP_EXPORT(227, void, png_set_alpha_mode, (png_structrp png_ptr, int mode,
John Bowlerbce79882012-02-13 11:45:22 -06001233 double output_gamma))
John Bowler5d567862011-12-24 09:12:00 -06001234PNG_FIXED_EXPORT(228, void, png_set_alpha_mode_fixed, (png_structrp png_ptr,
John Bowlerbce79882012-02-13 11:45:22 -06001235 int mode, png_fixed_point output_gamma))
John Bowlerf70c7d02011-05-10 22:54:37 -05001236#endif
John Bowlerd273ad22011-05-07 21:00:28 -05001237
John Bowlerf70c7d02011-05-10 22:54:37 -05001238#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_ALPHA_MODE_SUPPORTED)
John Bowlerd273ad22011-05-07 21:00:28 -05001239/* The output_gamma value is a screen gamma in libpng terminology: it expresses
1240 * how to decode the output values, not how they are encoded. The values used
1241 * correspond to the normal numbers used to describe the overall gamma of a
1242 * computer display system; for example 2.2 for an sRGB conformant system. The
1243 * values are scaled by 100000 in the _fixed version of the API (so 220000 for
1244 * sRGB.)
1245 *
1246 * The inverse of the value is always used to provide a default for the PNG file
1247 * encoding if it has no gAMA chunk and if png_set_gamma() has not been called
1248 * to override the PNG gamma information.
1249 *
1250 * When the ALPHA_OPTIMIZED mode is selected the output gamma is used to encode
1251 * opaque pixels however pixels with lower alpha values are not encoded,
1252 * regardless of the output gamma setting.
1253 *
1254 * When the standard Porter Duff handling is requested with mode 1 the output
1255 * encoding is set to be linear and the output_gamma value is only relevant
1256 * as a default for input data that has no gamma information. The linear output
1257 * encoding will be overridden if png_set_gamma() is called - the results may be
1258 * highly unexpected!
1259 *
1260 * The following numbers are derived from the sRGB standard and the research
1261 * behind it. sRGB is defined to be approximated by a PNG gAMA chunk value of
1262 * 0.45455 (1/2.2) for PNG. The value implicitly includes any viewing
1263 * correction required to take account of any differences in the color
1264 * environment of the original scene and the intended display environment; the
1265 * value expresses how to *decode* the image for display, not how the original
1266 * data was *encoded*.
1267 *
1268 * sRGB provides a peg for the PNG standard by defining a viewing environment.
1269 * sRGB itself, and earlier TV standards, actually use a more complex transform
1270 * (a linear portion then a gamma 2.4 power law) than PNG can express. (PNG is
1271 * limited to simple power laws.) By saying that an image for direct display on
1272 * an sRGB conformant system should be stored with a gAMA chunk value of 45455
1273 * (11.3.3.2 and 11.3.3.5 of the ISO PNG specification) the PNG specification
1274 * makes it possible to derive values for other display systems and
1275 * environments.
1276 *
1277 * The Mac value is deduced from the sRGB based on an assumption that the actual
1278 * extra viewing correction used in early Mac display systems was implemented as
1279 * a power 1.45 lookup table.
1280 *
1281 * Any system where a programmable lookup table is used or where the behavior of
1282 * the final display device characteristics can be changed requires system
1283 * specific code to obtain the current characteristic. However this can be
1284 * difficult and most PNG gamma correction only requires an approximate value.
1285 *
1286 * By default, if png_set_alpha_mode() is not called, libpng assumes that all
1287 * values are unencoded, linear, values and that the output device also has a
1288 * linear characteristic. This is only very rarely correct - it is invariably
1289 * better to call png_set_alpha_mode() with PNG_DEFAULT_sRGB than rely on the
1290 * default if you don't know what the right answer is!
1291 *
John Bowlerf70c7d02011-05-10 22:54:37 -05001292 * The special value PNG_GAMMA_MAC_18 indicates an older Mac system (pre Mac OS
1293 * 10.6) which used a correction table to implement a somewhat lower gamma on an
1294 * otherwise sRGB system.
1295 *
1296 * Both these values are reserved (not simple gamma values) in order to allow
1297 * more precise correction internally in the future.
1298 *
John Bowlerd273ad22011-05-07 21:00:28 -05001299 * NOTE: the following values can be passed to either the fixed or floating
1300 * point APIs, but the floating point API will also accept floating point
1301 * values.
1302 */
John Bowlerf70c7d02011-05-10 22:54:37 -05001303#define PNG_DEFAULT_sRGB -1 /* sRGB gamma and color space */
1304#define PNG_GAMMA_MAC_18 -2 /* Old Mac '1.8' gamma and color space */
Glenn Randers-Pehrsonc7822512011-05-07 21:23:43 -05001305#define PNG_GAMMA_sRGB 220000 /* Television standards--matches sRGB gamma */
John Bowlerd273ad22011-05-07 21:00:28 -05001306#define PNG_GAMMA_LINEAR PNG_FP_1 /* Linear */
John Bowlerf70c7d02011-05-10 22:54:37 -05001307#endif
John Bowlerd273ad22011-05-07 21:00:28 -05001308
1309/* The following are examples of calls to png_set_alpha_mode to achieve the
1310 * required overall gamma correction and, where necessary, alpha
1311 * premultiplication.
1312 *
1313 * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB);
1314 * This is the default libpng handling of the alpha channel - it is not
1315 * pre-multiplied into the color components. In addition the call states
1316 * that the output is for a sRGB system and causes all PNG files without gAMA
1317 * chunks to be assumed to be encoded using sRGB.
1318 *
1319 * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC);
1320 * In this case the output is assumed to be something like an sRGB conformant
1321 * display preceeded by a power-law lookup table of power 1.45. This is how
1322 * early Mac systems behaved.
1323 *
Glenn Randers-Pehrsonc7822512011-05-07 21:23:43 -05001324 * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_GAMMA_LINEAR);
John Bowlerd273ad22011-05-07 21:00:28 -05001325 * This is the classic Jim Blinn approach and will work in academic
1326 * environments where everything is done by the book. It has the shortcoming
1327 * of assuming that input PNG data with no gamma information is linear - this
1328 * is unlikely to be correct unless the PNG files where generated locally.
1329 * Most of the time the output precision will be so low as to show
1330 * significant banding in dark areas of the image.
1331 *
1332 * png_set_expand_16(pp);
1333 * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_DEFAULT_sRGB);
1334 * This is a somewhat more realistic Jim Blinn inspired approach. PNG files
1335 * are assumed to have the sRGB encoding if not marked with a gamma value and
1336 * the output is always 16 bits per component. This permits accurate scaling
1337 * and processing of the data. If you know that your input PNG files were
1338 * generated locally you might need to replace PNG_DEFAULT_sRGB with the
1339 * correct value for your system.
1340 *
1341 * png_set_alpha_mode(pp, PNG_ALPHA_OPTIMIZED, PNG_DEFAULT_sRGB);
1342 * If you just need to composite the PNG image onto an existing background
1343 * and if you control the code that does this you can use the optimization
1344 * setting. In this case you just copy completely opaque pixels to the
1345 * output. For pixels that are not completely transparent (you just skip
1346 * those) you do the composition math using png_composite or png_composite_16
Glenn Randers-Pehrsond768d102011-05-08 23:26:19 -05001347 * below then encode the resultant 8-bit or 16-bit values to match the output
John Bowlerd273ad22011-05-07 21:00:28 -05001348 * encoding.
1349 *
1350 * Other cases
1351 * If neither the PNG nor the standard linear encoding work for you because
1352 * of the software or hardware you use then you have a big problem. The PNG
1353 * case will probably result in halos around the image. The linear encoding
1354 * will probably result in a washed out, too bright, image (it's actually too
1355 * contrasty.) Try the ALPHA_OPTIMIZED mode above - this will probably
1356 * substantially reduce the halos. Alternatively try:
1357 *
1358 * png_set_alpha_mode(pp, PNG_ALPHA_BROKEN, PNG_DEFAULT_sRGB);
1359 * This option will also reduce the halos, but there will be slight dark
1360 * halos round the opaque parts of the image where the background is light.
1361 * In the OPTIMIZED mode the halos will be light halos where the background
1362 * is dark. Take your pick - the halos are unavoidable unless you can get
1363 * your hardware/software fixed! (The OPTIMIZED approach is slightly
1364 * faster.)
1365 *
1366 * When the default gamma of PNG files doesn't match the output gamma.
1367 * If you have PNG files with no gamma information png_set_alpha_mode allows
1368 * you to provide a default gamma, but it also sets the ouput gamma to the
1369 * matching value. If you know your PNG files have a gamma that doesn't
1370 * match the output you can take advantage of the fact that
1371 * png_set_alpha_mode always sets the output gamma but only sets the PNG
1372 * default if it is not already set:
1373 *
1374 * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB);
1375 * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC);
1376 * The first call sets both the default and the output gamma values, the
1377 * second call overrides the output gamma without changing the default. This
1378 * is easier than achieving the same effect with png_set_gamma. You must use
1379 * PNG_ALPHA_PNG for the first call - internal checking in png_set_alpha will
1380 * fire if more than one call to png_set_alpha_mode and png_set_background is
1381 * made in the same read operation, however multiple calls with PNG_ALPHA_PNG
1382 * are ignored.
1383 */
John Bowlerd273ad22011-05-07 21:00:28 -05001384
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05001385#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06001386PNG_EXPORT(36, void, png_set_strip_alpha, (png_structrp png_ptr));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001387#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05001388
1389#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
1390 defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
John Bowler5d567862011-12-24 09:12:00 -06001391PNG_EXPORT(37, void, png_set_swap_alpha, (png_structrp png_ptr));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001392#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05001393
Glenn Randers-Pehrsonc4a2ae61998-01-16 22:06:18 -06001394#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
1395 defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
John Bowler5d567862011-12-24 09:12:00 -06001396PNG_EXPORT(38, void, png_set_invert_alpha, (png_structrp png_ptr));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001397#endif
Glenn Randers-Pehrsonc4a2ae61998-01-16 22:06:18 -06001398
Guy Schalnat51f0eb41995-09-26 05:22:39 -05001399#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
Glenn Randers-Pehrson67864af2004-08-28 23:30:07 -05001400/* Add a filler byte to 8-bit Gray or 24-bit RGB images. */
John Bowler5d567862011-12-24 09:12:00 -06001401PNG_EXPORT(39, void, png_set_filler, (png_structrp png_ptr, png_uint_32 filler,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001402 int flags));
Andreas Dilger47a0c421997-05-16 02:46:07 -05001403/* The values of the PNG_FILLER_ defines should NOT be changed */
Glenn Randers-Pehrsond4df36c2010-03-06 10:45:55 -06001404# define PNG_FILLER_BEFORE 0
1405# define PNG_FILLER_AFTER 1
Glenn Randers-Pehrson67864af2004-08-28 23:30:07 -05001406/* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */
John Bowler5d567862011-12-24 09:12:00 -06001407PNG_EXPORT(40, void, png_set_add_alpha, (png_structrp png_ptr,
John Bowler40b26032011-12-22 08:09:15 -06001408 png_uint_32 filler, int flags));
Andreas Dilger47a0c421997-05-16 02:46:07 -05001409#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */
Guy Schalnat0d580581995-07-20 02:43:20 -05001410
Guy Schalnat51f0eb41995-09-26 05:22:39 -05001411#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05001412/* Swap bytes in 16-bit depth files. */
John Bowler5d567862011-12-24 09:12:00 -06001413PNG_EXPORT(41, void, png_set_swap, (png_structrp png_ptr));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001414#endif
Guy Schalnat0d580581995-07-20 02:43:20 -05001415
Guy Schalnat51f0eb41995-09-26 05:22:39 -05001416#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05001417/* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */
John Bowler5d567862011-12-24 09:12:00 -06001418PNG_EXPORT(42, void, png_set_packing, (png_structrp png_ptr));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001419#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05001420
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06001421#if defined(PNG_READ_PACKSWAP_SUPPORTED) || \
1422 defined(PNG_WRITE_PACKSWAP_SUPPORTED)
Andreas Dilger47a0c421997-05-16 02:46:07 -05001423/* Swap packing order of pixels in bytes. */
John Bowler5d567862011-12-24 09:12:00 -06001424PNG_EXPORT(43, void, png_set_packswap, (png_structrp png_ptr));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001425#endif
Guy Schalnat0d580581995-07-20 02:43:20 -05001426
Guy Schalnat51f0eb41995-09-26 05:22:39 -05001427#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
Guy Schalnat0d580581995-07-20 02:43:20 -05001428/* Converts files to legal bit depths. */
John Bowler5d567862011-12-24 09:12:00 -06001429PNG_EXPORT(44, void, png_set_shift, (png_structrp png_ptr, png_const_color_8p
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001430 true_bits));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001431#endif
Guy Schalnat0d580581995-07-20 02:43:20 -05001432
Guy Schalnat51f0eb41995-09-26 05:22:39 -05001433#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
1434 defined(PNG_WRITE_INTERLACING_SUPPORTED)
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -05001435/* Have the code handle the interlacing. Returns the number of passes.
Glenn Randers-Pehrson9f044c12010-12-07 14:59:43 -06001436 * MUST be called before png_read_update_info or png_start_read_image,
1437 * otherwise it will not have the desired effect. Note that it is still
1438 * necessary to call png_read_row or png_read_rows png_get_image_height
1439 * times for each pass.
1440*/
John Bowler5d567862011-12-24 09:12:00 -06001441PNG_EXPORT(45, int, png_set_interlace_handling, (png_structrp png_ptr));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001442#endif
Guy Schalnat0d580581995-07-20 02:43:20 -05001443
Guy Schalnat51f0eb41995-09-26 05:22:39 -05001444#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
Glenn Randers-Pehrson104622b2000-05-29 08:58:03 -05001445/* Invert monochrome files */
John Bowler5d567862011-12-24 09:12:00 -06001446PNG_EXPORT(46, void, png_set_invert_mono, (png_structrp png_ptr));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001447#endif
Guy Schalnat0d580581995-07-20 02:43:20 -05001448
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05001449#ifdef PNG_READ_BACKGROUND_SUPPORTED
John Bowlercb0b2962011-05-12 21:48:29 -05001450/* Handle alpha and tRNS by replacing with a background color. Prior to
Glenn Randers-Pehrsonef217b72011-06-15 12:58:27 -05001451 * libpng-1.5.4 this API must not be called before the PNG file header has been
John Bowlercb0b2962011-05-12 21:48:29 -05001452 * read. Doing so will result in unexpected behavior and possible warnings or
Glenn Randers-Pehrson1591a4c2011-05-16 09:07:26 -05001453 * errors if the PNG file contains a bKGD chunk.
John Bowlercb0b2962011-05-12 21:48:29 -05001454 */
John Bowler5d567862011-12-24 09:12:00 -06001455PNG_FP_EXPORT(47, void, png_set_background, (png_structrp png_ptr,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001456 png_const_color_16p background_color, int background_gamma_code,
John Bowlerbce79882012-02-13 11:45:22 -06001457 int need_expand, double background_gamma))
John Bowler5d567862011-12-24 09:12:00 -06001458PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structrp png_ptr,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001459 png_const_color_16p background_color, int background_gamma_code,
John Bowlerbce79882012-02-13 11:45:22 -06001460 int need_expand, png_fixed_point background_gamma))
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -05001461#endif
1462#ifdef PNG_READ_BACKGROUND_SUPPORTED
Glenn Randers-Pehrsond4df36c2010-03-06 10:45:55 -06001463# define PNG_BACKGROUND_GAMMA_UNKNOWN 0
1464# define PNG_BACKGROUND_GAMMA_SCREEN 1
1465# define PNG_BACKGROUND_GAMMA_FILE 2
1466# define PNG_BACKGROUND_GAMMA_UNIQUE 3
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001467#endif
Guy Schalnat0d580581995-07-20 02:43:20 -05001468
John Bowler8d261262011-06-18 13:37:11 -05001469#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
Glenn Randers-Pehrson413138a2011-06-13 22:07:37 -05001470/* Scale a 16-bit depth file down to 8-bit, accurately. */
John Bowler5d567862011-12-24 09:12:00 -06001471PNG_EXPORT(229, void, png_set_scale_16, (png_structrp png_ptr));
John Bowler8d261262011-06-18 13:37:11 -05001472#endif
Glenn Randers-Pehrsonab63dd02011-06-17 20:04:17 -05001473
John Bowler8d261262011-06-18 13:37:11 -05001474#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
1475#define PNG_READ_16_TO_8 SUPPORTED /* Name prior to 1.5.4 */
Glenn Randers-Pehrson413138a2011-06-13 22:07:37 -05001476/* Strip the second byte of information from a 16-bit depth file. */
John Bowler5d567862011-12-24 09:12:00 -06001477PNG_EXPORT(48, void, png_set_strip_16, (png_structrp png_ptr));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001478#endif
Guy Schalnat0d580581995-07-20 02:43:20 -05001479
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05001480#ifdef PNG_READ_QUANTIZE_SUPPORTED
1481/* Turn on quantizing, and reduce the palette to the number of colors
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06001482 * available.
1483 */
John Bowlerbce79882012-02-13 11:45:22 -06001484PNG_EXPORT(49, void, png_set_quantize, (png_structrp png_ptr,
1485 png_colorp palette, int num_palette, int maximum_colors,
1486 png_const_uint_16p histogram, int full_quantize));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001487#endif
Guy Schalnat0d580581995-07-20 02:43:20 -05001488
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05001489#ifdef PNG_READ_GAMMA_SUPPORTED
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -05001490/* The threshold on gamma processing is configurable but hard-wired into the
1491 * library. The following is the floating point variant.
1492 */
1493#define PNG_GAMMA_THRESHOLD (PNG_GAMMA_THRESHOLD_FIXED*.00001)
1494
John Bowlerd273ad22011-05-07 21:00:28 -05001495/* Handle gamma correction. Screen_gamma=(display_exponent).
Glenn Randers-Pehrsonc7822512011-05-07 21:23:43 -05001496 * NOTE: this API simply sets the screen and file gamma values. It will
John Bowlerd273ad22011-05-07 21:00:28 -05001497 * therefore override the value for gamma in a PNG file if it is called after
John Bowlerf70c7d02011-05-10 22:54:37 -05001498 * the file header has been read - use with care - call before reading the PNG
1499 * file for best results!
1500 *
1501 * These routines accept the same gamma values as png_set_alpha_mode (described
1502 * above). The PNG_GAMMA_ defines and PNG_DEFAULT_sRGB can be passed to either
1503 * API (floating point or fixed.) Notice, however, that the 'file_gamma' value
1504 * is the inverse of a 'screen gamma' value.
John Bowlerd273ad22011-05-07 21:00:28 -05001505 */
John Bowler5d567862011-12-24 09:12:00 -06001506PNG_FP_EXPORT(50, void, png_set_gamma, (png_structrp png_ptr,
John Bowlerbce79882012-02-13 11:45:22 -06001507 double screen_gamma, double override_file_gamma))
John Bowler5d567862011-12-24 09:12:00 -06001508PNG_FIXED_EXPORT(208, void, png_set_gamma_fixed, (png_structrp png_ptr,
John Bowlerbce79882012-02-13 11:45:22 -06001509 png_fixed_point screen_gamma, png_fixed_point override_file_gamma))
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001510#endif
Guy Schalnat0d580581995-07-20 02:43:20 -05001511
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05001512#ifdef PNG_WRITE_FLUSH_SUPPORTED
Guy Schalnat0f716451995-11-28 11:22:13 -06001513/* Set how many lines between output flushes - 0 for no flushing */
John Bowler5d567862011-12-24 09:12:00 -06001514PNG_EXPORT(51, void, png_set_flush, (png_structrp png_ptr, int nrows));
Guy Schalnat0f716451995-11-28 11:22:13 -06001515/* Flush the current PNG output buffer */
John Bowler5d567862011-12-24 09:12:00 -06001516PNG_EXPORT(52, void, png_write_flush, (png_structrp png_ptr));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001517#endif
Guy Schalnat0f716451995-11-28 11:22:13 -06001518
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001519/* Optional update palette with requested transformations */
John Bowler5d567862011-12-24 09:12:00 -06001520PNG_EXPORT(53, void, png_start_read_image, (png_structrp png_ptr));
Guy Schalnat51f0eb41995-09-26 05:22:39 -05001521
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001522/* Optional call to update the users info structure */
John Bowler5d567862011-12-24 09:12:00 -06001523PNG_EXPORT(54, void, png_read_update_info, (png_structrp png_ptr,
1524 png_inforp info_ptr));
Guy Schalnat0d580581995-07-20 02:43:20 -05001525
Glenn Randers-Pehrsondbd40142009-08-31 08:42:02 -05001526#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001527/* Read one or more rows of image data. */
John Bowler5d567862011-12-24 09:12:00 -06001528PNG_EXPORT(55, void, png_read_rows, (png_structrp png_ptr, png_bytepp row,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001529 png_bytepp display_row, png_uint_32 num_rows));
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -05001530#endif
Guy Schalnat0d580581995-07-20 02:43:20 -05001531
Glenn Randers-Pehrsondbd40142009-08-31 08:42:02 -05001532#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001533/* Read a row of data. */
John Bowler5d567862011-12-24 09:12:00 -06001534PNG_EXPORT(56, void, png_read_row, (png_structrp png_ptr, png_bytep row,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001535 png_bytep display_row));
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -05001536#endif
Guy Schalnat0d580581995-07-20 02:43:20 -05001537
Glenn Randers-Pehrsondbd40142009-08-31 08:42:02 -05001538#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001539/* Read the whole image into memory at once. */
John Bowler5d567862011-12-24 09:12:00 -06001540PNG_EXPORT(57, void, png_read_image, (png_structrp png_ptr, png_bytepp image));
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -05001541#endif
Guy Schalnat0d580581995-07-20 02:43:20 -05001542
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001543/* Write a row of image data */
John Bowler5d567862011-12-24 09:12:00 -06001544PNG_EXPORT(58, void, png_write_row, (png_structrp png_ptr, png_const_bytep row));
Guy Schalnat0d580581995-07-20 02:43:20 -05001545
Glenn Randers-Pehrson9f044c12010-12-07 14:59:43 -06001546/* Write a few rows of image data: (*row) is not written; however, the type
1547 * is declared as writeable to maintain compatibility with previous versions
1548 * of libpng and to allow the 'display_row' array from read_rows to be passed
Glenn Randers-Pehrsone600c512010-08-18 07:25:46 -05001549 * unchanged to write_rows.
1550 */
John Bowler5d567862011-12-24 09:12:00 -06001551PNG_EXPORT(59, void, png_write_rows, (png_structrp png_ptr, png_bytepp row,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001552 png_uint_32 num_rows));
Guy Schalnat0d580581995-07-20 02:43:20 -05001553
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001554/* Write the image data */
John Bowler5d567862011-12-24 09:12:00 -06001555PNG_EXPORT(60, void, png_write_image, (png_structrp png_ptr, png_bytepp image));
Guy Schalnat0d580581995-07-20 02:43:20 -05001556
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001557/* Write the end of the PNG file. */
John Bowler5d567862011-12-24 09:12:00 -06001558PNG_EXPORT(61, void, png_write_end, (png_structrp png_ptr, png_inforp info_ptr));
Guy Schalnat0d580581995-07-20 02:43:20 -05001559
Glenn Randers-Pehrsondbd40142009-08-31 08:42:02 -05001560#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001561/* Read the end of the PNG file. */
John Bowler5d567862011-12-24 09:12:00 -06001562PNG_EXPORT(62, void, png_read_end, (png_structrp png_ptr, png_inforp info_ptr));
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -05001563#endif
Guy Schalnat0d580581995-07-20 02:43:20 -05001564
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001565/* Free any memory associated with the png_info_struct */
John Bowler5d567862011-12-24 09:12:00 -06001566PNG_EXPORT(63, void, png_destroy_info_struct, (png_const_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001567 png_infopp info_ptr_ptr));
Guy Schalnate5a37791996-06-05 15:50:50 -05001568
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001569/* Free any memory associated with the png_struct and the png_info_structs */
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001570PNG_EXPORT(64, void, png_destroy_read_struct, (png_structpp png_ptr_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001571 png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr));
Guy Schalnate5a37791996-06-05 15:50:50 -05001572
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001573/* Free any memory associated with the png_struct and the png_info_structs */
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001574PNG_EXPORT(65, void, png_destroy_write_struct, (png_structpp png_ptr_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001575 png_infopp info_ptr_ptr));
Guy Schalnate5a37791996-06-05 15:50:50 -05001576
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001577/* Set the libpng method of handling chunk CRC errors */
John Bowler5d567862011-12-24 09:12:00 -06001578PNG_EXPORT(66, void, png_set_crc_action, (png_structrp png_ptr, int crit_action,
John Bowler40b26032011-12-22 08:09:15 -06001579 int ancil_action));
Andreas Dilger02ad0ef1997-01-17 01:34:35 -06001580
Glenn Randers-Pehrson9f044c12010-12-07 14:59:43 -06001581/* Values for png_set_crc_action() say how to handle CRC errors in
Andreas Dilger47a0c421997-05-16 02:46:07 -05001582 * ancillary and critical chunks, and whether to use the data contained
1583 * therein. Note that it is impossible to "discard" data in a critical
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001584 * chunk. For versions prior to 0.90, the action was always error/quit,
Andreas Dilger47a0c421997-05-16 02:46:07 -05001585 * whereas in version 0.90 and later, the action for CRC errors in ancillary
1586 * chunks is warn/discard. These values should NOT be changed.
1587 *
1588 * value action:critical action:ancillary
Andreas Dilger02ad0ef1997-01-17 01:34:35 -06001589 */
1590#define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */
1591#define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */
1592#define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */
1593#define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */
1594#define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */
1595#define PNG_CRC_NO_CHANGE 5 /* use current value use current value */
1596
Andreas Dilger47a0c421997-05-16 02:46:07 -05001597/* These functions give the user control over the scan-line filtering in
1598 * libpng and the compression methods used by zlib. These functions are
1599 * mainly useful for testing, as the defaults should work with most users.
1600 * Those users who are tight on memory or want faster performance at the
1601 * expense of compression can modify them. See the compression library
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -06001602 * header file (zlib.h) for an explination of the compression functions.
1603 */
Andreas Dilger02ad0ef1997-01-17 01:34:35 -06001604
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001605/* Set the filtering method(s) used by libpng. Currently, the only valid
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -06001606 * value for "method" is 0.
1607 */
John Bowler5d567862011-12-24 09:12:00 -06001608PNG_EXPORT(67, void, png_set_filter, (png_structrp png_ptr, int method,
John Bowler40b26032011-12-22 08:09:15 -06001609 int filters));
Guy Schalnat51f0eb41995-09-26 05:22:39 -05001610
Andreas Dilger02ad0ef1997-01-17 01:34:35 -06001611/* Flags for png_set_filter() to say which filters to use. The flags
Andreas Dilger47a0c421997-05-16 02:46:07 -05001612 * are chosen so that they don't conflict with real filter types
1613 * below, in case they are supplied instead of the #defined constants.
1614 * These values should NOT be changed.
Andreas Dilger02ad0ef1997-01-17 01:34:35 -06001615 */
1616#define PNG_NO_FILTERS 0x00
1617#define PNG_FILTER_NONE 0x08
1618#define PNG_FILTER_SUB 0x10
1619#define PNG_FILTER_UP 0x20
1620#define PNG_FILTER_AVG 0x40
1621#define PNG_FILTER_PAETH 0x80
1622#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \
1623 PNG_FILTER_AVG | PNG_FILTER_PAETH)
1624
Andreas Dilger47a0c421997-05-16 02:46:07 -05001625/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now.
1626 * These defines should NOT be changed.
1627 */
1628#define PNG_FILTER_VALUE_NONE 0
1629#define PNG_FILTER_VALUE_SUB 1
1630#define PNG_FILTER_VALUE_UP 2
1631#define PNG_FILTER_VALUE_AVG 3
1632#define PNG_FILTER_VALUE_PAETH 4
1633#define PNG_FILTER_VALUE_LAST 5
1634
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05001635#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* EXPERIMENTAL */
Andreas Dilger47a0c421997-05-16 02:46:07 -05001636/* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_
1637 * defines, either the default (minimum-sum-of-absolute-differences), or
1638 * the experimental method (weighted-minimum-sum-of-absolute-differences).
1639 *
1640 * Weights are factors >= 1.0, indicating how important it is to keep the
1641 * filter type consistent between rows. Larger numbers mean the current
1642 * filter is that many times as likely to be the same as the "num_weights"
1643 * previous filters. This is cumulative for each previous row with a weight.
1644 * There needs to be "num_weights" values in "filter_weights", or it can be
1645 * NULL if the weights aren't being specified. Weights have no influence on
1646 * the selection of the first row filter. Well chosen weights can (in theory)
1647 * improve the compression for a given image.
1648 *
1649 * Costs are factors >= 1.0 indicating the relative decoding costs of a
1650 * filter type. Higher costs indicate more decoding expense, and are
1651 * therefore less likely to be selected over a filter with lower computational
1652 * costs. There needs to be a value in "filter_costs" for each valid filter
1653 * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't
1654 * setting the costs. Costs try to improve the speed of decompression without
1655 * unduly increasing the compressed image size.
1656 *
1657 * A negative weight or cost indicates the default value is to be used, and
1658 * values in the range [0.0, 1.0) indicate the value is to remain unchanged.
1659 * The default values for both weights and costs are currently 1.0, but may
1660 * change if good general weighting/cost heuristics can be found. If both
1661 * the weights and costs are set to 1.0, this degenerates the WEIGHTED method
1662 * to the UNWEIGHTED method, but with added encoding time/computation.
1663 */
John Bowler5d567862011-12-24 09:12:00 -06001664PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structrp png_ptr,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001665 int heuristic_method, int num_weights, png_const_doublep filter_weights,
John Bowlerbce79882012-02-13 11:45:22 -06001666 png_const_doublep filter_costs))
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001667PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed,
John Bowler5d567862011-12-24 09:12:00 -06001668 (png_structrp png_ptr, int heuristic_method, int num_weights,
John Bowler40b26032011-12-22 08:09:15 -06001669 png_const_fixed_point_p filter_weights,
John Bowlerbce79882012-02-13 11:45:22 -06001670 png_const_fixed_point_p filter_costs))
Andreas Dilger47a0c421997-05-16 02:46:07 -05001671#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */
1672
1673/* Heuristic used for row filter selection. These defines should NOT be
1674 * changed.
1675 */
1676#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */
1677#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */
1678#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */
1679#define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */
1680
John Bowlerc5bef942011-05-05 17:35:39 -05001681#ifdef PNG_WRITE_SUPPORTED
Andreas Dilger47a0c421997-05-16 02:46:07 -05001682/* Set the library compression level. Currently, valid values range from
1683 * 0 - 9, corresponding directly to the zlib compression levels 0 - 9
1684 * (0 - no compression, 9 - "maximal" compression). Note that tests have
1685 * shown that zlib compression levels 3-6 usually perform as well as level 9
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001686 * for PNG images, and do considerably fewer caclulations. In the future,
Andreas Dilger47a0c421997-05-16 02:46:07 -05001687 * these values may not correspond directly to the zlib compression levels.
1688 */
John Bowler5d567862011-12-24 09:12:00 -06001689PNG_EXPORT(69, void, png_set_compression_level, (png_structrp png_ptr,
John Bowler40b26032011-12-22 08:09:15 -06001690 int level));
Guy Schalnat51f0eb41995-09-26 05:22:39 -05001691
John Bowler5d567862011-12-24 09:12:00 -06001692PNG_EXPORT(70, void, png_set_compression_mem_level, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001693 int mem_level));
Guy Schalnat51f0eb41995-09-26 05:22:39 -05001694
John Bowler5d567862011-12-24 09:12:00 -06001695PNG_EXPORT(71, void, png_set_compression_strategy, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001696 int strategy));
Guy Schalnat51f0eb41995-09-26 05:22:39 -05001697
Glenn Randers-Pehrsonaf855e42011-05-07 10:52:49 -05001698/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a
1699 * smaller value of window_bits if it can do so safely.
1700 */
John Bowler5d567862011-12-24 09:12:00 -06001701PNG_EXPORT(72, void, png_set_compression_window_bits, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001702 int window_bits));
Guy Schalnat51f0eb41995-09-26 05:22:39 -05001703
John Bowler5d567862011-12-24 09:12:00 -06001704PNG_EXPORT(73, void, png_set_compression_method, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001705 int method));
John Bowlerc5bef942011-05-05 17:35:39 -05001706#endif
Guy Schalnat0d580581995-07-20 02:43:20 -05001707
John Bowlerb2bee332011-06-10 23:24:58 -05001708#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
Glenn Randers-Pehrson6b3d50b2011-03-31 20:14:29 -05001709/* Also set zlib parameters for compressing non-IDAT chunks */
John Bowler5d567862011-12-24 09:12:00 -06001710PNG_EXPORT(222, void, png_set_text_compression_level, (png_structrp png_ptr,
John Bowler40b26032011-12-22 08:09:15 -06001711 int level));
Glenn Randers-Pehrson6b3d50b2011-03-31 20:14:29 -05001712
John Bowler5d567862011-12-24 09:12:00 -06001713PNG_EXPORT(223, void, png_set_text_compression_mem_level, (png_structrp png_ptr,
Glenn Randers-Pehrson6b3d50b2011-03-31 20:14:29 -05001714 int mem_level));
1715
John Bowler5d567862011-12-24 09:12:00 -06001716PNG_EXPORT(224, void, png_set_text_compression_strategy, (png_structrp png_ptr,
Glenn Randers-Pehrson6b3d50b2011-03-31 20:14:29 -05001717 int strategy));
1718
Glenn Randers-Pehrsonaf855e42011-05-07 10:52:49 -05001719/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a
1720 * smaller value of window_bits if it can do so safely.
1721 */
John Bowler40b26032011-12-22 08:09:15 -06001722PNG_EXPORT(225, void, png_set_text_compression_window_bits,
John Bowler5d567862011-12-24 09:12:00 -06001723 (png_structrp png_ptr, int window_bits));
Glenn Randers-Pehrson6b3d50b2011-03-31 20:14:29 -05001724
John Bowler5d567862011-12-24 09:12:00 -06001725PNG_EXPORT(226, void, png_set_text_compression_method, (png_structrp png_ptr,
Glenn Randers-Pehrson6b3d50b2011-03-31 20:14:29 -05001726 int method));
John Bowlerb2bee332011-06-10 23:24:58 -05001727#endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */
Glenn Randers-Pehrson6b3d50b2011-03-31 20:14:29 -05001728
Guy Schalnate5a37791996-06-05 15:50:50 -05001729/* These next functions are called for input/output, memory, and error
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001730 * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c,
Andreas Dilger47a0c421997-05-16 02:46:07 -05001731 * and call standard C I/O routines such as fread(), fwrite(), and
1732 * fprintf(). These functions can be made to use other I/O routines
1733 * at run time for those applications that need to handle I/O in a
Glenn Randers-Pehrsonf3abb2c2010-10-17 12:51:53 -05001734 * different manner by calling png_set_???_fn(). See libpng-manual.txt for
Andreas Dilger47a0c421997-05-16 02:46:07 -05001735 * more information.
1736 */
Guy Schalnat0d580581995-07-20 02:43:20 -05001737
Glenn Randers-Pehrsondbd40142009-08-31 08:42:02 -05001738#ifdef PNG_STDIO_SUPPORTED
Andreas Dilger47a0c421997-05-16 02:46:07 -05001739/* Initialize the input/output for the PNG file to the default functions. */
John Bowler5d567862011-12-24 09:12:00 -06001740PNG_EXPORT(74, void, png_init_io, (png_structrp png_ptr, png_FILE_p fp));
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -06001741#endif
Guy Schalnat6d764711995-12-19 03:22:19 -06001742
Andreas Dilger02ad0ef1997-01-17 01:34:35 -06001743/* Replace the (error and abort), and warning functions with user
Andreas Dilger47a0c421997-05-16 02:46:07 -05001744 * supplied functions. If no messages are to be printed you must still
1745 * write and use replacement functions. The replacement error_fn should
1746 * still do a longjmp to the last setjmp location if you are using this
1747 * method of error handling. If error_fn or warning_fn is NULL, the
1748 * default function will be used.
1749 */
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06001750
John Bowler5d567862011-12-24 09:12:00 -06001751PNG_EXPORT(75, void, png_set_error_fn, (png_structrp png_ptr,
John Bowler40b26032011-12-22 08:09:15 -06001752 png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn));
Guy Schalnat6d764711995-12-19 03:22:19 -06001753
Guy Schalnate5a37791996-06-05 15:50:50 -05001754/* Return the user pointer associated with the error functions */
John Bowler5d567862011-12-24 09:12:00 -06001755PNG_EXPORT(76, png_voidp, png_get_error_ptr, (png_const_structrp png_ptr));
Guy Schalnat6d764711995-12-19 03:22:19 -06001756
1757/* Replace the default data output functions with a user supplied one(s).
Andreas Dilger47a0c421997-05-16 02:46:07 -05001758 * If buffered output is not used, then output_flush_fn can be set to NULL.
1759 * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time
1760 * output_flush_fn will be ignored (and thus can be NULL).
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05001761 * It is probably a mistake to use NULL for output_flush_fn if
1762 * write_data_fn is not also NULL unless you have built libpng with
1763 * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's
1764 * default flush function, which uses the standard *FILE structure, will
1765 * be used.
Andreas Dilger47a0c421997-05-16 02:46:07 -05001766 */
John Bowler5d567862011-12-24 09:12:00 -06001767PNG_EXPORT(77, void, png_set_write_fn, (png_structrp png_ptr, png_voidp io_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001768 png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn));
Guy Schalnat6d764711995-12-19 03:22:19 -06001769
1770/* Replace the default data input function with a user supplied one. */
John Bowler5d567862011-12-24 09:12:00 -06001771PNG_EXPORT(78, void, png_set_read_fn, (png_structrp png_ptr, png_voidp io_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001772 png_rw_ptr read_data_fn));
Guy Schalnat6d764711995-12-19 03:22:19 -06001773
1774/* Return the user pointer associated with the I/O functions */
John Bowler5d567862011-12-24 09:12:00 -06001775PNG_EXPORT(79, png_voidp, png_get_io_ptr, (png_const_structrp png_ptr));
Guy Schalnat6d764711995-12-19 03:22:19 -06001776
John Bowler5d567862011-12-24 09:12:00 -06001777PNG_EXPORT(80, void, png_set_read_status_fn, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001778 png_read_status_ptr read_row_fn));
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -06001779
John Bowler5d567862011-12-24 09:12:00 -06001780PNG_EXPORT(81, void, png_set_write_status_fn, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001781 png_write_status_ptr write_row_fn));
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -06001782
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05001783#ifdef PNG_USER_MEM_SUPPORTED
1784/* Replace the default memory allocation functions with user supplied one(s). */
John Bowler5d567862011-12-24 09:12:00 -06001785PNG_EXPORT(82, void, png_set_mem_fn, (png_structrp png_ptr, png_voidp mem_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001786 png_malloc_ptr malloc_fn, png_free_ptr free_fn));
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05001787/* Return the user pointer associated with the memory functions */
John Bowler5d567862011-12-24 09:12:00 -06001788PNG_EXPORT(83, png_voidp, png_get_mem_ptr, (png_const_structrp png_ptr));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001789#endif
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05001790
Glenn Randers-Pehrson33188ac2009-06-16 14:12:35 -05001791#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06001792PNG_EXPORT(84, void, png_set_read_user_transform_fn, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001793 png_user_transform_ptr read_user_transform_fn));
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -06001794#endif
1795
Glenn Randers-Pehrson33188ac2009-06-16 14:12:35 -05001796#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06001797PNG_EXPORT(85, void, png_set_write_user_transform_fn, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001798 png_user_transform_ptr write_user_transform_fn));
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -06001799#endif
1800
John Bowler0a5c9c02011-01-22 17:36:34 -06001801#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06001802PNG_EXPORT(86, void, png_set_user_transform_info, (png_structrp png_ptr,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001803 png_voidp user_transform_ptr, int user_transform_depth,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001804 int user_transform_channels));
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05001805/* Return the user pointer associated with the user transform functions */
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06001806PNG_EXPORT(87, png_voidp, png_get_user_transform_ptr,
John Bowler5d567862011-12-24 09:12:00 -06001807 (png_const_structrp png_ptr));
John Bowler0a5c9c02011-01-22 17:36:34 -06001808#endif
1809
1810#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED
1811/* Return information about the row currently being processed. Note that these
1812 * APIs do not fail but will return unexpected results if called outside a user
1813 * transform callback. Also note that when transforming an interlaced image the
John Bowler9616ad92011-02-16 06:13:46 -06001814 * row number is the row number within the sub-image of the interlace pass, so
1815 * the value will increase to the height of the sub-image (not the full image)
1816 * then reset to 0 for the next pass.
John Bowler5432c012011-02-12 08:59:17 -06001817 *
John Bowler9616ad92011-02-16 06:13:46 -06001818 * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to
1819 * find the output pixel (x,y) given an interlaced sub-image pixel
1820 * (row,col,pass). (See below for these macros.)
John Bowler0a5c9c02011-01-22 17:36:34 -06001821 */
John Bowler5d567862011-12-24 09:12:00 -06001822PNG_EXPORT(217, png_uint_32, png_get_current_row_number, (png_const_structrp));
1823PNG_EXPORT(218, png_byte, png_get_current_pass_number, (png_const_structrp));
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05001824#endif
1825
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001826#ifdef PNG_USER_CHUNKS_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06001827PNG_EXPORT(88, void, png_set_read_user_chunk_fn, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001828 png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn));
John Bowler5d567862011-12-24 09:12:00 -06001829PNG_EXPORT(89, png_voidp, png_get_user_chunk_ptr, (png_const_structrp png_ptr));
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001830#endif
1831
Guy Schalnat4ee97b01996-01-16 01:51:56 -06001832#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
Andreas Dilger47a0c421997-05-16 02:46:07 -05001833/* Sets the function callbacks for the push reader, and a pointer to a
1834 * user-defined structure available to the callback functions.
1835 */
John Bowler5d567862011-12-24 09:12:00 -06001836PNG_EXPORT(90, void, png_set_progressive_read_fn, (png_structrp png_ptr,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001837 png_voidp progressive_ptr, png_progressive_info_ptr info_fn,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001838 png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn));
Guy Schalnat6d764711995-12-19 03:22:19 -06001839
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001840/* Returns the user pointer associated with the push read functions */
John Bowler5d567862011-12-24 09:12:00 -06001841PNG_EXPORT(91, png_voidp, png_get_progressive_ptr, (png_const_structrp png_ptr));
Andreas Dilger47a0c421997-05-16 02:46:07 -05001842
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001843/* Function to be called when data becomes available */
John Bowler5d567862011-12-24 09:12:00 -06001844PNG_EXPORT(92, void, png_process_data, (png_structrp png_ptr, png_inforp info_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001845 png_bytep buffer, png_size_t buffer_size));
Andreas Dilger47a0c421997-05-16 02:46:07 -05001846
John Bowler0a5c9c02011-01-22 17:36:34 -06001847/* A function which may be called *only* within png_process_data to stop the
1848 * processing of any more data. The function returns the number of bytes
1849 * remaining, excluding any that libpng has cached internally. A subsequent
1850 * call to png_process_data must supply these bytes again. If the argument
1851 * 'save' is set to true the routine will first save all the pending data and
1852 * will always return 0.
1853 */
John Bowler5d567862011-12-24 09:12:00 -06001854PNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structrp, int save));
John Bowler0a5c9c02011-01-22 17:36:34 -06001855
1856/* A function which may be called *only* outside (after) a call to
1857 * png_process_data. It returns the number of bytes of data to skip in the
1858 * input. Normally it will return 0, but if it returns a non-zero value the
1859 * application must skip than number of bytes of input data and pass the
1860 * following data to the next call to png_process_data.
1861 */
John Bowler5d567862011-12-24 09:12:00 -06001862PNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structrp));
John Bowler0a5c9c02011-01-22 17:36:34 -06001863
Glenn Randers-Pehrson4daae302011-10-06 21:37:47 -05001864#ifdef PNG_READ_INTERLACING_SUPPORTED
Glenn Randers-Pehrson9f044c12010-12-07 14:59:43 -06001865/* Function that combines rows. 'new_row' is a flag that should come from
1866 * the callback and be non-NULL if anything needs to be done; the library
1867 * stores its own version of the new data internally and ignores the passed
1868 * in value.
Andreas Dilger47a0c421997-05-16 02:46:07 -05001869 */
John Bowler5d567862011-12-24 09:12:00 -06001870PNG_EXPORT(93, void, png_progressive_combine_row, (png_const_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001871 png_bytep old_row, png_const_bytep new_row));
Glenn Randers-Pehrson4daae302011-10-06 21:37:47 -05001872#endif /* PNG_READ_INTERLACING_SUPPORTED */
Guy Schalnat4ee97b01996-01-16 01:51:56 -06001873#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
Guy Schalnat6d764711995-12-19 03:22:19 -06001874
John Bowler5d567862011-12-24 09:12:00 -06001875PNG_EXPORTA(94, png_voidp, png_malloc, (png_const_structrp png_ptr,
John Bowler40b26032011-12-22 08:09:15 -06001876 png_alloc_size_t size), PNG_ALLOCATED);
Glenn Randers-Pehrson0ffb71a2009-02-28 06:08:20 -06001877/* Added at libpng version 1.4.0 */
John Bowler5d567862011-12-24 09:12:00 -06001878PNG_EXPORTA(95, png_voidp, png_calloc, (png_const_structrp png_ptr,
John Bowler40b26032011-12-22 08:09:15 -06001879 png_alloc_size_t size), PNG_ALLOCATED);
Guy Schalnat0d580581995-07-20 02:43:20 -05001880
Glenn Randers-Pehrson07748d12002-05-25 11:12:10 -05001881/* Added at libpng version 1.2.4 */
John Bowler5d567862011-12-24 09:12:00 -06001882PNG_EXPORTA(96, png_voidp, png_malloc_warn, (png_const_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001883 png_alloc_size_t size), PNG_ALLOCATED);
Glenn Randers-Pehrson07748d12002-05-25 11:12:10 -05001884
Glenn Randers-Pehrsonbeb572e2006-08-19 13:59:24 -05001885/* Frees a pointer allocated by png_malloc() */
John Bowler5d567862011-12-24 09:12:00 -06001886PNG_EXPORT(97, void, png_free, (png_const_structrp png_ptr, png_voidp ptr));
Guy Schalnate5a37791996-06-05 15:50:50 -05001887
Glenn Randers-Pehrson38e6e772000-04-09 19:06:13 -05001888/* Free data that was allocated internally */
John Bowler5d567862011-12-24 09:12:00 -06001889PNG_EXPORT(98, void, png_free_data, (png_const_structrp png_ptr,
1890 png_inforp info_ptr, png_uint_32 free_me, int num));
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001891
Glenn Randers-Pehrson38e6e772000-04-09 19:06:13 -05001892/* Reassign responsibility for freeing existing data, whether allocated
John Bowler40b26032011-12-22 08:09:15 -06001893 * by libpng or by the application; this works on the png_info structure passed
1894 * in, it does not change the state for other png_info structures.
1895 */
John Bowler5d567862011-12-24 09:12:00 -06001896PNG_EXPORT(99, void, png_data_freer, (png_const_structrp png_ptr,
1897 png_inforp info_ptr, int freer, png_uint_32 mask));
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001898
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001899/* Assignments for png_data_freer */
Glenn Randers-Pehrson38e6e772000-04-09 19:06:13 -05001900#define PNG_DESTROY_WILL_FREE_DATA 1
1901#define PNG_SET_WILL_FREE_DATA 1
1902#define PNG_USER_WILL_FREE_DATA 2
1903/* Flags for png_ptr->free_me and info_ptr->free_me */
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -06001904#define PNG_FREE_HIST 0x0008
1905#define PNG_FREE_ICCP 0x0010
1906#define PNG_FREE_SPLT 0x0020
1907#define PNG_FREE_ROWS 0x0040
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05001908#define PNG_FREE_PCAL 0x0080
1909#define PNG_FREE_SCAL 0x0100
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -06001910#define PNG_FREE_UNKN 0x0200
1911#define PNG_FREE_LIST 0x0400
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05001912#define PNG_FREE_PLTE 0x1000
1913#define PNG_FREE_TRNS 0x2000
1914#define PNG_FREE_TEXT 0x4000
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05001915#define PNG_FREE_ALL 0x7fff
Glenn Randers-Pehrsonec61c232000-05-16 06:17:36 -05001916#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -06001917
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05001918#ifdef PNG_USER_MEM_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06001919PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_const_structrp png_ptr,
John Bowlerd332c672011-12-21 17:36:12 -06001920 png_alloc_size_t size), PNG_ALLOCATED PNG_DEPRECATED);
John Bowler5d567862011-12-24 09:12:00 -06001921PNG_EXPORTA(101, void, png_free_default, (png_const_structrp png_ptr,
John Bowler40b26032011-12-22 08:09:15 -06001922 png_voidp ptr), PNG_DEPRECATED);
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001923#endif
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05001924
Glenn Randers-Pehrson862cb202010-04-16 22:12:51 -05001925#ifdef PNG_ERROR_TEXT_SUPPORTED
Andreas Dilger47a0c421997-05-16 02:46:07 -05001926/* Fatal error in PNG image of libpng - can't continue */
John Bowler5d567862011-12-24 09:12:00 -06001927PNG_EXPORTA(102, void, png_error, (png_const_structrp png_ptr,
John Bowler40b26032011-12-22 08:09:15 -06001928 png_const_charp error_message), PNG_NORETURN);
Guy Schalnat0d580581995-07-20 02:43:20 -05001929
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -06001930/* The same, but the chunk name is prepended to the error string. */
John Bowler5d567862011-12-24 09:12:00 -06001931PNG_EXPORTA(103, void, png_chunk_error, (png_const_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001932 png_const_charp error_message), PNG_NORETURN);
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -06001933
Glenn Randers-Pehrsonfd107532009-11-10 05:59:22 -06001934#else
1935/* Fatal error in PNG image of libpng - can't continue */
John Bowler5d567862011-12-24 09:12:00 -06001936PNG_EXPORTA(104, void, png_err, (png_const_structrp png_ptr), PNG_NORETURN);
Glenn Randers-Pehrsonfd107532009-11-10 05:59:22 -06001937#endif
1938
John Bowler88b77cc2011-05-05 06:49:55 -05001939#ifdef PNG_WARNINGS_SUPPORTED
Guy Schalnat6d764711995-12-19 03:22:19 -06001940/* Non-fatal error in libpng. Can continue, but may have a problem. */
John Bowler5d567862011-12-24 09:12:00 -06001941PNG_EXPORT(105, void, png_warning, (png_const_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001942 png_const_charp warning_message));
Guy Schalnat0d580581995-07-20 02:43:20 -05001943
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -06001944/* Non-fatal error in libpng, chunk name is prepended to message. */
John Bowler5d567862011-12-24 09:12:00 -06001945PNG_EXPORT(106, void, png_chunk_warning, (png_const_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001946 png_const_charp warning_message));
John Bowler88b77cc2011-05-05 06:49:55 -05001947#endif
Glenn Randers-Pehrson70e3f541998-01-03 22:40:55 -06001948
Glenn Randers-Pehrson6bc53be2006-06-16 07:52:03 -05001949#ifdef PNG_BENIGN_ERRORS_SUPPORTED
1950/* Benign error in libpng. Can continue, but may have a problem.
1951 * User can choose whether to handle as a fatal error or as a warning. */
John Bowler5d567862011-12-24 09:12:00 -06001952PNG_EXPORT(107, void, png_benign_error, (png_const_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001953 png_const_charp warning_message));
Glenn Randers-Pehrson6bc53be2006-06-16 07:52:03 -05001954
1955/* Same, chunk name is prepended to message. */
John Bowler5d567862011-12-24 09:12:00 -06001956PNG_EXPORT(108, void, png_chunk_benign_error, (png_const_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001957 png_const_charp warning_message));
Glenn Randers-Pehrson6bc53be2006-06-16 07:52:03 -05001958
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06001959PNG_EXPORT(109, void, png_set_benign_errors,
John Bowler5d567862011-12-24 09:12:00 -06001960 (png_structrp png_ptr, int allowed));
Glenn Randers-Pehrson862cb202010-04-16 22:12:51 -05001961#else
1962# ifdef PNG_ALLOW_BENIGN_ERRORS
1963# define png_benign_error png_warning
1964# define png_chunk_benign_error png_chunk_warning
1965# else
1966# define png_benign_error png_error
1967# define png_chunk_benign_error png_chunk_error
1968# endif
Glenn Randers-Pehrson6bc53be2006-06-16 07:52:03 -05001969#endif
1970
Andreas Dilger47a0c421997-05-16 02:46:07 -05001971/* The png_set_<chunk> functions are for storing values in the png_info_struct.
1972 * Similarly, the png_get_<chunk> calls are used to read values from the
1973 * png_info_struct, either storing the parameters in the passed variables, or
1974 * setting pointers into the png_info_struct where the data is stored. The
1975 * png_get_<chunk> functions return a non-zero value if the data was available
1976 * in info_ptr, or return zero and do not change any of the parameters if the
1977 * data was not available.
1978 *
1979 * These functions should be used instead of directly accessing png_info
1980 * to avoid problems with future changes in the size and internal layout of
1981 * png_info_struct.
1982 */
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -06001983/* Returns "flag" if chunk data is valid in info_ptr. */
John Bowler5d567862011-12-24 09:12:00 -06001984PNG_EXPORT(110, png_uint_32, png_get_valid, (png_const_structrp png_ptr,
1985 png_const_inforp info_ptr, png_uint_32 flag));
Andreas Dilger47a0c421997-05-16 02:46:07 -05001986
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -06001987/* Returns number of bytes needed to hold a transformed row. */
John Bowler5d567862011-12-24 09:12:00 -06001988PNG_EXPORT(111, png_size_t, png_get_rowbytes, (png_const_structrp png_ptr,
1989 png_const_inforp info_ptr));
Andreas Dilger47a0c421997-05-16 02:46:07 -05001990
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05001991#ifdef PNG_INFO_IMAGE_SUPPORTED
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -06001992/* Returns row_pointers, which is an array of pointers to scanlines that was
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001993 * returned from png_read_png().
1994 */
John Bowler5d567862011-12-24 09:12:00 -06001995PNG_EXPORT(112, png_bytepp, png_get_rows, (png_const_structrp png_ptr,
1996 png_const_inforp info_ptr));
John Bowler40b26032011-12-22 08:09:15 -06001997
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -06001998/* Set row_pointers, which is an array of pointers to scanlines for use
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05001999 * by png_write_png().
2000 */
John Bowler4f67e402011-12-28 08:43:37 -06002001PNG_EXPORT(113, void, png_set_rows, (png_const_structrp png_ptr,
2002 png_inforp info_ptr, png_bytepp row_pointers));
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -06002003#endif
2004
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -06002005/* Returns number of color channels in image. */
John Bowler5d567862011-12-24 09:12:00 -06002006PNG_EXPORT(114, png_byte, png_get_channels, (png_const_structrp png_ptr,
2007 png_const_inforp info_ptr));
Andreas Dilger47a0c421997-05-16 02:46:07 -05002008
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -06002009#ifdef PNG_EASY_ACCESS_SUPPORTED
2010/* Returns image width in pixels. */
John Bowler5d567862011-12-24 09:12:00 -06002011PNG_EXPORT(115, png_uint_32, png_get_image_width, (png_const_structrp png_ptr,
2012 png_const_inforp info_ptr));
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -06002013
2014/* Returns image height in pixels. */
John Bowler5d567862011-12-24 09:12:00 -06002015PNG_EXPORT(116, png_uint_32, png_get_image_height, (png_const_structrp png_ptr,
2016 png_const_inforp info_ptr));
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -06002017
2018/* Returns image bit_depth. */
John Bowler5d567862011-12-24 09:12:00 -06002019PNG_EXPORT(117, png_byte, png_get_bit_depth, (png_const_structrp png_ptr,
2020 png_const_inforp info_ptr));
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -06002021
2022/* Returns image color_type. */
John Bowler5d567862011-12-24 09:12:00 -06002023PNG_EXPORT(118, png_byte, png_get_color_type, (png_const_structrp png_ptr,
2024 png_const_inforp info_ptr));
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -06002025
2026/* Returns image filter_type. */
John Bowler5d567862011-12-24 09:12:00 -06002027PNG_EXPORT(119, png_byte, png_get_filter_type, (png_const_structrp png_ptr,
2028 png_const_inforp info_ptr));
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -06002029
2030/* Returns image interlace_type. */
John Bowler5d567862011-12-24 09:12:00 -06002031PNG_EXPORT(120, png_byte, png_get_interlace_type, (png_const_structrp png_ptr,
2032 png_const_inforp info_ptr));
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -06002033
2034/* Returns image compression_type. */
John Bowler5d567862011-12-24 09:12:00 -06002035PNG_EXPORT(121, png_byte, png_get_compression_type, (png_const_structrp png_ptr,
2036 png_const_inforp info_ptr));
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -06002037
2038/* Returns image resolution in pixels per meter, from pHYs chunk data. */
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002039PNG_EXPORT(122, png_uint_32, png_get_pixels_per_meter,
John Bowler5d567862011-12-24 09:12:00 -06002040 (png_const_structrp png_ptr, png_const_inforp info_ptr));
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002041PNG_EXPORT(123, png_uint_32, png_get_x_pixels_per_meter,
John Bowler5d567862011-12-24 09:12:00 -06002042 (png_const_structrp png_ptr, png_const_inforp info_ptr));
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002043PNG_EXPORT(124, png_uint_32, png_get_y_pixels_per_meter,
John Bowler5d567862011-12-24 09:12:00 -06002044 (png_const_structrp png_ptr, png_const_inforp info_ptr));
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -06002045
2046/* Returns pixel aspect ratio, computed from pHYs chunk data. */
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002047PNG_FP_EXPORT(125, float, png_get_pixel_aspect_ratio,
John Bowlerbce79882012-02-13 11:45:22 -06002048 (png_const_structrp png_ptr, png_const_inforp info_ptr))
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06002049PNG_FIXED_EXPORT(210, png_fixed_point, png_get_pixel_aspect_ratio_fixed,
John Bowlerbce79882012-02-13 11:45:22 -06002050 (png_const_structrp png_ptr, png_const_inforp info_ptr))
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -06002051
2052/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */
John Bowlerbce79882012-02-13 11:45:22 -06002053PNG_EXPORT(126, png_int_32, png_get_x_offset_pixels,
2054 (png_const_structrp png_ptr, png_const_inforp info_ptr));
2055PNG_EXPORT(127, png_int_32, png_get_y_offset_pixels,
2056 (png_const_structrp png_ptr, png_const_inforp info_ptr));
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002057PNG_EXPORT(128, png_int_32, png_get_x_offset_microns,
John Bowler5d567862011-12-24 09:12:00 -06002058 (png_const_structrp png_ptr, png_const_inforp info_ptr));
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002059PNG_EXPORT(129, png_int_32, png_get_y_offset_microns,
John Bowler5d567862011-12-24 09:12:00 -06002060 (png_const_structrp png_ptr, png_const_inforp info_ptr));
Glenn Randers-Pehrson46f61e21998-01-30 21:45:12 -06002061
2062#endif /* PNG_EASY_ACCESS_SUPPORTED */
2063
Andreas Dilger47a0c421997-05-16 02:46:07 -05002064/* Returns pointer to signature string read from PNG header */
John Bowler5d567862011-12-24 09:12:00 -06002065PNG_EXPORT(130, png_const_bytep, png_get_signature, (png_const_structrp png_ptr,
John Bowler4f67e402011-12-28 08:43:37 -06002066 png_const_inforp info_ptr));
Andreas Dilger47a0c421997-05-16 02:46:07 -05002067
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002068#ifdef PNG_bKGD_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002069PNG_EXPORT(131, png_uint_32, png_get_bKGD, (png_const_structrp png_ptr,
2070 png_inforp info_ptr, png_color_16p *background));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002071#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002072
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002073#ifdef PNG_bKGD_SUPPORTED
John Bowler4f67e402011-12-28 08:43:37 -06002074PNG_EXPORT(132, void, png_set_bKGD, (png_const_structrp png_ptr,
2075 png_inforp info_ptr, png_const_color_16p background));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002076#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002077
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002078#ifdef PNG_cHRM_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002079PNG_FP_EXPORT(133, png_uint_32, png_get_cHRM, (png_const_structrp png_ptr,
John Bowlerbce79882012-02-13 11:45:22 -06002080 png_const_inforp info_ptr, double *white_x, double *white_y, double *red_x,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06002081 double *red_y, double *green_x, double *green_y, double *blue_x,
John Bowlerbce79882012-02-13 11:45:22 -06002082 double *blue_y))
John Bowler5d567862011-12-24 09:12:00 -06002083PNG_FP_EXPORT(230, png_uint_32, png_get_cHRM_XYZ, (png_const_structrp png_ptr,
2084 png_const_inforp info_ptr, double *red_X, double *red_Y, double *red_Z,
John Bowler736f40f2011-08-25 16:19:44 -05002085 double *green_X, double *green_Y, double *green_Z, double *blue_X,
John Bowlerbce79882012-02-13 11:45:22 -06002086 double *blue_Y, double *blue_Z))
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -05002087#ifdef PNG_FIXED_POINT_SUPPORTED /* Otherwise not implemented */
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002088PNG_FIXED_EXPORT(134, png_uint_32, png_get_cHRM_fixed,
John Bowler5d567862011-12-24 09:12:00 -06002089 (png_const_structrp png_ptr, png_const_inforp info_ptr,
John Bowler40b26032011-12-22 08:09:15 -06002090 png_fixed_point *int_white_x, png_fixed_point *int_white_y,
2091 png_fixed_point *int_red_x, png_fixed_point *int_red_y,
2092 png_fixed_point *int_green_x, png_fixed_point *int_green_y,
John Bowlerbce79882012-02-13 11:45:22 -06002093 png_fixed_point *int_blue_x, png_fixed_point *int_blue_y))
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -05002094#endif
John Bowler736f40f2011-08-25 16:19:44 -05002095PNG_FIXED_EXPORT(231, png_uint_32, png_get_cHRM_XYZ_fixed,
John Bowler5d567862011-12-24 09:12:00 -06002096 (png_const_structrp png_ptr, png_const_inforp info_ptr,
John Bowler736f40f2011-08-25 16:19:44 -05002097 png_fixed_point *int_red_X, png_fixed_point *int_red_Y,
2098 png_fixed_point *int_red_Z, png_fixed_point *int_green_X,
2099 png_fixed_point *int_green_Y, png_fixed_point *int_green_Z,
2100 png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y,
John Bowlerbce79882012-02-13 11:45:22 -06002101 png_fixed_point *int_blue_Z))
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002102#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002103
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002104#ifdef PNG_cHRM_SUPPORTED
John Bowler4f67e402011-12-28 08:43:37 -06002105PNG_FP_EXPORT(135, void, png_set_cHRM, (png_const_structrp png_ptr,
2106 png_inforp info_ptr,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06002107 double white_x, double white_y, double red_x, double red_y, double green_x,
John Bowlerbce79882012-02-13 11:45:22 -06002108 double green_y, double blue_x, double blue_y))
John Bowler4f67e402011-12-28 08:43:37 -06002109PNG_FP_EXPORT(232, void, png_set_cHRM_XYZ, (png_const_structrp png_ptr,
John Bowler5d567862011-12-24 09:12:00 -06002110 png_inforp info_ptr, double red_X, double red_Y, double red_Z,
John Bowler736f40f2011-08-25 16:19:44 -05002111 double green_X, double green_Y, double green_Z, double blue_X,
John Bowlerbce79882012-02-13 11:45:22 -06002112 double blue_Y, double blue_Z))
John Bowler4f67e402011-12-28 08:43:37 -06002113PNG_FIXED_EXPORT(136, void, png_set_cHRM_fixed, (png_const_structrp png_ptr,
John Bowler5d567862011-12-24 09:12:00 -06002114 png_inforp info_ptr, png_fixed_point int_white_x,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06002115 png_fixed_point int_white_y, png_fixed_point int_red_x,
2116 png_fixed_point int_red_y, png_fixed_point int_green_x,
2117 png_fixed_point int_green_y, png_fixed_point int_blue_x,
John Bowlerbce79882012-02-13 11:45:22 -06002118 png_fixed_point int_blue_y))
John Bowler4f67e402011-12-28 08:43:37 -06002119PNG_FIXED_EXPORT(233, void, png_set_cHRM_XYZ_fixed, (png_const_structrp png_ptr,
John Bowler5d567862011-12-24 09:12:00 -06002120 png_inforp info_ptr, png_fixed_point int_red_X, png_fixed_point int_red_Y,
John Bowler736f40f2011-08-25 16:19:44 -05002121 png_fixed_point int_red_Z, png_fixed_point int_green_X,
2122 png_fixed_point int_green_Y, png_fixed_point int_green_Z,
2123 png_fixed_point int_blue_X, png_fixed_point int_blue_Y,
John Bowlerbce79882012-02-13 11:45:22 -06002124 png_fixed_point int_blue_Z))
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002125#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002126
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002127#ifdef PNG_gAMA_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002128PNG_FP_EXPORT(137, png_uint_32, png_get_gAMA, (png_const_structrp png_ptr,
John Bowlerbce79882012-02-13 11:45:22 -06002129 png_const_inforp info_ptr, double *file_gamma))
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002130PNG_FIXED_EXPORT(138, png_uint_32, png_get_gAMA_fixed,
John Bowler5d567862011-12-24 09:12:00 -06002131 (png_const_structrp png_ptr, png_const_inforp info_ptr,
John Bowlerbce79882012-02-13 11:45:22 -06002132 png_fixed_point *int_file_gamma))
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002133#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002134
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002135#ifdef PNG_gAMA_SUPPORTED
John Bowler4f67e402011-12-28 08:43:37 -06002136PNG_FP_EXPORT(139, void, png_set_gAMA, (png_const_structrp png_ptr,
John Bowlerbce79882012-02-13 11:45:22 -06002137 png_inforp info_ptr, double file_gamma))
John Bowler4f67e402011-12-28 08:43:37 -06002138PNG_FIXED_EXPORT(140, void, png_set_gAMA_fixed, (png_const_structrp png_ptr,
John Bowlerbce79882012-02-13 11:45:22 -06002139 png_inforp info_ptr, png_fixed_point int_file_gamma))
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002140#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002141
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002142#ifdef PNG_hIST_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002143PNG_EXPORT(141, png_uint_32, png_get_hIST, (png_const_structrp png_ptr,
2144 png_const_inforp info_ptr, png_uint_16p *hist));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002145#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002146
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002147#ifdef PNG_hIST_SUPPORTED
John Bowler4f67e402011-12-28 08:43:37 -06002148PNG_EXPORT(142, void, png_set_hIST, (png_const_structrp png_ptr,
2149 png_inforp info_ptr, png_const_uint_16p hist));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002150#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002151
John Bowler5d567862011-12-24 09:12:00 -06002152PNG_EXPORT(143, png_uint_32, png_get_IHDR, (png_const_structrp png_ptr,
John Bowler4f67e402011-12-28 08:43:37 -06002153 png_const_inforp info_ptr, png_uint_32 *width, png_uint_32 *height,
John Bowler40b26032011-12-22 08:09:15 -06002154 int *bit_depth, int *color_type, int *interlace_method,
2155 int *compression_method, int *filter_method));
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002156
John Bowler4f67e402011-12-28 08:43:37 -06002157PNG_EXPORT(144, void, png_set_IHDR, (png_const_structrp png_ptr,
2158 png_inforp info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth,
2159 int color_type, int interlace_method, int compression_method,
2160 int filter_method));
Andreas Dilger47a0c421997-05-16 02:46:07 -05002161
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002162#ifdef PNG_oFFs_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002163PNG_EXPORT(145, png_uint_32, png_get_oFFs, (png_const_structrp png_ptr,
2164 png_const_inforp info_ptr, png_int_32 *offset_x, png_int_32 *offset_y,
John Bowler40b26032011-12-22 08:09:15 -06002165 int *unit_type));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002166#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002167
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002168#ifdef PNG_oFFs_SUPPORTED
John Bowler4f67e402011-12-28 08:43:37 -06002169PNG_EXPORT(146, void, png_set_oFFs, (png_const_structrp png_ptr,
2170 png_inforp info_ptr, png_int_32 offset_x, png_int_32 offset_y,
2171 int unit_type));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002172#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002173
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002174#ifdef PNG_pCAL_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002175PNG_EXPORT(147, png_uint_32, png_get_pCAL, (png_const_structrp png_ptr,
2176 png_const_inforp info_ptr, png_charp *purpose, png_int_32 *X0,
John Bowler40b26032011-12-22 08:09:15 -06002177 png_int_32 *X1, int *type, int *nparams, png_charp *units,
2178 png_charpp *params));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002179#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002180
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002181#ifdef PNG_pCAL_SUPPORTED
John Bowler4f67e402011-12-28 08:43:37 -06002182PNG_EXPORT(148, void, png_set_pCAL, (png_const_structrp png_ptr,
2183 png_inforp info_ptr, png_const_charp purpose, png_int_32 X0, png_int_32 X1,
2184 int type, int nparams, png_const_charp units, png_charpp params));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002185#endif
2186
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002187#ifdef PNG_pHYs_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002188PNG_EXPORT(149, png_uint_32, png_get_pHYs, (png_const_structrp png_ptr,
2189 png_const_inforp info_ptr, png_uint_32 *res_x, png_uint_32 *res_y,
John Bowler40b26032011-12-22 08:09:15 -06002190 int *unit_type));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002191#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002192
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002193#ifdef PNG_pHYs_SUPPORTED
John Bowler4f67e402011-12-28 08:43:37 -06002194PNG_EXPORT(150, void, png_set_pHYs, (png_const_structrp png_ptr,
2195 png_inforp info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002196#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002197
John Bowler5d567862011-12-24 09:12:00 -06002198PNG_EXPORT(151, png_uint_32, png_get_PLTE, (png_const_structrp png_ptr,
2199 png_const_inforp info_ptr, png_colorp *palette, int *num_palette));
Andreas Dilger47a0c421997-05-16 02:46:07 -05002200
John Bowler4f67e402011-12-28 08:43:37 -06002201PNG_EXPORT(152, void, png_set_PLTE, (png_structrp png_ptr,
2202 png_inforp info_ptr, png_const_colorp palette, int num_palette));
Andreas Dilger47a0c421997-05-16 02:46:07 -05002203
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002204#ifdef PNG_sBIT_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002205PNG_EXPORT(153, png_uint_32, png_get_sBIT, (png_const_structrp png_ptr,
2206 png_inforp info_ptr, png_color_8p *sig_bit));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002207#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002208
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002209#ifdef PNG_sBIT_SUPPORTED
John Bowler4f67e402011-12-28 08:43:37 -06002210PNG_EXPORT(154, void, png_set_sBIT, (png_const_structrp png_ptr,
2211 png_inforp info_ptr, png_const_color_8p sig_bit));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002212#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002213
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002214#ifdef PNG_sRGB_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002215PNG_EXPORT(155, png_uint_32, png_get_sRGB, (png_const_structrp png_ptr,
2216 png_const_inforp info_ptr, int *file_srgb_intent));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002217#endif
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -06002218
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002219#ifdef PNG_sRGB_SUPPORTED
John Bowler4f67e402011-12-28 08:43:37 -06002220PNG_EXPORT(156, void, png_set_sRGB, (png_const_structrp png_ptr,
2221 png_inforp info_ptr, int srgb_intent));
2222PNG_EXPORT(157, void, png_set_sRGB_gAMA_and_cHRM, (png_const_structrp png_ptr,
John Bowler5d567862011-12-24 09:12:00 -06002223 png_inforp info_ptr, int srgb_intent));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002224#endif
Glenn Randers-Pehrsonb6ce43d1998-01-01 07:13:13 -06002225
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002226#ifdef PNG_iCCP_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002227PNG_EXPORT(158, png_uint_32, png_get_iCCP, (png_const_structrp png_ptr,
2228 png_const_inforp info_ptr, png_charpp name, int *compression_type,
John Bowler40b26032011-12-22 08:09:15 -06002229 png_bytepp profile, png_uint_32 *proflen));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002230#endif
2231
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002232#ifdef PNG_iCCP_SUPPORTED
John Bowler4f67e402011-12-28 08:43:37 -06002233PNG_EXPORT(159, void, png_set_iCCP, (png_const_structrp png_ptr,
2234 png_inforp info_ptr, png_const_charp name, int compression_type,
2235 png_const_bytep profile, png_uint_32 proflen));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002236#endif
2237
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002238#ifdef PNG_sPLT_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002239PNG_EXPORT(160, png_uint_32, png_get_sPLT, (png_const_structrp png_ptr,
2240 png_const_inforp info_ptr, png_sPLT_tpp entries));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002241#endif
2242
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002243#ifdef PNG_sPLT_SUPPORTED
John Bowler4f67e402011-12-28 08:43:37 -06002244PNG_EXPORT(161, void, png_set_sPLT, (png_const_structrp png_ptr,
2245 png_inforp info_ptr, png_const_sPLT_tp entries, int nentries));
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06002246#endif
2247
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002248#ifdef PNG_TEXT_SUPPORTED
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002249/* png_get_text also returns the number of text chunks in *num_text */
John Bowler5d567862011-12-24 09:12:00 -06002250PNG_EXPORT(162, png_uint_32, png_get_text, (png_const_structrp png_ptr,
2251 png_const_inforp info_ptr, png_textp *text_ptr, int *num_text));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002252#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002253
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06002254/* Note while png_set_text() will accept a structure whose text,
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05002255 * language, and translated keywords are NULL pointers, the structure
2256 * returned by png_get_text will always contain regular
2257 * zero-terminated C strings. They might be empty strings but
2258 * they will never be NULL pointers.
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05002259 */
2260
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002261#ifdef PNG_TEXT_SUPPORTED
John Bowler4f67e402011-12-28 08:43:37 -06002262PNG_EXPORT(163, void, png_set_text, (png_const_structrp png_ptr,
2263 png_inforp info_ptr, png_const_textp text_ptr, int num_text));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002264#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002265
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002266#ifdef PNG_tIME_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002267PNG_EXPORT(164, png_uint_32, png_get_tIME, (png_const_structrp png_ptr,
2268 png_inforp info_ptr, png_timep *mod_time));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002269#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002270
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002271#ifdef PNG_tIME_SUPPORTED
John Bowler4f67e402011-12-28 08:43:37 -06002272PNG_EXPORT(165, void, png_set_tIME, (png_const_structrp png_ptr,
2273 png_inforp info_ptr, png_const_timep mod_time));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002274#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002275
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002276#ifdef PNG_tRNS_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002277PNG_EXPORT(166, png_uint_32, png_get_tRNS, (png_const_structrp png_ptr,
2278 png_inforp info_ptr, png_bytep *trans_alpha, int *num_trans,
John Bowler40b26032011-12-22 08:09:15 -06002279 png_color_16p *trans_color));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002280#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002281
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002282#ifdef PNG_tRNS_SUPPORTED
John Bowler4f67e402011-12-28 08:43:37 -06002283PNG_EXPORT(167, void, png_set_tRNS, (png_structrp png_ptr,
2284 png_inforp info_ptr, png_const_bytep trans_alpha, int num_trans,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06002285 png_const_color_16p trans_color));
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06002286#endif
2287
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002288#ifdef PNG_sCAL_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002289PNG_FP_EXPORT(168, png_uint_32, png_get_sCAL, (png_const_structrp png_ptr,
John Bowlerbce79882012-02-13 11:45:22 -06002290 png_const_inforp info_ptr, int *unit, double *width, double *height))
John Bowler29fca0d2011-12-24 07:57:43 -06002291#if (defined PNG_FLOATING_ARITHMETIC_SUPPORTED) || \
2292 (defined PNG_FLOATING_POINT_SUPPORTED)
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06002293/* NOTE: this API is currently implemented using floating point arithmetic,
Glenn Randers-Pehrson48dc6eb2010-07-31 07:09:58 -05002294 * consequently it can only be used on systems with floating point support.
2295 * In any case the range of values supported by png_fixed_point is small and it
2296 * is highly recommended that png_get_sCAL_s be used instead.
2297 */
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002298PNG_FIXED_EXPORT(214, png_uint_32, png_get_sCAL_fixed,
John Bowler5d567862011-12-24 09:12:00 -06002299 (png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit,
John Bowlerbce79882012-02-13 11:45:22 -06002300 png_fixed_point *width, png_fixed_point *height))
Glenn Randers-Pehrson48dc6eb2010-07-31 07:09:58 -05002301#endif
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06002302PNG_EXPORT(169, png_uint_32, png_get_sCAL_s,
John Bowler5d567862011-12-24 09:12:00 -06002303 (png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit,
John Bowler40b26032011-12-22 08:09:15 -06002304 png_charpp swidth, png_charpp sheight));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002305
John Bowler4f67e402011-12-28 08:43:37 -06002306PNG_FP_EXPORT(170, void, png_set_sCAL, (png_const_structrp png_ptr,
John Bowlerbce79882012-02-13 11:45:22 -06002307 png_inforp info_ptr, int unit, double width, double height))
John Bowler4f67e402011-12-28 08:43:37 -06002308PNG_FIXED_EXPORT(213, void, png_set_sCAL_fixed, (png_const_structrp png_ptr,
John Bowler5d567862011-12-24 09:12:00 -06002309 png_inforp info_ptr, int unit, png_fixed_point width,
John Bowlerbce79882012-02-13 11:45:22 -06002310 png_fixed_point height))
John Bowler4f67e402011-12-28 08:43:37 -06002311PNG_EXPORT(171, void, png_set_sCAL_s, (png_const_structrp png_ptr,
2312 png_inforp info_ptr, int unit,
2313 png_const_charp swidth, png_const_charp sheight));
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -05002314#endif /* PNG_sCAL_SUPPORTED */
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002315
Glenn Randers-Pehrson7824a702009-06-13 10:05:05 -05002316#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
2317/* Provide a list of chunks and how they are to be handled, if the built-in
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06002318 handling or default unknown chunk handling is not desired. Any chunks not
2319 listed will be handled in the default manner. The IHDR and IEND chunks
Glenn Randers-Pehrsonbb5cb142011-09-22 12:41:58 -05002320 must not be listed. Because this turns off the default handling for chunks
2321 that would otherwise be recognized the behavior of libpng transformations may
2322 well become incorrect!
2323 keep = 0: PNG_HANDLE_CHUNK_AS_DEFAULT: follow default behavior
2324 = 1: PNG_HANDLE_CHUNK_NEVER: do not keep
2325 = 2: PNG_HANDLE_CHUNK_IF_SAFE: keep only if safe-to-copy
2326 = 3: PNG_HANDLE_CHUNK_ALWAYS: keep even if unsafe-to-copy
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06002327*/
John Bowler5d567862011-12-24 09:12:00 -06002328PNG_EXPORT(172, void, png_set_keep_unknown_chunks, (png_structrp png_ptr,
John Bowler40b26032011-12-22 08:09:15 -06002329 int keep, png_const_bytep chunk_list, int num_chunks));
Glenn Randers-Pehrsonbb5cb142011-09-22 12:41:58 -05002330
2331/* The handling code is returned; the result is therefore true (non-zero) if
2332 * special handling is required, false for the default handling.
2333 */
John Bowler5d567862011-12-24 09:12:00 -06002334PNG_EXPORT(173, int, png_handle_as_unknown, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06002335 png_const_bytep chunk_name));
Glenn Randers-Pehrson7824a702009-06-13 10:05:05 -05002336#endif
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002337#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
John Bowler4f67e402011-12-28 08:43:37 -06002338PNG_EXPORT(174, void, png_set_unknown_chunks, (png_const_structrp png_ptr,
John Bowler5d567862011-12-24 09:12:00 -06002339 png_inforp info_ptr, png_const_unknown_chunkp unknowns,
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002340 int num_unknowns));
John Bowler4f67e402011-12-28 08:43:37 -06002341PNG_EXPORT(175, void, png_set_unknown_chunk_location,
2342 (png_const_structrp png_ptr, png_inforp info_ptr, int chunk, int location));
John Bowler5d567862011-12-24 09:12:00 -06002343PNG_EXPORT(176, int, png_get_unknown_chunks, (png_const_structrp png_ptr,
2344 png_const_inforp info_ptr, png_unknown_chunkpp entries));
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06002345#endif
2346
Glenn Randers-Pehrsonfc4a1432000-05-17 17:39:34 -05002347/* Png_free_data() will turn off the "valid" flag for anything it frees.
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06002348 * If you need to turn it off for a chunk that your application has freed,
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05002349 * you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK);
2350 */
John Bowler5d567862011-12-24 09:12:00 -06002351PNG_EXPORT(177, void, png_set_invalid, (png_const_structrp png_ptr,
2352 png_inforp info_ptr, int mask));
John Bowler6f237b62012-03-02 13:13:15 -06002353
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05002354#ifdef PNG_INFO_IMAGE_SUPPORTED
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05002355/* The "params" pointer is currently not used and is for future expansion. */
John Bowler5d567862011-12-24 09:12:00 -06002356PNG_EXPORT(178, void, png_read_png, (png_structrp png_ptr, png_inforp info_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06002357 int transforms, png_voidp params));
John Bowler5d567862011-12-24 09:12:00 -06002358PNG_EXPORT(179, void, png_write_png, (png_structrp png_ptr, png_inforp info_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06002359 int transforms, png_voidp params));
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002360#endif
Andreas Dilger47a0c421997-05-16 02:46:07 -05002361
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002362PNG_EXPORT(180, png_const_charp, png_get_copyright,
John Bowler5d567862011-12-24 09:12:00 -06002363 (png_const_structrp png_ptr));
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002364PNG_EXPORT(181, png_const_charp, png_get_header_ver,
John Bowler5d567862011-12-24 09:12:00 -06002365 (png_const_structrp png_ptr));
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002366PNG_EXPORT(182, png_const_charp, png_get_header_version,
John Bowler5d567862011-12-24 09:12:00 -06002367 (png_const_structrp png_ptr));
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002368PNG_EXPORT(183, png_const_charp, png_get_libpng_ver,
John Bowler5d567862011-12-24 09:12:00 -06002369 (png_const_structrp png_ptr));
Glenn Randers-Pehrsonc9442291999-01-06 21:50:16 -06002370
Glenn Randers-Pehrson5e5c1e12000-11-10 12:26:19 -06002371#ifdef PNG_MNG_FEATURES_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002372PNG_EXPORT(184, png_uint_32, png_permit_mng_features, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06002373 png_uint_32 mng_features_permitted));
Glenn Randers-Pehrson5e5c1e12000-11-10 12:26:19 -06002374#endif
2375
Glenn Randers-Pehrson8f3dd832004-08-10 09:43:42 -05002376/* For use in png_set_keep_unknown, added to version 1.2.6 */
2377#define PNG_HANDLE_CHUNK_AS_DEFAULT 0
2378#define PNG_HANDLE_CHUNK_NEVER 1
2379#define PNG_HANDLE_CHUNK_IF_SAFE 2
2380#define PNG_HANDLE_CHUNK_ALWAYS 3
2381
Glenn Randers-Pehrsone68f5a32001-05-14 09:20:53 -05002382/* Strip the prepended error numbers ("#nnn ") from error and warning
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05002383 * messages before passing them to the error or warning handler.
2384 */
Glenn Randers-Pehrsone68f5a32001-05-14 09:20:53 -05002385#ifdef PNG_ERROR_NUMBERS_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002386PNG_EXPORT(185, void, png_set_strip_error_numbers, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06002387 png_uint_32 strip_mode));
Glenn Randers-Pehrsonbe9de0f2001-01-22 08:52:16 -06002388#endif
Glenn Randers-Pehrson272489d2004-08-04 06:34:52 -05002389
Glenn Randers-Pehrsonbeb572e2006-08-19 13:59:24 -05002390/* Added in libpng-1.2.6 */
Glenn Randers-Pehrson272489d2004-08-04 06:34:52 -05002391#ifdef PNG_SET_USER_LIMITS_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002392PNG_EXPORT(186, void, png_set_user_limits, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06002393 png_uint_32 user_width_max, png_uint_32 user_height_max));
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002394PNG_EXPORT(187, png_uint_32, png_get_user_width_max,
John Bowler5d567862011-12-24 09:12:00 -06002395 (png_const_structrp png_ptr));
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002396PNG_EXPORT(188, png_uint_32, png_get_user_height_max,
John Bowler5d567862011-12-24 09:12:00 -06002397 (png_const_structrp png_ptr));
Glenn Randers-Pehrson800d1e92008-08-20 17:25:21 -05002398/* Added in libpng-1.4.0 */
John Bowler5d567862011-12-24 09:12:00 -06002399PNG_EXPORT(189, void, png_set_chunk_cache_max, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06002400 png_uint_32 user_chunk_cache_max));
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002401PNG_EXPORT(190, png_uint_32, png_get_chunk_cache_max,
John Bowler5d567862011-12-24 09:12:00 -06002402 (png_const_structrp png_ptr));
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06002403/* Added in libpng-1.4.1 */
John Bowler5d567862011-12-24 09:12:00 -06002404PNG_EXPORT(191, void, png_set_chunk_malloc_max, (png_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06002405 png_alloc_size_t user_chunk_cache_max));
2406PNG_EXPORT(192, png_alloc_size_t, png_get_chunk_malloc_max,
John Bowler5d567862011-12-24 09:12:00 -06002407 (png_const_structrp png_ptr));
Glenn Randers-Pehrson272489d2004-08-04 06:34:52 -05002408#endif
2409
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -05002410#if defined(PNG_INCH_CONVERSIONS_SUPPORTED)
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002411PNG_EXPORT(193, png_uint_32, png_get_pixels_per_inch,
John Bowler5d567862011-12-24 09:12:00 -06002412 (png_const_structrp png_ptr, png_const_inforp info_ptr));
Glenn Randers-Pehrson6bc53be2006-06-16 07:52:03 -05002413
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002414PNG_EXPORT(194, png_uint_32, png_get_x_pixels_per_inch,
John Bowler5d567862011-12-24 09:12:00 -06002415 (png_const_structrp png_ptr, png_const_inforp info_ptr));
Glenn Randers-Pehrson6bc53be2006-06-16 07:52:03 -05002416
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002417PNG_EXPORT(195, png_uint_32, png_get_y_pixels_per_inch,
John Bowler5d567862011-12-24 09:12:00 -06002418 (png_const_structrp png_ptr, png_const_inforp info_ptr));
Glenn Randers-Pehrson6bc53be2006-06-16 07:52:03 -05002419
Glenn Randers-Pehrsonb86b4922011-01-21 23:12:51 -06002420PNG_FP_EXPORT(196, float, png_get_x_offset_inches,
John Bowlerbce79882012-02-13 11:45:22 -06002421 (png_const_structrp png_ptr, png_const_inforp info_ptr))
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -05002422#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06002423PNG_FIXED_EXPORT(211, png_fixed_point, png_get_x_offset_inches_fixed,
John Bowlerbce79882012-02-13 11:45:22 -06002424 (png_const_structrp png_ptr, png_const_inforp info_ptr))
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -05002425#endif
Glenn Randers-Pehrson6bc53be2006-06-16 07:52:03 -05002426
John Bowler5d567862011-12-24 09:12:00 -06002427PNG_FP_EXPORT(197, float, png_get_y_offset_inches, (png_const_structrp png_ptr,
John Bowlerbce79882012-02-13 11:45:22 -06002428 png_const_inforp info_ptr))
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -05002429#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06002430PNG_FIXED_EXPORT(212, png_fixed_point, png_get_y_offset_inches_fixed,
John Bowlerbce79882012-02-13 11:45:22 -06002431 (png_const_structrp png_ptr, png_const_inforp info_ptr))
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -05002432#endif
Glenn Randers-Pehrson6bc53be2006-06-16 07:52:03 -05002433
Glenn Randers-Pehrsond4df36c2010-03-06 10:45:55 -06002434# ifdef PNG_pHYs_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002435PNG_EXPORT(198, png_uint_32, png_get_pHYs_dpi, (png_const_structrp png_ptr,
2436 png_const_inforp info_ptr, png_uint_32 *res_x, png_uint_32 *res_y,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06002437 int *unit_type));
Glenn Randers-Pehrsond4df36c2010-03-06 10:45:55 -06002438# endif /* PNG_pHYs_SUPPORTED */
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -05002439#endif /* PNG_INCH_CONVERSIONS_SUPPORTED */
Glenn Randers-Pehrson6bc53be2006-06-16 07:52:03 -05002440
Glenn Randers-Pehrsonbeb572e2006-08-19 13:59:24 -05002441/* Added in libpng-1.4.0 */
2442#ifdef PNG_IO_STATE_SUPPORTED
John Bowler5d567862011-12-24 09:12:00 -06002443PNG_EXPORT(199, png_uint_32, png_get_io_state, (png_const_structrp png_ptr));
Glenn Randers-Pehrsonbeb572e2006-08-19 13:59:24 -05002444
John Bowler40b26032011-12-22 08:09:15 -06002445/* Removed from libpng 1.6; use png_get_io_chunk_type. */
John Bowler5d567862011-12-24 09:12:00 -06002446PNG_REMOVED(200, png_const_bytep, png_get_io_chunk_name, (png_structrp png_ptr),
John Bowler40b26032011-12-22 08:09:15 -06002447 PNG_DEPRECATED)
2448
Glenn Randers-Pehrsoncf7cce62011-01-22 12:42:43 -06002449PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
John Bowler5d567862011-12-24 09:12:00 -06002450 (png_const_structrp png_ptr));
Glenn Randers-Pehrsonbeb572e2006-08-19 13:59:24 -05002451
2452/* The flags returned by png_get_io_state() are the following: */
Glenn Randers-Pehrsond4df36c2010-03-06 10:45:55 -06002453# define PNG_IO_NONE 0x0000 /* no I/O at this moment */
2454# define PNG_IO_READING 0x0001 /* currently reading */
2455# define PNG_IO_WRITING 0x0002 /* currently writing */
2456# define PNG_IO_SIGNATURE 0x0010 /* currently at the file signature */
2457# define PNG_IO_CHUNK_HDR 0x0020 /* currently at the chunk header */
2458# define PNG_IO_CHUNK_DATA 0x0040 /* currently at the chunk data */
2459# define PNG_IO_CHUNK_CRC 0x0080 /* currently at the chunk crc */
2460# define PNG_IO_MASK_OP 0x000f /* current operation: reading/writing */
2461# define PNG_IO_MASK_LOC 0x00f0 /* current location: sig/hdr/data/crc */
Glenn Randers-Pehrsonbeb572e2006-08-19 13:59:24 -05002462#endif /* ?PNG_IO_STATE_SUPPORTED */
2463
John Bowler660c6e42010-12-19 06:22:23 -06002464/* Interlace support. The following macros are always defined so that if
2465 * libpng interlace handling is turned off the macros may be used to handle
2466 * interlaced images within the application.
2467 */
2468#define PNG_INTERLACE_ADAM7_PASSES 7
2469
2470/* Two macros to return the first row and first column of the original,
2471 * full, image which appears in a given pass. 'pass' is in the range 0
2472 * to 6 and the result is in the range 0 to 7.
2473 */
John Bowler4e68aa72011-10-11 16:01:33 -05002474#define PNG_PASS_START_ROW(pass) (((1&~(pass))<<(3-((pass)>>1)))&7)
2475#define PNG_PASS_START_COL(pass) (((1& (pass))<<(3-(((pass)+1)>>1)))&7)
2476
2477/* A macro to return the offset between pixels in the output row for a pair of
2478 * pixels in the input - effectively the inverse of the 'COL_SHIFT' macro that
2479 * follows. Note that ROW_OFFSET is the offset from one row to the next whereas
2480 * COL_OFFSET is from one column to the next, within a row.
2481 */
2482#define PNG_PASS_ROW_OFFSET(pass) ((pass)>2?(8>>(((pass)-1)>>1)):8)
2483#define PNG_PASS_COL_OFFSET(pass) (1<<((7-(pass))>>1))
John Bowler660c6e42010-12-19 06:22:23 -06002484
2485/* Two macros to help evaluate the number of rows or columns in each
2486 * pass. This is expressed as a shift - effectively log2 of the number or
2487 * rows or columns in each 8x8 tile of the original image.
2488 */
2489#define PNG_PASS_ROW_SHIFT(pass) ((pass)>2?(8-(pass))>>1:3)
2490#define PNG_PASS_COL_SHIFT(pass) ((pass)>1?(7-(pass))>>1:3)
2491
2492/* Hence two macros to determine the number of rows or columns in a given
2493 * pass of an image given its height or width. In fact these macros may
2494 * return non-zero even though the sub-image is empty, because the other
2495 * dimension may be empty for a small image.
2496 */
2497#define PNG_PASS_ROWS(height, pass) (((height)+(((1<<PNG_PASS_ROW_SHIFT(pass))\
2498 -1)-PNG_PASS_START_ROW(pass)))>>PNG_PASS_ROW_SHIFT(pass))
2499#define PNG_PASS_COLS(width, pass) (((width)+(((1<<PNG_PASS_COL_SHIFT(pass))\
2500 -1)-PNG_PASS_START_COL(pass)))>>PNG_PASS_COL_SHIFT(pass))
2501
John Bowler9616ad92011-02-16 06:13:46 -06002502/* For the reader row callbacks (both progressive and sequential) it is
2503 * necessary to find the row in the output image given a row in an interlaced
2504 * image, so two more macros:
John Bowler660c6e42010-12-19 06:22:23 -06002505 */
2506#define PNG_ROW_FROM_PASS_ROW(yIn, pass) \
2507 (((yIn)<<PNG_PASS_ROW_SHIFT(pass))+PNG_PASS_START_ROW(pass))
2508#define PNG_COL_FROM_PASS_COL(xIn, pass) \
2509 (((xIn)<<PNG_PASS_COL_SHIFT(pass))+PNG_PASS_START_COL(pass))
2510
2511/* Two macros which return a boolean (0 or 1) saying whether the given row
2512 * or column is in a particular pass. These use a common utility macro that
2513 * returns a mask for a given pass - the offset 'off' selects the row or
2514 * column version. The mask has the appropriate bit set for each column in
2515 * the tile.
2516 */
2517#define PNG_PASS_MASK(pass,off) ( \
John Bowler4e68aa72011-10-11 16:01:33 -05002518 ((0x110145AF>>(((7-(off))-(pass))<<2)) & 0xF) | \
2519 ((0x01145AF0>>(((7-(off))-(pass))<<2)) & 0xF0))
John Bowler660c6e42010-12-19 06:22:23 -06002520
2521#define PNG_ROW_IN_INTERLACE_PASS(y, pass) \
2522 ((PNG_PASS_MASK(pass,0) >> ((y)&7)) & 1)
2523#define PNG_COL_IN_INTERLACE_PASS(x, pass) \
2524 ((PNG_PASS_MASK(pass,1) >> ((x)&7)) & 1)
2525
Glenn Randers-Pehrson1d963611998-05-02 12:52:25 -05002526#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED
Glenn Randers-Pehrson8686fff1998-05-21 09:27:50 -05002527/* With these routines we avoid an integer divide, which will be slower on
2528 * most machines. However, it does take more operations than the corresponding
2529 * divide method, so it may be slower on a few RISC systems. There are two
Glenn Randers-Pehrson1d963611998-05-02 12:52:25 -05002530 * shifts (by 8 or 16 bits) and an addition, versus a single integer divide.
2531 *
2532 * Note that the rounding factors are NOT supposed to be the same! 128 and
2533 * 32768 are correct for the NODIV code; 127 and 32767 are correct for the
2534 * standard method.
2535 *
2536 * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ]
2537 */
2538
Glenn Randers-Pehrsoneae8e362010-03-12 17:36:53 -06002539 /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002540
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06002541# define png_composite(composite, fg, alpha, bg) \
2542 { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) \
2543 * (png_uint_16)(alpha) \
2544 + (png_uint_16)(bg)*(png_uint_16)(255 \
John Bowler75156122011-09-09 17:21:44 -05002545 - (png_uint_16)(alpha)) + 128); \
Glenn Randers-Pehrson1d963611998-05-02 12:52:25 -05002546 (composite) = (png_byte)((temp + (temp >> 8)) >> 8); }
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002547
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06002548# define png_composite_16(composite, fg, alpha, bg) \
2549 { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) \
2550 * (png_uint_32)(alpha) \
John Bowler75156122011-09-09 17:21:44 -05002551 + (png_uint_32)(bg)*(65535 \
2552 - (png_uint_32)(alpha)) + 32768); \
Glenn Randers-Pehrson1d963611998-05-02 12:52:25 -05002553 (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); }
2554
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05002555#else /* Standard method using integer division */
Glenn Randers-Pehrson1d963611998-05-02 12:52:25 -05002556
Glenn Randers-Pehrsoneae8e362010-03-12 17:36:53 -06002557# define png_composite(composite, fg, alpha, bg) \
2558 (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \
Glenn Randers-Pehrsone8b1aa02010-03-06 11:39:29 -06002559 (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \
John Bowler75156122011-09-09 17:21:44 -05002560 127) / 255)
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002561
2562# define png_composite_16(composite, fg, alpha, bg) \
Glenn Randers-Pehrson1d963611998-05-02 12:52:25 -05002563 (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \
John Bowler75156122011-09-09 17:21:44 -05002564 (png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \
2565 32767) / 65535)
Glenn Randers-Pehrson1d963611998-05-02 12:52:25 -05002566#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */
2567
Glenn Randers-Pehrsonc3d73f42010-04-24 09:18:57 -05002568#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06002569PNG_EXPORT(201, png_uint_32, png_get_uint_32, (png_const_bytep buf));
2570PNG_EXPORT(202, png_uint_16, png_get_uint_16, (png_const_bytep buf));
2571PNG_EXPORT(203, png_int_32, png_get_int_32, (png_const_bytep buf));
Glenn Randers-Pehrsonc3d73f42010-04-24 09:18:57 -05002572#endif
2573
John Bowler5d567862011-12-24 09:12:00 -06002574PNG_EXPORT(204, png_uint_32, png_get_uint_31, (png_const_structrp png_ptr,
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06002575 png_const_bytep buf));
Glenn Randers-Pehrson9c3ab682006-02-20 22:09:05 -06002576/* No png_get_int_16 -- may be added if there's a real need for it. */
2577
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05002578/* Place a 32-bit number into a buffer in PNG byte order (big-endian). */
Glenn Randers-Pehrsonc3d73f42010-04-24 09:18:57 -05002579#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06002580PNG_EXPORT(205, void, png_save_uint_32, (png_bytep buf, png_uint_32 i));
Glenn Randers-Pehrsonc3d73f42010-04-24 09:18:57 -05002581#endif
Glenn Randers-Pehrson862cb202010-04-16 22:12:51 -05002582#ifdef PNG_SAVE_INT_32_SUPPORTED
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06002583PNG_EXPORT(206, void, png_save_int_32, (png_bytep buf, png_int_32 i));
Glenn Randers-Pehrson862cb202010-04-16 22:12:51 -05002584#endif
Glenn Randers-Pehrson9c3ab682006-02-20 22:09:05 -06002585
2586/* Place a 16-bit number into a buffer in PNG byte order.
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06002587 * The parameter is declared unsigned int, not png_uint_16,
Glenn Randers-Pehrson9c3ab682006-02-20 22:09:05 -06002588 * just to avoid potential problems on pre-ANSI C compilers.
2589 */
Glenn Randers-Pehrsonc3d73f42010-04-24 09:18:57 -05002590#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED
Glenn Randers-Pehrson23d39702010-12-06 18:28:02 -06002591PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i));
Glenn Randers-Pehrson9c3ab682006-02-20 22:09:05 -06002592/* No png_save_int_16 -- may be added if there's a real need for it. */
Glenn Randers-Pehrsonc3d73f42010-04-24 09:18:57 -05002593#endif
Glenn Randers-Pehrson9c3ab682006-02-20 22:09:05 -06002594
John Bowlerf21a0d02011-01-23 23:55:19 -06002595#ifdef PNG_USE_READ_MACROS
2596/* Inline macros to do direct reads of bytes from the input buffer.
2597 * The png_get_int_32() routine assumes we are using two's complement
2598 * format for negative values, which is almost certainly true.
2599 */
John Bowler42369cc2012-01-31 07:28:13 -06002600# define PNG_get_uint_32(buf) \
John Bowlerf21a0d02011-01-23 23:55:19 -06002601 (((png_uint_32)(*(buf)) << 24) + \
2602 ((png_uint_32)(*((buf) + 1)) << 16) + \
2603 ((png_uint_32)(*((buf) + 2)) << 8) + \
2604 ((png_uint_32)(*((buf) + 3))))
2605
2606 /* From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
2607 * function) incorrectly returned a value of type png_uint_32.
2608 */
John Bowler42369cc2012-01-31 07:28:13 -06002609# define PNG_get_uint_16(buf) \
John Bowlerf21a0d02011-01-23 23:55:19 -06002610 ((png_uint_16) \
2611 (((unsigned int)(*(buf)) << 8) + \
2612 ((unsigned int)(*((buf) + 1)))))
2613
John Bowler42369cc2012-01-31 07:28:13 -06002614# define PNG_get_int_32(buf) \
John Bowlerf21a0d02011-01-23 23:55:19 -06002615 ((png_int_32)((*(buf) & 0x80) \
2616 ? -((png_int_32)((png_get_uint_32(buf) ^ 0xffffffffL) + 1)) \
2617 : (png_int_32)png_get_uint_32(buf)))
John Bowler42369cc2012-01-31 07:28:13 -06002618
2619 /* If PNG_PREFIX is defined the same thing as below happens in pnglibconf.h,
2620 * but defining a macro name prefixed with PNG_PREFIX.
2621 */
2622# ifndef PNG_PREFIX
2623# define png_get_uint_32(buf) PNG_get_uint_32(buf)
2624# define png_get_uint_16(buf) PNG_get_uint_16(buf)
2625# define png_get_int_32(buf) PNG_get_int_32(buf)
2626# endif
2627#else
2628# ifdef PNG_PREFIX
2629 /* No macros; revert to the (redefined) function */
2630# define PNG_get_uint_32 (png_get_uint_32)
2631# define PNG_get_uint_16 (png_get_uint_16)
2632# define PNG_get_int_32 (png_get_int_32)
2633# endif
John Bowlerf21a0d02011-01-23 23:55:19 -06002634#endif
2635
John Bowler7875d532011-11-07 22:33:49 -06002636/*******************************************************************************
2637 * SIMPLIFIED API
Glenn Randers-Pehrson84b0da92011-11-10 06:32:19 -06002638 *******************************************************************************
2639 *
Glenn Randers-Pehrson5a956a72011-12-22 14:23:37 -06002640 * Please read the documentation in libpng-manual.txt (TODO: write said
2641 * documentation) if you don't understand what follows.
John Bowler7875d532011-11-07 22:33:49 -06002642 *
2643 * The simplified API hides the details of both libpng and the PNG file format
2644 * itself. It allows PNG files to be read into a very limited number of
2645 * in-memory bitmap formats or to be written from the same formats. If these
2646 * formats do not accomodate your needs then you can, and should, use the more
2647 * sophisticated APIs above - these support a wide variety of in-memory formats
2648 * and a wide variety of sophisticated transformations to those formats as well
2649 * as a wide variety of APIs to manipulate ancilliary information.
2650 *
2651 * To read a PNG file using the simplified API:
2652 *
John Bowler5bc90382012-01-23 22:43:22 -06002653 * 1) Declare a 'png_image' structure (see below) on the stack and set the
2654 * version field to PNG_IMAGE_VERSION.
John Bowler7875d532011-11-07 22:33:49 -06002655 * 2) Call the appropriate png_image_begin_read... function.
John Bowler04336ba2012-01-16 07:48:36 -06002656 * 3) Set the png_image 'format' member to the required sample format.
John Bowler5bc90382012-01-23 22:43:22 -06002657 * 4) Allocate a buffer for the image and, if required, the color-map.
2658 * 5) Call png_image_finish_read to read the image and, if required, the
2659 * color-map into your buffers.
John Bowler7875d532011-11-07 22:33:49 -06002660 *
Glenn Randers-Pehrson84b0da92011-11-10 06:32:19 -06002661 * There are no restrictions on the format of the PNG input itself; all valid
2662 * color types, bit depths, and interlace methods are acceptable, and the
2663 * input image is transformed as necessary to the requested in-memory format
John Bowler04336ba2012-01-16 07:48:36 -06002664 * during the png_image_finish_read() step. The only caveat is that if you
John Bowler5bc90382012-01-23 22:43:22 -06002665 * request a color-mapped image from a PNG that is full-color or makes
2666 * complex use of an alpha channel the transformation is extremely lossy and the
2667 * result may look terrible.
Glenn Randers-Pehrson84b0da92011-11-10 06:32:19 -06002668 *
John Bowler7875d532011-11-07 22:33:49 -06002669 * To write a PNG file using the simplified API:
2670 *
2671 * 1) Declare a 'png_image' structure on the stack and memset() it to all zero.
2672 * 2) Initialize the members of the structure that describe the image, setting
John Bowler04336ba2012-01-16 07:48:36 -06002673 * the 'format' member to the format of the image samples.
John Bowler5bc90382012-01-23 22:43:22 -06002674 * 3) Call the appropriate png_image_write... function with a pointer to the
2675 * image and, if necessary, the color-map to write the PNG data.
John Bowler7875d532011-11-07 22:33:49 -06002676 *
Glenn Randers-Pehrsonefc4b692011-11-07 23:31:34 -06002677 * png_image is a structure that describes the in-memory format of an image
John Bowler5bc90382012-01-23 22:43:22 -06002678 * when it is being read or defines the in-memory format of an image that you
John Bowler7875d532011-11-07 22:33:49 -06002679 * need to write:
2680 */
John Bowler5bc90382012-01-23 22:43:22 -06002681#define PNG_IMAGE_VERSION 1
Glenn Randers-Pehrson84b0da92011-11-10 06:32:19 -06002682
John Bowler7875d532011-11-07 22:33:49 -06002683typedef struct png_control *png_controlp;
2684typedef struct
2685{
John Bowler5bc90382012-01-23 22:43:22 -06002686 png_controlp opaque; /* Initialize to NULL, free with png_image_free */
2687 png_uint_32 version; /* Set to PNG_IMAGE_VERSION */
2688 png_uint_32 width; /* Image width in pixels (columns) */
2689 png_uint_32 height; /* Image height in pixels (rows) */
2690 png_uint_32 format; /* Image format as defined below */
2691 png_uint_32 flags; /* A bit mask containing informational flags */
2692 png_uint_32 colormap_entries;
2693 /* Number of entries in the color-map */
John Bowler04336ba2012-01-16 07:48:36 -06002694
John Bowler7875d532011-11-07 22:33:49 -06002695 /* In the event of an error or warning the following field will be set to a
2696 * non-zero value and the 'message' field will contain a '\0' terminated
Glenn Randers-Pehrson84b0da92011-11-10 06:32:19 -06002697 * string with the libpng error or warning message. If both warnings and
2698 * an error were encountered, only the error is recorded. If there
2699 * are multiple warnings, only the first one is recorded.
2700 *
John Bowler04336ba2012-01-16 07:48:36 -06002701 * The upper 30 bits of this value are reserved, the low two bits contain
2702 * a value as follows:
John Bowler7875d532011-11-07 22:33:49 -06002703 */
John Bowler04336ba2012-01-16 07:48:36 -06002704# define PNG_IMAGE_WARNING 1
2705# define PNG_IMAGE_ERROR 2
2706 /*
2707 * The result is a two bit code such that a value more than 1 indicates
2708 * a failure in the API just called:
2709 *
2710 * 0 - no warning or error
2711 * 1 - warning
2712 * 2 - error
2713 * 3 - error preceded by warning
2714 */
2715# define PNG_IMAGE_FAILED(png_cntrl) ((((png_cntrl).warning_or_error)&0x03)>1)
2716
John Bowler7875d532011-11-07 22:33:49 -06002717 png_uint_32 warning_or_error;
John Bowler04336ba2012-01-16 07:48:36 -06002718
John Bowler7875d532011-11-07 22:33:49 -06002719 char message[64];
2720} png_image, *png_imagep;
2721
John Bowler5bc90382012-01-23 22:43:22 -06002722/* The samples of the image have one to four channels whose components have
2723 * original values in the range 0 to 1.0:
John Bowler7875d532011-11-07 22:33:49 -06002724 *
2725 * 1: A single gray or luminance channel (G).
2726 * 2: A gray/luminance channel and an alpha channel (GA).
2727 * 3: Three red, green, blue color channels (RGB).
2728 * 4: Three color channels and an alpha channel (RGBA).
2729 *
John Bowler5bc90382012-01-23 22:43:22 -06002730 * The components are encoded in one of two ways:
John Bowler7875d532011-11-07 22:33:49 -06002731 *
John Bowler04336ba2012-01-16 07:48:36 -06002732 * a) As a small integer, value 0..255, contained in a single byte. For the
John Bowlerdd819152011-11-08 14:29:45 -06002733 * alpha channel the original value is simply value/255. For the color or
John Bowler7875d532011-11-07 22:33:49 -06002734 * luminance channels the value is encoded according to the sRGB specification
2735 * and matches the 8-bit format expected by typical display devices.
2736 *
Glenn Randers-Pehrson5578c372012-02-04 10:31:38 -06002737 * The color/gray channels are not scaled (pre-multiplied) by the alpha
John Bowler7875d532011-11-07 22:33:49 -06002738 * channel and are suitable for passing to color management software.
2739 *
John Bowler04336ba2012-01-16 07:48:36 -06002740 * b) As a value in the range 0..65535, contained in a 2-byte integer. All
John Bowler7875d532011-11-07 22:33:49 -06002741 * channels can be converted to the original value by dividing by 65535; all
2742 * channels are linear. Color channels use the RGB encoding (RGB end-points) of
2743 * the sRGB specification. This encoding is identified by the
2744 * PNG_FORMAT_FLAG_LINEAR flag below.
2745 *
Glenn Randers-Pehrson5578c372012-02-04 10:31:38 -06002746 * When the simplified API needs to convert between sRGB and linear colorspaces,
2747 * the actual sRGB transfer curve defined in the sRGB specification (see the
2748 * article at http://en.wikipedia.org/wiki/SRGB) is used, not the gamma=1/2.2
2749 * approximation used elsewhere in libpng.
2750 *
2751 * When an alpha channel is present it is expected to denote pixel coverage
John Bowler7875d532011-11-07 22:33:49 -06002752 * of the color or luminance channels and is returned as an associated alpha
Glenn Randers-Pehrson84b0da92011-11-10 06:32:19 -06002753 * channel: the color/gray channels are scaled (pre-multiplied) by the alpha
2754 * value.
John Bowler04336ba2012-01-16 07:48:36 -06002755 *
John Bowler5bc90382012-01-23 22:43:22 -06002756 * The samples are either contained directly in the image data, between 1 and 8
2757 * bytes per pixel according to the encoding, or are held in a color-map indexed
2758 * by bytes in the image data. In the case of a color-map the color-map entries
2759 * are individual samples, encoded as above, and the image data has one byte per
2760 * pixel to select the relevant sample from the color-map.
John Bowler7875d532011-11-07 22:33:49 -06002761 */
2762
2763/* PNG_FORMAT_*
2764 *
2765 * #defines to be used in png_image::format. Each #define identifies a
John Bowler5bc90382012-01-23 22:43:22 -06002766 * particular layout of sample data and, if present, alpha values. There are
2767 * separate defines for each of the two component encodings.
John Bowler7875d532011-11-07 22:33:49 -06002768 *
John Bowler5bc90382012-01-23 22:43:22 -06002769 * A format is built up using single bit flag values. All combinations are
2770 * valid. Formats can be built up from the flag values or you can use one of
2771 * the predefined values below. When testing formats always use the FORMAT_FLAG
2772 * macros to test for individual features - future versions of the library may
2773 * add new flags.
John Bowler7875d532011-11-07 22:33:49 -06002774 *
John Bowler04336ba2012-01-16 07:48:36 -06002775 * When reading or writing color-mapped images the format should be set to the
2776 * format of the entries in the color-map then png_image_{read,write}_colormap
2777 * called to read or write the color-map and set the format correctly for the
2778 * image data. Do not set the PNG_FORMAT_FLAG_COLORMAP bit directly!
2779 *
John Bowler7875d532011-11-07 22:33:49 -06002780 * NOTE: libpng can be built with particular features disabled, if you see
2781 * compiler errors because the definition of one of the following flags has been
2782 * compiled out it is because libpng does not have the required support. It is
2783 * possible, however, for the libpng configuration to enable the format on just
Glenn Randers-Pehrson84b0da92011-11-10 06:32:19 -06002784 * read or just write; in that case you may see an error at run time. You can
John Bowler5bc90382012-01-23 22:43:22 -06002785 * guard against this by checking for the definition of the appropriate
2786 * "_SUPPORTED" macro, one of:
John Bowler7875d532011-11-07 22:33:49 -06002787 *
2788 * PNG_SIMPLIFIED_{READ,WRITE}_{BGR,AFIRST}_SUPPORTED
2789 */
John Bowler04336ba2012-01-16 07:48:36 -06002790#define PNG_FORMAT_FLAG_ALPHA 0x01U /* format with an alpha channel */
2791#define PNG_FORMAT_FLAG_COLOR 0x02U /* color format: otherwise grayscale */
2792#define PNG_FORMAT_FLAG_LINEAR 0x04U /* 2 byte channels else 1 byte */
John Bowler5bc90382012-01-23 22:43:22 -06002793#define PNG_FORMAT_FLAG_COLORMAP 0x08U /* image data is color-mapped */
John Bowler7875d532011-11-07 22:33:49 -06002794
2795#ifdef PNG_FORMAT_BGR_SUPPORTED
John Bowler04336ba2012-01-16 07:48:36 -06002796# define PNG_FORMAT_FLAG_BGR 0x10U /* BGR colors, else order is RGB */
John Bowler7875d532011-11-07 22:33:49 -06002797#endif
2798
2799#ifdef PNG_FORMAT_AFIRST_SUPPORTED
John Bowler04336ba2012-01-16 07:48:36 -06002800# define PNG_FORMAT_FLAG_AFIRST 0x20U /* alpha channel comes first */
John Bowler7875d532011-11-07 22:33:49 -06002801#endif
2802
John Bowler5bc90382012-01-23 22:43:22 -06002803/* Commonly used formats have predefined macros.
John Bowler7875d532011-11-07 22:33:49 -06002804 *
John Bowler5bc90382012-01-23 22:43:22 -06002805 * First the single byte (sRGB) formats:
John Bowler7875d532011-11-07 22:33:49 -06002806 */
2807#define PNG_FORMAT_GRAY 0
2808#define PNG_FORMAT_GA PNG_FORMAT_FLAG_ALPHA
John Bowlerdd819152011-11-08 14:29:45 -06002809#define PNG_FORMAT_AG (PNG_FORMAT_GA|PNG_FORMAT_FLAG_AFIRST)
John Bowler7875d532011-11-07 22:33:49 -06002810#define PNG_FORMAT_RGB PNG_FORMAT_FLAG_COLOR
2811#define PNG_FORMAT_BGR (PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_BGR)
2812#define PNG_FORMAT_RGBA (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_ALPHA)
2813#define PNG_FORMAT_ARGB (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_AFIRST)
2814#define PNG_FORMAT_BGRA (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_ALPHA)
2815#define PNG_FORMAT_ABGR (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_AFIRST)
2816
John Bowler04336ba2012-01-16 07:48:36 -06002817/* Then the linear 2-byte formats. When naming these "Y" is used to
John Bowler5bc90382012-01-23 22:43:22 -06002818 * indicate a luminance (gray) channel.
John Bowler7875d532011-11-07 22:33:49 -06002819 */
John Bowlerdd819152011-11-08 14:29:45 -06002820#define PNG_FORMAT_LINEAR_Y PNG_FORMAT_FLAG_LINEAR
2821#define PNG_FORMAT_LINEAR_Y_ALPHA (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_ALPHA)
2822#define PNG_FORMAT_LINEAR_RGB (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR)
2823#define PNG_FORMAT_LINEAR_RGB_ALPHA \
2824 (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_ALPHA)
John Bowler7875d532011-11-07 22:33:49 -06002825
John Bowler5bc90382012-01-23 22:43:22 -06002826/* With color-mapped formats the image data is one byte for each pixel, the byte
2827 * is an index into the color-map which is formatted as above. To obtain a
2828 * color-mapped format it is sufficient just to add the PNG_FOMAT_FLAG_COLORMAP
2829 * to one of the above definitions, or you can use one of the definitions below.
John Bowler04336ba2012-01-16 07:48:36 -06002830 */
John Bowler5bc90382012-01-23 22:43:22 -06002831#define PNG_FORMAT_RGB_COLORMAP (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_COLORMAP)
2832#define PNG_FORMAT_BGR_COLORMAP (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_COLORMAP)
2833#define PNG_FORMAT_RGBA_COLORMAP (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_COLORMAP)
2834#define PNG_FORMAT_ARGB_COLORMAP (PNG_FORMAT_ARGB|PNG_FORMAT_FLAG_COLORMAP)
2835#define PNG_FORMAT_BGRA_COLORMAP (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_COLORMAP)
2836#define PNG_FORMAT_ABGR_COLORMAP (PNG_FORMAT_ABGR|PNG_FORMAT_FLAG_COLORMAP)
John Bowler04336ba2012-01-16 07:48:36 -06002837
John Bowler7875d532011-11-07 22:33:49 -06002838/* PNG_IMAGE macros
2839 *
John Bowler04336ba2012-01-16 07:48:36 -06002840 * These are convenience macros to derive information from a png_image
2841 * structure. The PNG_IMAGE_SAMPLE_ macros return values appropriate to the
2842 * actual image sample values - either the entries in the color-map or the
2843 * pixels in the image. The PNG_IMAGE_PIXEL_ macros return corresponding values
John Bowler5bc90382012-01-23 22:43:22 -06002844 * for the pixels and will always return 1 for color-mapped formats. The
2845 * remaining macros return information about the rows in the image and the
2846 * complete image.
John Bowler04336ba2012-01-16 07:48:36 -06002847 *
2848 * NOTE: All the macros that take a png_image::format parameter are compile time
2849 * constants if the format parameter is, itself, a constant. Therefore these
2850 * macros can be used in array declarations and case labels where required.
2851 * Similarly the macros are also pre-processor constants (sizeof is not used) so
2852 * they can be used in #if tests.
2853 *
2854 * First the information about the samples.
John Bowler7875d532011-11-07 22:33:49 -06002855 */
John Bowler04336ba2012-01-16 07:48:36 -06002856#define PNG_IMAGE_SAMPLE_CHANNELS(fmt)\
2857 (((fmt)&(PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_ALPHA))+1)
John Bowler7875d532011-11-07 22:33:49 -06002858 /* Return the total number of channels in a given format: 1..4 */
2859
John Bowler04336ba2012-01-16 07:48:36 -06002860#define PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt)\
2861 ((((fmt) & PNG_FORMAT_FLAG_LINEAR) >> 2)+1)
2862 /* Return the size in bytes of a single component of a pixel or color-map
John Bowler5bc90382012-01-23 22:43:22 -06002863 * entry (as appropriate) in the image: 1 or 2.
John Bowler04336ba2012-01-16 07:48:36 -06002864 */
John Bowler7875d532011-11-07 22:33:49 -06002865
John Bowler04336ba2012-01-16 07:48:36 -06002866#define PNG_IMAGE_SAMPLE_SIZE(fmt)\
2867 (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt))
2868 /* This is the size of the sample data for one sample. If the image is
2869 * color-mapped it is the size of one color-map entry (and image pixels are
2870 * one byte in size), otherwise it is the size of one image pixel.
2871 */
2872
John Bowler5bc90382012-01-23 22:43:22 -06002873#define PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(fmt)\
2874 (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * 256)
2875 /* The maximum size of the color-map required by the format expressed in a
2876 * count of components. This can be used to compile-time allocate a
2877 * color-map:
2878 *
2879 * png_uint_16 colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(linear_fmt)];
2880 *
2881 * png_byte colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(sRGB_fmt)];
2882 *
2883 * Alternatively use the PNG_IMAGE_COLORMAP_SIZE macro below to use the
2884 * information from one of the png_image_begin_read_ APIs and dynamically
2885 * allocate the required memory.
John Bowler04336ba2012-01-16 07:48:36 -06002886 */
2887
2888/* Corresponding information about the pixels */
2889#define PNG_IMAGE_PIXEL_(test,fmt)\
2890 (((fmt)&PNG_FORMAT_FLAG_COLORMAP)?1:test(fmt))
2891
2892#define PNG_IMAGE_PIXEL_CHANNELS(fmt)\
2893 PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_CHANNELS,fmt)
2894 /* The number of separate channels (components) in a pixel; 1 for a
2895 * color-mapped image.
2896 */
2897
2898#define PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)\
2899 PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_COMPONENT_SIZE,fmt)
2900 /* The size, in bytes, of each component in a pixel; 1 for a color-mapped
2901 * image.
2902 */
2903
2904#define PNG_IMAGE_PIXEL_SIZE(fmt) PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_SIZE,fmt)
2905 /* The size, in bytes, of a complete pixel; 1 for a color-mapped image. */
2906
2907/* Information about the whole row, or whole image */
John Bowler7875d532011-11-07 22:33:49 -06002908#define PNG_IMAGE_ROW_STRIDE(image)\
John Bowler04336ba2012-01-16 07:48:36 -06002909 (PNG_IMAGE_PIXEL_CHANNELS((image).format) * (image).width)
John Bowler7875d532011-11-07 22:33:49 -06002910 /* Return the total number of components in a single row of the image; this
2911 * is the minimum 'row stride', the minimum count of components between each
John Bowler04336ba2012-01-16 07:48:36 -06002912 * row. For a color-mapped image this is the minimum number of bytes in a
Glenn Randers-Pehrsone0a6c062011-11-07 23:50:05 -06002913 * row.
2914 */
John Bowler7875d532011-11-07 22:33:49 -06002915
2916#define PNG_IMAGE_BUFFER_SIZE(image, row_stride)\
John Bowler04336ba2012-01-16 07:48:36 -06002917 (PNG_IMAGE_PIXEL_COMPONENT_SIZE((image).format)*(image).height*(row_stride))
John Bowler7875d532011-11-07 22:33:49 -06002918 /* Return the size, in bytes, of an image buffer given a png_image and a row
Glenn Randers-Pehrsone0a6c062011-11-07 23:50:05 -06002919 * stride - the number of components to leave space for in each row.
2920 */
John Bowler7875d532011-11-07 22:33:49 -06002921
John Bowler3706d732011-11-21 10:28:06 -06002922#define PNG_IMAGE_SIZE(image)\
2923 PNG_IMAGE_BUFFER_SIZE(image, PNG_IMAGE_ROW_STRIDE(image))
2924 /* Return the size, in bytes, of the image in memory given just a png_image;
2925 * the row stride is the minimum stride required for the image.
2926 */
2927
John Bowler5bc90382012-01-23 22:43:22 -06002928#define PNG_IMAGE_COLORMAP_SIZE(image)\
2929 (PNG_IMAGE_SAMPLE_SIZE((image).format) * (image).colormap_entries)
2930 /* Return the size, in bytes, of the color-map of this image. If the image
2931 * format is not a color-map format this will return a size sufficient for
John Bowler9ff37ea2012-03-10 20:03:06 -06002932 * 256 entries in the given format; check PNG_FORMAT_FLAG_COLORMAP if
John Bowler5bc90382012-01-23 22:43:22 -06002933 * you don't want to allocate a color-map in this case.
2934 */
2935
John Bowler7875d532011-11-07 22:33:49 -06002936/* PNG_IMAGE_FLAG_*
2937 *
2938 * Flags containing additional information about the image are held in the
2939 * 'flags' field of png_image.
2940 */
John Bowler04336ba2012-01-16 07:48:36 -06002941#define PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB 0x01
John Bowler7875d532011-11-07 22:33:49 -06002942 /* This indicates the the RGB values of the in-memory bitmap do not
2943 * correspond to the red, green and blue end-points defined by sRGB.
2944 */
2945
John Bowlerdee75772012-03-01 18:55:54 -06002946#define PNG_IMAGE_FLAG_FAST 0x02
2947 /* On write emphasise speed over compression; the resultant PNG file will be
2948 * larger but will be produced significantly faster, particular for large
2949 * images. Do not use this option for images which will be distributed, only
2950 * used it when producing intermediate files that will be read back in
2951 * repeatedly. For a typical 24-bit image the option will double the read
2952 * speed at the cost of increasing the image size by 25%, however for many
2953 * more compressible images the PNG file can be 10 times larger with only a
2954 * slight speed gain.
2955 */
2956
John Bowler7875d532011-11-07 22:33:49 -06002957#ifdef PNG_SIMPLIFIED_READ_SUPPORTED
2958/* READ APIs
2959 * ---------
2960 *
2961 * The png_image passed to the read APIs must have been initialized by setting
John Bowler04336ba2012-01-16 07:48:36 -06002962 * the png_controlp field 'opaque' to NULL (or, safer, memset the whole thing.)
John Bowler7875d532011-11-07 22:33:49 -06002963 */
2964#ifdef PNG_STDIO_SUPPORTED
2965PNG_EXPORT(234, int, png_image_begin_read_from_file, (png_imagep image,
2966 const char *file_name));
Glenn Randers-Pehrson84b0da92011-11-10 06:32:19 -06002967 /* The named file is opened for read and the image header is filled in
2968 * from the PNG header in the file.
Glenn Randers-Pehrsone0a6c062011-11-07 23:50:05 -06002969 */
John Bowler7875d532011-11-07 22:33:49 -06002970
2971PNG_EXPORT(235, int, png_image_begin_read_from_stdio, (png_imagep image,
2972 FILE* file));
2973 /* The PNG header is read from the stdio FILE object. */
2974#endif /* PNG_STDIO_SUPPORTED */
2975
2976PNG_EXPORT(236, int, png_image_begin_read_from_memory, (png_imagep image,
2977 png_const_voidp memory, png_size_t size));
2978 /* The PNG header is read from the given memory buffer. */
2979
2980PNG_EXPORT(237, int, png_image_finish_read, (png_imagep image,
John Bowler40ca77a2012-01-28 23:19:42 -06002981 png_const_colorp background, void *buffer, png_int_32 row_stride,
John Bowler5bc90382012-01-23 22:43:22 -06002982 void *colormap));
John Bowler7875d532011-11-07 22:33:49 -06002983 /* Finish reading the image into the supplied buffer and clean up the
2984 * png_image structure.
2985 *
John Bowler04336ba2012-01-16 07:48:36 -06002986 * row_stride is the step, in byte or 2-byte units as appropriate,
John Bowler7875d532011-11-07 22:33:49 -06002987 * between adjacent rows. A positive stride indicates that the top-most row
2988 * is first in the buffer - the normal top-down arrangement. A negative
2989 * stride indicates that the bottom-most row is first in the buffer.
2990 *
2991 * background need only be supplied if an alpha channel must be removed from
2992 * a png_byte format and the removal is to be done by compositing on a solid
2993 * color; otherwise it may be NULL and any composition will be done directly
2994 * onto the buffer. The value is an sRGB color to use for the background,
2995 * for grayscale output the green channel is used.
2996 *
John Bowler5bc90382012-01-23 22:43:22 -06002997 * background must be supplied when an alpha channel must be removed from a
2998 * single byte color-mapped output format, in other words if:
2999 *
3000 * 1) The original format from png_image_begin_read_from_* had
3001 * PNG_FORMAT_FLAG_ALPHA set.
3002 * 2) The format set by the application does not.
3003 * 3) The format set by the application has PNG_FORMAT_FLAG_COLORMAP set and
3004 * PNG_FORMAT_FLAG_LINEAR *not* set.
John Bowler04336ba2012-01-16 07:48:36 -06003005 *
Glenn Randers-Pehrson84b0da92011-11-10 06:32:19 -06003006 * For linear output removing the alpha channel is always done by compositing
John Bowler5bc90382012-01-23 22:43:22 -06003007 * on black and background is ignored.:
3008 *
3009 * colormap must be supplied when PNG_FORMAT_FLAG_COLORMAP is set. It must
3010 * be at least the size (in bytes) returned by PNG_IMAGE_COLORMAP_SIZE.
3011 * image->colormap_entries will be updated to the actual number of entries
3012 * written to the colormap; this may be less than the original value.
John Bowler7875d532011-11-07 22:33:49 -06003013 */
3014
3015PNG_EXPORT(238, void, png_image_free, (png_imagep image));
3016 /* Free any data allocated by libpng in image->opaque, setting the pointer to
Glenn Randers-Pehrsone0a6c062011-11-07 23:50:05 -06003017 * NULL. May be called at any time after the structure is initialized.
3018 */
John Bowler7875d532011-11-07 22:33:49 -06003019#endif /* PNG_SIMPLIFIED_READ_SUPPORTED */
3020
3021#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
3022/* WRITE APIS
3023 * ----------
3024 * For write you must initialize a png_image structure to describe the image to
John Bowler5bc90382012-01-23 22:43:22 -06003025 * be written. To do this use memset to set the whole structure to 0 then
3026 * initialize fields describing your image.
John Bowler7875d532011-11-07 22:33:49 -06003027 *
John Bowler5bc90382012-01-23 22:43:22 -06003028 * version: must be set to PNG_IMAGE_VERSION
John Bowler7875d532011-11-07 22:33:49 -06003029 * opaque: must be initialized to NULL
3030 * width: image width in pixels
3031 * height: image height in rows
John Bowler5bc90382012-01-23 22:43:22 -06003032 * format: the format of the data (image and color-map) you wish to write
John Bowler7875d532011-11-07 22:33:49 -06003033 * flags: set to 0 unless one of the defined flags applies; set
3034 * PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB for color format images where the RGB
3035 * values do not correspond to the colors in sRGB.
John Bowler5bc90382012-01-23 22:43:22 -06003036 * colormap_entries: set to the number of entries in the color-map (0 to 256)
John Bowler7875d532011-11-07 22:33:49 -06003037 */
3038PNG_EXPORT(239, int, png_image_write_to_file, (png_imagep image,
3039 const char *file, int convert_to_8bit, const void *buffer,
John Bowler5bc90382012-01-23 22:43:22 -06003040 png_int_32 row_stride, const void *colormap));
John Bowler7875d532011-11-07 22:33:49 -06003041 /* Write the image to the named file. */
3042
3043PNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file,
John Bowler5bc90382012-01-23 22:43:22 -06003044 int convert_to_8_bit, const void *buffer, png_int_32 row_stride,
3045 const void *colormap));
John Bowler7875d532011-11-07 22:33:49 -06003046 /* Write the image to the given (FILE*). */
3047
John Bowler5bc90382012-01-23 22:43:22 -06003048/* With both write APIs if image is in one of the linear formats with 16-bit
3049 * data then setting convert_to_8_bit will cause the output to be an 8-bit PNG
3050 * gamma encoded according to the sRGB specification, otherwise a 16-bit linear
John Bowler04336ba2012-01-16 07:48:36 -06003051 * encoded PNG file is written.
3052 *
John Bowler5bc90382012-01-23 22:43:22 -06003053 * With color-mapped data formats the colormap parameter point to a color-map
3054 * with at least image->colormap_entries encoded in the specified format. If
3055 * the format is linear the written PNG color-map will be converted to sRGB
3056 * regardless of the convert_to_8_bit flag.
John Bowler7875d532011-11-07 22:33:49 -06003057 *
3058 * With all APIs row_stride is handled as in the read APIs - it is the spacing
John Bowler04336ba2012-01-16 07:48:36 -06003059 * from one row to the next in component sized units (1 or 2 bytes) and if
3060 * negative indicates a bottom-up row layout in the buffer.
Glenn Randers-Pehrson84b0da92011-11-10 06:32:19 -06003061 *
John Bowler04336ba2012-01-16 07:48:36 -06003062 * Note that the write API does not support interlacing or sub-8-bit pixels.
John Bowler7875d532011-11-07 22:33:49 -06003063 */
3064#endif /* PNG_SIMPLIFIED_WRITE_SUPPORTED */
3065/*******************************************************************************
3066 * END OF SIMPLIFIED API
3067 ******************************************************************************/
3068
Glenn Randers-Pehrsoneeb1bb62012-03-02 22:10:15 -06003069#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \
3070 defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED)
3071PNG_EXPORT(242, void, png_set_check_for_invalid_index,
3072 (png_structrp png_ptr, int allowed));
3073#endif
3074
Glenn Randers-Pehrson31aee0d2010-07-29 17:39:14 -05003075/* Maintainer: Put new public prototypes here ^, in libpng.3, and project
3076 * defs
3077 */
3078
Glenn Randers-Pehrson9f044c12010-12-07 14:59:43 -06003079/* The last ordinal number (this is the *last* one already used; the next
John Bowler71a10f22011-01-22 17:03:33 -06003080 * one to use is one more than this.) Maintainer, remember to add an entry to
3081 * scripts/symbols.def as well.
Glenn Randers-Pehrsonc551c0d2010-03-16 07:52:34 -05003082 */
3083#ifdef PNG_EXPORT_LAST_ORDINAL
Glenn Randers-Pehrson42ed02e2012-03-16 23:17:27 -05003084 PNG_EXPORT_LAST_ORDINAL(242);
Glenn Randers-Pehrsonc551c0d2010-03-16 07:52:34 -05003085#endif
3086
Andreas Dilger02ad0ef1997-01-17 01:34:35 -06003087#ifdef __cplusplus
3088}
3089#endif
3090
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05003091#endif /* PNG_VERSION_INFO_ONLY */
Glenn Randers-Pehrson6c7a09a2009-06-15 21:57:39 -05003092/* Do not put anything past this line */
Glenn Randers-Pehrson13944802000-06-24 07:42:42 -05003093#endif /* PNG_H */