1libpng-manual.txt - A description on how to use and modify libpng 2 3 libpng version 1.6.10 - March 6, 2014 4 Updated and distributed by Glenn Randers-Pehrson 5 <glennrp at users.sourceforge.net> 6 Copyright (c) 1998-2014 Glenn Randers-Pehrson 7 8 This document is released under the libpng license. 9 For conditions of distribution and use, see the disclaimer 10 and license in png.h 11 12 Based on: 13 14 libpng versions 0.97, January 1998, through 1.6.10 - March 6, 2014 15 Updated and distributed by Glenn Randers-Pehrson 16 Copyright (c) 1998-2014 Glenn Randers-Pehrson 17 18 libpng 1.0 beta 6 version 0.96 May 28, 1997 19 Updated and distributed by Andreas Dilger 20 Copyright (c) 1996, 1997 Andreas Dilger 21 22 libpng 1.0 beta 2 - version 0.88 January 26, 1996 23 For conditions of distribution and use, see copyright 24 notice in png.h. Copyright (c) 1995, 1996 Guy Eric 25 Schalnat, Group 42, Inc. 26 27 Updated/rewritten per request in the libpng FAQ 28 Copyright (c) 1995, 1996 Frank J. T. Wojcik 29 December 18, 1995 & January 20, 1996 30 31 TABLE OF CONTENTS 32 33 I. Introduction 34 II. Structures 35 III. Reading 36 IV. Writing 37 V. Simplified API 38 VI. Modifying/Customizing libpng 39 VII. MNG support 40 VIII. Changes to Libpng from version 0.88 41 IX. Changes to Libpng from version 1.0.x to 1.2.x 42 X. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x 43 XI. Changes to Libpng from version 1.4.x to 1.5.x 44 XII. Changes to Libpng from version 1.5.x to 1.6.x 45 XIII. Detecting libpng 46 XIV. Source code repository 47 XV. Coding style 48 XVI. Y2K Compliance in libpng 49 50I. Introduction 51 52This file describes how to use and modify the PNG reference library 53(known as libpng) for your own use. In addition to this 54file, example.c is a good starting point for using the library, as 55it is heavily commented and should include everything most people 56will need. We assume that libpng is already installed; see the 57INSTALL file for instructions on how to install libpng. 58 59For examples of libpng usage, see the files "example.c", "pngtest.c", 60and the files in the "contrib" directory, all of which are included in 61the libpng distribution. 62 63Libpng was written as a companion to the PNG specification, as a way 64of reducing the amount of time and effort it takes to support the PNG 65file format in application programs. 66 67The PNG specification (second edition), November 2003, is available as 68a W3C Recommendation and as an ISO Standard (ISO/IEC 15948:2004 (E)) at 69<http://www.w3.org/TR/2003/REC-PNG-20031110/ 70The W3C and ISO documents have identical technical content. 71 72The PNG-1.2 specification is available at 73<http://www.libpng.org/pub/png/documents/>. It is technically equivalent 74to the PNG specification (second edition) but has some additional material. 75 76The PNG-1.0 specification is available 77as RFC 2083 <http://www.libpng.org/pub/png/documents/> and as a 78W3C Recommendation <http://www.w3.org/TR/REC.png.html>. 79 80Some additional chunks are described in the special-purpose public chunks 81documents at <http://www.libpng.org/pub/png/documents/>. 82 83Other information 84about PNG, and the latest version of libpng, can be found at the PNG home 85page, <http://www.libpng.org/pub/png/>. 86 87Most users will not have to modify the library significantly; advanced 88users may want to modify it more. All attempts were made to make it as 89complete as possible, while keeping the code easy to understand. 90Currently, this library only supports C. Support for other languages 91is being considered. 92 93Libpng has been designed to handle multiple sessions at one time, 94to be easily modifiable, to be portable to the vast majority of 95machines (ANSI, K&R, 16-, 32-, and 64-bit) available, and to be easy 96to use. The ultimate goal of libpng is to promote the acceptance of 97the PNG file format in whatever way possible. While there is still 98work to be done (see the TODO file), libpng should cover the 99majority of the needs of its users. 100 101Libpng uses zlib for its compression and decompression of PNG files. 102Further information about zlib, and the latest version of zlib, can 103be found at the zlib home page, <http://www.info-zip.org/pub/infozip/zlib/>. 104The zlib compression utility is a general purpose utility that is 105useful for more than PNG files, and can be used without libpng. 106See the documentation delivered with zlib for more details. 107You can usually find the source files for the zlib utility wherever you 108find the libpng source files. 109 110Libpng is thread safe, provided the threads are using different 111instances of the structures. Each thread should have its own 112png_struct and png_info instances, and thus its own image. 113Libpng does not protect itself against two threads using the 114same instance of a structure. 115 116II. Structures 117 118There are two main structures that are important to libpng, png_struct 119and png_info. Both are internal structures that are no longer exposed 120in the libpng interface (as of libpng 1.5.0). 121 122The png_info structure is designed to provide information about the 123PNG file. At one time, the fields of png_info were intended to be 124directly accessible to the user. However, this tended to cause problems 125with applications using dynamically loaded libraries, and as a result 126a set of interface functions for png_info (the png_get_*() and png_set_*() 127functions) was developed, and direct access to the png_info fields was 128deprecated.. 129 130The png_struct structure is the object used by the library to decode a 131single image. As of 1.5.0 this structure is also not exposed. 132 133Almost all libpng APIs require a pointer to a png_struct as the first argument. 134Many (in particular the png_set and png_get APIs) also require a pointer 135to png_info as the second argument. Some application visible macros 136defined in png.h designed for basic data access (reading and writing 137integers in the PNG format) don't take a png_info pointer, but it's almost 138always safe to assume that a (png_struct*) has to be passed to call an API 139function. 140 141You can have more than one png_info structure associated with an image, 142as illustrated in pngtest.c, one for information valid prior to the 143IDAT chunks and another (called "end_info" below) for things after them. 144 145The png.h header file is an invaluable reference for programming with libpng. 146And while I'm on the topic, make sure you include the libpng header file: 147 148#include <png.h> 149 150and also (as of libpng-1.5.0) the zlib header file, if you need it: 151 152#include <zlib.h> 153 154Types 155 156The png.h header file defines a number of integral types used by the 157APIs. Most of these are fairly obvious; for example types corresponding 158to integers of particular sizes and types for passing color values. 159 160One exception is how non-integral numbers are handled. For application 161convenience most APIs that take such numbers have C (double) arguments; 162however, internally PNG, and libpng, use 32 bit signed integers and encode 163the value by multiplying by 100,000. As of libpng 1.5.0 a convenience 164macro PNG_FP_1 is defined in png.h along with a type (png_fixed_point) 165which is simply (png_int_32). 166 167All APIs that take (double) arguments also have a matching API that 168takes the corresponding fixed point integer arguments. The fixed point 169API has the same name as the floating point one with "_fixed" appended. 170The actual range of values permitted in the APIs is frequently less than 171the full range of (png_fixed_point) (-21474 to +21474). When APIs require 172a non-negative argument the type is recorded as png_uint_32 above. Consult 173the header file and the text below for more information. 174 175Special care must be take with sCAL chunk handling because the chunk itself 176uses non-integral values encoded as strings containing decimal floating point 177numbers. See the comments in the header file. 178 179Configuration 180 181The main header file function declarations are frequently protected by C 182preprocessing directives of the form: 183 184 #ifdef PNG_feature_SUPPORTED 185 declare-function 186 #endif 187 ... 188 #ifdef PNG_feature_SUPPORTED 189 use-function 190 #endif 191 192The library can be built without support for these APIs, although a 193standard build will have all implemented APIs. Application programs 194should check the feature macros before using an API for maximum 195portability. From libpng 1.5.0 the feature macros set during the build 196of libpng are recorded in the header file "pnglibconf.h" and this file 197is always included by png.h. 198 199If you don't need to change the library configuration from the default, skip to 200the next section ("Reading"). 201 202Notice that some of the makefiles in the 'scripts' directory and (in 1.5.0) all 203of the build project files in the 'projects' directory simply copy 204scripts/pnglibconf.h.prebuilt to pnglibconf.h. This means that these build 205systems do not permit easy auto-configuration of the library - they only 206support the default configuration. 207 208The easiest way to make minor changes to the libpng configuration when 209auto-configuration is supported is to add definitions to the command line 210using (typically) CPPFLAGS. For example: 211 212CPPFLAGS=-DPNG_NO_FLOATING_ARITHMETIC 213 214will change the internal libpng math implementation for gamma correction and 215other arithmetic calculations to fixed point, avoiding the need for fast 216floating point support. The result can be seen in the generated pnglibconf.h - 217make sure it contains the changed feature macro setting. 218 219If you need to make more extensive configuration changes - more than one or two 220feature macro settings - you can either add -DPNG_USER_CONFIG to the build 221command line and put a list of feature macro settings in pngusr.h or you can set 222DFA_XTRA (a makefile variable) to a file containing the same information in the 223form of 'option' settings. 224 225A. Changing pnglibconf.h 226 227A variety of methods exist to build libpng. Not all of these support 228reconfiguration of pnglibconf.h. To reconfigure pnglibconf.h it must either be 229rebuilt from scripts/pnglibconf.dfa using awk or it must be edited by hand. 230 231Hand editing is achieved by copying scripts/pnglibconf.h.prebuilt to 232pnglibconf.h and changing the lines defining the supported features, paying 233very close attention to the 'option' information in scripts/pnglibconf.dfa 234that describes those features and their requirements. This is easy to get 235wrong. 236 237B. Configuration using DFA_XTRA 238 239Rebuilding from pnglibconf.dfa is easy if a functioning 'awk', or a later 240variant such as 'nawk' or 'gawk', is available. The configure build will 241automatically find an appropriate awk and build pnglibconf.h. 242The scripts/pnglibconf.mak file contains a set of make rules for doing the 243same thing if configure is not used, and many of the makefiles in the scripts 244directory use this approach. 245 246When rebuilding simply write a new file containing changed options and set 247DFA_XTRA to the name of this file. This causes the build to append the new file 248to the end of scripts/pnglibconf.dfa. The pngusr.dfa file should contain lines 249of the following forms: 250 251everything = off 252 253This turns all optional features off. Include it at the start of pngusr.dfa to 254make it easier to build a minimal configuration. You will need to turn at least 255some features on afterward to enable either reading or writing code, or both. 256 257option feature on 258option feature off 259 260Enable or disable a single feature. This will automatically enable other 261features required by a feature that is turned on or disable other features that 262require a feature which is turned off. Conflicting settings will cause an error 263message to be emitted by awk. 264 265setting feature default value 266 267Changes the default value of setting 'feature' to 'value'. There are a small 268number of settings listed at the top of pnglibconf.h, they are documented in the 269source code. Most of these values have performance implications for the library 270but most of them have no visible effect on the API. Some can also be overridden 271from the API. 272 273This method of building a customized pnglibconf.h is illustrated in 274contrib/pngminim/*. See the "$(PNGCONF):" target in the makefile and 275pngusr.dfa in these directories. 276 277C. Configuration using PNG_USER_CONFIG 278 279If -DPNG_USER_CONFIG is added to the CPPFLAGS when pnglibconf.h is built, 280the file pngusr.h will automatically be included before the options in 281scripts/pnglibconf.dfa are processed. Your pngusr.h file should contain only 282macro definitions turning features on or off or setting settings. 283 284Apart from the global setting "everything = off" all the options listed above 285can be set using macros in pngusr.h: 286 287#define PNG_feature_SUPPORTED 288 289is equivalent to: 290 291option feature on 292 293#define PNG_NO_feature 294 295is equivalent to: 296 297option feature off 298 299#define PNG_feature value 300 301is equivalent to: 302 303setting feature default value 304 305Notice that in both cases, pngusr.dfa and pngusr.h, the contents of the 306pngusr file you supply override the contents of scripts/pnglibconf.dfa 307 308If confusing or incomprehensible behavior results it is possible to 309examine the intermediate file pnglibconf.dfn to find the full set of 310dependency information for each setting and option. Simply locate the 311feature in the file and read the C comments that precede it. 312 313This method is also illustrated in the contrib/pngminim/* makefiles and 314pngusr.h. 315 316III. Reading 317 318We'll now walk you through the possible functions to call when reading 319in a PNG file sequentially, briefly explaining the syntax and purpose 320of each one. See example.c and png.h for more detail. While 321progressive reading is covered in the next section, you will still 322need some of the functions discussed in this section to read a PNG 323file. 324 325Setup 326 327You will want to do the I/O initialization(*) before you get into libpng, 328so if it doesn't work, you don't have much to undo. Of course, you 329will also want to insure that you are, in fact, dealing with a PNG 330file. Libpng provides a simple check to see if a file is a PNG file. 331To use it, pass in the first 1 to 8 bytes of the file to the function 332png_sig_cmp(), and it will return 0 (false) if the bytes match the 333corresponding bytes of the PNG signature, or nonzero (true) otherwise. 334Of course, the more bytes you pass in, the greater the accuracy of the 335prediction. 336 337If you are intending to keep the file pointer open for use in libpng, 338you must ensure you don't read more than 8 bytes from the beginning 339of the file, and you also have to make a call to png_set_sig_bytes_read() 340with the number of bytes you read from the beginning. Libpng will 341then only check the bytes (if any) that your program didn't read. 342 343(*): If you are not using the standard I/O functions, you will need 344to replace them with custom functions. See the discussion under 345Customizing libpng. 346 347 348 FILE *fp = fopen(file_name, "rb"); 349 if (!fp) 350 { 351 return (ERROR); 352 } 353 354 fread(header, 1, number, fp); 355 is_png = !png_sig_cmp(header, 0, number); 356 357 if (!is_png) 358 { 359 return (NOT_PNG); 360 } 361 362 363Next, png_struct and png_info need to be allocated and initialized. In 364order to ensure that the size of these structures is correct even with a 365dynamically linked libpng, there are functions to initialize and 366allocate the structures. We also pass the library version, optional 367pointers to error handling functions, and a pointer to a data struct for 368use by the error functions, if necessary (the pointer and functions can 369be NULL if the default error handlers are to be used). See the section 370on Changes to Libpng below regarding the old initialization functions. 371The structure allocation functions quietly return NULL if they fail to 372create the structure, so your application should check for that. 373 374 png_structp png_ptr = png_create_read_struct 375 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, 376 user_error_fn, user_warning_fn); 377 378 if (!png_ptr) 379 return (ERROR); 380 381 png_infop info_ptr = png_create_info_struct(png_ptr); 382 383 if (!info_ptr) 384 { 385 png_destroy_read_struct(&png_ptr, 386 (png_infopp)NULL, (png_infopp)NULL); 387 return (ERROR); 388 } 389 390If you want to use your own memory allocation routines, 391use a libpng that was built with PNG_USER_MEM_SUPPORTED defined, and use 392png_create_read_struct_2() instead of png_create_read_struct(): 393 394 png_structp png_ptr = png_create_read_struct_2 395 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, 396 user_error_fn, user_warning_fn, (png_voidp) 397 user_mem_ptr, user_malloc_fn, user_free_fn); 398 399The error handling routines passed to png_create_read_struct() 400and the memory alloc/free routines passed to png_create_struct_2() 401are only necessary if you are not using the libpng supplied error 402handling and memory alloc/free functions. 403 404When libpng encounters an error, it expects to longjmp back 405to your routine. Therefore, you will need to call setjmp and pass 406your png_jmpbuf(png_ptr). If you read the file from different 407routines, you will need to update the longjmp buffer every time you enter 408a new routine that will call a png_*() function. 409 410See your documentation of setjmp/longjmp for your compiler for more 411information on setjmp/longjmp. See the discussion on libpng error 412handling in the Customizing Libpng section below for more information 413on the libpng error handling. If an error occurs, and libpng longjmp's 414back to your setjmp, you will want to call png_destroy_read_struct() to 415free any memory. 416 417 if (setjmp(png_jmpbuf(png_ptr))) 418 { 419 png_destroy_read_struct(&png_ptr, &info_ptr, 420 &end_info); 421 fclose(fp); 422 return (ERROR); 423 } 424 425Pass (png_infopp)NULL instead of &end_info if you didn't create 426an end_info structure. 427 428If you would rather avoid the complexity of setjmp/longjmp issues, 429you can compile libpng with PNG_NO_SETJMP, in which case 430errors will result in a call to PNG_ABORT() which defaults to abort(). 431 432You can #define PNG_ABORT() to a function that does something 433more useful than abort(), as long as your function does not 434return. 435 436Now you need to set up the input code. The default for libpng is to 437use the C function fread(). If you use this, you will need to pass a 438valid FILE * in the function png_init_io(). Be sure that the file is 439opened in binary mode. If you wish to handle reading data in another 440way, you need not call the png_init_io() function, but you must then 441implement the libpng I/O methods discussed in the Customizing Libpng 442section below. 443 444 png_init_io(png_ptr, fp); 445 446If you had previously opened the file and read any of the signature from 447the beginning in order to see if this was a PNG file, you need to let 448libpng know that there are some bytes missing from the start of the file. 449 450 png_set_sig_bytes(png_ptr, number); 451 452You can change the zlib compression buffer size to be used while 453reading compressed data with 454 455 png_set_compression_buffer_size(png_ptr, buffer_size); 456 457where the default size is 8192 bytes. Note that the buffer size 458is changed immediately and the buffer is reallocated immediately, 459instead of setting a flag to be acted upon later. 460 461If you want CRC errors to be handled in a different manner than 462the default, use 463 464 png_set_crc_action(png_ptr, crit_action, ancil_action); 465 466The values for png_set_crc_action() say how libpng is to handle CRC errors in 467ancillary and critical chunks, and whether to use the data contained 468therein. Note that it is impossible to "discard" data in a critical 469chunk. 470 471Choices for (int) crit_action are 472 PNG_CRC_DEFAULT 0 error/quit 473 PNG_CRC_ERROR_QUIT 1 error/quit 474 PNG_CRC_WARN_USE 3 warn/use data 475 PNG_CRC_QUIET_USE 4 quiet/use data 476 PNG_CRC_NO_CHANGE 5 use the current value 477 478Choices for (int) ancil_action are 479 PNG_CRC_DEFAULT 0 error/quit 480 PNG_CRC_ERROR_QUIT 1 error/quit 481 PNG_CRC_WARN_DISCARD 2 warn/discard data 482 PNG_CRC_WARN_USE 3 warn/use data 483 PNG_CRC_QUIET_USE 4 quiet/use data 484 PNG_CRC_NO_CHANGE 5 use the current value 485 486Setting up callback code 487 488You can set up a callback function to handle any unknown chunks in the 489input stream. You must supply the function 490 491 read_chunk_callback(png_structp png_ptr, 492 png_unknown_chunkp chunk); 493 { 494 /* The unknown chunk structure contains your 495 chunk data, along with similar data for any other 496 unknown chunks: */ 497 498 png_byte name[5]; 499 png_byte *data; 500 png_size_t size; 501 502 /* Note that libpng has already taken care of 503 the CRC handling */ 504 505 /* put your code here. Search for your chunk in the 506 unknown chunk structure, process it, and return one 507 of the following: */ 508 509 return (-n); /* chunk had an error */ 510 return (0); /* did not recognize */ 511 return (n); /* success */ 512 } 513 514(You can give your function another name that you like instead of 515"read_chunk_callback") 516 517To inform libpng about your function, use 518 519 png_set_read_user_chunk_fn(png_ptr, user_chunk_ptr, 520 read_chunk_callback); 521 522This names not only the callback function, but also a user pointer that 523you can retrieve with 524 525 png_get_user_chunk_ptr(png_ptr); 526 527If you call the png_set_read_user_chunk_fn() function, then all unknown 528chunks which the callback does not handle will be saved when read. You can 529cause them to be discarded by returning '1' ("handled") instead of '0'. This 530behavior will change in libpng 1.7 and the default handling set by the 531png_set_keep_unknown_chunks() function, described below, will be used when the 532callback returns 0. If you want the existing behavior you should set the global 533default to PNG_HANDLE_CHUNK_IF_SAFE now; this is compatible with all current 534versions of libpng and with 1.7. Libpng 1.6 issues a warning if you keep the 535default, or PNG_HANDLE_CHUNK_NEVER, and the callback returns 0. 536 537At this point, you can set up a callback function that will be 538called after each row has been read, which you can use to control 539a progress meter or the like. It's demonstrated in pngtest.c. 540You must supply a function 541 542 void read_row_callback(png_structp png_ptr, 543 png_uint_32 row, int pass); 544 { 545 /* put your code here */ 546 } 547 548(You can give it another name that you like instead of "read_row_callback") 549 550To inform libpng about your function, use 551 552 png_set_read_status_fn(png_ptr, read_row_callback); 553 554When this function is called the row has already been completely processed and 555the 'row' and 'pass' refer to the next row to be handled. For the 556non-interlaced case the row that was just handled is simply one less than the 557passed in row number, and pass will always be 0. For the interlaced case the 558same applies unless the row value is 0, in which case the row just handled was 559the last one from one of the preceding passes. Because interlacing may skip a 560pass you cannot be sure that the preceding pass is just 'pass-1', if you really 561need to know what the last pass is record (row,pass) from the callback and use 562the last recorded value each time. 563 564As with the user transform you can find the output row using the 565PNG_ROW_FROM_PASS_ROW macro. 566 567Unknown-chunk handling 568 569Now you get to set the way the library processes unknown chunks in the 570input PNG stream. Both known and unknown chunks will be read. Normal 571behavior is that known chunks will be parsed into information in 572various info_ptr members while unknown chunks will be discarded. This 573behavior can be wasteful if your application will never use some known 574chunk types. To change this, you can call: 575 576 png_set_keep_unknown_chunks(png_ptr, keep, 577 chunk_list, num_chunks); 578 579 keep - 0: default unknown chunk handling 580 1: ignore; do not keep 581 2: keep only if safe-to-copy 582 3: keep even if unsafe-to-copy 583 584 You can use these definitions: 585 PNG_HANDLE_CHUNK_AS_DEFAULT 0 586 PNG_HANDLE_CHUNK_NEVER 1 587 PNG_HANDLE_CHUNK_IF_SAFE 2 588 PNG_HANDLE_CHUNK_ALWAYS 3 589 590 chunk_list - list of chunks affected (a byte string, 591 five bytes per chunk, NULL or '\0' if 592 num_chunks is positive; ignored if 593 numchunks <= 0). 594 595 num_chunks - number of chunks affected; if 0, all 596 unknown chunks are affected. If positive, 597 only the chunks in the list are affected, 598 and if negative all unknown chunks and 599 all known chunks except for the IHDR, 600 PLTE, tRNS, IDAT, and IEND chunks are 601 affected. 602 603Unknown chunks declared in this way will be saved as raw data onto a 604list of png_unknown_chunk structures. If a chunk that is normally 605known to libpng is named in the list, it will be handled as unknown, 606according to the "keep" directive. If a chunk is named in successive 607instances of png_set_keep_unknown_chunks(), the final instance will 608take precedence. The IHDR and IEND chunks should not be named in 609chunk_list; if they are, libpng will process them normally anyway. 610If you know that your application will never make use of some particular 611chunks, use PNG_HANDLE_CHUNK_NEVER (or 1) as demonstrated below. 612 613Here is an example of the usage of png_set_keep_unknown_chunks(), 614where the private "vpAg" chunk will later be processed by a user chunk 615callback function: 616 617 png_byte vpAg[5]={118, 112, 65, 103, (png_byte) '\0'}; 618 619 #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) 620 png_byte unused_chunks[]= 621 { 622 104, 73, 83, 84, (png_byte) '\0', /* hIST */ 623 105, 84, 88, 116, (png_byte) '\0', /* iTXt */ 624 112, 67, 65, 76, (png_byte) '\0', /* pCAL */ 625 115, 67, 65, 76, (png_byte) '\0', /* sCAL */ 626 115, 80, 76, 84, (png_byte) '\0', /* sPLT */ 627 116, 73, 77, 69, (png_byte) '\0', /* tIME */ 628 }; 629 #endif 630 631 ... 632 633 #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) 634 /* ignore all unknown chunks 635 * (use global setting "2" for libpng16 and earlier): 636 */ 637 png_set_keep_unknown_chunks(read_ptr, 2, NULL, 0); 638 639 /* except for vpAg: */ 640 png_set_keep_unknown_chunks(read_ptr, 2, vpAg, 1); 641 642 /* also ignore unused known chunks: */ 643 png_set_keep_unknown_chunks(read_ptr, 1, unused_chunks, 644 (int)(sizeof unused_chunks)/5); 645 #endif 646 647User limits 648 649The PNG specification allows the width and height of an image to be as 650large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns. 651Since very few applications really need to process such large images, 652we have imposed an arbitrary 1-million limit on rows and columns. 653Larger images will be rejected immediately with a png_error() call. If 654you wish to change this limit, you can use 655 656 png_set_user_limits(png_ptr, width_max, height_max); 657 658to set your own limits, or use width_max = height_max = 0x7fffffffL 659to allow all valid dimensions (libpng may reject some very large images 660anyway because of potential buffer overflow conditions). 661 662You should put this statement after you create the PNG structure and 663before calling png_read_info(), png_read_png(), or png_process_data(). 664 665When writing a PNG datastream, put this statement before calling 666png_write_info() or png_write_png(). 667 668If you need to retrieve the limits that are being applied, use 669 670 width_max = png_get_user_width_max(png_ptr); 671 height_max = png_get_user_height_max(png_ptr); 672 673The PNG specification sets no limit on the number of ancillary chunks 674allowed in a PNG datastream. You can impose a limit on the total number 675of sPLT, tEXt, iTXt, zTXt, and unknown chunks that will be stored, with 676 677 png_set_chunk_cache_max(png_ptr, user_chunk_cache_max); 678 679where 0x7fffffffL means unlimited. You can retrieve this limit with 680 681 chunk_cache_max = png_get_chunk_cache_max(png_ptr); 682 683You can also set a limit on the amount of memory that a compressed chunk 684other than IDAT can occupy, with 685 686 png_set_chunk_malloc_max(png_ptr, user_chunk_malloc_max); 687 688and you can retrieve the limit with 689 690 chunk_malloc_max = png_get_chunk_malloc_max(png_ptr); 691 692Any chunks that would cause either of these limits to be exceeded will 693be ignored. 694 695Information about your system 696 697If you intend to display the PNG or to incorporate it in other image data you 698need to tell libpng information about your display or drawing surface so that 699libpng can convert the values in the image to match the display. 700 701From libpng-1.5.4 this information can be set before reading the PNG file 702header. In earlier versions png_set_gamma() existed but behaved incorrectly if 703called before the PNG file header had been read and png_set_alpha_mode() did not 704exist. 705 706If you need to support versions prior to libpng-1.5.4 test the version number 707as illustrated below using "PNG_LIBPNG_VER >= 10504" and follow the procedures 708described in the appropriate manual page. 709 710You give libpng the encoding expected by your system expressed as a 'gamma' 711value. You can also specify a default encoding for the PNG file in 712case the required information is missing from the file. By default libpng 713assumes that the PNG data matches your system, to keep this default call: 714 715 png_set_gamma(png_ptr, screen_gamma, output_gamma); 716 717or you can use the fixed point equivalent: 718 719 png_set_gamma_fixed(png_ptr, PNG_FP_1*screen_gamma, 720 PNG_FP_1*output_gamma); 721 722If you don't know the gamma for your system it is probably 2.2 - a good 723approximation to the IEC standard for display systems (sRGB). If images are 724too contrasty or washed out you got the value wrong - check your system 725documentation! 726 727Many systems permit the system gamma to be changed via a lookup table in the 728display driver, a few systems, including older Macs, change the response by 729default. As of 1.5.4 three special values are available to handle common 730situations: 731 732 PNG_DEFAULT_sRGB: Indicates that the system conforms to the 733 IEC 61966-2-1 standard. This matches almost 734 all systems. 735 PNG_GAMMA_MAC_18: Indicates that the system is an older 736 (pre Mac OS 10.6) Apple Macintosh system with 737 the default settings. 738 PNG_GAMMA_LINEAR: Just the fixed point value for 1.0 - indicates 739 that the system expects data with no gamma 740 encoding. 741 742You would use the linear (unencoded) value if you need to process the pixel 743values further because this avoids the need to decode and re-encode each 744component value whenever arithmetic is performed. A lot of graphics software 745uses linear values for this reason, often with higher precision component values 746to preserve overall accuracy. 747 748 749The output_gamma value expresses how to decode the output values, not how 750they are encoded. The values used correspond to the normal numbers used to 751describe the overall gamma of a computer display system; for example 2.2 for 752an sRGB conformant system. The values are scaled by 100000 in the _fixed 753version of the API (so 220000 for sRGB.) 754 755The inverse of the value is always used to provide a default for the PNG file 756encoding if it has no gAMA chunk and if png_set_gamma() has not been called 757to override the PNG gamma information. 758 759When the ALPHA_OPTIMIZED mode is selected the output gamma is used to encode 760opaque pixels however pixels with lower alpha values are not encoded, 761regardless of the output gamma setting. 762 763When the standard Porter Duff handling is requested with mode 1 the output 764encoding is set to be linear and the output_gamma value is only relevant 765as a default for input data that has no gamma information. The linear output 766encoding will be overridden if png_set_gamma() is called - the results may be 767highly unexpected! 768 769The following numbers are derived from the sRGB standard and the research 770behind it. sRGB is defined to be approximated by a PNG gAMA chunk value of 7710.45455 (1/2.2) for PNG. The value implicitly includes any viewing 772correction required to take account of any differences in the color 773environment of the original scene and the intended display environment; the 774value expresses how to *decode* the image for display, not how the original 775data was *encoded*. 776 777sRGB provides a peg for the PNG standard by defining a viewing environment. 778sRGB itself, and earlier TV standards, actually use a more complex transform 779(a linear portion then a gamma 2.4 power law) than PNG can express. (PNG is 780limited to simple power laws.) By saying that an image for direct display on 781an sRGB conformant system should be stored with a gAMA chunk value of 45455 782(11.3.3.2 and 11.3.3.5 of the ISO PNG specification) the PNG specification 783makes it possible to derive values for other display systems and 784environments. 785 786The Mac value is deduced from the sRGB based on an assumption that the actual 787extra viewing correction used in early Mac display systems was implemented as 788a power 1.45 lookup table. 789 790Any system where a programmable lookup table is used or where the behavior of 791the final display device characteristics can be changed requires system 792specific code to obtain the current characteristic. However this can be 793difficult and most PNG gamma correction only requires an approximate value. 794 795By default, if png_set_alpha_mode() is not called, libpng assumes that all 796values are unencoded, linear, values and that the output device also has a 797linear characteristic. This is only very rarely correct - it is invariably 798better to call png_set_alpha_mode() with PNG_DEFAULT_sRGB than rely on the 799default if you don't know what the right answer is! 800 801The special value PNG_GAMMA_MAC_18 indicates an older Mac system (pre Mac OS 80210.6) which used a correction table to implement a somewhat lower gamma on an 803otherwise sRGB system. 804 805Both these values are reserved (not simple gamma values) in order to allow 806more precise correction internally in the future. 807 808NOTE: the values can be passed to either the fixed or floating 809point APIs, but the floating point API will also accept floating point 810values. 811 812The second thing you may need to tell libpng about is how your system handles 813alpha channel information. Some, but not all, PNG files contain an alpha 814channel. To display these files correctly you need to compose the data onto a 815suitable background, as described in the PNG specification. 816 817Libpng only supports composing onto a single color (using png_set_background; 818see below). Otherwise you must do the composition yourself and, in this case, 819you may need to call png_set_alpha_mode: 820 821 #if PNG_LIBPNG_VER >= 10504 822 png_set_alpha_mode(png_ptr, mode, screen_gamma); 823 #else 824 png_set_gamma(png_ptr, screen_gamma, 1.0/screen_gamma); 825 #endif 826 827The screen_gamma value is the same as the argument to png_set_gamma; however, 828how it affects the output depends on the mode. png_set_alpha_mode() sets the 829file gamma default to 1/screen_gamma, so normally you don't need to call 830png_set_gamma. If you need different defaults call png_set_gamma() before 831png_set_alpha_mode() - if you call it after it will override the settings made 832by png_set_alpha_mode(). 833 834The mode is as follows: 835 836 PNG_ALPHA_PNG: The data is encoded according to the PNG 837specification. Red, green and blue, or gray, components are 838gamma encoded color values and are not premultiplied by the 839alpha value. The alpha value is a linear measure of the 840contribution of the pixel to the corresponding final output pixel. 841 842You should normally use this format if you intend to perform 843color correction on the color values; most, maybe all, color 844correction software has no handling for the alpha channel and, 845anyway, the math to handle pre-multiplied component values is 846unnecessarily complex. 847 848Before you do any arithmetic on the component values you need 849to remove the gamma encoding and multiply out the alpha 850channel. See the PNG specification for more detail. It is 851important to note that when an image with an alpha channel is 852scaled, linear encoded, pre-multiplied component values must 853be used! 854 855The remaining modes assume you don't need to do any further color correction or 856that if you do, your color correction software knows all about alpha (it 857probably doesn't!). They 'associate' the alpha with the color information by 858storing color channel values that have been scaled by the alpha. The 859advantage is that the color channels can be resampled (the image can be 860scaled) in this form. The disadvantage is that normal practice is to store 861linear, not (gamma) encoded, values and this requires 16-bit channels for 862still images rather than the 8-bit channels that are just about sufficient if 863gamma encoding is used. In addition all non-transparent pixel values, 864including completely opaque ones, must be gamma encoded to produce the final 865image. These are the 'STANDARD', 'ASSOCIATED' or 'PREMULTIPLIED' modes 866described below (the latter being the two common names for associated alpha 867color channels). Note that PNG files always contain non-associated color 868channels; png_set_alpha_mode() with one of the modes causes the decoder to 869convert the pixels to an associated form before returning them to your 870application. 871 872Since it is not necessary to perform arithmetic on opaque color values so 873long as they are not to be resampled and are in the final color space it is 874possible to optimize the handling of alpha by storing the opaque pixels in 875the PNG format (adjusted for the output color space) while storing partially 876opaque pixels in the standard, linear, format. The accuracy required for 877standard alpha composition is relatively low, because the pixels are 878isolated, therefore typically the accuracy loss in storing 8-bit linear 879values is acceptable. (This is not true if the alpha channel is used to 880simulate transparency over large areas - use 16 bits or the PNG mode in 881this case!) This is the 'OPTIMIZED' mode. For this mode a pixel is 882treated as opaque only if the alpha value is equal to the maximum value. 883 884 PNG_ALPHA_STANDARD: The data libpng produces is encoded in the 885standard way assumed by most correctly written graphics software. 886The gamma encoding will be removed by libpng and the 887linear component values will be pre-multiplied by the 888alpha channel. 889 890With this format the final image must be re-encoded to 891match the display gamma before the image is displayed. 892If your system doesn't do that, yet still seems to 893perform arithmetic on the pixels without decoding them, 894it is broken - check out the modes below. 895 896With PNG_ALPHA_STANDARD libpng always produces linear 897component values, whatever screen_gamma you supply. The 898screen_gamma value is, however, used as a default for 899the file gamma if the PNG file has no gamma information. 900 901If you call png_set_gamma() after png_set_alpha_mode() you 902will override the linear encoding. Instead the 903pre-multiplied pixel values will be gamma encoded but 904the alpha channel will still be linear. This may 905actually match the requirements of some broken software, 906but it is unlikely. 907 908While linear 8-bit data is often used it has 909insufficient precision for any image with a reasonable 910dynamic range. To avoid problems, and if your software 911supports it, use png_set_expand_16() to force all 912components to 16 bits. 913 914 PNG_ALPHA_OPTIMIZED: This mode is the same as PNG_ALPHA_STANDARD 915except that completely opaque pixels are gamma encoded according to 916the screen_gamma value. Pixels with alpha less than 1.0 917will still have linear components. 918 919Use this format if you have control over your 920compositing software and so don't do other arithmetic 921(such as scaling) on the data you get from libpng. Your 922compositing software can simply copy opaque pixels to 923the output but still has linear values for the 924non-opaque pixels. 925 926In normal compositing, where the alpha channel encodes 927partial pixel coverage (as opposed to broad area 928translucency), the inaccuracies of the 8-bit 929representation of non-opaque pixels are irrelevant. 930 931You can also try this format if your software is broken; 932it might look better. 933 934 PNG_ALPHA_BROKEN: This is PNG_ALPHA_STANDARD; however, all component 935values, including the alpha channel are gamma encoded. This is 936broken because, in practice, no implementation that uses this choice 937correctly undoes the encoding before handling alpha composition. Use this 938choice only if other serious errors in the software or hardware you use 939mandate it. In most cases of broken software or hardware the bug in the 940final display manifests as a subtle halo around composited parts of the 941image. You may not even perceive this as a halo; the composited part of 942the image may simply appear separate from the background, as though it had 943been cut out of paper and pasted on afterward. 944 945If you don't have to deal with bugs in software or hardware, or if you can fix 946them, there are three recommended ways of using png_set_alpha_mode(): 947 948 png_set_alpha_mode(png_ptr, PNG_ALPHA_PNG, 949 screen_gamma); 950 951You can do color correction on the result (libpng does not currently 952support color correction internally). When you handle the alpha channel 953you need to undo the gamma encoding and multiply out the alpha. 954 955 png_set_alpha_mode(png_ptr, PNG_ALPHA_STANDARD, 956 screen_gamma); 957 png_set_expand_16(png_ptr); 958 959If you are using the high level interface, don't call png_set_expand_16(); 960instead pass PNG_TRANSFORM_EXPAND_16 to the interface. 961 962With this mode you can't do color correction, but you can do arithmetic, 963including composition and scaling, on the data without further processing. 964 965 png_set_alpha_mode(png_ptr, PNG_ALPHA_OPTIMIZED, 966 screen_gamma); 967 968You can avoid the expansion to 16-bit components with this mode, but you 969lose the ability to scale the image or perform other linear arithmetic. 970All you can do is compose the result onto a matching output. Since this 971mode is libpng-specific you also need to write your own composition 972software. 973 974The following are examples of calls to png_set_alpha_mode to achieve the 975required overall gamma correction and, where necessary, alpha 976premultiplication. 977 978 png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB); 979 980This is the default libpng handling of the alpha channel - it is not 981pre-multiplied into the color components. In addition the call states 982that the output is for a sRGB system and causes all PNG files without gAMA 983chunks to be assumed to be encoded using sRGB. 984 985 png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC); 986 987In this case the output is assumed to be something like an sRGB conformant 988display preceeded by a power-law lookup table of power 1.45. This is how 989early Mac systems behaved. 990 991 png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_GAMMA_LINEAR); 992 993This is the classic Jim Blinn approach and will work in academic 994environments where everything is done by the book. It has the shortcoming 995of assuming that input PNG data with no gamma information is linear - this 996is unlikely to be correct unless the PNG files where generated locally. 997Most of the time the output precision will be so low as to show 998significant banding in dark areas of the image. 999 1000 png_set_expand_16(pp); 1001 png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_DEFAULT_sRGB); 1002 1003This is a somewhat more realistic Jim Blinn inspired approach. PNG files 1004are assumed to have the sRGB encoding if not marked with a gamma value and 1005the output is always 16 bits per component. This permits accurate scaling 1006and processing of the data. If you know that your input PNG files were 1007generated locally you might need to replace PNG_DEFAULT_sRGB with the 1008correct value for your system. 1009 1010 png_set_alpha_mode(pp, PNG_ALPHA_OPTIMIZED, PNG_DEFAULT_sRGB); 1011 1012If you just need to composite the PNG image onto an existing background 1013and if you control the code that does this you can use the optimization 1014setting. In this case you just copy completely opaque pixels to the 1015output. For pixels that are not completely transparent (you just skip 1016those) you do the composition math using png_composite or png_composite_16 1017below then encode the resultant 8-bit or 16-bit values to match the output 1018encoding. 1019 1020 Other cases 1021 1022If neither the PNG nor the standard linear encoding work for you because 1023of the software or hardware you use then you have a big problem. The PNG 1024case will probably result in halos around the image. The linear encoding 1025will probably result in a washed out, too bright, image (it's actually too 1026contrasty.) Try the ALPHA_OPTIMIZED mode above - this will probably 1027substantially reduce the halos. Alternatively try: 1028 1029 png_set_alpha_mode(pp, PNG_ALPHA_BROKEN, PNG_DEFAULT_sRGB); 1030 1031This option will also reduce the halos, but there will be slight dark 1032halos round the opaque parts of the image where the background is light. 1033In the OPTIMIZED mode the halos will be light halos where the background 1034is dark. Take your pick - the halos are unavoidable unless you can get 1035your hardware/software fixed! (The OPTIMIZED approach is slightly 1036faster.) 1037 1038When the default gamma of PNG files doesn't match the output gamma. 1039If you have PNG files with no gamma information png_set_alpha_mode allows 1040you to provide a default gamma, but it also sets the ouput gamma to the 1041matching value. If you know your PNG files have a gamma that doesn't 1042match the output you can take advantage of the fact that 1043png_set_alpha_mode always sets the output gamma but only sets the PNG 1044default if it is not already set: 1045 1046 png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB); 1047 png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC); 1048 1049The first call sets both the default and the output gamma values, the 1050second call overrides the output gamma without changing the default. This 1051is easier than achieving the same effect with png_set_gamma. You must use 1052PNG_ALPHA_PNG for the first call - internal checking in png_set_alpha will 1053fire if more than one call to png_set_alpha_mode and png_set_background is 1054made in the same read operation, however multiple calls with PNG_ALPHA_PNG 1055are ignored. 1056 1057If you don't need, or can't handle, the alpha channel you can call 1058png_set_background() to remove it by compositing against a fixed color. Don't 1059call png_set_strip_alpha() to do this - it will leave spurious pixel values in 1060transparent parts of this image. 1061 1062 png_set_background(png_ptr, &background_color, 1063 PNG_BACKGROUND_GAMMA_SCREEN, 0, 1); 1064 1065The background_color is an RGB or grayscale value according to the data format 1066libpng will produce for you. Because you don't yet know the format of the PNG 1067file, if you call png_set_background at this point you must arrange for the 1068format produced by libpng to always have 8-bit or 16-bit components and then 1069store the color as an 8-bit or 16-bit color as appropriate. The color contains 1070separate gray and RGB component values, so you can let libpng produce gray or 1071RGB output according to the input format, but low bit depth grayscale images 1072must always be converted to at least 8-bit format. (Even though low bit depth 1073grayscale images can't have an alpha channel they can have a transparent 1074color!) 1075 1076You set the transforms you need later, either as flags to the high level 1077interface or libpng API calls for the low level interface. For reference the 1078settings and API calls required are: 1079 10808-bit values: 1081 PNG_TRANSFORM_SCALE_16 | PNG_EXPAND 1082 png_set_expand(png_ptr); png_set_scale_16(png_ptr); 1083 1084 If you must get exactly the same inaccurate results 1085 produced by default in versions prior to libpng-1.5.4, 1086 use PNG_TRANSFORM_STRIP_16 and png_set_strip_16(png_ptr) 1087 instead. 1088 108916-bit values: 1090 PNG_TRANSFORM_EXPAND_16 1091 png_set_expand_16(png_ptr); 1092 1093In either case palette image data will be expanded to RGB. If you just want 1094color data you can add PNG_TRANSFORM_GRAY_TO_RGB or png_set_gray_to_rgb(png_ptr) 1095to the list. 1096 1097Calling png_set_background before the PNG file header is read will not work 1098prior to libpng-1.5.4. Because the failure may result in unexpected warnings or 1099errors it is therefore much safer to call png_set_background after the head has 1100been read. Unfortunately this means that prior to libpng-1.5.4 it cannot be 1101used with the high level interface. 1102 1103The high-level read interface 1104 1105At this point there are two ways to proceed; through the high-level 1106read interface, or through a sequence of low-level read operations. 1107You can use the high-level interface if (a) you are willing to read 1108the entire image into memory, and (b) the input transformations 1109you want to do are limited to the following set: 1110 1111 PNG_TRANSFORM_IDENTITY No transformation 1112 PNG_TRANSFORM_SCALE_16 Strip 16-bit samples to 1113 8-bit accurately 1114 PNG_TRANSFORM_STRIP_16 Chop 16-bit samples to 1115 8-bit less accurately 1116 PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel 1117 PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit 1118 samples to bytes 1119 PNG_TRANSFORM_PACKSWAP Change order of packed 1120 pixels to LSB first 1121 PNG_TRANSFORM_EXPAND Perform set_expand() 1122 PNG_TRANSFORM_INVERT_MONO Invert monochrome images 1123 PNG_TRANSFORM_SHIFT Normalize pixels to the 1124 sBIT depth 1125 PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA 1126 to BGRA 1127 PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA 1128 to AG 1129 PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity 1130 to transparency 1131 PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples 1132 PNG_TRANSFORM_GRAY_TO_RGB Expand grayscale samples 1133 to RGB (or GA to RGBA) 1134 PNG_TRANSFORM_EXPAND_16 Expand samples to 16 bits 1135 1136(This excludes setting a background color, doing gamma transformation, 1137quantizing, and setting filler.) If this is the case, simply do this: 1138 1139 png_read_png(png_ptr, info_ptr, png_transforms, NULL) 1140 1141where png_transforms is an integer containing the bitwise OR of some 1142set of transformation flags. This call is equivalent to png_read_info(), 1143followed the set of transformations indicated by the transform mask, 1144then png_read_image(), and finally png_read_end(). 1145 1146(The final parameter of this call is not yet used. Someday it might point 1147to transformation parameters required by some future input transform.) 1148 1149You must use png_transforms and not call any png_set_transform() functions 1150when you use png_read_png(). 1151 1152After you have called png_read_png(), you can retrieve the image data 1153with 1154 1155 row_pointers = png_get_rows(png_ptr, info_ptr); 1156 1157where row_pointers is an array of pointers to the pixel data for each row: 1158 1159 png_bytep row_pointers[height]; 1160 1161If you know your image size and pixel size ahead of time, you can allocate 1162row_pointers prior to calling png_read_png() with 1163 1164 if (height > PNG_UINT_32_MAX/(sizeof (png_byte))) 1165 png_error (png_ptr, 1166 "Image is too tall to process in memory"); 1167 1168 if (width > PNG_UINT_32_MAX/pixel_size) 1169 png_error (png_ptr, 1170 "Image is too wide to process in memory"); 1171 1172 row_pointers = png_malloc(png_ptr, 1173 height*(sizeof (png_bytep))); 1174 1175 for (int i=0; i<height, i++) 1176 row_pointers[i]=NULL; /* security precaution */ 1177 1178 for (int i=0; i<height, i++) 1179 row_pointers[i]=png_malloc(png_ptr, 1180 width*pixel_size); 1181 1182 png_set_rows(png_ptr, info_ptr, &row_pointers); 1183 1184Alternatively you could allocate your image in one big block and define 1185row_pointers[i] to point into the proper places in your block. 1186 1187If you use png_set_rows(), the application is responsible for freeing 1188row_pointers (and row_pointers[i], if they were separately allocated). 1189 1190If you don't allocate row_pointers ahead of time, png_read_png() will 1191do it, and it'll be free'ed by libpng when you call png_destroy_*(). 1192 1193The low-level read interface 1194 1195If you are going the low-level route, you are now ready to read all 1196the file information up to the actual image data. You do this with a 1197call to png_read_info(). 1198 1199 png_read_info(png_ptr, info_ptr); 1200 1201This will process all chunks up to but not including the image data. 1202 1203This also copies some of the data from the PNG file into the decode structure 1204for use in later transformations. Important information copied in is: 1205 12061) The PNG file gamma from the gAMA chunk. This overwrites the default value 1207provided by an earlier call to png_set_gamma or png_set_alpha_mode. 1208 12092) Prior to libpng-1.5.4 the background color from a bKGd chunk. This 1210damages the information provided by an earlier call to png_set_background 1211resulting in unexpected behavior. Libpng-1.5.4 no longer does this. 1212 12133) The number of significant bits in each component value. Libpng uses this to 1214optimize gamma handling by reducing the internal lookup table sizes. 1215 12164) The transparent color information from a tRNS chunk. This can be modified by 1217a later call to png_set_tRNS. 1218 1219Querying the info structure 1220 1221Functions are used to get the information from the info_ptr once it 1222has been read. Note that these fields may not be completely filled 1223in until png_read_end() has read the chunk data following the image. 1224 1225 png_get_IHDR(png_ptr, info_ptr, &width, &height, 1226 &bit_depth, &color_type, &interlace_type, 1227 &compression_type, &filter_method); 1228 1229 width - holds the width of the image 1230 in pixels (up to 2^31). 1231 1232 height - holds the height of the image 1233 in pixels (up to 2^31). 1234 1235 bit_depth - holds the bit depth of one of the 1236 image channels. (valid values are 1237 1, 2, 4, 8, 16 and depend also on 1238 the color_type. See also 1239 significant bits (sBIT) below). 1240 1241 color_type - describes which color/alpha channels 1242 are present. 1243 PNG_COLOR_TYPE_GRAY 1244 (bit depths 1, 2, 4, 8, 16) 1245 PNG_COLOR_TYPE_GRAY_ALPHA 1246 (bit depths 8, 16) 1247 PNG_COLOR_TYPE_PALETTE 1248 (bit depths 1, 2, 4, 8) 1249 PNG_COLOR_TYPE_RGB 1250 (bit_depths 8, 16) 1251 PNG_COLOR_TYPE_RGB_ALPHA 1252 (bit_depths 8, 16) 1253 1254 PNG_COLOR_MASK_PALETTE 1255 PNG_COLOR_MASK_COLOR 1256 PNG_COLOR_MASK_ALPHA 1257 1258 interlace_type - (PNG_INTERLACE_NONE or 1259 PNG_INTERLACE_ADAM7) 1260 1261 compression_type - (must be PNG_COMPRESSION_TYPE_BASE 1262 for PNG 1.0) 1263 1264 filter_method - (must be PNG_FILTER_TYPE_BASE 1265 for PNG 1.0, and can also be 1266 PNG_INTRAPIXEL_DIFFERENCING if 1267 the PNG datastream is embedded in 1268 a MNG-1.0 datastream) 1269 1270 Any or all of interlace_type, compression_type, or 1271 filter_method can be NULL if you are 1272 not interested in their values. 1273 1274 Note that png_get_IHDR() returns 32-bit data into 1275 the application's width and height variables. 1276 This is an unsafe situation if these are 16-bit 1277 variables. In such situations, the 1278 png_get_image_width() and png_get_image_height() 1279 functions described below are safer. 1280 1281 width = png_get_image_width(png_ptr, 1282 info_ptr); 1283 1284 height = png_get_image_height(png_ptr, 1285 info_ptr); 1286 1287 bit_depth = png_get_bit_depth(png_ptr, 1288 info_ptr); 1289 1290 color_type = png_get_color_type(png_ptr, 1291 info_ptr); 1292 1293 interlace_type = png_get_interlace_type(png_ptr, 1294 info_ptr); 1295 1296 compression_type = png_get_compression_type(png_ptr, 1297 info_ptr); 1298 1299 filter_method = png_get_filter_type(png_ptr, 1300 info_ptr); 1301 1302 channels = png_get_channels(png_ptr, info_ptr); 1303 1304 channels - number of channels of info for the 1305 color type (valid values are 1 (GRAY, 1306 PALETTE), 2 (GRAY_ALPHA), 3 (RGB), 1307 4 (RGB_ALPHA or RGB + filler byte)) 1308 1309 rowbytes = png_get_rowbytes(png_ptr, info_ptr); 1310 1311 rowbytes - number of bytes needed to hold a row 1312 1313 signature = png_get_signature(png_ptr, info_ptr); 1314 1315 signature - holds the signature read from the 1316 file (if any). The data is kept in 1317 the same offset it would be if the 1318 whole signature were read (i.e. if an 1319 application had already read in 4 1320 bytes of signature before starting 1321 libpng, the remaining 4 bytes would 1322 be in signature[4] through signature[7] 1323 (see png_set_sig_bytes())). 1324 1325These are also important, but their validity depends on whether the chunk 1326has been read. The png_get_valid(png_ptr, info_ptr, PNG_INFO_<chunk>) and 1327png_get_<chunk>(png_ptr, info_ptr, ...) functions return non-zero if the 1328data has been read, or zero if it is missing. The parameters to the 1329png_get_<chunk> are set directly if they are simple data types, or a 1330pointer into the info_ptr is returned for any complex types. 1331 1332The colorspace data from gAMA, cHRM, sRGB, iCCP, and sBIT chunks 1333is simply returned to give the application information about how the 1334image was encoded. Libpng itself only does transformations using the file 1335gamma when combining semitransparent pixels with the background color, and, 1336since libpng-1.6.0, when converting between 8-bit sRGB and 16-bit linear pixels 1337within the simplified API. Libpng also uses the file gamma when converting 1338RGB to gray, beginning with libpng-1.0.5, if the application calls 1339png_set_rgb_to_gray()). 1340 1341 png_get_PLTE(png_ptr, info_ptr, &palette, 1342 &num_palette); 1343 1344 palette - the palette for the file 1345 (array of png_color) 1346 1347 num_palette - number of entries in the palette 1348 1349 png_get_gAMA(png_ptr, info_ptr, &file_gamma); 1350 png_get_gAMA_fixed(png_ptr, info_ptr, &int_file_gamma); 1351 1352 file_gamma - the gamma at which the file is 1353 written (PNG_INFO_gAMA) 1354 1355 int_file_gamma - 100,000 times the gamma at which the 1356 file is written 1357 1358 png_get_cHRM(png_ptr, info_ptr, &white_x, &white_y, &red_x, 1359 &red_y, &green_x, &green_y, &blue_x, &blue_y) 1360 png_get_cHRM_XYZ(png_ptr, info_ptr, &red_X, &red_Y, &red_Z, 1361 &green_X, &green_Y, &green_Z, &blue_X, &blue_Y, 1362 &blue_Z) 1363 png_get_cHRM_fixed(png_ptr, info_ptr, &int_white_x, 1364 &int_white_y, &int_red_x, &int_red_y, 1365 &int_green_x, &int_green_y, &int_blue_x, 1366 &int_blue_y) 1367 png_get_cHRM_XYZ_fixed(png_ptr, info_ptr, &int_red_X, &int_red_Y, 1368 &int_red_Z, &int_green_X, &int_green_Y, 1369 &int_green_Z, &int_blue_X, &int_blue_Y, 1370 &int_blue_Z) 1371 1372 {white,red,green,blue}_{x,y} 1373 A color space encoding specified using the 1374 chromaticities of the end points and the 1375 white point. (PNG_INFO_cHRM) 1376 1377 {red,green,blue}_{X,Y,Z} 1378 A color space encoding specified using the 1379 encoding end points - the CIE tristimulus 1380 specification of the intended color of the red, 1381 green and blue channels in the PNG RGB data. 1382 The white point is simply the sum of the three 1383 end points. (PNG_INFO_cHRM) 1384 1385 png_get_sRGB(png_ptr, info_ptr, &srgb_intent); 1386 1387 srgb_intent - the rendering intent (PNG_INFO_sRGB) 1388 The presence of the sRGB chunk 1389 means that the pixel data is in the 1390 sRGB color space. This chunk also 1391 implies specific values of gAMA and 1392 cHRM. 1393 1394 png_get_iCCP(png_ptr, info_ptr, &name, 1395 &compression_type, &profile, &proflen); 1396 1397 name - The profile name. 1398 1399 compression_type - The compression type; always 1400 PNG_COMPRESSION_TYPE_BASE for PNG 1.0. 1401 You may give NULL to this argument to 1402 ignore it. 1403 1404 profile - International Color Consortium color 1405 profile data. May contain NULs. 1406 1407 proflen - length of profile data in bytes. 1408 1409 png_get_sBIT(png_ptr, info_ptr, &sig_bit); 1410 1411 sig_bit - the number of significant bits for 1412 (PNG_INFO_sBIT) each of the gray, 1413 red, green, and blue channels, 1414 whichever are appropriate for the 1415 given color type (png_color_16) 1416 1417 png_get_tRNS(png_ptr, info_ptr, &trans_alpha, 1418 &num_trans, &trans_color); 1419 1420 trans_alpha - array of alpha (transparency) 1421 entries for palette (PNG_INFO_tRNS) 1422 1423 num_trans - number of transparent entries 1424 (PNG_INFO_tRNS) 1425 1426 trans_color - graylevel or color sample values of 1427 the single transparent color for 1428 non-paletted images (PNG_INFO_tRNS) 1429 1430 png_get_hIST(png_ptr, info_ptr, &hist); 1431 (PNG_INFO_hIST) 1432 1433 hist - histogram of palette (array of 1434 png_uint_16) 1435 1436 png_get_tIME(png_ptr, info_ptr, &mod_time); 1437 1438 mod_time - time image was last modified 1439 (PNG_VALID_tIME) 1440 1441 png_get_bKGD(png_ptr, info_ptr, &background); 1442 1443 background - background color (of type 1444 png_color_16p) (PNG_VALID_bKGD) 1445 valid 16-bit red, green and blue 1446 values, regardless of color_type 1447 1448 num_comments = png_get_text(png_ptr, info_ptr, 1449 &text_ptr, &num_text); 1450 1451 num_comments - number of comments 1452 1453 text_ptr - array of png_text holding image 1454 comments 1455 1456 text_ptr[i].compression - type of compression used 1457 on "text" PNG_TEXT_COMPRESSION_NONE 1458 PNG_TEXT_COMPRESSION_zTXt 1459 PNG_ITXT_COMPRESSION_NONE 1460 PNG_ITXT_COMPRESSION_zTXt 1461 1462 text_ptr[i].key - keyword for comment. Must contain 1463 1-79 characters. 1464 1465 text_ptr[i].text - text comments for current 1466 keyword. Can be empty. 1467 1468 text_ptr[i].text_length - length of text string, 1469 after decompression, 0 for iTXt 1470 1471 text_ptr[i].itxt_length - length of itxt string, 1472 after decompression, 0 for tEXt/zTXt 1473 1474 text_ptr[i].lang - language of comment (empty 1475 string for unknown). 1476 1477 text_ptr[i].lang_key - keyword in UTF-8 1478 (empty string for unknown). 1479 1480 Note that the itxt_length, lang, and lang_key 1481 members of the text_ptr structure only exist when the 1482 library is built with iTXt chunk support. Prior to 1483 libpng-1.4.0 the library was built by default without 1484 iTXt support. Also note that when iTXt is supported, 1485 they contain NULL pointers when the "compression" 1486 field contains PNG_TEXT_COMPRESSION_NONE or 1487 PNG_TEXT_COMPRESSION_zTXt. 1488 1489 num_text - number of comments (same as 1490 num_comments; you can put NULL here 1491 to avoid the duplication) 1492 1493 Note while png_set_text() will accept text, language, 1494 and translated keywords that can be NULL pointers, the 1495 structure returned by png_get_text will always contain 1496 regular zero-terminated C strings. They might be 1497 empty strings but they will never be NULL pointers. 1498 1499 num_spalettes = png_get_sPLT(png_ptr, info_ptr, 1500 &palette_ptr); 1501 1502 num_spalettes - number of sPLT chunks read. 1503 1504 palette_ptr - array of palette structures holding 1505 contents of one or more sPLT chunks 1506 read. 1507 1508 png_get_oFFs(png_ptr, info_ptr, &offset_x, &offset_y, 1509 &unit_type); 1510 1511 offset_x - positive offset from the left edge 1512 of the screen (can be negative) 1513 1514 offset_y - positive offset from the top edge 1515 of the screen (can be negative) 1516 1517 unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER 1518 1519 png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y, 1520 &unit_type); 1521 1522 res_x - pixels/unit physical resolution in 1523 x direction 1524 1525 res_y - pixels/unit physical resolution in 1526 x direction 1527 1528 unit_type - PNG_RESOLUTION_UNKNOWN, 1529 PNG_RESOLUTION_METER 1530 1531 png_get_sCAL(png_ptr, info_ptr, &unit, &width, 1532 &height) 1533 1534 unit - physical scale units (an integer) 1535 1536 width - width of a pixel in physical scale units 1537 1538 height - height of a pixel in physical scale units 1539 (width and height are doubles) 1540 1541 png_get_sCAL_s(png_ptr, info_ptr, &unit, &width, 1542 &height) 1543 1544 unit - physical scale units (an integer) 1545 1546 width - width of a pixel in physical scale units 1547 (expressed as a string) 1548 1549 height - height of a pixel in physical scale units 1550 (width and height are strings like "2.54") 1551 1552 num_unknown_chunks = png_get_unknown_chunks(png_ptr, 1553 info_ptr, &unknowns) 1554 1555 unknowns - array of png_unknown_chunk 1556 structures holding unknown chunks 1557 1558 unknowns[i].name - name of unknown chunk 1559 1560 unknowns[i].data - data of unknown chunk 1561 1562 unknowns[i].size - size of unknown chunk's data 1563 1564 unknowns[i].location - position of chunk in file 1565 1566 The value of "i" corresponds to the order in which the 1567 chunks were read from the PNG file or inserted with the 1568 png_set_unknown_chunks() function. 1569 1570 The value of "location" is a bitwise "or" of 1571 1572 PNG_HAVE_IHDR (0x01) 1573 PNG_HAVE_PLTE (0x02) 1574 PNG_AFTER_IDAT (0x08) 1575 1576The data from the pHYs chunk can be retrieved in several convenient 1577forms: 1578 1579 res_x = png_get_x_pixels_per_meter(png_ptr, 1580 info_ptr) 1581 1582 res_y = png_get_y_pixels_per_meter(png_ptr, 1583 info_ptr) 1584 1585 res_x_and_y = png_get_pixels_per_meter(png_ptr, 1586 info_ptr) 1587 1588 res_x = png_get_x_pixels_per_inch(png_ptr, 1589 info_ptr) 1590 1591 res_y = png_get_y_pixels_per_inch(png_ptr, 1592 info_ptr) 1593 1594 res_x_and_y = png_get_pixels_per_inch(png_ptr, 1595 info_ptr) 1596 1597 aspect_ratio = png_get_pixel_aspect_ratio(png_ptr, 1598 info_ptr) 1599 1600 Each of these returns 0 [signifying "unknown"] if 1601 the data is not present or if res_x is 0; 1602 res_x_and_y is 0 if res_x != res_y 1603 1604 Note that because of the way the resolutions are 1605 stored internally, the inch conversions won't 1606 come out to exactly even number. For example, 1607 72 dpi is stored as 0.28346 pixels/meter, and 1608 when this is retrieved it is 71.9988 dpi, so 1609 be sure to round the returned value appropriately 1610 if you want to display a reasonable-looking result. 1611 1612The data from the oFFs chunk can be retrieved in several convenient 1613forms: 1614 1615 x_offset = png_get_x_offset_microns(png_ptr, info_ptr); 1616 1617 y_offset = png_get_y_offset_microns(png_ptr, info_ptr); 1618 1619 x_offset = png_get_x_offset_inches(png_ptr, info_ptr); 1620 1621 y_offset = png_get_y_offset_inches(png_ptr, info_ptr); 1622 1623 Each of these returns 0 [signifying "unknown" if both 1624 x and y are 0] if the data is not present or if the 1625 chunk is present but the unit is the pixel. The 1626 remark about inexact inch conversions applies here 1627 as well, because a value in inches can't always be 1628 converted to microns and back without some loss 1629 of precision. 1630 1631For more information, see the 1632PNG specification for chunk contents. Be careful with trusting 1633rowbytes, as some of the transformations could increase the space 1634needed to hold a row (expand, filler, gray_to_rgb, etc.). 1635See png_read_update_info(), below. 1636 1637A quick word about text_ptr and num_text. PNG stores comments in 1638keyword/text pairs, one pair per chunk, with no limit on the number 1639of text chunks, and a 2^31 byte limit on their size. While there are 1640suggested keywords, there is no requirement to restrict the use to these 1641strings. It is strongly suggested that keywords and text be sensible 1642to humans (that's the point), so don't use abbreviations. Non-printing 1643symbols are not allowed. See the PNG specification for more details. 1644There is also no requirement to have text after the keyword. 1645 1646Keywords should be limited to 79 Latin-1 characters without leading or 1647trailing spaces, but non-consecutive spaces are allowed within the 1648keyword. It is possible to have the same keyword any number of times. 1649The text_ptr is an array of png_text structures, each holding a 1650pointer to a language string, a pointer to a keyword and a pointer to 1651a text string. The text string, language code, and translated 1652keyword may be empty or NULL pointers. The keyword/text 1653pairs are put into the array in the order that they are received. 1654However, some or all of the text chunks may be after the image, so, to 1655make sure you have read all the text chunks, don't mess with these 1656until after you read the stuff after the image. This will be 1657mentioned again below in the discussion that goes with png_read_end(). 1658 1659Input transformations 1660 1661After you've read the header information, you can set up the library 1662to handle any special transformations of the image data. The various 1663ways to transform the data will be described in the order that they 1664should occur. This is important, as some of these change the color 1665type and/or bit depth of the data, and some others only work on 1666certain color types and bit depths. 1667 1668Transformations you request are ignored if they don't have any meaning for a 1669particular input data format. However some transformations can have an effect 1670as a result of a previous transformation. If you specify a contradictory set of 1671transformations, for example both adding and removing the alpha channel, you 1672cannot predict the final result. 1673 1674The color used for the transparency values should be supplied in the same 1675format/depth as the current image data. It is stored in the same format/depth 1676as the image data in a tRNS chunk, so this is what libpng expects for this data. 1677 1678The color used for the background value depends on the need_expand argument as 1679described below. 1680 1681Data will be decoded into the supplied row buffers packed into bytes 1682unless the library has been told to transform it into another format. 1683For example, 4 bit/pixel paletted or grayscale data will be returned 16842 pixels/byte with the leftmost pixel in the high-order bits of the 1685byte, unless png_set_packing() is called. 8-bit RGB data will be stored 1686in RGB RGB RGB format unless png_set_filler() or png_set_add_alpha() 1687is called to insert filler bytes, either before or after each RGB triplet. 168816-bit RGB data will be returned RRGGBB RRGGBB, with the most significant 1689byte of the color value first, unless png_set_scale_16() is called to 1690transform it to regular RGB RGB triplets, or png_set_filler() or 1691png_set_add alpha() is called to insert filler bytes, either before or 1692after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can 1693be modified with png_set_filler(), png_set_add_alpha(), png_set_strip_16(), 1694or png_set_scale_16(). 1695 1696The following code transforms grayscale images of less than 8 to 8 bits, 1697changes paletted images to RGB, and adds a full alpha channel if there is 1698transparency information in a tRNS chunk. This is most useful on 1699grayscale images with bit depths of 2 or 4 or if there is a multiple-image 1700viewing application that wishes to treat all images in the same way. 1701 1702 if (color_type == PNG_COLOR_TYPE_PALETTE) 1703 png_set_palette_to_rgb(png_ptr); 1704 1705 if (png_get_valid(png_ptr, info_ptr, 1706 PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr); 1707 1708 if (color_type == PNG_COLOR_TYPE_GRAY && 1709 bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr); 1710 1711The first two functions are actually aliases for png_set_expand(), added 1712in libpng version 1.0.4, with the function names expanded to improve code 1713readability. In some future version they may actually do different 1714things. 1715 1716As of libpng version 1.2.9, png_set_expand_gray_1_2_4_to_8() was 1717added. It expands the sample depth without changing tRNS to alpha. 1718 1719As of libpng version 1.5.2, png_set_expand_16() was added. It behaves as 1720png_set_expand(); however, the resultant channels have 16 bits rather than 8. 1721Use this when the output color or gray channels are made linear to avoid fairly 1722severe accuracy loss. 1723 1724 if (bit_depth < 16) 1725 png_set_expand_16(png_ptr); 1726 1727PNG can have files with 16 bits per channel. If you only can handle 17288 bits per channel, this will strip the pixels down to 8-bit. 1729 1730 if (bit_depth == 16) 1731#if PNG_LIBPNG_VER >= 10504 1732 png_set_scale_16(png_ptr); 1733#else 1734 png_set_strip_16(png_ptr); 1735#endif 1736 1737(The more accurate "png_set_scale_16()" API became available in libpng version 17381.5.4). 1739 1740If you need to process the alpha channel on the image separately from the image 1741data (for example if you convert it to a bitmap mask) it is possible to have 1742libpng strip the channel leaving just RGB or gray data: 1743 1744 if (color_type & PNG_COLOR_MASK_ALPHA) 1745 png_set_strip_alpha(png_ptr); 1746 1747If you strip the alpha channel you need to find some other way of dealing with 1748the information. If, instead, you want to convert the image to an opaque 1749version with no alpha channel use png_set_background; see below. 1750 1751As of libpng version 1.5.2, almost all useful expansions are supported, the 1752major ommissions are conversion of grayscale to indexed images (which can be 1753done trivially in the application) and conversion of indexed to grayscale (which 1754can be done by a trivial manipulation of the palette.) 1755 1756In the following table, the 01 means grayscale with depth<8, 31 means 1757indexed with depth<8, other numerals represent the color type, "T" means 1758the tRNS chunk is present, A means an alpha channel is present, and O 1759means tRNS or alpha is present but all pixels in the image are opaque. 1760 1761 FROM 01 31 0 0T 0O 2 2T 2O 3 3T 3O 4A 4O 6A 6O 1762 TO 1763 01 - [G] - - - - - - - - - - - - - 1764 31 [Q] Q [Q] [Q] [Q] Q Q Q Q Q Q [Q] [Q] Q Q 1765 0 1 G + . . G G G G G G B B GB GB 1766 0T lt Gt t + . Gt G G Gt G G Bt Bt GBt GBt 1767 0O lt Gt t . + Gt Gt G Gt Gt G Bt Bt GBt GBt 1768 2 C P C C C + . . C - - CB CB B B 1769 2T Ct - Ct C C t + t - - - CBt CBt Bt Bt 1770 2O Ct - Ct C C t t + - - - CBt CBt Bt Bt 1771 3 [Q] p [Q] [Q] [Q] Q Q Q + . . [Q] [Q] Q Q 1772 3T [Qt] p [Qt][Q] [Q] Qt Qt Qt t + t [Qt][Qt] Qt Qt 1773 3O [Qt] p [Qt][Q] [Q] Qt Qt Qt t t + [Qt][Qt] Qt Qt 1774 4A lA G A T T GA GT GT GA GT GT + BA G GBA 1775 4O lA GBA A T T GA GT GT GA GT GT BA + GBA G 1776 6A CA PA CA C C A T tT PA P P C CBA + BA 1777 6O CA PBA CA C C A tT T PA P P CBA C BA + 1778 1779Within the matrix, 1780 "+" identifies entries where 'from' and 'to' are the same. 1781 "-" means the transformation is not supported. 1782 "." means nothing is necessary (a tRNS chunk can just be ignored). 1783 "t" means the transformation is obtained by png_set_tRNS. 1784 "A" means the transformation is obtained by png_set_add_alpha(). 1785 "X" means the transformation is obtained by png_set_expand(). 1786 "1" means the transformation is obtained by 1787 png_set_expand_gray_1_2_4_to_8() (and by png_set_expand() 1788 if there is no transparency in the original or the final 1789 format). 1790 "C" means the transformation is obtained by png_set_gray_to_rgb(). 1791 "G" means the transformation is obtained by png_set_rgb_to_gray(). 1792 "P" means the transformation is obtained by 1793 png_set_expand_palette_to_rgb(). 1794 "p" means the transformation is obtained by png_set_packing(). 1795 "Q" means the transformation is obtained by png_set_quantize(). 1796 "T" means the transformation is obtained by 1797 png_set_tRNS_to_alpha(). 1798 "B" means the transformation is obtained by 1799 png_set_background(), or png_strip_alpha(). 1800 1801When an entry has multiple transforms listed all are required to cause the 1802right overall transformation. When two transforms are separated by a comma 1803either will do the job. When transforms are enclosed in [] the transform should 1804do the job but this is currently unimplemented - a different format will result 1805if the suggested transformations are used. 1806 1807In PNG files, the alpha channel in an image 1808is the level of opacity. If you need the alpha channel in an image to 1809be the level of transparency instead of opacity, you can invert the 1810alpha channel (or the tRNS chunk data) after it's read, so that 0 is 1811fully opaque and 255 (in 8-bit or paletted images) or 65535 (in 16-bit 1812images) is fully transparent, with 1813 1814 png_set_invert_alpha(png_ptr); 1815 1816PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as 1817they can, resulting in, for example, 8 pixels per byte for 1 bit 1818files. This code expands to 1 pixel per byte without changing the 1819values of the pixels: 1820 1821 if (bit_depth < 8) 1822 png_set_packing(png_ptr); 1823 1824PNG files have possible bit depths of 1, 2, 4, 8, and 16. All pixels 1825stored in a PNG image have been "scaled" or "shifted" up to the next 1826higher possible bit depth (e.g. from 5 bits/sample in the range [0,31] 1827to 8 bits/sample in the range [0, 255]). However, it is also possible 1828to convert the PNG pixel data back to the original bit depth of the 1829image. This call reduces the pixels back down to the original bit depth: 1830 1831 png_color_8p sig_bit; 1832 1833 if (png_get_sBIT(png_ptr, info_ptr, &sig_bit)) 1834 png_set_shift(png_ptr, sig_bit); 1835 1836PNG files store 3-color pixels in red, green, blue order. This code 1837changes the storage of the pixels to blue, green, red: 1838 1839 if (color_type == PNG_COLOR_TYPE_RGB || 1840 color_type == PNG_COLOR_TYPE_RGB_ALPHA) 1841 png_set_bgr(png_ptr); 1842 1843PNG files store RGB pixels packed into 3 or 6 bytes. This code expands them 1844into 4 or 8 bytes for windowing systems that need them in this format: 1845 1846 if (color_type == PNG_COLOR_TYPE_RGB) 1847 png_set_filler(png_ptr, filler, PNG_FILLER_BEFORE); 1848 1849where "filler" is the 8 or 16-bit number to fill with, and the location is 1850either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether 1851you want the filler before the RGB or after. This transformation 1852does not affect images that already have full alpha channels. To add an 1853opaque alpha channel, use filler=0xff or 0xffff and PNG_FILLER_AFTER which 1854will generate RGBA pixels. 1855 1856Note that png_set_filler() does not change the color type. If you want 1857to do that, you can add a true alpha channel with 1858 1859 if (color_type == PNG_COLOR_TYPE_RGB || 1860 color_type == PNG_COLOR_TYPE_GRAY) 1861 png_set_add_alpha(png_ptr, filler, PNG_FILLER_AFTER); 1862 1863where "filler" contains the alpha value to assign to each pixel. 1864This function was added in libpng-1.2.7. 1865 1866If you are reading an image with an alpha channel, and you need the 1867data as ARGB instead of the normal PNG format RGBA: 1868 1869 if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) 1870 png_set_swap_alpha(png_ptr); 1871 1872For some uses, you may want a grayscale image to be represented as 1873RGB. This code will do that conversion: 1874 1875 if (color_type == PNG_COLOR_TYPE_GRAY || 1876 color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 1877 png_set_gray_to_rgb(png_ptr); 1878 1879Conversely, you can convert an RGB or RGBA image to grayscale or grayscale 1880with alpha. 1881 1882 if (color_type == PNG_COLOR_TYPE_RGB || 1883 color_type == PNG_COLOR_TYPE_RGB_ALPHA) 1884 png_set_rgb_to_gray(png_ptr, error_action, 1885 double red_weight, double green_weight); 1886 1887 error_action = 1: silently do the conversion 1888 1889 error_action = 2: issue a warning if the original 1890 image has any pixel where 1891 red != green or red != blue 1892 1893 error_action = 3: issue an error and abort the 1894 conversion if the original 1895 image has any pixel where 1896 red != green or red != blue 1897 1898 red_weight: weight of red component 1899 1900 green_weight: weight of green component 1901 If either weight is negative, default 1902 weights are used. 1903 1904In the corresponding fixed point API the red_weight and green_weight values are 1905simply scaled by 100,000: 1906 1907 png_set_rgb_to_gray(png_ptr, error_action, 1908 png_fixed_point red_weight, 1909 png_fixed_point green_weight); 1910 1911If you have set error_action = 1 or 2, you can 1912later check whether the image really was gray, after processing 1913the image rows, with the png_get_rgb_to_gray_status(png_ptr) function. 1914It will return a png_byte that is zero if the image was gray or 19151 if there were any non-gray pixels. Background and sBIT data 1916will be silently converted to grayscale, using the green channel 1917data for sBIT, regardless of the error_action setting. 1918 1919The default values come from the PNG file cHRM chunk if present; otherwise, the 1920defaults correspond to the ITU-R recommendation 709, and also the sRGB color 1921space, as recommended in the Charles Poynton's Colour FAQ, 1922<http://www.poynton.com/>, in section 9: 1923 1924 <http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9> 1925 1926 Y = 0.2126 * R + 0.7152 * G + 0.0722 * B 1927 1928Previous versions of this document, 1998 through 2002, recommended a slightly 1929different formula: 1930 1931 Y = 0.212671 * R + 0.715160 * G + 0.072169 * B 1932 1933Libpng uses an integer approximation: 1934 1935 Y = (6968 * R + 23434 * G + 2366 * B)/32768 1936 1937The calculation is done in a linear colorspace, if the image gamma 1938can be determined. 1939 1940The png_set_background() function has been described already; it tells libpng to 1941composite images with alpha or simple transparency against the supplied 1942background color. For compatibility with versions of libpng earlier than 1943libpng-1.5.4 it is recommended that you call the function after reading the file 1944header, even if you don't want to use the color in a bKGD chunk, if one exists. 1945 1946If the PNG file contains a bKGD chunk (PNG_INFO_bKGD valid), 1947you may use this color, or supply another color more suitable for 1948the current display (e.g., the background color from a web page). You 1949need to tell libpng how the color is represented, both the format of the 1950component values in the color (the number of bits) and the gamma encoding of the 1951color. The function takes two arguments, background_gamma_mode and need_expand 1952to convey this information; however, only two combinations are likely to be 1953useful: 1954 1955 png_color_16 my_background; 1956 png_color_16p image_background; 1957 1958 if (png_get_bKGD(png_ptr, info_ptr, &image_background)) 1959 png_set_background(png_ptr, image_background, 1960 PNG_BACKGROUND_GAMMA_FILE, 1/*needs to be expanded*/, 1); 1961 else 1962 png_set_background(png_ptr, &my_background, 1963 PNG_BACKGROUND_GAMMA_SCREEN, 0/*do not expand*/, 1); 1964 1965The second call was described above - my_background is in the format of the 1966final, display, output produced by libpng. Because you now know the format of 1967the PNG it is possible to avoid the need to choose either 8-bit or 16-bit 1968output and to retain palette images (the palette colors will be modified 1969appropriately and the tRNS chunk removed.) However, if you are doing this, 1970take great care not to ask for transformations without checking first that 1971they apply! 1972 1973In the first call the background color has the original bit depth and color type 1974of the PNG file. So, for palette images the color is supplied as a palette 1975index and for low bit greyscale images the color is a reduced bit value in 1976image_background->gray. 1977 1978If you didn't call png_set_gamma() before reading the file header, for example 1979if you need your code to remain compatible with older versions of libpng prior 1980to libpng-1.5.4, this is the place to call it. 1981 1982Do not call it if you called png_set_alpha_mode(); doing so will damage the 1983settings put in place by png_set_alpha_mode(). (If png_set_alpha_mode() is 1984supported then you can certainly do png_set_gamma() before reading the PNG 1985header.) 1986 1987This API unconditionally sets the screen and file gamma values, so it will 1988override the value in the PNG file unless it is called before the PNG file 1989reading starts. For this reason you must always call it with the PNG file 1990value when you call it in this position: 1991 1992 if (png_get_gAMA(png_ptr, info_ptr, &file_gamma)) 1993 png_set_gamma(png_ptr, screen_gamma, file_gamma); 1994 1995 else 1996 png_set_gamma(png_ptr, screen_gamma, 0.45455); 1997 1998If you need to reduce an RGB file to a paletted file, or if a paletted 1999file has more entries then will fit on your screen, png_set_quantize() 2000will do that. Note that this is a simple match quantization that merely 2001finds the closest color available. This should work fairly well with 2002optimized palettes, but fairly badly with linear color cubes. If you 2003pass a palette that is larger than maximum_colors, the file will 2004reduce the number of colors in the palette so it will fit into 2005maximum_colors. If there is a histogram, libpng will use it to make 2006more intelligent choices when reducing the palette. If there is no 2007histogram, it may not do as good a job. 2008 2009 if (color_type & PNG_COLOR_MASK_COLOR) 2010 { 2011 if (png_get_valid(png_ptr, info_ptr, 2012 PNG_INFO_PLTE)) 2013 { 2014 png_uint_16p histogram = NULL; 2015 2016 png_get_hIST(png_ptr, info_ptr, 2017 &histogram); 2018 png_set_quantize(png_ptr, palette, num_palette, 2019 max_screen_colors, histogram, 1); 2020 } 2021 2022 else 2023 { 2024 png_color std_color_cube[MAX_SCREEN_COLORS] = 2025 { ... colors ... }; 2026 2027 png_set_quantize(png_ptr, std_color_cube, 2028 MAX_SCREEN_COLORS, MAX_SCREEN_COLORS, 2029 NULL,0); 2030 } 2031 } 2032 2033PNG files describe monochrome as black being zero and white being one. 2034The following code will reverse this (make black be one and white be 2035zero): 2036 2037 if (bit_depth == 1 && color_type == PNG_COLOR_TYPE_GRAY) 2038 png_set_invert_mono(png_ptr); 2039 2040This function can also be used to invert grayscale and gray-alpha images: 2041 2042 if (color_type == PNG_COLOR_TYPE_GRAY || 2043 color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 2044 png_set_invert_mono(png_ptr); 2045 2046PNG files store 16-bit pixels in network byte order (big-endian, 2047ie. most significant bits first). This code changes the storage to the 2048other way (little-endian, i.e. least significant bits first, the 2049way PCs store them): 2050 2051 if (bit_depth == 16) 2052 png_set_swap(png_ptr); 2053 2054If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you 2055need to change the order the pixels are packed into bytes, you can use: 2056 2057 if (bit_depth < 8) 2058 png_set_packswap(png_ptr); 2059 2060Finally, you can write your own transformation function if none of 2061the existing ones meets your needs. This is done by setting a callback 2062with 2063 2064 png_set_read_user_transform_fn(png_ptr, 2065 read_transform_fn); 2066 2067You must supply the function 2068 2069 void read_transform_fn(png_structp png_ptr, png_row_infop 2070 row_info, png_bytep data) 2071 2072See pngtest.c for a working example. Your function will be called 2073after all of the other transformations have been processed. Take care with 2074interlaced images if you do the interlace yourself - the width of the row is the 2075width in 'row_info', not the overall image width. 2076 2077If supported, libpng provides two information routines that you can use to find 2078where you are in processing the image: 2079 2080 png_get_current_pass_number(png_structp png_ptr); 2081 png_get_current_row_number(png_structp png_ptr); 2082 2083Don't try using these outside a transform callback - firstly they are only 2084supported if user transforms are supported, secondly they may well return 2085unexpected results unless the row is actually being processed at the moment they 2086are called. 2087 2088With interlaced 2089images the value returned is the row in the input sub-image image. Use 2090PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to 2091find the output pixel (x,y) given an interlaced sub-image pixel (row,col,pass). 2092 2093The discussion of interlace handling above contains more information on how to 2094use these values. 2095 2096You can also set up a pointer to a user structure for use by your 2097callback function, and you can inform libpng that your transform 2098function will change the number of channels or bit depth with the 2099function 2100 2101 png_set_user_transform_info(png_ptr, user_ptr, 2102 user_depth, user_channels); 2103 2104The user's application, not libpng, is responsible for allocating and 2105freeing any memory required for the user structure. 2106 2107You can retrieve the pointer via the function 2108png_get_user_transform_ptr(). For example: 2109 2110 voidp read_user_transform_ptr = 2111 png_get_user_transform_ptr(png_ptr); 2112 2113The last thing to handle is interlacing; this is covered in detail below, 2114but you must call the function here if you want libpng to handle expansion 2115of the interlaced image. 2116 2117 number_of_passes = png_set_interlace_handling(png_ptr); 2118 2119After setting the transformations, libpng can update your png_info 2120structure to reflect any transformations you've requested with this 2121call. 2122 2123 png_read_update_info(png_ptr, info_ptr); 2124 2125This is most useful to update the info structure's rowbytes 2126field so you can use it to allocate your image memory. This function 2127will also update your palette with the correct screen_gamma and 2128background if these have been given with the calls above. You may 2129only call png_read_update_info() once with a particular info_ptr. 2130 2131After you call png_read_update_info(), you can allocate any 2132memory you need to hold the image. The row data is simply 2133raw byte data for all forms of images. As the actual allocation 2134varies among applications, no example will be given. If you 2135are allocating one large chunk, you will need to build an 2136array of pointers to each row, as it will be needed for some 2137of the functions below. 2138 2139Remember: Before you call png_read_update_info(), the png_get_*() 2140functions return the values corresponding to the original PNG image. 2141After you call png_read_update_info the values refer to the image 2142that libpng will output. Consequently you must call all the png_set_ 2143functions before you call png_read_update_info(). This is particularly 2144important for png_set_interlace_handling() - if you are going to call 2145png_read_update_info() you must call png_set_interlace_handling() before 2146it unless you want to receive interlaced output. 2147 2148Reading image data 2149 2150After you've allocated memory, you can read the image data. 2151The simplest way to do this is in one function call. If you are 2152allocating enough memory to hold the whole image, you can just 2153call png_read_image() and libpng will read in all the image data 2154and put it in the memory area supplied. You will need to pass in 2155an array of pointers to each row. 2156 2157This function automatically handles interlacing, so you don't 2158need to call png_set_interlace_handling() (unless you call 2159png_read_update_info()) or call this function multiple times, or any 2160of that other stuff necessary with png_read_rows(). 2161 2162 png_read_image(png_ptr, row_pointers); 2163 2164where row_pointers is: 2165 2166 png_bytep row_pointers[height]; 2167 2168You can point to void or char or whatever you use for pixels. 2169 2170If you don't want to read in the whole image at once, you can 2171use png_read_rows() instead. If there is no interlacing (check 2172interlace_type == PNG_INTERLACE_NONE), this is simple: 2173 2174 png_read_rows(png_ptr, row_pointers, NULL, 2175 number_of_rows); 2176 2177where row_pointers is the same as in the png_read_image() call. 2178 2179If you are doing this just one row at a time, you can do this with 2180a single row_pointer instead of an array of row_pointers: 2181 2182 png_bytep row_pointer = row; 2183 png_read_row(png_ptr, row_pointer, NULL); 2184 2185If the file is interlaced (interlace_type != 0 in the IHDR chunk), things 2186get somewhat harder. The only current (PNG Specification version 1.2) 2187interlacing type for PNG is (interlace_type == PNG_INTERLACE_ADAM7); 2188a somewhat complicated 2D interlace scheme, known as Adam7, that 2189breaks down an image into seven smaller images of varying size, based 2190on an 8x8 grid. This number is defined (from libpng 1.5) as 2191PNG_INTERLACE_ADAM7_PASSES in png.h 2192 2193libpng can fill out those images or it can give them to you "as is". 2194It is almost always better to have libpng handle the interlacing for you. 2195If you want the images filled out, there are two ways to do that. The one 2196mentioned in the PNG specification is to expand each pixel to cover 2197those pixels that have not been read yet (the "rectangle" method). 2198This results in a blocky image for the first pass, which gradually 2199smooths out as more pixels are read. The other method is the "sparkle" 2200method, where pixels are drawn only in their final locations, with the 2201rest of the image remaining whatever colors they were initialized to 2202before the start of the read. The first method usually looks better, 2203but tends to be slower, as there are more pixels to put in the rows. 2204 2205If, as is likely, you want libpng to expand the images, call this before 2206calling png_start_read_image() or png_read_update_info(): 2207 2208 if (interlace_type == PNG_INTERLACE_ADAM7) 2209 number_of_passes 2210 = png_set_interlace_handling(png_ptr); 2211 2212This will return the number of passes needed. Currently, this is seven, 2213but may change if another interlace type is added. This function can be 2214called even if the file is not interlaced, where it will return one pass. 2215You then need to read the whole image 'number_of_passes' times. Each time 2216will distribute the pixels from the current pass to the correct place in 2217the output image, so you need to supply the same rows to png_read_rows in 2218each pass. 2219 2220If you are not going to display the image after each pass, but are 2221going to wait until the entire image is read in, use the sparkle 2222effect. This effect is faster and the end result of either method 2223is exactly the same. If you are planning on displaying the image 2224after each pass, the "rectangle" effect is generally considered the 2225better looking one. 2226 2227If you only want the "sparkle" effect, just call png_read_rows() as 2228normal, with the third parameter NULL. Make sure you make pass over 2229the image number_of_passes times, and you don't change the data in the 2230rows between calls. You can change the locations of the data, just 2231not the data. Each pass only writes the pixels appropriate for that 2232pass, and assumes the data from previous passes is still valid. 2233 2234 png_read_rows(png_ptr, row_pointers, NULL, 2235 number_of_rows); 2236 2237If you only want the first effect (the rectangles), do the same as 2238before except pass the row buffer in the third parameter, and leave 2239the second parameter NULL. 2240 2241 png_read_rows(png_ptr, NULL, row_pointers, 2242 number_of_rows); 2243 2244If you don't want libpng to handle the interlacing details, just call 2245png_read_rows() PNG_INTERLACE_ADAM7_PASSES times to read in all the images. 2246Each of the images is a valid image by itself; however, you will almost 2247certainly need to distribute the pixels from each sub-image to the 2248correct place. This is where everything gets very tricky. 2249 2250If you want to retrieve the separate images you must pass the correct 2251number of rows to each successive call of png_read_rows(). The calculation 2252gets pretty complicated for small images, where some sub-images may 2253not even exist because either their width or height ends up zero. 2254libpng provides two macros to help you in 1.5 and later versions: 2255 2256 png_uint_32 width = PNG_PASS_COLS(image_width, pass_number); 2257 png_uint_32 height = PNG_PASS_ROWS(image_height, pass_number); 2258 2259Respectively these tell you the width and height of the sub-image 2260corresponding to the numbered pass. 'pass' is in in the range 0 to 6 - 2261this can be confusing because the specification refers to the same passes 2262as 1 to 7! Be careful, you must check both the width and height before 2263calling png_read_rows() and not call it for that pass if either is zero. 2264 2265You can, of course, read each sub-image row by row. If you want to 2266produce optimal code to make a pixel-by-pixel transformation of an 2267interlaced image this is the best approach; read each row of each pass, 2268transform it, and write it out to a new interlaced image. 2269 2270If you want to de-interlace the image yourself libpng provides further 2271macros to help that tell you where to place the pixels in the output image. 2272Because the interlacing scheme is rectangular - sub-image pixels are always 2273arranged on a rectangular grid - all you need to know for each pass is the 2274starting column and row in the output image of the first pixel plus the 2275spacing between each pixel. As of libpng 1.5 there are four macros to 2276retrieve this information: 2277 2278 png_uint_32 x = PNG_PASS_START_COL(pass); 2279 png_uint_32 y = PNG_PASS_START_ROW(pass); 2280 png_uint_32 xStep = 1U << PNG_PASS_COL_SHIFT(pass); 2281 png_uint_32 yStep = 1U << PNG_PASS_ROW_SHIFT(pass); 2282 2283These allow you to write the obvious loop: 2284 2285 png_uint_32 input_y = 0; 2286 png_uint_32 output_y = PNG_PASS_START_ROW(pass); 2287 2288 while (output_y < output_image_height) 2289 { 2290 png_uint_32 input_x = 0; 2291 png_uint_32 output_x = PNG_PASS_START_COL(pass); 2292 2293 while (output_x < output_image_width) 2294 { 2295 image[output_y][output_x] = 2296 subimage[pass][input_y][input_x++]; 2297 2298 output_x += xStep; 2299 } 2300 2301 ++input_y; 2302 output_y += yStep; 2303 } 2304 2305Notice that the steps between successive output rows and columns are 2306returned as shifts. This is possible because the pixels in the subimages 2307are always a power of 2 apart - 1, 2, 4 or 8 pixels - in the original 2308image. In practice you may need to directly calculate the output coordinate 2309given an input coordinate. libpng provides two further macros for this 2310purpose: 2311 2312 png_uint_32 output_x = PNG_COL_FROM_PASS_COL(input_x, pass); 2313 png_uint_32 output_y = PNG_ROW_FROM_PASS_ROW(input_y, pass); 2314 2315Finally a pair of macros are provided to tell you if a particular image 2316row or column appears in a given pass: 2317 2318 int col_in_pass = PNG_COL_IN_INTERLACE_PASS(output_x, pass); 2319 int row_in_pass = PNG_ROW_IN_INTERLACE_PASS(output_y, pass); 2320 2321Bear in mind that you will probably also need to check the width and height 2322of the pass in addition to the above to be sure the pass even exists! 2323 2324With any luck you are convinced by now that you don't want to do your own 2325interlace handling. In reality normally the only good reason for doing this 2326is if you are processing PNG files on a pixel-by-pixel basis and don't want 2327to load the whole file into memory when it is interlaced. 2328 2329libpng includes a test program, pngvalid, that illustrates reading and 2330writing of interlaced images. If you can't get interlacing to work in your 2331code and don't want to leave it to libpng (the recommended approach), see 2332how pngvalid.c does it. 2333 2334Finishing a sequential read 2335 2336After you are finished reading the image through the 2337low-level interface, you can finish reading the file. 2338 2339If you want to use a different crc action for handling CRC errors in 2340chunks after the image data, you can call png_set_crc_action() 2341again at this point. 2342 2343If you are interested in comments or time, which may be stored either 2344before or after the image data, you should pass the separate png_info 2345struct if you want to keep the comments from before and after the image 2346separate. 2347 2348 png_infop end_info = png_create_info_struct(png_ptr); 2349 2350 if (!end_info) 2351 { 2352 png_destroy_read_struct(&png_ptr, &info_ptr, 2353 (png_infopp)NULL); 2354 return (ERROR); 2355 } 2356 2357 png_read_end(png_ptr, end_info); 2358 2359If you are not interested, you should still call png_read_end() 2360but you can pass NULL, avoiding the need to create an end_info structure. 2361If you do this, libpng will not process any chunks after IDAT other than 2362skipping over them and perhaps (depending on whether you have called 2363png_set_crc_action) checking their CRCs while looking for the IEND chunk. 2364 2365 png_read_end(png_ptr, (png_infop)NULL); 2366 2367If you don't call png_read_end(), then your file pointer will be 2368left pointing to the first chunk after the last IDAT, which is probably 2369not what you want if you expect to read something beyond the end of 2370the PNG datastream. 2371 2372When you are done, you can free all memory allocated by libpng like this: 2373 2374 png_destroy_read_struct(&png_ptr, &info_ptr, 2375 &end_info); 2376 2377or, if you didn't create an end_info structure, 2378 2379 png_destroy_read_struct(&png_ptr, &info_ptr, 2380 (png_infopp)NULL); 2381 2382It is also possible to individually free the info_ptr members that 2383point to libpng-allocated storage with the following function: 2384 2385 png_free_data(png_ptr, info_ptr, mask, seq) 2386 2387 mask - identifies data to be freed, a mask 2388 containing the bitwise OR of one or 2389 more of 2390 PNG_FREE_PLTE, PNG_FREE_TRNS, 2391 PNG_FREE_HIST, PNG_FREE_ICCP, 2392 PNG_FREE_PCAL, PNG_FREE_ROWS, 2393 PNG_FREE_SCAL, PNG_FREE_SPLT, 2394 PNG_FREE_TEXT, PNG_FREE_UNKN, 2395 or simply PNG_FREE_ALL 2396 2397 seq - sequence number of item to be freed 2398 (-1 for all items) 2399 2400This function may be safely called when the relevant storage has 2401already been freed, or has not yet been allocated, or was allocated 2402by the user and not by libpng, and will in those cases do nothing. 2403The "seq" parameter is ignored if only one item of the selected data 2404type, such as PLTE, is allowed. If "seq" is not -1, and multiple items 2405are allowed for the data type identified in the mask, such as text or 2406sPLT, only the n'th item in the structure is freed, where n is "seq". 2407 2408The default behavior is only to free data that was allocated internally 2409by libpng. This can be changed, so that libpng will not free the data, 2410or so that it will free data that was allocated by the user with png_malloc() 2411or png_calloc() and passed in via a png_set_*() function, with 2412 2413 png_data_freer(png_ptr, info_ptr, freer, mask) 2414 2415 freer - one of 2416 PNG_DESTROY_WILL_FREE_DATA 2417 PNG_SET_WILL_FREE_DATA 2418 PNG_USER_WILL_FREE_DATA 2419 2420 mask - which data elements are affected 2421 same choices as in png_free_data() 2422 2423This function only affects data that has already been allocated. 2424You can call this function after reading the PNG data but before calling 2425any png_set_*() functions, to control whether the user or the png_set_*() 2426function is responsible for freeing any existing data that might be present, 2427and again after the png_set_*() functions to control whether the user 2428or png_destroy_*() is supposed to free the data. When the user assumes 2429responsibility for libpng-allocated data, the application must use 2430png_free() to free it, and when the user transfers responsibility to libpng 2431for data that the user has allocated, the user must have used png_malloc() 2432or png_calloc() to allocate it. 2433 2434If you allocated your row_pointers in a single block, as suggested above in 2435the description of the high level read interface, you must not transfer 2436responsibility for freeing it to the png_set_rows or png_read_destroy function, 2437because they would also try to free the individual row_pointers[i]. 2438 2439If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword 2440separately, do not transfer responsibility for freeing text_ptr to libpng, 2441because when libpng fills a png_text structure it combines these members with 2442the key member, and png_free_data() will free only text_ptr.key. Similarly, 2443if you transfer responsibility for free'ing text_ptr from libpng to your 2444application, your application must not separately free those members. 2445 2446The png_free_data() function will turn off the "valid" flag for anything 2447it frees. If you need to turn the flag off for a chunk that was freed by 2448your application instead of by libpng, you can use 2449 2450 png_set_invalid(png_ptr, info_ptr, mask); 2451 2452 mask - identifies the chunks to be made invalid, 2453 containing the bitwise OR of one or 2454 more of 2455 PNG_INFO_gAMA, PNG_INFO_sBIT, 2456 PNG_INFO_cHRM, PNG_INFO_PLTE, 2457 PNG_INFO_tRNS, PNG_INFO_bKGD, 2458 PNG_INFO_hIST, PNG_INFO_pHYs, 2459 PNG_INFO_oFFs, PNG_INFO_tIME, 2460 PNG_INFO_pCAL, PNG_INFO_sRGB, 2461 PNG_INFO_iCCP, PNG_INFO_sPLT, 2462 PNG_INFO_sCAL, PNG_INFO_IDAT 2463 2464For a more compact example of reading a PNG image, see the file example.c. 2465 2466Reading PNG files progressively 2467 2468The progressive reader is slightly different from the non-progressive 2469reader. Instead of calling png_read_info(), png_read_rows(), and 2470png_read_end(), you make one call to png_process_data(), which calls 2471callbacks when it has the info, a row, or the end of the image. You 2472set up these callbacks with png_set_progressive_read_fn(). You don't 2473have to worry about the input/output functions of libpng, as you are 2474giving the library the data directly in png_process_data(). I will 2475assume that you have read the section on reading PNG files above, 2476so I will only highlight the differences (although I will show 2477all of the code). 2478 2479png_structp png_ptr; 2480png_infop info_ptr; 2481 2482 /* An example code fragment of how you would 2483 initialize the progressive reader in your 2484 application. */ 2485 int 2486 initialize_png_reader() 2487 { 2488 png_ptr = png_create_read_struct 2489 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, 2490 user_error_fn, user_warning_fn); 2491 2492 if (!png_ptr) 2493 return (ERROR); 2494 2495 info_ptr = png_create_info_struct(png_ptr); 2496 2497 if (!info_ptr) 2498 { 2499 png_destroy_read_struct(&png_ptr, 2500 (png_infopp)NULL, (png_infopp)NULL); 2501 return (ERROR); 2502 } 2503 2504 if (setjmp(png_jmpbuf(png_ptr))) 2505 { 2506 png_destroy_read_struct(&png_ptr, &info_ptr, 2507 (png_infopp)NULL); 2508 return (ERROR); 2509 } 2510 2511 /* This one's new. You can provide functions 2512 to be called when the header info is valid, 2513 when each row is completed, and when the image 2514 is finished. If you aren't using all functions, 2515 you can specify NULL parameters. Even when all 2516 three functions are NULL, you need to call 2517 png_set_progressive_read_fn(). You can use 2518 any struct as the user_ptr (cast to a void pointer 2519 for the function call), and retrieve the pointer 2520 from inside the callbacks using the function 2521 2522 png_get_progressive_ptr(png_ptr); 2523 2524 which will return a void pointer, which you have 2525 to cast appropriately. 2526 */ 2527 png_set_progressive_read_fn(png_ptr, (void *)user_ptr, 2528 info_callback, row_callback, end_callback); 2529 2530 return 0; 2531 } 2532 2533 /* A code fragment that you call as you receive blocks 2534 of data */ 2535 int 2536 process_data(png_bytep buffer, png_uint_32 length) 2537 { 2538 if (setjmp(png_jmpbuf(png_ptr))) 2539 { 2540 png_destroy_read_struct(&png_ptr, &info_ptr, 2541 (png_infopp)NULL); 2542 return (ERROR); 2543 } 2544 2545 /* This one's new also. Simply give it a chunk 2546 of data from the file stream (in order, of 2547 course). On machines with segmented memory 2548 models machines, don't give it any more than 2549 64K. The library seems to run fine with sizes 2550 of 4K. Although you can give it much less if 2551 necessary (I assume you can give it chunks of 2552 1 byte, I haven't tried less then 256 bytes 2553 yet). When this function returns, you may 2554 want to display any rows that were generated 2555 in the row callback if you don't already do 2556 so there. 2557 */ 2558 png_process_data(png_ptr, info_ptr, buffer, length); 2559 2560 /* At this point you can call png_process_data_skip if 2561 you want to handle data the library will skip yourself; 2562 it simply returns the number of bytes to skip (and stops 2563 libpng skipping that number of bytes on the next 2564 png_process_data call). 2565 return 0; 2566 } 2567 2568 /* This function is called (as set by 2569 png_set_progressive_read_fn() above) when enough data 2570 has been supplied so all of the header has been 2571 read. 2572 */ 2573 void 2574 info_callback(png_structp png_ptr, png_infop info) 2575 { 2576 /* Do any setup here, including setting any of 2577 the transformations mentioned in the Reading 2578 PNG files section. For now, you _must_ call 2579 either png_start_read_image() or 2580 png_read_update_info() after all the 2581 transformations are set (even if you don't set 2582 any). You may start getting rows before 2583 png_process_data() returns, so this is your 2584 last chance to prepare for that. 2585 2586 This is where you turn on interlace handling, 2587 assuming you don't want to do it yourself. 2588 2589 If you need to you can stop the processing of 2590 your original input data at this point by calling 2591 png_process_data_pause. This returns the number 2592 of unprocessed bytes from the last png_process_data 2593 call - it is up to you to ensure that the next call 2594 sees these bytes again. If you don't want to bother 2595 with this you can get libpng to cache the unread 2596 bytes by setting the 'save' parameter (see png.h) but 2597 then libpng will have to copy the data internally. 2598 */ 2599 } 2600 2601 /* This function is called when each row of image 2602 data is complete */ 2603 void 2604 row_callback(png_structp png_ptr, png_bytep new_row, 2605 png_uint_32 row_num, int pass) 2606 { 2607 /* If the image is interlaced, and you turned 2608 on the interlace handler, this function will 2609 be called for every row in every pass. Some 2610 of these rows will not be changed from the 2611 previous pass. When the row is not changed, 2612 the new_row variable will be NULL. The rows 2613 and passes are called in order, so you don't 2614 really need the row_num and pass, but I'm 2615 supplying them because it may make your life 2616 easier. 2617 2618 If you did not turn on interlace handling then 2619 the callback is called for each row of each 2620 sub-image when the image is interlaced. In this 2621 case 'row_num' is the row in the sub-image, not 2622 the row in the output image as it is in all other 2623 cases. 2624 2625 For the non-NULL rows of interlaced images when 2626 you have switched on libpng interlace handling, 2627 you must call png_progressive_combine_row() 2628 passing in the row and the old row. You can 2629 call this function for NULL rows (it will just 2630 return) and for non-interlaced images (it just 2631 does the memcpy for you) if it will make the 2632 code easier. Thus, you can just do this for 2633 all cases if you switch on interlace handling; 2634 */ 2635 2636 png_progressive_combine_row(png_ptr, old_row, 2637 new_row); 2638 2639 /* where old_row is what was displayed for 2640 previously for the row. Note that the first 2641 pass (pass == 0, really) will completely cover 2642 the old row, so the rows do not have to be 2643 initialized. After the first pass (and only 2644 for interlaced images), you will have to pass 2645 the current row, and the function will combine 2646 the old row and the new row. 2647 2648 You can also call png_process_data_pause in this 2649 callback - see above. 2650 */ 2651 } 2652 2653 void 2654 end_callback(png_structp png_ptr, png_infop info) 2655 { 2656 /* This function is called after the whole image 2657 has been read, including any chunks after the 2658 image (up to and including the IEND). You 2659 will usually have the same info chunk as you 2660 had in the header, although some data may have 2661 been added to the comments and time fields. 2662 2663 Most people won't do much here, perhaps setting 2664 a flag that marks the image as finished. 2665 */ 2666 } 2667 2668 2669 2670IV. Writing 2671 2672Much of this is very similar to reading. However, everything of 2673importance is repeated here, so you won't have to constantly look 2674back up in the reading section to understand writing. 2675 2676Setup 2677 2678You will want to do the I/O initialization before you get into libpng, 2679so if it doesn't work, you don't have anything to undo. If you are not 2680using the standard I/O functions, you will need to replace them with 2681custom writing functions. See the discussion under Customizing libpng. 2682 2683 FILE *fp = fopen(file_name, "wb"); 2684 2685 if (!fp) 2686 return (ERROR); 2687 2688Next, png_struct and png_info need to be allocated and initialized. 2689As these can be both relatively large, you may not want to store these 2690on the stack, unless you have stack space to spare. Of course, you 2691will want to check if they return NULL. If you are also reading, 2692you won't want to name your read structure and your write structure 2693both "png_ptr"; you can call them anything you like, such as 2694"read_ptr" and "write_ptr". Look at pngtest.c, for example. 2695 2696 png_structp png_ptr = png_create_write_struct 2697 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, 2698 user_error_fn, user_warning_fn); 2699 2700 if (!png_ptr) 2701 return (ERROR); 2702 2703 png_infop info_ptr = png_create_info_struct(png_ptr); 2704 if (!info_ptr) 2705 { 2706 png_destroy_write_struct(&png_ptr, 2707 (png_infopp)NULL); 2708 return (ERROR); 2709 } 2710 2711If you want to use your own memory allocation routines, 2712define PNG_USER_MEM_SUPPORTED and use 2713png_create_write_struct_2() instead of png_create_write_struct(): 2714 2715 png_structp png_ptr = png_create_write_struct_2 2716 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, 2717 user_error_fn, user_warning_fn, (png_voidp) 2718 user_mem_ptr, user_malloc_fn, user_free_fn); 2719 2720After you have these structures, you will need to set up the 2721error handling. When libpng encounters an error, it expects to 2722longjmp() back to your routine. Therefore, you will need to call 2723setjmp() and pass the png_jmpbuf(png_ptr). If you 2724write the file from different routines, you will need to update 2725the png_jmpbuf(png_ptr) every time you enter a new routine that will 2726call a png_*() function. See your documentation of setjmp/longjmp 2727for your compiler for more information on setjmp/longjmp. See 2728the discussion on libpng error handling in the Customizing Libpng 2729section below for more information on the libpng error handling. 2730 2731 if (setjmp(png_jmpbuf(png_ptr))) 2732 { 2733 png_destroy_write_struct(&png_ptr, &info_ptr); 2734 fclose(fp); 2735 return (ERROR); 2736 } 2737 ... 2738 return; 2739 2740If you would rather avoid the complexity of setjmp/longjmp issues, 2741you can compile libpng with PNG_NO_SETJMP, in which case 2742errors will result in a call to PNG_ABORT() which defaults to abort(). 2743 2744You can #define PNG_ABORT() to a function that does something 2745more useful than abort(), as long as your function does not 2746return. 2747 2748Checking for invalid palette index on write was added at libpng 27491.5.10. If a pixel contains an invalid (out-of-range) index libpng issues 2750a benign error. This is enabled by default because this condition is an 2751error according to the PNG specification, Clause 11.3.2, but the error can 2752be ignored in each png_ptr with 2753 2754 png_set_check_for_invalid_index(png_ptr, 0); 2755 2756If the error is ignored, or if png_benign_error() treats it as a warning, 2757any invalid pixels are written as-is by the encoder, resulting in an 2758invalid PNG datastream as output. In this case the application is 2759responsible for ensuring that the pixel indexes are in range when it writes 2760a PLTE chunk with fewer entries than the bit depth would allow. 2761 2762Now you need to set up the output code. The default for libpng is to 2763use the C function fwrite(). If you use this, you will need to pass a 2764valid FILE * in the function png_init_io(). Be sure that the file is 2765opened in binary mode. Again, if you wish to handle writing data in 2766another way, see the discussion on libpng I/O handling in the Customizing 2767Libpng section below. 2768 2769 png_init_io(png_ptr, fp); 2770 2771If you are embedding your PNG into a datastream such as MNG, and don't 2772want libpng to write the 8-byte signature, or if you have already 2773written the signature in your application, use 2774 2775 png_set_sig_bytes(png_ptr, 8); 2776 2777to inform libpng that it should not write a signature. 2778 2779Write callbacks 2780 2781At this point, you can set up a callback function that will be 2782called after each row has been written, which you can use to control 2783a progress meter or the like. It's demonstrated in pngtest.c. 2784You must supply a function 2785 2786 void write_row_callback(png_structp png_ptr, png_uint_32 row, 2787 int pass); 2788 { 2789 /* put your code here */ 2790 } 2791 2792(You can give it another name that you like instead of "write_row_callback") 2793 2794To inform libpng about your function, use 2795 2796 png_set_write_status_fn(png_ptr, write_row_callback); 2797 2798When this function is called the row has already been completely processed and 2799it has also been written out. The 'row' and 'pass' refer to the next row to be 2800handled. For the 2801non-interlaced case the row that was just handled is simply one less than the 2802passed in row number, and pass will always be 0. For the interlaced case the 2803same applies unless the row value is 0, in which case the row just handled was 2804the last one from one of the preceding passes. Because interlacing may skip a 2805pass you cannot be sure that the preceding pass is just 'pass-1', if you really 2806need to know what the last pass is record (row,pass) from the callback and use 2807the last recorded value each time. 2808 2809As with the user transform you can find the output row using the 2810PNG_ROW_FROM_PASS_ROW macro. 2811 2812You now have the option of modifying how the compression library will 2813run. The following functions are mainly for testing, but may be useful 2814in some cases, like if you need to write PNG files extremely fast and 2815are willing to give up some compression, or if you want to get the 2816maximum possible compression at the expense of slower writing. If you 2817have no special needs in this area, let the library do what it wants by 2818not calling this function at all, as it has been tuned to deliver a good 2819speed/compression ratio. The second parameter to png_set_filter() is 2820the filter method, for which the only valid values are 0 (as of the 2821July 1999 PNG specification, version 1.2) or 64 (if you are writing 2822a PNG datastream that is to be embedded in a MNG datastream). The third 2823parameter is a flag that indicates which filter type(s) are to be tested 2824for each scanline. See the PNG specification for details on the specific 2825filter types. 2826 2827 2828 /* turn on or off filtering, and/or choose 2829 specific filters. You can use either a single 2830 PNG_FILTER_VALUE_NAME or the bitwise OR of one 2831 or more PNG_FILTER_NAME masks. 2832 */ 2833 png_set_filter(png_ptr, 0, 2834 PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE | 2835 PNG_FILTER_SUB | PNG_FILTER_VALUE_SUB | 2836 PNG_FILTER_UP | PNG_FILTER_VALUE_UP | 2837 PNG_FILTER_AVG | PNG_FILTER_VALUE_AVG | 2838 PNG_FILTER_PAETH | PNG_FILTER_VALUE_PAETH| 2839 PNG_ALL_FILTERS); 2840 2841If an application wants to start and stop using particular filters during 2842compression, it should start out with all of the filters (to ensure that 2843the previous row of pixels will be stored in case it's needed later), 2844and then add and remove them after the start of compression. 2845 2846If you are writing a PNG datastream that is to be embedded in a MNG 2847datastream, the second parameter can be either 0 or 64. 2848 2849The png_set_compression_*() functions interface to the zlib compression 2850library, and should mostly be ignored unless you really know what you are 2851doing. The only generally useful call is png_set_compression_level() 2852which changes how much time zlib spends on trying to compress the image 2853data. See the Compression Library (zlib.h and algorithm.txt, distributed 2854with zlib) for details on the compression levels. 2855 2856 #include zlib.h 2857 2858 /* Set the zlib compression level */ 2859 png_set_compression_level(png_ptr, 2860 Z_BEST_COMPRESSION); 2861 2862 /* Set other zlib parameters for compressing IDAT */ 2863 png_set_compression_mem_level(png_ptr, 8); 2864 png_set_compression_strategy(png_ptr, 2865 Z_DEFAULT_STRATEGY); 2866 png_set_compression_window_bits(png_ptr, 15); 2867 png_set_compression_method(png_ptr, 8); 2868 png_set_compression_buffer_size(png_ptr, 8192) 2869 2870 /* Set zlib parameters for text compression 2871 * If you don't call these, the parameters 2872 * fall back on those defined for IDAT chunks 2873 */ 2874 png_set_text_compression_mem_level(png_ptr, 8); 2875 png_set_text_compression_strategy(png_ptr, 2876 Z_DEFAULT_STRATEGY); 2877 png_set_text_compression_window_bits(png_ptr, 15); 2878 png_set_text_compression_method(png_ptr, 8); 2879 2880Setting the contents of info for output 2881 2882You now need to fill in the png_info structure with all the data you 2883wish to write before the actual image. Note that the only thing you 2884are allowed to write after the image is the text chunks and the time 2885chunk (as of PNG Specification 1.2, anyway). See png_write_end() and 2886the latest PNG specification for more information on that. If you 2887wish to write them before the image, fill them in now, and flag that 2888data as being valid. If you want to wait until after the data, don't 2889fill them until png_write_end(). For all the fields in png_info and 2890their data types, see png.h. For explanations of what the fields 2891contain, see the PNG specification. 2892 2893Some of the more important parts of the png_info are: 2894 2895 png_set_IHDR(png_ptr, info_ptr, width, height, 2896 bit_depth, color_type, interlace_type, 2897 compression_type, filter_method) 2898 2899 width - holds the width of the image 2900 in pixels (up to 2^31). 2901 2902 height - holds the height of the image 2903 in pixels (up to 2^31). 2904 2905 bit_depth - holds the bit depth of one of the 2906 image channels. 2907 (valid values are 1, 2, 4, 8, 16 2908 and depend also on the 2909 color_type. See also significant 2910 bits (sBIT) below). 2911 2912 color_type - describes which color/alpha 2913 channels are present. 2914 PNG_COLOR_TYPE_GRAY 2915 (bit depths 1, 2, 4, 8, 16) 2916 PNG_COLOR_TYPE_GRAY_ALPHA 2917 (bit depths 8, 16) 2918 PNG_COLOR_TYPE_PALETTE 2919 (bit depths 1, 2, 4, 8) 2920 PNG_COLOR_TYPE_RGB 2921 (bit_depths 8, 16) 2922 PNG_COLOR_TYPE_RGB_ALPHA 2923 (bit_depths 8, 16) 2924 2925 PNG_COLOR_MASK_PALETTE 2926 PNG_COLOR_MASK_COLOR 2927 PNG_COLOR_MASK_ALPHA 2928 2929 interlace_type - PNG_INTERLACE_NONE or 2930 PNG_INTERLACE_ADAM7 2931 2932 compression_type - (must be 2933 PNG_COMPRESSION_TYPE_DEFAULT) 2934 2935 filter_method - (must be PNG_FILTER_TYPE_DEFAULT 2936 or, if you are writing a PNG to 2937 be embedded in a MNG datastream, 2938 can also be 2939 PNG_INTRAPIXEL_DIFFERENCING) 2940 2941If you call png_set_IHDR(), the call must appear before any of the 2942other png_set_*() functions, because they might require access to some of 2943the IHDR settings. The remaining png_set_*() functions can be called 2944in any order. 2945 2946If you wish, you can reset the compression_type, interlace_type, or 2947filter_method later by calling png_set_IHDR() again; if you do this, the 2948width, height, bit_depth, and color_type must be the same in each call. 2949 2950 png_set_PLTE(png_ptr, info_ptr, palette, 2951 num_palette); 2952 2953 palette - the palette for the file 2954 (array of png_color) 2955 num_palette - number of entries in the palette 2956 2957 png_set_gAMA(png_ptr, info_ptr, file_gamma); 2958 png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma); 2959 2960 file_gamma - the gamma at which the image was 2961 created (PNG_INFO_gAMA) 2962 2963 int_file_gamma - 100,000 times the gamma at which 2964 the image was created 2965 2966 png_set_cHRM(png_ptr, info_ptr, white_x, white_y, red_x, red_y, 2967 green_x, green_y, blue_x, blue_y) 2968 png_set_cHRM_XYZ(png_ptr, info_ptr, red_X, red_Y, red_Z, green_X, 2969 green_Y, green_Z, blue_X, blue_Y, blue_Z) 2970 png_set_cHRM_fixed(png_ptr, info_ptr, int_white_x, int_white_y, 2971 int_red_x, int_red_y, int_green_x, int_green_y, 2972 int_blue_x, int_blue_y) 2973 png_set_cHRM_XYZ_fixed(png_ptr, info_ptr, int_red_X, int_red_Y, 2974 int_red_Z, int_green_X, int_green_Y, int_green_Z, 2975 int_blue_X, int_blue_Y, int_blue_Z) 2976 2977 {white,red,green,blue}_{x,y} 2978 A color space encoding specified using the chromaticities 2979 of the end points and the white point. 2980 2981 {red,green,blue}_{X,Y,Z} 2982 A color space encoding specified using the encoding end 2983 points - the CIE tristimulus specification of the intended 2984 color of the red, green and blue channels in the PNG RGB 2985 data. The white point is simply the sum of the three end 2986 points. 2987 2988 png_set_sRGB(png_ptr, info_ptr, srgb_intent); 2989 2990 srgb_intent - the rendering intent 2991 (PNG_INFO_sRGB) The presence of 2992 the sRGB chunk means that the pixel 2993 data is in the sRGB color space. 2994 This chunk also implies specific 2995 values of gAMA and cHRM. Rendering 2996 intent is the CSS-1 property that 2997 has been defined by the International 2998 Color Consortium 2999 (http://www.color.org). 3000 It can be one of 3001 PNG_sRGB_INTENT_SATURATION, 3002 PNG_sRGB_INTENT_PERCEPTUAL, 3003 PNG_sRGB_INTENT_ABSOLUTE, or 3004 PNG_sRGB_INTENT_RELATIVE. 3005 3006 3007 png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, 3008 srgb_intent); 3009 3010 srgb_intent - the rendering intent 3011 (PNG_INFO_sRGB) The presence of the 3012 sRGB chunk means that the pixel 3013 data is in the sRGB color space. 3014 This function also causes gAMA and 3015 cHRM chunks with the specific values 3016 that are consistent with sRGB to be 3017 written. 3018 3019 png_set_iCCP(png_ptr, info_ptr, name, compression_type, 3020 profile, proflen); 3021 3022 name - The profile name. 3023 3024 compression_type - The compression type; always 3025 PNG_COMPRESSION_TYPE_BASE for PNG 1.0. 3026 You may give NULL to this argument to 3027 ignore it. 3028 3029 profile - International Color Consortium color 3030 profile data. May contain NULs. 3031 3032 proflen - length of profile data in bytes. 3033 3034 png_set_sBIT(png_ptr, info_ptr, sig_bit); 3035 3036 sig_bit - the number of significant bits for 3037 (PNG_INFO_sBIT) each of the gray, red, 3038 green, and blue channels, whichever are 3039 appropriate for the given color type 3040 (png_color_16) 3041 3042 png_set_tRNS(png_ptr, info_ptr, trans_alpha, 3043 num_trans, trans_color); 3044 3045 trans_alpha - array of alpha (transparency) 3046 entries for palette (PNG_INFO_tRNS) 3047 3048 num_trans - number of transparent entries 3049 (PNG_INFO_tRNS) 3050 3051 trans_color - graylevel or color sample values 3052 (in order red, green, blue) of the 3053 single transparent color for 3054 non-paletted images (PNG_INFO_tRNS) 3055 3056 png_set_hIST(png_ptr, info_ptr, hist); 3057 3058 hist - histogram of palette (array of 3059 png_uint_16) (PNG_INFO_hIST) 3060 3061 png_set_tIME(png_ptr, info_ptr, mod_time); 3062 3063 mod_time - time image was last modified 3064 (PNG_VALID_tIME) 3065 3066 png_set_bKGD(png_ptr, info_ptr, background); 3067 3068 background - background color (of type 3069 png_color_16p) (PNG_VALID_bKGD) 3070 3071 png_set_text(png_ptr, info_ptr, text_ptr, num_text); 3072 3073 text_ptr - array of png_text holding image 3074 comments 3075 3076 text_ptr[i].compression - type of compression used 3077 on "text" PNG_TEXT_COMPRESSION_NONE 3078 PNG_TEXT_COMPRESSION_zTXt 3079 PNG_ITXT_COMPRESSION_NONE 3080 PNG_ITXT_COMPRESSION_zTXt 3081 text_ptr[i].key - keyword for comment. Must contain 3082 1-79 characters. 3083 text_ptr[i].text - text comments for current 3084 keyword. Can be NULL or empty. 3085 text_ptr[i].text_length - length of text string, 3086 after decompression, 0 for iTXt 3087 text_ptr[i].itxt_length - length of itxt string, 3088 after decompression, 0 for tEXt/zTXt 3089 text_ptr[i].lang - language of comment (NULL or 3090 empty for unknown). 3091 text_ptr[i].translated_keyword - keyword in UTF-8 (NULL 3092 or empty for unknown). 3093 3094 Note that the itxt_length, lang, and lang_key 3095 members of the text_ptr structure only exist when the 3096 library is built with iTXt chunk support. Prior to 3097 libpng-1.4.0 the library was built by default without 3098 iTXt support. Also note that when iTXt is supported, 3099 they contain NULL pointers when the "compression" 3100 field contains PNG_TEXT_COMPRESSION_NONE or 3101 PNG_TEXT_COMPRESSION_zTXt. 3102 3103 num_text - number of comments 3104 3105 png_set_sPLT(png_ptr, info_ptr, &palette_ptr, 3106 num_spalettes); 3107 3108 palette_ptr - array of png_sPLT_struct structures 3109 to be added to the list of palettes 3110 in the info structure. 3111 num_spalettes - number of palette structures to be 3112 added. 3113 3114 png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, 3115 unit_type); 3116 3117 offset_x - positive offset from the left 3118 edge of the screen 3119 3120 offset_y - positive offset from the top 3121 edge of the screen 3122 3123 unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER 3124 3125 png_set_pHYs(png_ptr, info_ptr, res_x, res_y, 3126 unit_type); 3127 3128 res_x - pixels/unit physical resolution 3129 in x direction 3130 3131 res_y - pixels/unit physical resolution 3132 in y direction 3133 3134 unit_type - PNG_RESOLUTION_UNKNOWN, 3135 PNG_RESOLUTION_METER 3136 3137 png_set_sCAL(png_ptr, info_ptr, unit, width, height) 3138 3139 unit - physical scale units (an integer) 3140 3141 width - width of a pixel in physical scale units 3142 3143 height - height of a pixel in physical scale units 3144 (width and height are doubles) 3145 3146 png_set_sCAL_s(png_ptr, info_ptr, unit, width, height) 3147 3148 unit - physical scale units (an integer) 3149 3150 width - width of a pixel in physical scale units 3151 expressed as a string 3152 3153 height - height of a pixel in physical scale units 3154 (width and height are strings like "2.54") 3155 3156 png_set_unknown_chunks(png_ptr, info_ptr, &unknowns, 3157 num_unknowns) 3158 3159 unknowns - array of png_unknown_chunk 3160 structures holding unknown chunks 3161 unknowns[i].name - name of unknown chunk 3162 unknowns[i].data - data of unknown chunk 3163 unknowns[i].size - size of unknown chunk's data 3164 unknowns[i].location - position to write chunk in file 3165 0: do not write chunk 3166 PNG_HAVE_IHDR: before PLTE 3167 PNG_HAVE_PLTE: before IDAT 3168 PNG_AFTER_IDAT: after IDAT 3169 3170The "location" member is set automatically according to 3171what part of the output file has already been written. 3172You can change its value after calling png_set_unknown_chunks() 3173as demonstrated in pngtest.c. Within each of the "locations", 3174the chunks are sequenced according to their position in the 3175structure (that is, the value of "i", which is the order in which 3176the chunk was either read from the input file or defined with 3177png_set_unknown_chunks). 3178 3179A quick word about text and num_text. text is an array of png_text 3180structures. num_text is the number of valid structures in the array. 3181Each png_text structure holds a language code, a keyword, a text value, 3182and a compression type. 3183 3184The compression types have the same valid numbers as the compression 3185types of the image data. Currently, the only valid number is zero. 3186However, you can store text either compressed or uncompressed, unlike 3187images, which always have to be compressed. So if you don't want the 3188text compressed, set the compression type to PNG_TEXT_COMPRESSION_NONE. 3189Because tEXt and zTXt chunks don't have a language field, if you 3190specify PNG_TEXT_COMPRESSION_NONE or PNG_TEXT_COMPRESSION_zTXt 3191any language code or translated keyword will not be written out. 3192 3193Until text gets around a few hundred bytes, it is not worth compressing it. 3194After the text has been written out to the file, the compression type 3195is set to PNG_TEXT_COMPRESSION_NONE_WR or PNG_TEXT_COMPRESSION_zTXt_WR, 3196so that it isn't written out again at the end (in case you are calling 3197png_write_end() with the same struct). 3198 3199The keywords that are given in the PNG Specification are: 3200 3201 Title Short (one line) title or 3202 caption for image 3203 3204 Author Name of image's creator 3205 3206 Description Description of image (possibly long) 3207 3208 Copyright Copyright notice 3209 3210 Creation Time Time of original image creation 3211 (usually RFC 1123 format, see below) 3212 3213 Software Software used to create the image 3214 3215 Disclaimer Legal disclaimer 3216 3217 Warning Warning of nature of content 3218 3219 Source Device used to create the image 3220 3221 Comment Miscellaneous comment; conversion 3222 from other image format 3223 3224The keyword-text pairs work like this. Keywords should be short 3225simple descriptions of what the comment is about. Some typical 3226keywords are found in the PNG specification, as is some recommendations 3227on keywords. You can repeat keywords in a file. You can even write 3228some text before the image and some after. For example, you may want 3229to put a description of the image before the image, but leave the 3230disclaimer until after, so viewers working over modem connections 3231don't have to wait for the disclaimer to go over the modem before 3232they start seeing the image. Finally, keywords should be full 3233words, not abbreviations. Keywords and text are in the ISO 8859-1 3234(Latin-1) character set (a superset of regular ASCII) and can not 3235contain NUL characters, and should not contain control or other 3236unprintable characters. To make the comments widely readable, stick 3237with basic ASCII, and avoid machine specific character set extensions 3238like the IBM-PC character set. The keyword must be present, but 3239you can leave off the text string on non-compressed pairs. 3240Compressed pairs must have a text string, as only the text string 3241is compressed anyway, so the compression would be meaningless. 3242 3243PNG supports modification time via the png_time structure. Two 3244conversion routines are provided, png_convert_from_time_t() for 3245time_t and png_convert_from_struct_tm() for struct tm. The 3246time_t routine uses gmtime(). You don't have to use either of 3247these, but if you wish to fill in the png_time structure directly, 3248you should provide the time in universal time (GMT) if possible 3249instead of your local time. Note that the year number is the full 3250year (e.g. 1998, rather than 98 - PNG is year 2000 compliant!), and 3251that months start with 1. 3252 3253If you want to store the time of the original image creation, you should 3254use a plain tEXt chunk with the "Creation Time" keyword. This is 3255necessary because the "creation time" of a PNG image is somewhat vague, 3256depending on whether you mean the PNG file, the time the image was 3257created in a non-PNG format, a still photo from which the image was 3258scanned, or possibly the subject matter itself. In order to facilitate 3259machine-readable dates, it is recommended that the "Creation Time" 3260tEXt chunk use RFC 1123 format dates (e.g. "22 May 1997 18:07:10 GMT"), 3261although this isn't a requirement. Unlike the tIME chunk, the 3262"Creation Time" tEXt chunk is not expected to be automatically changed 3263by the software. To facilitate the use of RFC 1123 dates, a function 3264png_convert_to_rfc1123_buffer(png_ptr, buffer, png_timep) is provided to 3265convert from PNG time to an RFC 1123 format string. The caller must provide 3266a writeable buffer of at least 29 bytes. 3267 3268Writing unknown chunks 3269 3270You can use the png_set_unknown_chunks function to queue up private chunks 3271for writing. You give it a chunk name, location, raw data, and a size. You 3272also must use png_set_keep_unknown_chunks() to ensure that libpng will 3273handle them. That's all there is to it. The chunks will be written by the 3274next following png_write_info_before_PLTE, png_write_info, or png_write_end 3275function, depending upon the specified location. Any chunks previously 3276read into the info structure's unknown-chunk list will also be written out 3277in a sequence that satisfies the PNG specification's ordering rules. 3278 3279Here is an example of writing two private chunks, prVt and miNE: 3280 3281 #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED 3282 /* Set unknown chunk data */ 3283 png_unknown_chunk unk_chunk[2]; 3284 strcpy((char *) unk_chunk[0].name, "prVt"; 3285 unk_chunk[0].data = (unsigned char *) "PRIVATE DATA"; 3286 unk_chunk[0].size = strlen(unk_chunk[0].data)+1; 3287 unk_chunk[0].location = PNG_HAVE_IHDR; 3288 strcpy((char *) unk_chunk[1].name, "miNE"; 3289 unk_chunk[1].data = (unsigned char *) "MY CHUNK DATA"; 3290 unk_chunk[1].size = strlen(unk_chunk[0].data)+1; 3291 unk_chunk[1].location = PNG_AFTER_IDAT; 3292 png_set_unknown_chunks(write_ptr, write_info_ptr, 3293 unk_chunk, 2); 3294 /* Needed because miNE is not safe-to-copy */ 3295 png_set_keep_unknown_chunks(png, PNG_HANDLE_CHUNK_ALWAYS, 3296 (png_bytep) "miNE", 1); 3297 # if PNG_LIBPNG_VER < 10600 3298 /* Deal with unknown chunk location bug in 1.5.x and earlier */ 3299 png_set_unknown_chunk_location(png, info, 0, PNG_HAVE_IHDR); 3300 png_set_unknown_chunk_location(png, info, 1, PNG_AFTER_IDAT); 3301 # endif 3302 # if PNG_LIBPNG_VER < 10500 3303 /* PNG_AFTER_IDAT writes two copies of the chunk prior to libpng-1.5.0, 3304 * one before IDAT and another after IDAT, so don't use it; only use 3305 * PNG_HAVE_IHDR location. This call resets the location previously 3306 * set by assignment and png_set_unknown_chunk_location() for chunk 1. 3307 */ 3308 png_set_unknown_chunk_location(png, info, 1, PNG_HAVE_IHDR); 3309 # endif 3310 #endif 3311 3312The high-level write interface 3313 3314At this point there are two ways to proceed; through the high-level 3315write interface, or through a sequence of low-level write operations. 3316You can use the high-level interface if your image data is present 3317in the info structure. All defined output 3318transformations are permitted, enabled by the following masks. 3319 3320 PNG_TRANSFORM_IDENTITY No transformation 3321 PNG_TRANSFORM_PACKING Pack 1, 2 and 4-bit samples 3322 PNG_TRANSFORM_PACKSWAP Change order of packed 3323 pixels to LSB first 3324 PNG_TRANSFORM_INVERT_MONO Invert monochrome images 3325 PNG_TRANSFORM_SHIFT Normalize pixels to the 3326 sBIT depth 3327 PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA 3328 to BGRA 3329 PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA 3330 to AG 3331 PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity 3332 to transparency 3333 PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples 3334 PNG_TRANSFORM_STRIP_FILLER Strip out filler 3335 bytes (deprecated). 3336 PNG_TRANSFORM_STRIP_FILLER_BEFORE Strip out leading 3337 filler bytes 3338 PNG_TRANSFORM_STRIP_FILLER_AFTER Strip out trailing 3339 filler bytes 3340 3341If you have valid image data in the info structure (you can use 3342png_set_rows() to put image data in the info structure), simply do this: 3343 3344 png_write_png(png_ptr, info_ptr, png_transforms, NULL) 3345 3346where png_transforms is an integer containing the bitwise OR of some set of 3347transformation flags. This call is equivalent to png_write_info(), 3348followed the set of transformations indicated by the transform mask, 3349then png_write_image(), and finally png_write_end(). 3350 3351(The final parameter of this call is not yet used. Someday it might point 3352to transformation parameters required by some future output transform.) 3353 3354You must use png_transforms and not call any png_set_transform() functions 3355when you use png_write_png(). 3356 3357The low-level write interface 3358 3359If you are going the low-level route instead, you are now ready to 3360write all the file information up to the actual image data. You do 3361this with a call to png_write_info(). 3362 3363 png_write_info(png_ptr, info_ptr); 3364 3365Note that there is one transformation you may need to do before 3366png_write_info(). In PNG files, the alpha channel in an image is the 3367level of opacity. If your data is supplied as a level of transparency, 3368you can invert the alpha channel before you write it, so that 0 is 3369fully transparent and 255 (in 8-bit or paletted images) or 65535 3370(in 16-bit images) is fully opaque, with 3371 3372 png_set_invert_alpha(png_ptr); 3373 3374This must appear before png_write_info() instead of later with the 3375other transformations because in the case of paletted images the tRNS 3376chunk data has to be inverted before the tRNS chunk is written. If 3377your image is not a paletted image, the tRNS data (which in such cases 3378represents a single color to be rendered as transparent) won't need to 3379be changed, and you can safely do this transformation after your 3380png_write_info() call. 3381 3382If you need to write a private chunk that you want to appear before 3383the PLTE chunk when PLTE is present, you can write the PNG info in 3384two steps, and insert code to write your own chunk between them: 3385 3386 png_write_info_before_PLTE(png_ptr, info_ptr); 3387 png_set_unknown_chunks(png_ptr, info_ptr, ...); 3388 png_write_info(png_ptr, info_ptr); 3389 3390After you've written the file information, you can set up the library 3391to handle any special transformations of the image data. The various 3392ways to transform the data will be described in the order that they 3393should occur. This is important, as some of these change the color 3394type and/or bit depth of the data, and some others only work on 3395certain color types and bit depths. Even though each transformation 3396checks to see if it has data that it can do something with, you should 3397make sure to only enable a transformation if it will be valid for the 3398data. For example, don't swap red and blue on grayscale data. 3399 3400PNG files store RGB pixels packed into 3 or 6 bytes. This code tells 3401the library to strip input data that has 4 or 8 bytes per pixel down 3402to 3 or 6 bytes (or strip 2 or 4-byte grayscale+filler data to 1 or 2 3403bytes per pixel). 3404 3405 png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); 3406 3407where the 0 is unused, and the location is either PNG_FILLER_BEFORE or 3408PNG_FILLER_AFTER, depending upon whether the filler byte in the pixel 3409is stored XRGB or RGBX. 3410 3411PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as 3412they can, resulting in, for example, 8 pixels per byte for 1 bit files. 3413If the data is supplied at 1 pixel per byte, use this code, which will 3414correctly pack the pixels into a single byte: 3415 3416 png_set_packing(png_ptr); 3417 3418PNG files reduce possible bit depths to 1, 2, 4, 8, and 16. If your 3419data is of another bit depth, you can write an sBIT chunk into the 3420file so that decoders can recover the original data if desired. 3421 3422 /* Set the true bit depth of the image data */ 3423 if (color_type & PNG_COLOR_MASK_COLOR) 3424 { 3425 sig_bit.red = true_bit_depth; 3426 sig_bit.green = true_bit_depth; 3427 sig_bit.blue = true_bit_depth; 3428 } 3429 3430 else 3431 { 3432 sig_bit.gray = true_bit_depth; 3433 } 3434 3435 if (color_type & PNG_COLOR_MASK_ALPHA) 3436 { 3437 sig_bit.alpha = true_bit_depth; 3438 } 3439 3440 png_set_sBIT(png_ptr, info_ptr, &sig_bit); 3441 3442If the data is stored in the row buffer in a bit depth other than 3443one supported by PNG (e.g. 3 bit data in the range 0-7 for a 4-bit PNG), 3444this will scale the values to appear to be the correct bit depth as 3445is required by PNG. 3446 3447 png_set_shift(png_ptr, &sig_bit); 3448 3449PNG files store 16-bit pixels in network byte order (big-endian, 3450ie. most significant bits first). This code would be used if they are 3451supplied the other way (little-endian, i.e. least significant bits 3452first, the way PCs store them): 3453 3454 if (bit_depth > 8) 3455 png_set_swap(png_ptr); 3456 3457If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you 3458need to change the order the pixels are packed into bytes, you can use: 3459 3460 if (bit_depth < 8) 3461 png_set_packswap(png_ptr); 3462 3463PNG files store 3 color pixels in red, green, blue order. This code 3464would be used if they are supplied as blue, green, red: 3465 3466 png_set_bgr(png_ptr); 3467 3468PNG files describe monochrome as black being zero and white being 3469one. This code would be used if the pixels are supplied with this reversed 3470(black being one and white being zero): 3471 3472 png_set_invert_mono(png_ptr); 3473 3474Finally, you can write your own transformation function if none of 3475the existing ones meets your needs. This is done by setting a callback 3476with 3477 3478 png_set_write_user_transform_fn(png_ptr, 3479 write_transform_fn); 3480 3481You must supply the function 3482 3483 void write_transform_fn(png_structp png_ptr, png_row_infop 3484 row_info, png_bytep data) 3485 3486See pngtest.c for a working example. Your function will be called 3487before any of the other transformations are processed. If supported 3488libpng also supplies an information routine that may be called from 3489your callback: 3490 3491 png_get_current_row_number(png_ptr); 3492 png_get_current_pass_number(png_ptr); 3493 3494This returns the current row passed to the transform. With interlaced 3495images the value returned is the row in the input sub-image image. Use 3496PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to 3497find the output pixel (x,y) given an interlaced sub-image pixel (row,col,pass). 3498 3499The discussion of interlace handling above contains more information on how to 3500use these values. 3501 3502You can also set up a pointer to a user structure for use by your 3503callback function. 3504 3505 png_set_user_transform_info(png_ptr, user_ptr, 0, 0); 3506 3507The user_channels and user_depth parameters of this function are ignored 3508when writing; you can set them to zero as shown. 3509 3510You can retrieve the pointer via the function png_get_user_transform_ptr(). 3511For example: 3512 3513 voidp write_user_transform_ptr = 3514 png_get_user_transform_ptr(png_ptr); 3515 3516It is possible to have libpng flush any pending output, either manually, 3517or automatically after a certain number of lines have been written. To 3518flush the output stream a single time call: 3519 3520 png_write_flush(png_ptr); 3521 3522and to have libpng flush the output stream periodically after a certain 3523number of scanlines have been written, call: 3524 3525 png_set_flush(png_ptr, nrows); 3526 3527Note that the distance between rows is from the last time png_write_flush() 3528was called, or the first row of the image if it has never been called. 3529So if you write 50 lines, and then png_set_flush 25, it will flush the 3530output on the next scanline, and every 25 lines thereafter, unless 3531png_write_flush() is called before 25 more lines have been written. 3532If nrows is too small (less than about 10 lines for a 640 pixel wide 3533RGB image) the image compression may decrease noticeably (although this 3534may be acceptable for real-time applications). Infrequent flushing will 3535only degrade the compression performance by a few percent over images 3536that do not use flushing. 3537 3538Writing the image data 3539 3540That's it for the transformations. Now you can write the image data. 3541The simplest way to do this is in one function call. If you have the 3542whole image in memory, you can just call png_write_image() and libpng 3543will write the image. You will need to pass in an array of pointers to 3544each row. This function automatically handles interlacing, so you don't 3545need to call png_set_interlace_handling() or call this function multiple 3546times, or any of that other stuff necessary with png_write_rows(). 3547 3548 png_write_image(png_ptr, row_pointers); 3549 3550where row_pointers is: 3551 3552 png_byte *row_pointers[height]; 3553 3554You can point to void or char or whatever you use for pixels. 3555 3556If you don't want to write the whole image at once, you can 3557use png_write_rows() instead. If the file is not interlaced, 3558this is simple: 3559 3560 png_write_rows(png_ptr, row_pointers, 3561 number_of_rows); 3562 3563row_pointers is the same as in the png_write_image() call. 3564 3565If you are just writing one row at a time, you can do this with 3566a single row_pointer instead of an array of row_pointers: 3567 3568 png_bytep row_pointer = row; 3569 3570 png_write_row(png_ptr, row_pointer); 3571 3572When the file is interlaced, things can get a good deal more complicated. 3573The only currently (as of the PNG Specification version 1.2, dated July 35741999) defined interlacing scheme for PNG files is the "Adam7" interlace 3575scheme, that breaks down an image into seven smaller images of varying 3576size. libpng will build these images for you, or you can do them 3577yourself. If you want to build them yourself, see the PNG specification 3578for details of which pixels to write when. 3579 3580If you don't want libpng to handle the interlacing details, just 3581use png_set_interlace_handling() and call png_write_rows() the 3582correct number of times to write all the sub-images 3583(png_set_interlace_handling() returns the number of sub-images.) 3584 3585If you want libpng to build the sub-images, call this before you start 3586writing any rows: 3587 3588 number_of_passes = png_set_interlace_handling(png_ptr); 3589 3590This will return the number of passes needed. Currently, this is seven, 3591but may change if another interlace type is added. 3592 3593Then write the complete image number_of_passes times. 3594 3595 png_write_rows(png_ptr, row_pointers, number_of_rows); 3596 3597Think carefully before you write an interlaced image. Typically code that 3598reads such images reads all the image data into memory, uncompressed, before 3599doing any processing. Only code that can display an image on the fly can 3600take advantage of the interlacing and even then the image has to be exactly 3601the correct size for the output device, because scaling an image requires 3602adjacent pixels and these are not available until all the passes have been 3603read. 3604 3605If you do write an interlaced image you will hardly ever need to handle 3606the interlacing yourself. Call png_set_interlace_handling() and use the 3607approach described above. 3608 3609The only time it is conceivable that you will really need to write an 3610interlaced image pass-by-pass is when you have read one pass by pass and 3611made some pixel-by-pixel transformation to it, as described in the read 3612code above. In this case use the PNG_PASS_ROWS and PNG_PASS_COLS macros 3613to determine the size of each sub-image in turn and simply write the rows 3614you obtained from the read code. 3615 3616Finishing a sequential write 3617 3618After you are finished writing the image, you should finish writing 3619the file. If you are interested in writing comments or time, you should 3620pass an appropriately filled png_info pointer. If you are not interested, 3621you can pass NULL. 3622 3623 png_write_end(png_ptr, info_ptr); 3624 3625When you are done, you can free all memory used by libpng like this: 3626 3627 png_destroy_write_struct(&png_ptr, &info_ptr); 3628 3629It is also possible to individually free the info_ptr members that 3630point to libpng-allocated storage with the following function: 3631 3632 png_free_data(png_ptr, info_ptr, mask, seq) 3633 3634 mask - identifies data to be freed, a mask 3635 containing the bitwise OR of one or 3636 more of 3637 PNG_FREE_PLTE, PNG_FREE_TRNS, 3638 PNG_FREE_HIST, PNG_FREE_ICCP, 3639 PNG_FREE_PCAL, PNG_FREE_ROWS, 3640 PNG_FREE_SCAL, PNG_FREE_SPLT, 3641 PNG_FREE_TEXT, PNG_FREE_UNKN, 3642 or simply PNG_FREE_ALL 3643 3644 seq - sequence number of item to be freed 3645 (-1 for all items) 3646 3647This function may be safely called when the relevant storage has 3648already been freed, or has not yet been allocated, or was allocated 3649by the user and not by libpng, and will in those cases do nothing. 3650The "seq" parameter is ignored if only one item of the selected data 3651type, such as PLTE, is allowed. If "seq" is not -1, and multiple items 3652are allowed for the data type identified in the mask, such as text or 3653sPLT, only the n'th item in the structure is freed, where n is "seq". 3654 3655If you allocated data such as a palette that you passed in to libpng 3656with png_set_*, you must not free it until just before the call to 3657png_destroy_write_struct(). 3658 3659The default behavior is only to free data that was allocated internally 3660by libpng. This can be changed, so that libpng will not free the data, 3661or so that it will free data that was allocated by the user with png_malloc() 3662or png_calloc() and passed in via a png_set_*() function, with 3663 3664 png_data_freer(png_ptr, info_ptr, freer, mask) 3665 3666 freer - one of 3667 PNG_DESTROY_WILL_FREE_DATA 3668 PNG_SET_WILL_FREE_DATA 3669 PNG_USER_WILL_FREE_DATA 3670 3671 mask - which data elements are affected 3672 same choices as in png_free_data() 3673 3674For example, to transfer responsibility for some data from a read structure 3675to a write structure, you could use 3676 3677 png_data_freer(read_ptr, read_info_ptr, 3678 PNG_USER_WILL_FREE_DATA, 3679 PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST) 3680 3681 png_data_freer(write_ptr, write_info_ptr, 3682 PNG_DESTROY_WILL_FREE_DATA, 3683 PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST) 3684 3685thereby briefly reassigning responsibility for freeing to the user but 3686immediately afterwards reassigning it once more to the write_destroy 3687function. Having done this, it would then be safe to destroy the read 3688structure and continue to use the PLTE, tRNS, and hIST data in the write 3689structure. 3690 3691This function only affects data that has already been allocated. 3692You can call this function before calling after the png_set_*() functions 3693to control whether the user or png_destroy_*() is supposed to free the data. 3694When the user assumes responsibility for libpng-allocated data, the 3695application must use 3696png_free() to free it, and when the user transfers responsibility to libpng 3697for data that the user has allocated, the user must have used png_malloc() 3698or png_calloc() to allocate it. 3699 3700If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword 3701separately, do not transfer responsibility for freeing text_ptr to libpng, 3702because when libpng fills a png_text structure it combines these members with 3703the key member, and png_free_data() will free only text_ptr.key. Similarly, 3704if you transfer responsibility for free'ing text_ptr from libpng to your 3705application, your application must not separately free those members. 3706For a more compact example of writing a PNG image, see the file example.c. 3707 3708V. Simplified API 3709 3710The simplified API, which became available in libpng-1.6.0, hides the details 3711of both libpng and the PNG file format itself. 3712It allows PNG files to be read into a very limited number of 3713in-memory bitmap formats or to be written from the same formats. If these 3714formats do not accommodate your needs then you can, and should, use the more 3715sophisticated APIs above - these support a wide variety of in-memory formats 3716and a wide variety of sophisticated transformations to those formats as well 3717as a wide variety of APIs to manipulate ancilliary information. 3718 3719To read a PNG file using the simplified API: 3720 3721 1) Declare a 'png_image' structure (see below) on the 3722 stack and memset() it to all zero. 3723 3724 2) Call the appropriate png_image_begin_read... function. 3725 3726 3) Set the png_image 'format' member to the required 3727 format and allocate a buffer for the image. 3728 3729 4) Call png_image_finish_read to read the image into 3730 your buffer. 3731 3732There are no restrictions on the format of the PNG input itself; all valid 3733color types, bit depths, and interlace methods are acceptable, and the 3734input image is transformed as necessary to the requested in-memory format 3735during the png_image_finish_read() step. 3736 3737To write a PNG file using the simplified API: 3738 3739 1) Declare a 'png_image' structure on the stack and memset() 3740 it to all zero. 3741 3742 2) Initialize the members of the structure that describe the 3743 image, setting the 'format' member to the format of the 3744 image in memory. 3745 3746 3) Call the appropriate png_image_write... function with a 3747 pointer to the image to write the PNG data. 3748 3749png_image is a structure that describes the in-memory format of an image 3750when it is being read or define the in-memory format of an image that you 3751need to write. The "png_image" structure contains the following members: 3752 3753 png_uint_32 version Set to PNG_IMAGE_VERSION 3754 png_uint_32 width Image width in pixels (columns) 3755 png_uint_32 height Image height in pixels (rows) 3756 png_uint_32 format Image format as defined below 3757 png_uint_32 flags A bit mask containing informational flags 3758 png_controlp opaque Initialize to NULL, free with png_image_free 3759 png_uint_32 colormap_entries; Number of entries in the color-map 3760 png_uint_32 warning_or_error; 3761 char message[64]; 3762 3763In the event of an error or warning the following field warning_or_error 3764field will be set to a non-zero value and the 'message' field will contain 3765a '\0' terminated string with the libpng error or warning message. If both 3766warnings and an error were encountered, only the error is recorded. If there 3767are multiple warnings, only the first one is recorded. 3768 3769The upper 30 bits of this value are reserved; the low two bits contain 3770a two bit code such that a value more than 1 indicates a failure in the API 3771just called: 3772 3773 0 - no warning or error 3774 1 - warning 3775 2 - error 3776 3 - error preceded by warning 3777 3778The pixels (samples) of the image have one to four channels whose components 3779have original values in the range 0 to 1.0: 3780 3781 1: A single gray or luminance channel (G). 3782 2: A gray/luminance channel and an alpha channel (GA). 3783 3: Three red, green, blue color channels (RGB). 3784 4: Three color channels and an alpha channel (RGBA). 3785 3786The channels are encoded in one of two ways: 3787 3788 a) As a small integer, value 0..255, contained in a single byte. For the 3789alpha channel the original value is simply value/255. For the color or 3790luminance channels the value is encoded according to the sRGB specification 3791and matches the 8-bit format expected by typical display devices. 3792 3793The color/gray channels are not scaled (pre-multiplied) by the alpha 3794channel and are suitable for passing to color management software. 3795 3796 b) As a value in the range 0..65535, contained in a 2-byte integer. All 3797channels can be converted to the original value by dividing by 65535; all 3798channels are linear. Color channels use the RGB encoding (RGB end-points) of 3799the sRGB specification. This encoding is identified by the 3800PNG_FORMAT_FLAG_LINEAR flag below. 3801 3802When an alpha channel is present it is expected to denote pixel coverage 3803of the color or luminance channels and is returned as an associated alpha 3804channel: the color/gray channels are scaled (pre-multiplied) by the alpha 3805value. 3806 3807When a color-mapped image is used as a result of calling 3808png_image_read_colormap or png_image_write_colormap the channels are encoded 3809in the color-map and the descriptions above apply to the color-map entries. 3810The image data is encoded as small integers, value 0..255, that index the 3811entries in the color-map. One integer (one byte) is stored for each pixel. 3812 3813PNG_FORMAT_* 3814 3815The #defines to be used in png_image::format. Each #define identifies a 3816particular layout of channel data and, if present, alpha values. There are 3817separate defines for each of the two channel encodings. 3818 3819A format is built up using single bit flag values. Not all combinations are 3820valid: use the bit flag values below for testing a format returned by the 3821read APIs, but set formats from the derived values. 3822 3823When reading or writing color-mapped images the format should be set to the 3824format of the entries in the color-map then png_image_{read,write}_colormap 3825called to read or write the color-map and set the format correctly for the 3826image data. Do not set the PNG_FORMAT_FLAG_COLORMAP bit directly! 3827 3828NOTE: libpng can be built with particular features disabled, if you see 3829compiler errors because the definition of one of the following flags has been 3830compiled out it is because libpng does not have the required support. It is 3831possible, however, for the libpng configuration to enable the format on just 3832read or just write; in that case you may see an error at run time. You can 3833guard against this by checking for the definition of: 3834 3835 PNG_SIMPLIFIED_{READ,WRITE}_{BGR,AFIRST}_SUPPORTED 3836 3837 PNG_FORMAT_FLAG_ALPHA 0x01 format with an alpha channel 3838 PNG_FORMAT_FLAG_COLOR 0x02 color format: otherwise grayscale 3839 PNG_FORMAT_FLAG_LINEAR 0x04 png_uint_16 channels else png_byte 3840 PNG_FORMAT_FLAG_COLORMAP 0x08 libpng use only 3841 PNG_FORMAT_FLAG_BGR 0x10 BGR colors, else order is RGB 3842 PNG_FORMAT_FLAG_AFIRST 0x20 alpha channel comes first 3843 3844Supported formats are as follows. Future versions of libpng may support more 3845formats; for compatibility with older versions simply check if the format 3846macro is defined using #ifdef. These defines describe the in-memory layout 3847of the components of the pixels of the image. 3848 3849First the single byte formats: 3850 3851 PNG_FORMAT_GRAY 0 3852 PNG_FORMAT_GA PNG_FORMAT_FLAG_ALPHA 3853 PNG_FORMAT_AG (PNG_FORMAT_GA|PNG_FORMAT_FLAG_AFIRST) 3854 PNG_FORMAT_RGB PNG_FORMAT_FLAG_COLOR 3855 PNG_FORMAT_BGR (PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_BGR) 3856 PNG_FORMAT_RGBA (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_ALPHA) 3857 PNG_FORMAT_ARGB (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_AFIRST) 3858 PNG_FORMAT_BGRA (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_ALPHA) 3859 PNG_FORMAT_ABGR (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_AFIRST) 3860 3861Then the linear 2-byte formats. When naming these "Y" is used to 3862indicate a luminance (gray) channel. The component order within the pixel 3863is always the same - there is no provision for swapping the order of the 3864components in the linear format. 3865 3866 PNG_FORMAT_LINEAR_Y PNG_FORMAT_FLAG_LINEAR 3867 PNG_FORMAT_LINEAR_Y_ALPHA 3868 (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_ALPHA) 3869 PNG_FORMAT_LINEAR_RGB 3870 (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR) 3871 PNG_FORMAT_LINEAR_RGB_ALPHA 3872 (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR| 3873 PNG_FORMAT_FLAG_ALPHA) 3874 3875Color-mapped formats are obtained by calling png_image_{read,write}_colormap, 3876as appropriate after setting png_image::format to the format of the color-map 3877to be read or written. Applications may check the value of 3878PNG_FORMAT_FLAG_COLORMAP to see if they have called the colormap API. The 3879format of the color-map may be extracted using the following macro. 3880 3881 PNG_FORMAT_OF_COLORMAP(fmt) ((fmt) & ~PNG_FORMAT_FLAG_COLORMAP) 3882 3883PNG_IMAGE macros 3884 3885These are convenience macros to derive information from a png_image 3886structure. The PNG_IMAGE_SAMPLE_ macros return values appropriate to the 3887actual image sample values - either the entries in the color-map or the 3888pixels in the image. The PNG_IMAGE_PIXEL_ macros return corresponding values 3889for the pixels and will always return 1 after a call to 3890png_image_{read,write}_colormap. The remaining macros return information 3891about the rows in the image and the complete image. 3892 3893NOTE: All the macros that take a png_image::format parameter are compile time 3894constants if the format parameter is, itself, a constant. Therefore these 3895macros can be used in array declarations and case labels where required. 3896Similarly the macros are also pre-processor constants (sizeof is not used) so 3897they can be used in #if tests. 3898 3899First the information about the samples. 3900 3901 PNG_IMAGE_SAMPLE_CHANNELS(fmt) 3902 Returns the total number of channels in a given format: 1..4 3903 3904 PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt) 3905 Returns the size in bytes of a single component of a pixel or color-map 3906 entry (as appropriate) in the image. 3907 3908 PNG_IMAGE_SAMPLE_SIZE(fmt) 3909 This is the size of the sample data for one sample. If the image is 3910 color-mapped it is the size of one color-map entry (and image pixels are 3911 one byte in size), otherwise it is the size of one image pixel. 3912 3913 PNG_IMAGE_COLORMAP_SIZE(fmt) 3914 The size of the color-map required by the format; this is the size of the 3915 color-map buffer passed to the png_image_{read,write}_colormap APIs, it is 3916 a fixed number determined by the format so can easily be allocated on the 3917 stack if necessary. 3918 3919#define PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(fmt)\ 3920 (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * 256) 3921 /* The maximum size of the color-map required by the format expressed in a 3922 * count of components. This can be used to compile-time allocate a 3923 * color-map: 3924 * 3925 * png_uint_16 colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(linear_fmt)]; 3926 * 3927 * png_byte colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(sRGB_fmt)]; 3928 * 3929 * Alternatively use the PNG_IMAGE_COLORMAP_SIZE macro below to use the 3930 * information from one of the png_image_begin_read_ APIs and dynamically 3931 * allocate the required memory. 3932 */ 3933 3934 3935Corresponding information about the pixels 3936 3937 PNG_IMAGE_PIXEL_(test,fmt) 3938 3939 PNG_IMAGE_PIXEL_CHANNELS(fmt) 3940 The number of separate channels (components) in a pixel; 1 for a 3941 color-mapped image. 3942 3943 PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)\ 3944 The size, in bytes, of each component in a pixel; 1 for a color-mapped 3945 image. 3946 3947 PNG_IMAGE_PIXEL_SIZE(fmt) 3948 The size, in bytes, of a complete pixel; 1 for a color-mapped image. 3949 3950Information about the whole row, or whole image 3951 3952 PNG_IMAGE_ROW_STRIDE(image) 3953 Returns the total number of components in a single row of the image; this 3954 is the minimum 'row stride', the minimum count of components between each 3955 row. For a color-mapped image this is the minimum number of bytes in a 3956 row. 3957 3958 PNG_IMAGE_BUFFER_SIZE(image, row_stride) 3959 Returns the size, in bytes, of an image buffer given a png_image and a row 3960 stride - the number of components to leave space for in each row. 3961 3962 PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB == 0x01 3963 This indicates the the RGB values of the in-memory bitmap do not 3964 correspond to the red, green and blue end-points defined by sRGB. 3965 3966 PNG_IMAGE_FLAG_COLORMAP == 0x02 3967 The PNG is color-mapped. If this flag is set png_image_read_colormap 3968 can be used without further loss of image information. If it is not set 3969 png_image_read_colormap will cause significant loss if the image has any 3970 3971READ APIs 3972 3973 The png_image passed to the read APIs must have been initialized by setting 3974 the png_controlp field 'opaque' to NULL (or, better, memset the whole thing.) 3975 3976 int png_image_begin_read_from_file( png_imagep image, 3977 const char *file_name) 3978 3979 The named file is opened for read and the image header 3980 is filled in from the PNG header in the file. 3981 3982 int png_image_begin_read_from_stdio (png_imagep image, 3983 FILE* file) 3984 3985 The PNG header is read from the stdio FILE object. 3986 3987 int png_image_begin_read_from_memory(png_imagep image, 3988 png_const_voidp memory, png_size_t size) 3989 3990 The PNG header is read from the given memory buffer. 3991 3992 int png_image_finish_read(png_imagep image, 3993 png_colorp background, void *buffer, 3994 png_int_32 row_stride, void *colormap)); 3995 3996 Finish reading the image into the supplied buffer and 3997 clean up the png_image structure. 3998 3999 row_stride is the step, in png_byte or png_uint_16 units 4000 as appropriate, between adjacent rows. A positive stride 4001 indicates that the top-most row is first in the buffer - 4002 the normal top-down arrangement. A negative stride 4003 indicates that the bottom-most row is first in the buffer. 4004 4005 background need only be supplied if an alpha channel must 4006 be removed from a png_byte format and the removal is to be 4007 done by compositing on a solid color; otherwise it may be 4008 NULL and any composition will be done directly onto the 4009 buffer. The value is an sRGB color to use for the 4010 background, for grayscale output the green channel is used. 4011 4012 For linear output removing the alpha channel is always done 4013 by compositing on black. 4014 4015 void png_image_free(png_imagep image) 4016 4017 Free any data allocated by libpng in image->opaque, 4018 setting the pointer to NULL. May be called at any time 4019 after the structure is initialized. 4020 4021When the simplified API needs to convert between sRGB and linear colorspaces, 4022the actual sRGB transfer curve defined in the sRGB specification (see the 4023article at http://en.wikipedia.org/wiki/SRGB) is used, not the gamma=1/2.2 4024approximation used elsewhere in libpng. 4025 4026WRITE APIS 4027 4028For write you must initialize a png_image structure to describe the image to 4029be written: 4030 4031 version: must be set to PNG_IMAGE_VERSION 4032 opaque: must be initialized to NULL 4033 width: image width in pixels 4034 height: image height in rows 4035 format: the format of the data you wish to write 4036 flags: set to 0 unless one of the defined flags applies; set 4037 PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB for color format images 4038 where the RGB values do not correspond to the colors in sRGB. 4039 colormap_entries: set to the number of entries in the color-map (0 to 256) 4040 4041 int png_image_write_to_file, (png_imagep image, 4042 const char *file, int convert_to_8bit, const void *buffer, 4043 png_int_32 row_stride, const void *colormap)); 4044 4045 Write the image to the named file. 4046 4047 int png_image_write_to_stdio(png_imagep image, FILE *file, 4048 int convert_to_8_bit, const void *buffer, 4049 png_int_32 row_stride, const void *colormap) 4050 4051 Write the image to the given (FILE*). 4052 4053With all write APIs if image is in one of the linear formats with 4054(png_uint_16) data then setting convert_to_8_bit will cause the output to be 4055a (png_byte) PNG gamma encoded according to the sRGB specification, otherwise 4056a 16-bit linear encoded PNG file is written. 4057 4058With all APIs row_stride is handled as in the read APIs - it is the spacing 4059from one row to the next in component sized units (float) and if negative 4060indicates a bottom-up row layout in the buffer. 4061 4062Note that the write API does not support interlacing, sub-8-bit pixels, 4063and indexed (paletted) images. 4064 4065VI. Modifying/Customizing libpng 4066 4067There are two issues here. The first is changing how libpng does 4068standard things like memory allocation, input/output, and error handling. 4069The second deals with more complicated things like adding new chunks, 4070adding new transformations, and generally changing how libpng works. 4071Both of those are compile-time issues; that is, they are generally 4072determined at the time the code is written, and there is rarely a need 4073to provide the user with a means of changing them. 4074 4075Memory allocation, input/output, and error handling 4076 4077All of the memory allocation, input/output, and error handling in libpng 4078goes through callbacks that are user-settable. The default routines are 4079in pngmem.c, pngrio.c, pngwio.c, and pngerror.c, respectively. To change 4080these functions, call the appropriate png_set_*_fn() function. 4081 4082Memory allocation is done through the functions png_malloc(), png_calloc(), 4083and png_free(). The png_malloc() and png_free() functions currently just 4084call the standard C functions and png_calloc() calls png_malloc() and then 4085clears the newly allocated memory to zero; note that png_calloc(png_ptr, size) 4086is not the same as the calloc(number, size) function provided by stdlib.h. 4087There is limited support for certain systems with segmented memory 4088architectures and the types of pointers declared by png.h match this; you 4089will have to use appropriate pointers in your application. Since it is 4090unlikely that the method of handling memory allocation on a platform 4091will change between applications, these functions must be modified in 4092the library at compile time. If you prefer to use a different method 4093of allocating and freeing data, you can use png_create_read_struct_2() or 4094png_create_write_struct_2() to register your own functions as described 4095above. These functions also provide a void pointer that can be retrieved 4096via 4097 4098 mem_ptr=png_get_mem_ptr(png_ptr); 4099 4100Your replacement memory functions must have prototypes as follows: 4101 4102 png_voidp malloc_fn(png_structp png_ptr, 4103 png_alloc_size_t size); 4104 4105 void free_fn(png_structp png_ptr, png_voidp ptr); 4106 4107Your malloc_fn() must return NULL in case of failure. The png_malloc() 4108function will normally call png_error() if it receives a NULL from the 4109system memory allocator or from your replacement malloc_fn(). 4110 4111Your free_fn() will never be called with a NULL ptr, since libpng's 4112png_free() checks for NULL before calling free_fn(). 4113 4114Input/Output in libpng is done through png_read() and png_write(), 4115which currently just call fread() and fwrite(). The FILE * is stored in 4116png_struct and is initialized via png_init_io(). If you wish to change 4117the method of I/O, the library supplies callbacks that you can set 4118through the function png_set_read_fn() and png_set_write_fn() at run 4119time, instead of calling the png_init_io() function. These functions 4120also provide a void pointer that can be retrieved via the function 4121png_get_io_ptr(). For example: 4122 4123 png_set_read_fn(png_structp read_ptr, 4124 voidp read_io_ptr, png_rw_ptr read_data_fn) 4125 4126 png_set_write_fn(png_structp write_ptr, 4127 voidp write_io_ptr, png_rw_ptr write_data_fn, 4128 png_flush_ptr output_flush_fn); 4129 4130 voidp read_io_ptr = png_get_io_ptr(read_ptr); 4131 voidp write_io_ptr = png_get_io_ptr(write_ptr); 4132 4133The replacement I/O functions must have prototypes as follows: 4134 4135 void user_read_data(png_structp png_ptr, 4136 png_bytep data, png_size_t length); 4137 4138 void user_write_data(png_structp png_ptr, 4139 png_bytep data, png_size_t length); 4140 4141 void user_flush_data(png_structp png_ptr); 4142 4143The user_read_data() function is responsible for detecting and 4144handling end-of-data errors. 4145 4146Supplying NULL for the read, write, or flush functions sets them back 4147to using the default C stream functions, which expect the io_ptr to 4148point to a standard *FILE structure. It is probably a mistake 4149to use NULL for one of write_data_fn and output_flush_fn but not both 4150of them, unless you have built libpng with PNG_NO_WRITE_FLUSH defined. 4151It is an error to read from a write stream, and vice versa. 4152 4153Error handling in libpng is done through png_error() and png_warning(). 4154Errors handled through png_error() are fatal, meaning that png_error() 4155should never return to its caller. Currently, this is handled via 4156setjmp() and longjmp() (unless you have compiled libpng with 4157PNG_NO_SETJMP, in which case it is handled via PNG_ABORT()), 4158but you could change this to do things like exit() if you should wish, 4159as long as your function does not return. 4160 4161On non-fatal errors, png_warning() is called 4162to print a warning message, and then control returns to the calling code. 4163By default png_error() and png_warning() print a message on stderr via 4164fprintf() unless the library is compiled with PNG_NO_CONSOLE_IO defined 4165(because you don't want the messages) or PNG_NO_STDIO defined (because 4166fprintf() isn't available). If you wish to change the behavior of the error 4167functions, you will need to set up your own message callbacks. These 4168functions are normally supplied at the time that the png_struct is created. 4169It is also possible to redirect errors and warnings to your own replacement 4170functions after png_create_*_struct() has been called by calling: 4171 4172 png_set_error_fn(png_structp png_ptr, 4173 png_voidp error_ptr, png_error_ptr error_fn, 4174 png_error_ptr warning_fn); 4175 4176 png_voidp error_ptr = png_get_error_ptr(png_ptr); 4177 4178If NULL is supplied for either error_fn or warning_fn, then the libpng 4179default function will be used, calling fprintf() and/or longjmp() if a 4180problem is encountered. The replacement error functions should have 4181parameters as follows: 4182 4183 void user_error_fn(png_structp png_ptr, 4184 png_const_charp error_msg); 4185 4186 void user_warning_fn(png_structp png_ptr, 4187 png_const_charp warning_msg); 4188 4189The motivation behind using setjmp() and longjmp() is the C++ throw and 4190catch exception handling methods. This makes the code much easier to write, 4191as there is no need to check every return code of every function call. 4192However, there are some uncertainties about the status of local variables 4193after a longjmp, so the user may want to be careful about doing anything 4194after setjmp returns non-zero besides returning itself. Consult your 4195compiler documentation for more details. For an alternative approach, you 4196may wish to use the "cexcept" facility (see http://cexcept.sourceforge.net), 4197which is illustrated in pngvalid.c and in contrib/visupng. 4198 4199Beginning in libpng-1.4.0, the png_set_benign_errors() API became available. 4200You can use this to handle certain errors (normally handled as errors) 4201as warnings. 4202 4203 png_set_benign_errors (png_ptr, int allowed); 4204 4205 allowed: 0: treat png_benign_error() as an error. 4206 1: treat png_benign_error() as a warning. 4207 4208As of libpng-1.6.0, the default condition is to treat benign errors as 4209warnings while reading and as errors while writing. 4210 4211Custom chunks 4212 4213If you need to read or write custom chunks, you may need to get deeper 4214into the libpng code. The library now has mechanisms for storing 4215and writing chunks of unknown type; you can even declare callbacks 4216for custom chunks. However, this may not be good enough if the 4217library code itself needs to know about interactions between your 4218chunk and existing `intrinsic' chunks. 4219 4220If you need to write a new intrinsic chunk, first read the PNG 4221specification. Acquire a first level of understanding of how it works. 4222Pay particular attention to the sections that describe chunk names, 4223and look at how other chunks were designed, so you can do things 4224similarly. Second, check out the sections of libpng that read and 4225write chunks. Try to find a chunk that is similar to yours and use 4226it as a template. More details can be found in the comments inside 4227the code. It is best to handle private or unknown chunks in a generic method, 4228via callback functions, instead of by modifying libpng functions. This 4229is illustrated in pngtest.c, which uses a callback function to handle a 4230private "vpAg" chunk and the new "sTER" chunk, which are both unknown to 4231libpng. 4232 4233If you wish to write your own transformation for the data, look through 4234the part of the code that does the transformations, and check out some of 4235the simpler ones to get an idea of how they work. Try to find a similar 4236transformation to the one you want to add and copy off of it. More details 4237can be found in the comments inside the code itself. 4238 4239Configuring for 16-bit platforms 4240 4241You will want to look into zconf.h to tell zlib (and thus libpng) that 4242it cannot allocate more then 64K at a time. Even if you can, the memory 4243won't be accessible. So limit zlib and libpng to 64K by defining MAXSEG_64K. 4244 4245Configuring for DOS 4246 4247For DOS users who only have access to the lower 640K, you will 4248have to limit zlib's memory usage via a png_set_compression_mem_level() 4249call. See zlib.h or zconf.h in the zlib library for more information. 4250 4251Configuring for Medium Model 4252 4253Libpng's support for medium model has been tested on most of the popular 4254compilers. Make sure MAXSEG_64K gets defined, USE_FAR_KEYWORD gets 4255defined, and FAR gets defined to far in pngconf.h, and you should be 4256all set. Everything in the library (except for zlib's structure) is 4257expecting far data. You must use the typedefs with the p or pp on 4258the end for pointers (or at least look at them and be careful). Make 4259note that the rows of data are defined as png_bytepp, which is 4260an "unsigned char far * far *". 4261 4262Configuring for gui/windowing platforms: 4263 4264You will need to write new error and warning functions that use the GUI 4265interface, as described previously, and set them to be the error and 4266warning functions at the time that png_create_*_struct() is called, 4267in order to have them available during the structure initialization. 4268They can be changed later via png_set_error_fn(). On some compilers, 4269you may also have to change the memory allocators (png_malloc, etc.). 4270 4271Configuring for compiler xxx: 4272 4273All includes for libpng are in pngconf.h. If you need to add, change 4274or delete an include, this is the place to do it. 4275The includes that are not needed outside libpng are placed in pngpriv.h, 4276which is only used by the routines inside libpng itself. 4277The files in libpng proper only include pngpriv.h and png.h, which 4278in turn includes pngconf.h and, as of libpng-1.5.0, pnglibconf.h. 4279As of libpng-1.5.0, pngpriv.h also includes three other private header 4280files, pngstruct.h, pnginfo.h, and pngdebug.h, which contain material 4281that previously appeared in the public headers. 4282 4283Configuring zlib: 4284 4285There are special functions to configure the compression. Perhaps the 4286most useful one changes the compression level, which currently uses 4287input compression values in the range 0 - 9. The library normally 4288uses the default compression level (Z_DEFAULT_COMPRESSION = 6). Tests 4289have shown that for a large majority of images, compression values in 4290the range 3-6 compress nearly as well as higher levels, and do so much 4291faster. For online applications it may be desirable to have maximum speed 4292(Z_BEST_SPEED = 1). With versions of zlib after v0.99, you can also 4293specify no compression (Z_NO_COMPRESSION = 0), but this would create 4294files larger than just storing the raw bitmap. You can specify the 4295compression level by calling: 4296 4297 #include zlib.h 4298 png_set_compression_level(png_ptr, level); 4299 4300Another useful one is to reduce the memory level used by the library. 4301The memory level defaults to 8, but it can be lowered if you are 4302short on memory (running DOS, for example, where you only have 640K). 4303Note that the memory level does have an effect on compression; among 4304other things, lower levels will result in sections of incompressible 4305data being emitted in smaller stored blocks, with a correspondingly 4306larger relative overhead of up to 15% in the worst case. 4307 4308 #include zlib.h 4309 png_set_compression_mem_level(png_ptr, level); 4310 4311The other functions are for configuring zlib. They are not recommended 4312for normal use and may result in writing an invalid PNG file. See 4313zlib.h for more information on what these mean. 4314 4315 #include zlib.h 4316 png_set_compression_strategy(png_ptr, 4317 strategy); 4318 4319 png_set_compression_window_bits(png_ptr, 4320 window_bits); 4321 4322 png_set_compression_method(png_ptr, method); 4323 4324 png_set_compression_buffer_size(png_ptr, size); 4325 4326As of libpng version 1.5.4, additional APIs became 4327available to set these separately for non-IDAT 4328compressed chunks such as zTXt, iTXt, and iCCP: 4329 4330 #include zlib.h 4331 #if PNG_LIBPNG_VER >= 10504 4332 png_set_text_compression_level(png_ptr, level); 4333 4334 png_set_text_compression_mem_level(png_ptr, level); 4335 4336 png_set_text_compression_strategy(png_ptr, 4337 strategy); 4338 4339 png_set_text_compression_window_bits(png_ptr, 4340 window_bits); 4341 4342 png_set_text_compression_method(png_ptr, method); 4343 #endif 4344 4345Controlling row filtering 4346 4347If you want to control whether libpng uses filtering or not, which 4348filters are used, and how it goes about picking row filters, you 4349can call one of these functions. The selection and configuration 4350of row filters can have a significant impact on the size and 4351encoding speed and a somewhat lesser impact on the decoding speed 4352of an image. Filtering is enabled by default for RGB and grayscale 4353images (with and without alpha), but not for paletted images nor 4354for any images with bit depths less than 8 bits/pixel. 4355 4356The 'method' parameter sets the main filtering method, which is 4357currently only '0' in the PNG 1.2 specification. The 'filters' 4358parameter sets which filter(s), if any, should be used for each 4359scanline. Possible values are PNG_ALL_FILTERS and PNG_NO_FILTERS 4360to turn filtering on and off, respectively. 4361 4362Individual filter types are PNG_FILTER_NONE, PNG_FILTER_SUB, 4363PNG_FILTER_UP, PNG_FILTER_AVG, PNG_FILTER_PAETH, which can be bitwise 4364ORed together with '|' to specify one or more filters to use. 4365These filters are described in more detail in the PNG specification. 4366If you intend to change the filter type during the course of writing 4367the image, you should start with flags set for all of the filters 4368you intend to use so that libpng can initialize its internal 4369structures appropriately for all of the filter types. (Note that this 4370means the first row must always be adaptively filtered, because libpng 4371currently does not allocate the filter buffers until png_write_row() 4372is called for the first time.) 4373 4374 filters = PNG_FILTER_NONE | PNG_FILTER_SUB 4375 PNG_FILTER_UP | PNG_FILTER_AVG | 4376 PNG_FILTER_PAETH | PNG_ALL_FILTERS; 4377 4378 png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE, 4379 filters); 4380 The second parameter can also be 4381 PNG_INTRAPIXEL_DIFFERENCING if you are 4382 writing a PNG to be embedded in a MNG 4383 datastream. This parameter must be the 4384 same as the value of filter_method used 4385 in png_set_IHDR(). 4386 4387It is also possible to influence how libpng chooses from among the 4388available filters. This is done in one or both of two ways - by 4389telling it how important it is to keep the same filter for successive 4390rows, and by telling it the relative computational costs of the filters. 4391 4392 double weights[3] = {1.5, 1.3, 1.1}, 4393 costs[PNG_FILTER_VALUE_LAST] = 4394 {1.0, 1.3, 1.3, 1.5, 1.7}; 4395 4396 png_set_filter_heuristics(png_ptr, 4397 PNG_FILTER_HEURISTIC_WEIGHTED, 3, 4398 weights, costs); 4399 4400The weights are multiplying factors that indicate to libpng that the 4401row filter should be the same for successive rows unless another row filter 4402is that many times better than the previous filter. In the above example, 4403if the previous 3 filters were SUB, SUB, NONE, the SUB filter could have a 4404"sum of absolute differences" 1.5 x 1.3 times higher than other filters 4405and still be chosen, while the NONE filter could have a sum 1.1 times 4406higher than other filters and still be chosen. Unspecified weights are 4407taken to be 1.0, and the specified weights should probably be declining 4408like those above in order to emphasize recent filters over older filters. 4409 4410The filter costs specify for each filter type a relative decoding cost 4411to be considered when selecting row filters. This means that filters 4412with higher costs are less likely to be chosen over filters with lower 4413costs, unless their "sum of absolute differences" is that much smaller. 4414The costs do not necessarily reflect the exact computational speeds of 4415the various filters, since this would unduly influence the final image 4416size. 4417 4418Note that the numbers above were invented purely for this example and 4419are given only to help explain the function usage. Little testing has 4420been done to find optimum values for either the costs or the weights. 4421 4422Removing unwanted object code 4423 4424There are a bunch of #define's in pngconf.h that control what parts of 4425libpng are compiled. All the defines end in _SUPPORTED. If you are 4426never going to use a capability, you can change the #define to #undef 4427before recompiling libpng and save yourself code and data space, or 4428you can turn off individual capabilities with defines that begin with 4429PNG_NO_. 4430 4431In libpng-1.5.0 and later, the #define's are in pnglibconf.h instead. 4432 4433You can also turn all of the transforms and ancillary chunk capabilities 4434off en masse with compiler directives that define 4435PNG_NO_READ[or WRITE]_TRANSFORMS, or PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS, 4436or all four, 4437along with directives to turn on any of the capabilities that you do 4438want. The PNG_NO_READ[or WRITE]_TRANSFORMS directives disable the extra 4439transformations but still leave the library fully capable of reading 4440and writing PNG files with all known public chunks. Use of the 4441PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS directive produces a library 4442that is incapable of reading or writing ancillary chunks. If you are 4443not using the progressive reading capability, you can turn that off 4444with PNG_NO_PROGRESSIVE_READ (don't confuse this with the INTERLACING 4445capability, which you'll still have). 4446 4447All the reading and writing specific code are in separate files, so the 4448linker should only grab the files it needs. However, if you want to 4449make sure, or if you are building a stand alone library, all the 4450reading files start with "pngr" and all the writing files start with "pngw". 4451The files that don't match either (like png.c, pngtrans.c, etc.) 4452are used for both reading and writing, and always need to be included. 4453The progressive reader is in pngpread.c 4454 4455If you are creating or distributing a dynamically linked library (a .so 4456or DLL file), you should not remove or disable any parts of the library, 4457as this will cause applications linked with different versions of the 4458library to fail if they call functions not available in your library. 4459The size of the library itself should not be an issue, because only 4460those sections that are actually used will be loaded into memory. 4461 4462Requesting debug printout 4463 4464The macro definition PNG_DEBUG can be used to request debugging 4465printout. Set it to an integer value in the range 0 to 3. Higher 4466numbers result in increasing amounts of debugging information. The 4467information is printed to the "stderr" file, unless another file 4468name is specified in the PNG_DEBUG_FILE macro definition. 4469 4470When PNG_DEBUG > 0, the following functions (macros) become available: 4471 4472 png_debug(level, message) 4473 png_debug1(level, message, p1) 4474 png_debug2(level, message, p1, p2) 4475 4476in which "level" is compared to PNG_DEBUG to decide whether to print 4477the message, "message" is the formatted string to be printed, 4478and p1 and p2 are parameters that are to be embedded in the string 4479according to printf-style formatting directives. For example, 4480 4481 png_debug1(2, "foo=%d", foo); 4482 4483is expanded to 4484 4485 if (PNG_DEBUG > 2) 4486 fprintf(PNG_DEBUG_FILE, "foo=%d\n", foo); 4487 4488When PNG_DEBUG is defined but is zero, the macros aren't defined, but you 4489can still use PNG_DEBUG to control your own debugging: 4490 4491 #ifdef PNG_DEBUG 4492 fprintf(stderr, ... 4493 #endif 4494 4495When PNG_DEBUG = 1, the macros are defined, but only png_debug statements 4496having level = 0 will be printed. There aren't any such statements in 4497this version of libpng, but if you insert some they will be printed. 4498 4499Prepending a prefix to exported symbols 4500 4501Starting with libpng-1.6.0, you can configure libpng (when using the 4502"configure" script) to prefix all exported symbols by means of the 4503configuration option "--with-libpng-prefix=FOO_", where FOO_ can be any 4504string beginning with a letter and containing only uppercase 4505and lowercase letters, digits, and the underscore (i.e., a C language 4506identifier). This creates a set of macros in pnglibconf.h, so this is 4507transparent to applications; their function calls get transformed by 4508the macros to use the modified names. 4509 4510VII. MNG support 4511 4512The MNG specification (available at http://www.libpng.org/pub/mng) allows 4513certain extensions to PNG for PNG images that are embedded in MNG datastreams. 4514Libpng can support some of these extensions. To enable them, use the 4515png_permit_mng_features() function: 4516 4517 feature_set = png_permit_mng_features(png_ptr, mask) 4518 4519 mask is a png_uint_32 containing the bitwise OR of the 4520 features you want to enable. These include 4521 PNG_FLAG_MNG_EMPTY_PLTE 4522 PNG_FLAG_MNG_FILTER_64 4523 PNG_ALL_MNG_FEATURES 4524 4525 feature_set is a png_uint_32 that is the bitwise AND of 4526 your mask with the set of MNG features that is 4527 supported by the version of libpng that you are using. 4528 4529It is an error to use this function when reading or writing a standalone 4530PNG file with the PNG 8-byte signature. The PNG datastream must be wrapped 4531in a MNG datastream. As a minimum, it must have the MNG 8-byte signature 4532and the MHDR and MEND chunks. Libpng does not provide support for these 4533or any other MNG chunks; your application must provide its own support for 4534them. You may wish to consider using libmng (available at 4535http://www.libmng.com) instead. 4536 4537VIII. Changes to Libpng from version 0.88 4538 4539It should be noted that versions of libpng later than 0.96 are not 4540distributed by the original libpng author, Guy Schalnat, nor by 4541Andreas Dilger, who had taken over from Guy during 1996 and 1997, and 4542distributed versions 0.89 through 0.96, but rather by another member 4543of the original PNG Group, Glenn Randers-Pehrson. Guy and Andreas are 4544still alive and well, but they have moved on to other things. 4545 4546The old libpng functions png_read_init(), png_write_init(), 4547png_info_init(), png_read_destroy(), and png_write_destroy() have been 4548moved to PNG_INTERNAL in version 0.95 to discourage their use. These 4549functions will be removed from libpng version 1.4.0. 4550 4551The preferred method of creating and initializing the libpng structures is 4552via the png_create_read_struct(), png_create_write_struct(), and 4553png_create_info_struct() because they isolate the size of the structures 4554from the application, allow version error checking, and also allow the 4555use of custom error handling routines during the initialization, which 4556the old functions do not. The functions png_read_destroy() and 4557png_write_destroy() do not actually free the memory that libpng 4558allocated for these structs, but just reset the data structures, so they 4559can be used instead of png_destroy_read_struct() and 4560png_destroy_write_struct() if you feel there is too much system overhead 4561allocating and freeing the png_struct for each image read. 4562 4563Setting the error callbacks via png_set_message_fn() before 4564png_read_init() as was suggested in libpng-0.88 is no longer supported 4565because this caused applications that do not use custom error functions 4566to fail if the png_ptr was not initialized to zero. It is still possible 4567to set the error callbacks AFTER png_read_init(), or to change them with 4568png_set_error_fn(), which is essentially the same function, but with a new 4569name to force compilation errors with applications that try to use the old 4570method. 4571 4572Support for the sCAL, iCCP, iTXt, and sPLT chunks was added at libpng-1.0.6; 4573however, iTXt support was not enabled by default. 4574 4575Starting with version 1.0.7, you can find out which version of the library 4576you are using at run-time: 4577 4578 png_uint_32 libpng_vn = png_access_version_number(); 4579 4580The number libpng_vn is constructed from the major version, minor 4581version with leading zero, and release number with leading zero, 4582(e.g., libpng_vn for version 1.0.7 is 10007). 4583 4584Note that this function does not take a png_ptr, so you can call it 4585before you've created one. 4586 4587You can also check which version of png.h you used when compiling your 4588application: 4589 4590 png_uint_32 application_vn = PNG_LIBPNG_VER; 4591 4592IX. Changes to Libpng from version 1.0.x to 1.2.x 4593 4594Support for user memory management was enabled by default. To 4595accomplish this, the functions png_create_read_struct_2(), 4596png_create_write_struct_2(), png_set_mem_fn(), png_get_mem_ptr(), 4597png_malloc_default(), and png_free_default() were added. 4598 4599Support for the iTXt chunk has been enabled by default as of 4600version 1.2.41. 4601 4602Support for certain MNG features was enabled. 4603 4604Support for numbered error messages was added. However, we never got 4605around to actually numbering the error messages. The function 4606png_set_strip_error_numbers() was added (Note: the prototype for this 4607function was inadvertently removed from png.h in PNG_NO_ASSEMBLER_CODE 4608builds of libpng-1.2.15. It was restored in libpng-1.2.36). 4609 4610The png_malloc_warn() function was added at libpng-1.2.3. This issues 4611a png_warning and returns NULL instead of aborting when it fails to 4612acquire the requested memory allocation. 4613 4614Support for setting user limits on image width and height was enabled 4615by default. The functions png_set_user_limits(), png_get_user_width_max(), 4616and png_get_user_height_max() were added at libpng-1.2.6. 4617 4618The png_set_add_alpha() function was added at libpng-1.2.7. 4619 4620The function png_set_expand_gray_1_2_4_to_8() was added at libpng-1.2.9. 4621Unlike png_set_gray_1_2_4_to_8(), the new function does not expand the 4622tRNS chunk to alpha. The png_set_gray_1_2_4_to_8() function is 4623deprecated. 4624 4625A number of macro definitions in support of runtime selection of 4626assembler code features (especially Intel MMX code support) were 4627added at libpng-1.2.0: 4628 4629 PNG_ASM_FLAG_MMX_SUPPORT_COMPILED 4630 PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU 4631 PNG_ASM_FLAG_MMX_READ_COMBINE_ROW 4632 PNG_ASM_FLAG_MMX_READ_INTERLACE 4633 PNG_ASM_FLAG_MMX_READ_FILTER_SUB 4634 PNG_ASM_FLAG_MMX_READ_FILTER_UP 4635 PNG_ASM_FLAG_MMX_READ_FILTER_AVG 4636 PNG_ASM_FLAG_MMX_READ_FILTER_PAETH 4637 PNG_ASM_FLAGS_INITIALIZED 4638 PNG_MMX_READ_FLAGS 4639 PNG_MMX_FLAGS 4640 PNG_MMX_WRITE_FLAGS 4641 PNG_MMX_FLAGS 4642 4643We added the following functions in support of runtime 4644selection of assembler code features: 4645 4646 png_get_mmx_flagmask() 4647 png_set_mmx_thresholds() 4648 png_get_asm_flags() 4649 png_get_mmx_bitdepth_threshold() 4650 png_get_mmx_rowbytes_threshold() 4651 png_set_asm_flags() 4652 4653We replaced all of these functions with simple stubs in libpng-1.2.20, 4654when the Intel assembler code was removed due to a licensing issue. 4655 4656These macros are deprecated: 4657 4658 PNG_READ_TRANSFORMS_NOT_SUPPORTED 4659 PNG_PROGRESSIVE_READ_NOT_SUPPORTED 4660 PNG_NO_SEQUENTIAL_READ_SUPPORTED 4661 PNG_WRITE_TRANSFORMS_NOT_SUPPORTED 4662 PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED 4663 PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED 4664 4665They have been replaced, respectively, by: 4666 4667 PNG_NO_READ_TRANSFORMS 4668 PNG_NO_PROGRESSIVE_READ 4669 PNG_NO_SEQUENTIAL_READ 4670 PNG_NO_WRITE_TRANSFORMS 4671 PNG_NO_READ_ANCILLARY_CHUNKS 4672 PNG_NO_WRITE_ANCILLARY_CHUNKS 4673 4674PNG_MAX_UINT was replaced with PNG_UINT_31_MAX. It has been 4675deprecated since libpng-1.0.16 and libpng-1.2.6. 4676 4677The function 4678 png_check_sig(sig, num) 4679was replaced with 4680 !png_sig_cmp(sig, 0, num) 4681It has been deprecated since libpng-0.90. 4682 4683The function 4684 png_set_gray_1_2_4_to_8() 4685which also expands tRNS to alpha was replaced with 4686 png_set_expand_gray_1_2_4_to_8() 4687which does not. It has been deprecated since libpng-1.0.18 and 1.2.9. 4688 4689X. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x 4690 4691Private libpng prototypes and macro definitions were moved from 4692png.h and pngconf.h into a new pngpriv.h header file. 4693 4694Functions png_set_benign_errors(), png_benign_error(), and 4695png_chunk_benign_error() were added. 4696 4697Support for setting the maximum amount of memory that the application 4698will allocate for reading chunks was added, as a security measure. 4699The functions png_set_chunk_cache_max() and png_get_chunk_cache_max() 4700were added to the library. 4701 4702We implemented support for I/O states by adding png_ptr member io_state 4703and functions png_get_io_chunk_name() and png_get_io_state() in pngget.c 4704 4705We added PNG_TRANSFORM_GRAY_TO_RGB to the available high-level 4706input transforms. 4707 4708Checking for and reporting of errors in the IHDR chunk is more thorough. 4709 4710Support for global arrays was removed, to improve thread safety. 4711 4712Some obsolete/deprecated macros and functions have been removed. 4713 4714Typecasted NULL definitions such as 4715 #define png_voidp_NULL (png_voidp)NULL 4716were eliminated. If you used these in your application, just use 4717NULL instead. 4718 4719The png_struct and info_struct members "trans" and "trans_values" were 4720changed to "trans_alpha" and "trans_color", respectively. 4721 4722The obsolete, unused pnggccrd.c and pngvcrd.c files and related makefiles 4723were removed. 4724 4725The PNG_1_0_X and PNG_1_2_X macros were eliminated. 4726 4727The PNG_LEGACY_SUPPORTED macro was eliminated. 4728 4729Many WIN32_WCE #ifdefs were removed. 4730 4731The functions png_read_init(info_ptr), png_write_init(info_ptr), 4732png_info_init(info_ptr), png_read_destroy(), and png_write_destroy() 4733have been removed. They have been deprecated since libpng-0.95. 4734 4735The png_permit_empty_plte() was removed. It has been deprecated 4736since libpng-1.0.9. Use png_permit_mng_features() instead. 4737 4738We removed the obsolete stub functions png_get_mmx_flagmask(), 4739png_set_mmx_thresholds(), png_get_asm_flags(), 4740png_get_mmx_bitdepth_threshold(), png_get_mmx_rowbytes_threshold(), 4741png_set_asm_flags(), and png_mmx_supported() 4742 4743We removed the obsolete png_check_sig(), png_memcpy_check(), and 4744png_memset_check() functions. Instead use !png_sig_cmp(), memcpy(), 4745and memset(), respectively. 4746 4747The function png_set_gray_1_2_4_to_8() was removed. It has been 4748deprecated since libpng-1.0.18 and 1.2.9, when it was replaced with 4749png_set_expand_gray_1_2_4_to_8() because the former function also 4750expanded any tRNS chunk to an alpha channel. 4751 4752Macros for png_get_uint_16, png_get_uint_32, and png_get_int_32 4753were added and are used by default instead of the corresponding 4754functions. Unfortunately, 4755from libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the 4756function) incorrectly returned a value of type png_uint_32. 4757 4758We changed the prototype for png_malloc() from 4759 png_malloc(png_structp png_ptr, png_uint_32 size) 4760to 4761 png_malloc(png_structp png_ptr, png_alloc_size_t size) 4762 4763This also applies to the prototype for the user replacement malloc_fn(). 4764 4765The png_calloc() function was added and is used in place of 4766of "png_malloc(); memset();" except in the case in png_read_png() 4767where the array consists of pointers; in this case a "for" loop is used 4768after the png_malloc() to set the pointers to NULL, to give robust. 4769behavior in case the application runs out of memory part-way through 4770the process. 4771 4772We changed the prototypes of png_get_compression_buffer_size() and 4773png_set_compression_buffer_size() to work with png_size_t instead of 4774png_uint_32. 4775 4776Support for numbered error messages was removed by default, since we 4777never got around to actually numbering the error messages. The function 4778png_set_strip_error_numbers() was removed from the library by default. 4779 4780The png_zalloc() and png_zfree() functions are no longer exported. 4781The png_zalloc() function no longer zeroes out the memory that it 4782allocates. Applications that called png_zalloc(png_ptr, number, size) 4783can call png_calloc(png_ptr, number*size) instead, and can call 4784png_free() instead of png_zfree(). 4785 4786Support for dithering was disabled by default in libpng-1.4.0, because 4787it has not been well tested and doesn't actually "dither". 4788The code was not 4789removed, however, and could be enabled by building libpng with 4790PNG_READ_DITHER_SUPPORTED defined. In libpng-1.4.2, this support 4791was re-enabled, but the function was renamed png_set_quantize() to 4792reflect more accurately what it actually does. At the same time, 4793the PNG_DITHER_[RED,GREEN_BLUE]_BITS macros were also renamed to 4794PNG_QUANTIZE_[RED,GREEN,BLUE]_BITS, and PNG_READ_DITHER_SUPPORTED 4795was renamed to PNG_READ_QUANTIZE_SUPPORTED. 4796 4797We removed the trailing '.' from the warning and error messages. 4798 4799XI. Changes to Libpng from version 1.4.x to 1.5.x 4800 4801From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the 4802function) incorrectly returned a value of type png_uint_32. 4803The incorrect macro was removed from libpng-1.4.5. 4804 4805Checking for invalid palette index on write was added at libpng 48061.5.10. If a pixel contains an invalid (out-of-range) index libpng issues 4807a benign error. This is enabled by default because this condition is an 4808error according to the PNG specification, Clause 11.3.2, but the error can 4809be ignored in each png_ptr with 4810 4811 png_set_check_for_invalid_index(png_ptr, allowed); 4812 4813 allowed - one of 4814 0: disable benign error (accept the 4815 invalid data without warning). 4816 1: enable benign error (treat the 4817 invalid data as an error or a 4818 warning). 4819 4820If the error is ignored, or if png_benign_error() treats it as a warning, 4821any invalid pixels are decoded as opaque black by the decoder and written 4822as-is by the encoder. 4823 4824Retrieving the maximum palette index found was added at libpng-1.5.15. 4825This statement must appear after png_read_png() or png_read_image() while 4826reading, and after png_write_png() or png_write_image() while writing. 4827 4828 int max_palette = png_get_palette_max(png_ptr, info_ptr); 4829 4830This will return the maximum palette index found in the image, or "-1" if 4831the palette was not checked, or "0" if no palette was found. Note that this 4832does not account for any palette index used by ancillary chunks such as the 4833bKGD chunk; you must check those separately to determine the maximum 4834palette index actually used. 4835 4836A. Changes that affect users of libpng 4837 4838There are no substantial API changes between the non-deprecated parts of 4839the 1.4.5 API and the 1.5.0 API; however, the ability to directly access 4840members of the main libpng control structures, png_struct and png_info, 4841deprecated in earlier versions of libpng, has been completely removed from 4842libpng 1.5. 4843 4844We no longer include zlib.h in png.h. The include statement has been moved 4845to pngstruct.h, where it is not accessible by applications. Applications that 4846need access to information in zlib.h will need to add the '#include "zlib.h"' 4847directive. It does not matter whether this is placed prior to or after 4848the '"#include png.h"' directive. 4849 4850The png_sprintf(), png_strcpy(), and png_strncpy() macros are no longer used 4851and were removed. 4852 4853We moved the png_strlen(), png_memcpy(), png_memset(), and png_memcmp() 4854macros into a private header file (pngpriv.h) that is not accessible to 4855applications. 4856 4857In png_get_iCCP, the type of "profile" was changed from png_charpp 4858to png_bytepp, and in png_set_iCCP, from png_charp to png_const_bytep. 4859 4860There are changes of form in png.h, including new and changed macros to 4861declare parts of the API. Some API functions with arguments that are 4862pointers to data not modified within the function have been corrected to 4863declare these arguments with PNG_CONST. 4864 4865Much of the internal use of C macros to control the library build has also 4866changed and some of this is visible in the exported header files, in 4867particular the use of macros to control data and API elements visible 4868during application compilation may require significant revision to 4869application code. (It is extremely rare for an application to do this.) 4870 4871Any program that compiled against libpng 1.4 and did not use deprecated 4872features or access internal library structures should compile and work 4873against libpng 1.5, except for the change in the prototype for 4874png_get_iCCP() and png_set_iCCP() API functions mentioned above. 4875 4876libpng 1.5.0 adds PNG_ PASS macros to help in the reading and writing of 4877interlaced images. The macros return the number of rows and columns in 4878each pass and information that can be used to de-interlace and (if 4879absolutely necessary) interlace an image. 4880 4881libpng 1.5.0 adds an API png_longjmp(png_ptr, value). This API calls 4882the application-provided png_longjmp_ptr on the internal, but application 4883initialized, longjmp buffer. It is provided as a convenience to avoid 4884the need to use the png_jmpbuf macro, which had the unnecessary side 4885effect of resetting the internal png_longjmp_ptr value. 4886 4887libpng 1.5.0 includes a complete fixed point API. By default this is 4888present along with the corresponding floating point API. In general the 4889fixed point API is faster and smaller than the floating point one because 4890the PNG file format used fixed point, not floating point. This applies 4891even if the library uses floating point in internal calculations. A new 4892macro, PNG_FLOATING_ARITHMETIC_SUPPORTED, reveals whether the library 4893uses floating point arithmetic (the default) or fixed point arithmetic 4894internally for performance critical calculations such as gamma correction. 4895In some cases, the gamma calculations may produce slightly different 4896results. This has changed the results in png_rgb_to_gray and in alpha 4897composition (png_set_background for example). This applies even if the 4898original image was already linear (gamma == 1.0) and, therefore, it is 4899not necessary to linearize the image. This is because libpng has *not* 4900been changed to optimize that case correctly, yet. 4901 4902Fixed point support for the sCAL chunk comes with an important caveat; 4903the sCAL specification uses a decimal encoding of floating point values 4904and the accuracy of PNG fixed point values is insufficient for 4905representation of these values. Consequently a "string" API 4906(png_get_sCAL_s and png_set_sCAL_s) is the only reliable way of reading 4907arbitrary sCAL chunks in the absence of either the floating point API or 4908internal floating point calculations. Starting with libpng-1.5.0, both 4909of these functions are present when PNG_sCAL_SUPPORTED is defined. Prior 4910to libpng-1.5.0, their presence also depended upon PNG_FIXED_POINT_SUPPORTED 4911being defined and PNG_FLOATING_POINT_SUPPORTED not being defined. 4912 4913Applications no longer need to include the optional distribution header 4914file pngusr.h or define the corresponding macros during application 4915build in order to see the correct variant of the libpng API. From 1.5.0 4916application code can check for the corresponding _SUPPORTED macro: 4917 4918#ifdef PNG_INCH_CONVERSIONS_SUPPORTED 4919 /* code that uses the inch conversion APIs. */ 4920#endif 4921 4922This macro will only be defined if the inch conversion functions have been 4923compiled into libpng. The full set of macros, and whether or not support 4924has been compiled in, are available in the header file pnglibconf.h. 4925This header file is specific to the libpng build. Notice that prior to 49261.5.0 the _SUPPORTED macros would always have the default definition unless 4927reset by pngusr.h or by explicit settings on the compiler command line. 4928These settings may produce compiler warnings or errors in 1.5.0 because 4929of macro redefinition. 4930 4931Applications can now choose whether to use these macros or to call the 4932corresponding function by defining PNG_USE_READ_MACROS or 4933PNG_NO_USE_READ_MACROS before including png.h. Notice that this is 4934only supported from 1.5.0; defining PNG_NO_USE_READ_MACROS prior to 1.5.0 4935will lead to a link failure. 4936 4937Prior to libpng-1.5.4, the zlib compressor used the same set of parameters 4938when compressing the IDAT data and textual data such as zTXt and iCCP. 4939In libpng-1.5.4 we reinitialized the zlib stream for each type of data. 4940We added five png_set_text_*() functions for setting the parameters to 4941use with textual data. 4942 4943Prior to libpng-1.5.4, the PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED 4944option was off by default, and slightly inaccurate scaling occurred. 4945This option can no longer be turned off, and the choice of accurate 4946or inaccurate 16-to-8 scaling is by using the new png_set_scale_16_to_8() 4947API for accurate scaling or the old png_set_strip_16_to_8() API for simple 4948chopping. In libpng-1.5.4, the PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED 4949macro became PNG_READ_SCALE_16_TO_8_SUPPORTED, and the PNG_READ_16_TO_8 4950macro became PNG_READ_STRIP_16_TO_8_SUPPORTED, to enable the two 4951png_set_*_16_to_8() functions separately. 4952 4953Prior to libpng-1.5.4, the png_set_user_limits() function could only be 4954used to reduce the width and height limits from the value of 4955PNG_USER_WIDTH_MAX and PNG_USER_HEIGHT_MAX, although this document said 4956that it could be used to override them. Now this function will reduce or 4957increase the limits. 4958 4959Starting in libpng-1.5.10, the user limits can be set en masse with the 4960configuration option PNG_SAFE_LIMITS_SUPPORTED. If this option is enabled, 4961a set of "safe" limits is applied in pngpriv.h. These can be overridden by 4962application calls to png_set_user_limits(), png_set_user_chunk_cache_max(), 4963and/or png_set_user_malloc_max() that increase or decrease the limits. Also, 4964in libpng-1.5.10 the default width and height limits were increased 4965from 1,000,000 to 0x7ffffff (i.e., made unlimited). Therefore, the 4966limits are now 4967 default safe 4968 png_user_width_max 0x7fffffff 1,000,000 4969 png_user_height_max 0x7fffffff 1,000,000 4970 png_user_chunk_cache_max 0 (unlimited) 128 4971 png_user_chunk_malloc_max 0 (unlimited) 8,000,000 4972 4973The png_set_option() function (and the "options" member of the png struct) was 4974added to libpng-1.5.15. 4975 4976B. Changes to the build and configuration of libpng 4977 4978Details of internal changes to the library code can be found in the CHANGES 4979file and in the GIT repository logs. These will be of no concern to the vast 4980majority of library users or builders; however, the few who configure libpng 4981to a non-default feature set may need to change how this is done. 4982 4983There should be no need for library builders to alter build scripts if 4984these use the distributed build support - configure or the makefiles - 4985however, users of the makefiles may care to update their build scripts 4986to build pnglibconf.h where the corresponding makefile does not do so. 4987 4988Building libpng with a non-default configuration has changed completely. 4989The old method using pngusr.h should still work correctly even though the 4990way pngusr.h is used in the build has been changed; however, library 4991builders will probably want to examine the changes to take advantage of 4992new capabilities and to simplify their build system. 4993 4994B.1 Specific changes to library configuration capabilities 4995 4996The library now supports a complete fixed point implementation and can 4997thus be used on systems that have no floating point support or very 4998limited or slow support. Previously gamma correction, an essential part 4999of complete PNG support, required reasonably fast floating point. 5000 5001As part of this the choice of internal implementation has been made 5002independent of the choice of fixed versus floating point APIs and all the 5003missing fixed point APIs have been implemented. 5004 5005The exact mechanism used to control attributes of API functions has 5006changed. A single set of operating system independent macro definitions 5007is used and operating system specific directives are defined in 5008pnglibconf.h 5009 5010As part of this the mechanism used to choose procedure call standards on 5011those systems that allow a choice has been changed. At present this only 5012affects certain Microsoft (DOS, Windows) and IBM (OS/2) operating systems 5013running on Intel processors. As before, PNGAPI is defined where required 5014to control the exported API functions; however, two new macros, PNGCBAPI 5015and PNGCAPI, are used instead for callback functions (PNGCBAPI) and 5016(PNGCAPI) for functions that must match a C library prototype (currently 5017only png_longjmp_ptr, which must match the C longjmp function.) The new 5018approach is documented in pngconf.h 5019 5020Despite these changes, libpng 1.5.0 only supports the native C function 5021calling standard on those platforms tested so far (__cdecl on Microsoft 5022Windows). This is because the support requirements for alternative 5023calling conventions seem to no longer exist. Developers who find it 5024necessary to set PNG_API_RULE to 1 should advise the mailing list 5025(png-mng-implement) of this and library builders who use Openwatcom and 5026therefore set PNG_API_RULE to 2 should also contact the mailing list. 5027 5028A new test program, pngvalid, is provided in addition to pngtest. 5029pngvalid validates the arithmetic accuracy of the gamma correction 5030calculations and includes a number of validations of the file format. 5031A subset of the full range of tests is run when "make check" is done 5032(in the 'configure' build.) pngvalid also allows total allocated memory 5033usage to be evaluated and performs additional memory overwrite validation. 5034 5035Many changes to individual feature macros have been made. The following 5036are the changes most likely to be noticed by library builders who 5037configure libpng: 5038 50391) All feature macros now have consistent naming: 5040 5041#define PNG_NO_feature turns the feature off 5042#define PNG_feature_SUPPORTED turns the feature on 5043 5044pnglibconf.h contains one line for each feature macro which is either: 5045 5046#define PNG_feature_SUPPORTED 5047 5048if the feature is supported or: 5049 5050/*#undef PNG_feature_SUPPORTED*/ 5051 5052if it is not. Library code consistently checks for the 'SUPPORTED' macro. 5053It does not, and libpng applications should not, check for the 'NO' macro 5054which will not normally be defined even if the feature is not supported. 5055The 'NO' macros are only used internally for setting or not setting the 5056corresponding 'SUPPORTED' macros. 5057 5058Compatibility with the old names is provided as follows: 5059 5060PNG_INCH_CONVERSIONS turns on PNG_INCH_CONVERSIONS_SUPPORTED 5061 5062And the following definitions disable the corresponding feature: 5063 5064PNG_SETJMP_NOT_SUPPORTED disables SETJMP 5065PNG_READ_TRANSFORMS_NOT_SUPPORTED disables READ_TRANSFORMS 5066PNG_NO_READ_COMPOSITED_NODIV disables READ_COMPOSITE_NODIV 5067PNG_WRITE_TRANSFORMS_NOT_SUPPORTED disables WRITE_TRANSFORMS 5068PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED disables READ_ANCILLARY_CHUNKS 5069PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED disables WRITE_ANCILLARY_CHUNKS 5070 5071Library builders should remove use of the above, inconsistent, names. 5072 50732) Warning and error message formatting was previously conditional on 5074the STDIO feature. The library has been changed to use the 5075CONSOLE_IO feature instead. This means that if CONSOLE_IO is disabled 5076the library no longer uses the printf(3) functions, even though the 5077default read/write implementations use (FILE) style stdio.h functions. 5078 50793) Three feature macros now control the fixed/floating point decisions: 5080 5081PNG_FLOATING_POINT_SUPPORTED enables the floating point APIs 5082 5083PNG_FIXED_POINT_SUPPORTED enables the fixed point APIs; however, in 5084practice these are normally required internally anyway (because the PNG 5085file format is fixed point), therefore in most cases PNG_NO_FIXED_POINT 5086merely stops the function from being exported. 5087 5088PNG_FLOATING_ARITHMETIC_SUPPORTED chooses between the internal floating 5089point implementation or the fixed point one. Typically the fixed point 5090implementation is larger and slower than the floating point implementation 5091on a system that supports floating point; however, it may be faster on a 5092system which lacks floating point hardware and therefore uses a software 5093emulation. 5094 50954) Added PNG_{READ,WRITE}_INT_FUNCTIONS_SUPPORTED. This allows the 5096functions to read and write ints to be disabled independently of 5097PNG_USE_READ_MACROS, which allows libpng to be built with the functions 5098even though the default is to use the macros - this allows applications 5099to choose at app buildtime whether or not to use macros (previously 5100impossible because the functions weren't in the default build.) 5101 5102B.2 Changes to the configuration mechanism 5103 5104Prior to libpng-1.5.0 library builders who needed to configure libpng 5105had either to modify the exported pngconf.h header file to add system 5106specific configuration or had to write feature selection macros into 5107pngusr.h and cause this to be included into pngconf.h by defining 5108PNG_USER_CONFIG. The latter mechanism had the disadvantage that an 5109application built without PNG_USER_CONFIG defined would see the 5110unmodified, default, libpng API and thus would probably fail to link. 5111 5112These mechanisms still work in the configure build and in any makefile 5113build that builds pnglibconf.h, although the feature selection macros 5114have changed somewhat as described above. In 1.5.0, however, pngusr.h is 5115processed only once, when the exported header file pnglibconf.h is built. 5116pngconf.h no longer includes pngusr.h, therefore pngusr.h is ignored after the 5117build of pnglibconf.h and it is never included in an application build. 5118 5119The rarely used alternative of adding a list of feature macros to the 5120CPPFLAGS setting in the build also still works; however, the macros will be 5121copied to pnglibconf.h and this may produce macro redefinition warnings 5122when the individual C files are compiled. 5123 5124All configuration now only works if pnglibconf.h is built from 5125scripts/pnglibconf.dfa. This requires the program awk. Brian Kernighan 5126(the original author of awk) maintains C source code of that awk and this 5127and all known later implementations (often called by subtly different 5128names - nawk and gawk for example) are adequate to build pnglibconf.h. 5129The Sun Microsystems (now Oracle) program 'awk' is an earlier version 5130and does not work; this may also apply to other systems that have a 5131functioning awk called 'nawk'. 5132 5133Configuration options are now documented in scripts/pnglibconf.dfa. This 5134file also includes dependency information that ensures a configuration is 5135consistent; that is, if a feature is switched off dependent features are 5136also removed. As a recommended alternative to using feature macros in 5137pngusr.h a system builder may also define equivalent options in pngusr.dfa 5138(or, indeed, any file) and add that to the configuration by setting 5139DFA_XTRA to the file name. The makefiles in contrib/pngminim illustrate 5140how to do this, and a case where pngusr.h is still required. 5141 5142XII. Changes to Libpng from version 1.5.x to 1.6.x 5143 5144A "simplified API" has been added (see documentation in png.h and a simple 5145example in contrib/examples/pngtopng.c). The new publicly visible API 5146includes the following: 5147 5148 macros: 5149 PNG_FORMAT_* 5150 PNG_IMAGE_* 5151 structures: 5152 png_control 5153 png_image 5154 read functions 5155 png_image_begin_read_from_file() 5156 png_image_begin_read_from_stdio() 5157 png_image_begin_read_from_memory() 5158 png_image_finish_read() 5159 png_image_free() 5160 write functions 5161 png_image_write_to_file() 5162 png_image_write_to_stdio() 5163 5164Starting with libpng-1.6.0, you can configure libpng to prefix all exported 5165symbols, using the PNG_PREFIX macro. 5166 5167We no longer include string.h in png.h. The include statement has been moved 5168to pngpriv.h, where it is not accessible by applications. Applications that 5169need access to information in string.h must add an '#include <string.h>' 5170directive. It does not matter whether this is placed prior to or after 5171the '#include "png.h"' directive. 5172 5173The following API are now DEPRECATED: 5174 png_info_init_3() 5175 png_convert_to_rfc1123() which has been replaced 5176 with png_convert_to_rfc1123_buffer() 5177 png_malloc_default() 5178 png_free_default() 5179 png_reset_zstream() 5180 5181The following have been removed: 5182 png_get_io_chunk_name(), which has been replaced 5183 with png_get_io_chunk_type(). The new 5184 function returns a 32-bit integer instead of 5185 a string. 5186 The png_sizeof(), png_strlen(), png_memcpy(), png_memcmp(), and 5187 png_memset() macros are no longer used in the libpng sources and 5188 have been removed. These had already been made invisible to applications 5189 (i.e., defined in the private pngpriv.h header file) since libpng-1.5.0. 5190 5191The signatures of many exported functions were changed, such that 5192 png_structp became png_structrp or png_const_structrp 5193 png_infop became png_inforp or png_const_inforp 5194where "rp" indicates a "restricted pointer". 5195 5196Error detection in some chunks has improved; in particular the iCCP chunk 5197reader now does pretty complete validation of the basic format. Some bad 5198profiles that were previously accepted are now accepted with a warning or 5199rejected, depending upon the png_set_benign_errors() setting, in particular the 5200very old broken Microsoft/HP 3144-byte sRGB profile. The PNG spec requirement 5201that only grayscale profiles may appear in images with color type 0 or 4 and 5202that even if the image only contains gray pixels, only RGB profiles may appear 5203in images with color type 2, 3, or 6, is now enforced. The sRGB chunk 5204is allowed to appear in images with any color type. 5205 5206Prior to libpng-1.6.0 a warning would be issued if the iTXt chunk contained 5207an empty language field or an empty translated keyword. Both of these 5208are allowed by the PNG specification, so these warnings are no longer issued. 5209 5210The library now issues an error if the application attempts to set a 5211transform after it calls png_read_update_info() or if it attempts to call 5212both png_read_update_info() and png_start_read_image() or to call either 5213of them more than once. 5214 5215The default condition for benign_errors is now to treat benign errors as 5216warnings while reading and as errors while writing. 5217 5218The library now issues a warning if both background processing and RGB to 5219gray are used when gamma correction happens. As with previous versions of 5220the library the results are numerically very incorrect in this case. 5221 5222There are some minor arithmetic changes in some transforms such as 5223png_set_background(), that might be detected by certain regression tests. 5224 5225Unknown chunk handling has been improved internally, without any API change. 5226This adds more correct option control of the unknown handling, corrects 5227a pre-existing bug where the per-chunk 'keep' setting is ignored, and makes 5228it possible to skip IDAT chunks in the sequential reader. 5229 5230The machine-generated configure files are no longer included in branches 5231libpng16 and later of the GIT repository. They continue to be included 5232in the tarball releases, however. 5233 5234Libpng-1.6.0 through 1.6.2 used the CMF bytes at the beginning of the IDAT 5235stream to set the size of the sliding window for reading instead of using the 5236default 32-kbyte sliding window size. It was discovered that there are 5237hundreds of PNG files in the wild that have incorrect CMF bytes that caused 5238libpng to issue a "too far back" error and reject the file. Libpng-1.6.3 and 5239later calculate their own safe CMF from the image dimensions, provide a way 5240to revert to the libpng-1.5.x behavior (ignoring the CMF bytes and using a 524132-kbyte sliding window), by using 5242 5243 png_set_option(png_ptr, PNG_MAXIMUM_INFLATE_WINDOW, 5244 PNG_OPTION_ON); 5245 5246and provide a tool (contrib/tools/pngfix) for optimizing the CMF bytes 5247correctly. 5248 5249Libpng-1.6.0 and libpng-1.6.1 wrote uncompressed iTXt chunks with the wrong 5250length, which resulted in PNG files that cannot be read beyond the bad iTXt 5251chunk. This error was fixed in libpng-1.6.3, and a tool (called 5252contrib/tools/png-fix-itxt) has been added to the libpng distribution. 5253 5254XIII. Detecting libpng 5255 5256The png_get_io_ptr() function has been present since libpng-0.88, has never 5257changed, and is unaffected by conditional compilation macros. It is the 5258best choice for use in configure scripts for detecting the presence of any 5259libpng version since 0.88. In an autoconf "configure.in" you could use 5260 5261 AC_CHECK_LIB(png, png_get_io_ptr, ... 5262 5263XV. Source code repository 5264 5265Since about February 2009, version 1.2.34, libpng has been under "git" source 5266control. The git repository was built from old libpng-x.y.z.tar.gz files 5267going back to version 0.70. You can access the git repository (read only) 5268at 5269 5270 git://git.code.sf.net/p/libpng/code 5271 5272or you can browse it with a web browser by selecting the "code" button at 5273 5274 https://sourceforge.net/projects/libpng 5275 5276Patches can be sent to glennrp at users.sourceforge.net or to 5277png-mng-implement at lists.sourceforge.net or you can upload them to 5278the libpng bug tracker at 5279 5280 http://libpng.sourceforge.net 5281 5282We also accept patches built from the tar or zip distributions, and 5283simple verbal discriptions of bug fixes, reported either to the 5284SourceForge bug tracker, to the png-mng-implement at lists.sf.net 5285mailing list, or directly to glennrp. 5286 5287XV. Coding style 5288 5289Our coding style is similar to the "Allman" style, with curly 5290braces on separate lines: 5291 5292 if (condition) 5293 { 5294 action; 5295 } 5296 5297 else if (another condition) 5298 { 5299 another action; 5300 } 5301 5302The braces can be omitted from simple one-line actions: 5303 5304 if (condition) 5305 return (0); 5306 5307We use 3-space indentation, except for continued statements which 5308are usually indented the same as the first line of the statement 5309plus four more spaces. 5310 5311For macro definitions we use 2-space indentation, always leaving the "#" 5312in the first column. 5313 5314 #ifndef PNG_NO_FEATURE 5315 # ifndef PNG_FEATURE_SUPPORTED 5316 # define PNG_FEATURE_SUPPORTED 5317 # endif 5318 #endif 5319 5320Comments appear with the leading "/*" at the same indentation as 5321the statement that follows the comment: 5322 5323 /* Single-line comment */ 5324 statement; 5325 5326 /* This is a multiple-line 5327 * comment. 5328 */ 5329 statement; 5330 5331Very short comments can be placed after the end of the statement 5332to which they pertain: 5333 5334 statement; /* comment */ 5335 5336We don't use C++ style ("//") comments. We have, however, 5337used them in the past in some now-abandoned MMX assembler 5338code. 5339 5340Functions and their curly braces are not indented, and 5341exported functions are marked with PNGAPI: 5342 5343 /* This is a public function that is visible to 5344 * application programmers. It does thus-and-so. 5345 */ 5346 void PNGAPI 5347 png_exported_function(png_ptr, png_info, foo) 5348 { 5349 body; 5350 } 5351 5352The return type and decorations are placed on a separate line 5353ahead of the function name, as illustrated above. 5354 5355The prototypes for all exported functions appear in png.h, 5356above the comment that says 5357 5358 /* Maintainer: Put new public prototypes here ... */ 5359 5360We mark all non-exported functions with "/* PRIVATE */"": 5361 5362 void /* PRIVATE */ 5363 png_non_exported_function(png_ptr, png_info, foo) 5364 { 5365 body; 5366 } 5367 5368The prototypes for non-exported functions (except for those in 5369pngtest) appear in 5370pngpriv.h 5371above the comment that says 5372 5373 /* Maintainer: Put new private prototypes here ^ */ 5374 5375We put a space after the "sizeof" operator and we omit the 5376optional parentheses around its argument when the argument 5377is an expression, not a type name, and we always enclose the 5378sizeof operator, with its argument, in parentheses: 5379 5380 (sizeof (png_uint_32)) 5381 (sizeof array) 5382 5383Prior to libpng-1.6.0 we used a "png_sizeof()" macro, formatted as 5384though it were a function. 5385 5386To avoid polluting the global namespace, the names of all exported 5387functions and variables begin with "png_", and all publicly visible C 5388preprocessor macros begin with "PNG". We request that applications that 5389use libpng *not* begin any of their own symbols with either of these strings. 5390 5391We put a space after each comma and after each semicolon 5392in "for" statements, and we put spaces before and after each 5393C binary operator and after "for" or "while", and before 5394"?". We don't put a space between a typecast and the expression 5395being cast, nor do we put one between a function name and the 5396left parenthesis that follows it: 5397 5398 for (i = 2; i > 0; --i) 5399 y[i] = a(x) + (int)b; 5400 5401We prefer #ifdef and #ifndef to #if defined() and #if !defined() 5402when there is only one macro being tested. We always use parentheses 5403with "defined". 5404 5405We prefer to express integers that are used as bit masks in hex format, 5406with an even number of lower-case hex digits (e.g., 0x00, 0xff, 0x0100). 5407 5408We prefer to use underscores in variable names rather than camelCase, except 5409for a few type names that we inherit from zlib.h. 5410 5411We do not use the TAB character for indentation in the C sources. 5412 5413Lines do not exceed 80 characters. 5414 5415Other rules can be inferred by inspecting the libpng source. 5416 5417XVI. Y2K Compliance in libpng 5418 5419March 6, 2014 5420 5421Since the PNG Development group is an ad-hoc body, we can't make 5422an official declaration. 5423 5424This is your unofficial assurance that libpng from version 0.71 and 5425upward through 1.6.10 are Y2K compliant. It is my belief that earlier 5426versions were also Y2K compliant. 5427 5428Libpng only has two year fields. One is a 2-byte unsigned integer 5429that will hold years up to 65535. The other, which is deprecated, 5430holds the date in text format, and will hold years up to 9999. 5431 5432The integer is 5433 "png_uint_16 year" in png_time_struct. 5434 5435The string is 5436 "char time_buffer[29]" in png_struct. This is no longer used 5437in libpng-1.6.x and will be removed from libpng-1.7.0. 5438 5439There are seven time-related functions: 5440 5441 png_convert_to_rfc_1123() in png.c 5442 (formerly png_convert_to_rfc_1152() in error) 5443 png_convert_from_struct_tm() in pngwrite.c, called 5444 in pngwrite.c 5445 png_convert_from_time_t() in pngwrite.c 5446 png_get_tIME() in pngget.c 5447 png_handle_tIME() in pngrutil.c, called in pngread.c 5448 png_set_tIME() in pngset.c 5449 png_write_tIME() in pngwutil.c, called in pngwrite.c 5450 5451All appear to handle dates properly in a Y2K environment. The 5452png_convert_from_time_t() function calls gmtime() to convert from system 5453clock time, which returns (year - 1900), which we properly convert to 5454the full 4-digit year. There is a possibility that applications using 5455libpng are not passing 4-digit years into the png_convert_to_rfc_1123() 5456function, or that they are incorrectly passing only a 2-digit year 5457instead of "year - 1900" into the png_convert_from_struct_tm() function, 5458but this is not under our control. The libpng documentation has always 5459stated that it works with 4-digit years, and the APIs have been 5460documented as such. 5461 5462The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned 5463integer to hold the year, and can hold years as large as 65535. 5464 5465zlib, upon which libpng depends, is also Y2K compliant. It contains 5466no date-related code. 5467 5468 5469 Glenn Randers-Pehrson 5470 libpng maintainer 5471 PNG Development Group 5472