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