blob: ced192d4e1079bf41e3be3ab79b4c28fc4287527 [file] [log] [blame]
Glenn Randers-Pehrson48854ae2010-10-17 12:52:29 -05001libpng-manual.txt - A description on how to use and modify libpng
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002
Glenn Randers-Pehrsond4e1ddb2011-07-27 20:09:57 -05003 libpng version 1.5.5beta04 - July 28, 2011
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05004 Updated and distributed by Glenn Randers-Pehrson
5 <glennrp at users.sourceforge.net>
Glenn Randers-Pehrson9f45c8e2011-01-15 19:35:03 -06006 Copyright (c) 1998-2011 Glenn Randers-Pehrson
Glenn Randers-Pehrson037023b2009-06-24 10:27:36 -05007
Glenn Randers-Pehrsonbfbf8652009-06-26 21:46:52 -05008 This document is released under the libpng license.
Glenn Randers-Pehrsonc332bbc2009-06-25 13:43:50 -05009 For conditions of distribution and use, see the disclaimer
Glenn Randers-Pehrson037023b2009-06-24 10:27:36 -050010 and license in png.h
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -050011
12 Based on:
13
Glenn Randers-Pehrsond4e1ddb2011-07-27 20:09:57 -050014 libpng versions 0.97, January 1998, through 1.5.5beta04 - July 28, 2011
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -050015 Updated and distributed by Glenn Randers-Pehrson
Glenn Randers-Pehrson9f45c8e2011-01-15 19:35:03 -060016 Copyright (c) 1998-2011 Glenn Randers-Pehrson
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -050017
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
31I. Introduction
32
33This file describes how to use and modify the PNG reference library
34(known as libpng) for your own use. There are five sections to this
35file: introduction, structures, reading, writing, and modification and
36configuration notes for various special platforms. In addition to this
37file, example.c is a good starting point for using the library, as
38it is heavily commented and should include everything most people
39will need. We assume that libpng is already installed; see the
40INSTALL file for instructions on how to install libpng.
41
42For examples of libpng usage, see the files "example.c", "pngtest.c",
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -060043and the files in the "contrib" directory, all of which are included in
44the libpng distribution.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -050045
46Libpng was written as a companion to the PNG specification, as a way
47of reducing the amount of time and effort it takes to support the PNG
48file format in application programs.
49
50The PNG specification (second edition), November 2003, is available as
51a W3C Recommendation and as an ISO Standard (ISO/IEC 15948:2003 (E)) at
52<http://www.w3.org/TR/2003/REC-PNG-20031110/
53The W3C and ISO documents have identical technical content.
54
55The PNG-1.2 specification is available at
56<http://www.libpng.org/pub/png/documents/>. It is technically equivalent
57to the PNG specification (second edition) but has some additional material.
58
59The PNG-1.0 specification is available
60as RFC 2083 <http://www.libpng.org/pub/png/documents/> and as a
61W3C Recommendation <http://www.w3.org/TR/REC.png.html>.
62
63Some additional chunks are described in the special-purpose public chunks
64documents at <http://www.libpng.org/pub/png/documents/>.
65
66Other information
67about PNG, and the latest version of libpng, can be found at the PNG home
68page, <http://www.libpng.org/pub/png/>.
69
70Most users will not have to modify the library significantly; advanced
71users may want to modify it more. All attempts were made to make it as
72complete as possible, while keeping the code easy to understand.
73Currently, this library only supports C. Support for other languages
74is being considered.
75
76Libpng has been designed to handle multiple sessions at one time,
77to be easily modifiable, to be portable to the vast majority of
78machines (ANSI, K&R, 16-, 32-, and 64-bit) available, and to be easy
79to use. The ultimate goal of libpng is to promote the acceptance of
80the PNG file format in whatever way possible. While there is still
81work to be done (see the TODO file), libpng should cover the
82majority of the needs of its users.
83
84Libpng uses zlib for its compression and decompression of PNG files.
85Further information about zlib, and the latest version of zlib, can
86be found at the zlib home page, <http://www.info-zip.org/pub/infozip/zlib/>.
87The zlib compression utility is a general purpose utility that is
88useful for more than PNG files, and can be used without libpng.
89See the documentation delivered with zlib for more details.
90You can usually find the source files for the zlib utility wherever you
91find the libpng source files.
92
93Libpng is thread safe, provided the threads are using different
94instances of the structures. Each thread should have its own
95png_struct and png_info instances, and thus its own image.
96Libpng does not protect itself against two threads using the
97same instance of a structure.
98
99II. Structures
100
101There are two main structures that are important to libpng, png_struct
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500102and png_info. Both are internal structures that are no longer exposed
103in the libpng interface (as of libpng 1.5.0).
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500104
105The png_info structure is designed to provide information about the
106PNG file. At one time, the fields of png_info were intended to be
107directly accessible to the user. However, this tended to cause problems
108with applications using dynamically loaded libraries, and as a result
109a set of interface functions for png_info (the png_get_*() and png_set_*()
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -0500110functions) was developed, and direct access to the png_info fields was
111deprecated..
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500112
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500113The png_struct structure is the object used by the library to decode a
114single image. As of 1.5.0 this structure is also not exposed.
115
116Almost all libpng APIs require a pointer to a png_struct as the first argument.
117Many (in particular the png_set and png_get APIs) also require a pointer
118to png_info as the second argument. Some application visible macros
119defined in png.h designed for basic data access (reading and writing
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -0500120integers in the PNG format) don't take a png_info pointer, but it's almost
121always safe to assume that a (png_struct*) has to be passed to call an API
122function.
123
124You can have more than one png_info structure associated with an image,
125as illustrated in pngtest.c, one for information valid prior to the
126IDAT chunks and another (called "end_info" below) for things after them.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500127
128The png.h header file is an invaluable reference for programming with libpng.
129And while I'm on the topic, make sure you include the libpng header file:
130
131#include <png.h>
132
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -0500133and also (as of libpng-1.5.0) the zlib header file, if you need it:
134
135#include <zlib.h>
136
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500137Types
138
139The png.h header file defines a number of integral types used by the
140APIs. Most of these are fairly obvious; for example types corresponding
141to integers of particular sizes and types for passing color values.
142
143One exception is how non-integral numbers are handled. For application
144convenience most APIs that take such numbers have C (double) arguments,
145however internally PNG, and libpng, use 32 bit signed integers and encode
146the value by multiplying by 100,000. As of libpng 1.5.0 a convenience
147macro PNG_FP_1 is defined in png.h along with a type (png_fixed_point)
148which is simply (png_int_32).
149
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -0500150All APIs that take (double) arguments also have a matching API that
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500151takes the corresponding fixed point integer arguments. The fixed point
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -0500152API has the same name as the floating point one with "_fixed" appended.
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500153The actual range of values permitted in the APIs is frequently less than
154the full range of (png_fixed_point) (-21474 to +21474). When APIs require
155a non-negative argument the type is recorded as png_uint_32 above. Consult
156the header file and the text below for more information.
157
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -0600158Special care must be take with sCAL chunk handling because the chunk itself
159uses non-integral values encoded as strings containing decimal floating point
160numbers. See the comments in the header file.
161
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500162Configuration
163
164The main header file function declarations are frequently protected by C
165preprocessing directives of the form:
166
167 #ifdef PNG_feature_SUPPORTED
168 declare-function
169 #endif
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -0500170 ...
171 #ifdef PNG_feature_SUPPORTED
172 use-function
173 #endif
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500174
175The library can be built without support for these APIs, although a
176standard build will have all implemented APIs. Application programs
177should check the feature macros before using an API for maximum
178portability. From libpng 1.5.0 the feature macros set during the build
179of libpng are recorded in the header file "pnglibconf.h" and this file
180is always included by png.h.
181
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -0500182If you don't need to change the library configuration from the default, skip to
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -0600183the next section ("Reading").
184
185Notice that some of the makefiles in the 'scripts' directory and (in 1.5.0) all
186of the build project files in the 'projects' directory simply copy
187scripts/pnglibconf.h.prebuilt to pnglibconf.h. This means that these build
188systems do not permit easy auto-configuration of the library - they only
189support the default configuration.
190
191The easiest way to make minor changes to the libpng configuration when
192auto-configuration is supported is to add definitions to the command line
193using (typically) CPPFLAGS. For example:
194
195CPPFLAGS=-DPNG_NO_FLOATING_ARITHMETIC
196
197will change the internal libpng math implementation for gamma correction and
198other arithmetic calculations to fixed point, avoiding the need for fast
199floating point support. The result can be seen in the generated pnglibconf.h -
200make sure it contains the changed feature macro setting.
201
202If you need to make more extensive configuration changes - more than one or two
203feature macro settings - you can either add -DPNG_USER_CONFIG to the build
204command line and put a list of feature macro settings in pngusr.h or you can set
205DFA_XTRA (a makefile variable) to a file containing the same information in the
206form of 'option' settings.
207
208A. Changing pnglibconf.h
209
210A variety of methods exist to build libpng. Not all of these support
211reconfiguration of pnglibconf.h. To reconfigure pnglibconf.h it must either be
212rebuilt from scripts/pnglibconf.dfa using awk or it must be edited by hand.
213
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -0500214Hand editing is achieved by copying scripts/pnglibconf.h.prebuilt to
215pnglibconf.h and changing the lines defining the supported features, paying
216very close attention to the 'option' information in scripts/pnglibconf.dfa
217that describes those features and their requirements. This is easy to get
218wrong.
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -0600219
220B. Configuration using DFA_XTRA
221
222Rebuilding from pnglibconf.dfa is easy if a functioning 'awk', or a later
223variant such as 'nawk' or 'gawk', is available. The configure build will
224automatically find an appropriate awk and build pnglibconf.h.
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -0500225The scripts/pnglibconf.mak file contains a set of make rules for doing the
226same thing if configure is not used, and many of the makefiles in the scripts
227directory use this approach.
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -0600228
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -0500229When rebuilding simply write a new file containing changed options and set
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -0600230DFA_XTRA to the name of this file. This causes the build to append the new file
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -0500231to the end of scripts/pnglibconf.dfa. The pngusr.dfa file should contain lines
232of the following forms:
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -0600233
234everything = off
235
236This turns all optional features off. Include it at the start of pngusr.dfa to
237make it easier to build a minimal configuration. You will need to turn at least
238some features on afterward to enable either reading or writing code, or both.
239
240option feature on
241option feature off
242
243Enable or disable a single feature. This will automatically enable other
244features required by a feature that is turned on or disable other features that
245require a feature which is turned off. Conflicting settings will cause an error
246message to be emitted by awk.
247
248setting feature default value
249
250Changes the default value of setting 'feature' to 'value'. There are a small
251number of settings listed at the top of pnglibconf.h, they are documented in the
252source code. Most of these values have performance implications for the library
253but most of them have no visible effect on the API. Some can also be overridden
254from the API.
255
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -0500256This method of building a customized pnglibconf.h is illustrated in
257contrib/pngminim/*. See the "$(PNGCONF):" target in the makefile and
258pngusr.dfa in these directories.
259
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -0600260C. Configuration using PNG_USR_CONFIG
261
262If -DPNG_USR_CONFIG is added to the CFLAGS when pnglibconf.h is built the file
263pngusr.h will automatically be included before the options in
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -0500264scripts/pnglibconf.dfa are processed. Your pngusr.h file should contain only
265macro definitions turning features on or off or setting settings.
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -0600266
267Apart from the global setting "everything = off" all the options listed above
268can be set using macros in pngusr.h:
269
270#define PNG_feature_SUPPORTED
271
272is equivalent to:
273
274option feature on
275
276#define PNG_NO_feature
277
278is equivalent to:
279
280option feature off
281
282#define PNG_feature value
283
284is equivalent to:
285
286setting feature default value
287
288Notice that in both cases, pngusr.dfa and pngusr.h, the contents of the
289pngusr file you supply override the contents of scripts/pnglibconf.dfa
290
291If confusing or incomprehensible behavior results it is possible to
292examine the intermediate file pnglibconf.dfn to find the full set of
293dependency information for each setting and option. Simply locate the
294feature in the file and read the C comments that precede it.
295
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -0500296This method is also illustrated in the contrib/pngminim/* makefiles and
297pngusr.h.
298
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500299III. Reading
300
301We'll now walk you through the possible functions to call when reading
302in a PNG file sequentially, briefly explaining the syntax and purpose
303of each one. See example.c and png.h for more detail. While
304progressive reading is covered in the next section, you will still
305need some of the functions discussed in this section to read a PNG
306file.
307
308Setup
309
310You will want to do the I/O initialization(*) before you get into libpng,
311so if it doesn't work, you don't have much to undo. Of course, you
312will also want to insure that you are, in fact, dealing with a PNG
313file. Libpng provides a simple check to see if a file is a PNG file.
314To use it, pass in the first 1 to 8 bytes of the file to the function
315png_sig_cmp(), and it will return 0 (false) if the bytes match the
316corresponding bytes of the PNG signature, or nonzero (true) otherwise.
317Of course, the more bytes you pass in, the greater the accuracy of the
318prediction.
319
320If you are intending to keep the file pointer open for use in libpng,
321you must ensure you don't read more than 8 bytes from the beginning
322of the file, and you also have to make a call to png_set_sig_bytes_read()
323with the number of bytes you read from the beginning. Libpng will
324then only check the bytes (if any) that your program didn't read.
325
326(*): If you are not using the standard I/O functions, you will need
327to replace them with custom functions. See the discussion under
328Customizing libpng.
329
330
331 FILE *fp = fopen(file_name, "rb");
332 if (!fp)
333 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600334 return (ERROR);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500335 }
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600336
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500337 fread(header, 1, number, fp);
338 is_png = !png_sig_cmp(header, 0, number);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600339
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500340 if (!is_png)
341 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600342 return (NOT_PNG);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500343 }
344
345
346Next, png_struct and png_info need to be allocated and initialized. In
347order to ensure that the size of these structures is correct even with a
348dynamically linked libpng, there are functions to initialize and
349allocate the structures. We also pass the library version, optional
350pointers to error handling functions, and a pointer to a data struct for
351use by the error functions, if necessary (the pointer and functions can
352be NULL if the default error handlers are to be used). See the section
353on Changes to Libpng below regarding the old initialization functions.
354The structure allocation functions quietly return NULL if they fail to
355create the structure, so your application should check for that.
356
357 png_structp png_ptr = png_create_read_struct
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600358 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500359 user_error_fn, user_warning_fn);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600360
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500361 if (!png_ptr)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600362 return (ERROR);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500363
364 png_infop info_ptr = png_create_info_struct(png_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600365
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500366 if (!info_ptr)
367 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600368 png_destroy_read_struct(&png_ptr,
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500369 (png_infopp)NULL, (png_infopp)NULL);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600370 return (ERROR);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500371 }
372
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500373If you want to use your own memory allocation routines,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600374use a libpng that was built with PNG_USER_MEM_SUPPORTED defined, and use
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500375png_create_read_struct_2() instead of png_create_read_struct():
376
377 png_structp png_ptr = png_create_read_struct_2
Glenn Randers-Pehrson20786be2011-04-20 22:20:40 -0500378 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500379 user_error_fn, user_warning_fn, (png_voidp)
380 user_mem_ptr, user_malloc_fn, user_free_fn);
381
382The error handling routines passed to png_create_read_struct()
383and the memory alloc/free routines passed to png_create_struct_2()
384are only necessary if you are not using the libpng supplied error
385handling and memory alloc/free functions.
386
387When libpng encounters an error, it expects to longjmp back
388to your routine. Therefore, you will need to call setjmp and pass
389your png_jmpbuf(png_ptr). If you read the file from different
John Bowlere6dc85b2011-04-27 14:47:15 -0500390routines, you will need to update the longjmp buffer every time you enter
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500391a new routine that will call a png_*() function.
392
393See your documentation of setjmp/longjmp for your compiler for more
394information on setjmp/longjmp. See the discussion on libpng error
395handling in the Customizing Libpng section below for more information
396on the libpng error handling. If an error occurs, and libpng longjmp's
397back to your setjmp, you will want to call png_destroy_read_struct() to
398free any memory.
399
400 if (setjmp(png_jmpbuf(png_ptr)))
401 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600402 png_destroy_read_struct(&png_ptr, &info_ptr,
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500403 &end_info);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600404 fclose(fp);
405 return (ERROR);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500406 }
407
Glenn Randers-Pehrson20786be2011-04-20 22:20:40 -0500408Pass (png_infopp)NULL instead of &end_info if you didn't create
409an end_info structure.
410
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500411If you would rather avoid the complexity of setjmp/longjmp issues,
Glenn Randers-Pehrson54ac9a92010-04-02 17:06:22 -0500412you can compile libpng with PNG_NO_SETJMP, in which case
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500413errors will result in a call to PNG_ABORT() which defaults to abort().
414
Glenn Randers-Pehrson54ac9a92010-04-02 17:06:22 -0500415You can #define PNG_ABORT() to a function that does something
416more useful than abort(), as long as your function does not
417return.
418
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500419Now you need to set up the input code. The default for libpng is to
420use the C function fread(). If you use this, you will need to pass a
421valid FILE * in the function png_init_io(). Be sure that the file is
422opened in binary mode. If you wish to handle reading data in another
423way, you need not call the png_init_io() function, but you must then
424implement the libpng I/O methods discussed in the Customizing Libpng
425section below.
426
427 png_init_io(png_ptr, fp);
428
429If you had previously opened the file and read any of the signature from
430the beginning in order to see if this was a PNG file, you need to let
431libpng know that there are some bytes missing from the start of the file.
432
433 png_set_sig_bytes(png_ptr, number);
434
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -0600435You can change the zlib compression buffer size to be used while
436reading compressed data with
437
438 png_set_compression_buffer_size(png_ptr, buffer_size);
439
440where the default size is 8192 bytes. Note that the buffer size
441is changed immediately and the buffer is reallocated immediately,
442instead of setting a flag to be acted upon later.
443
Glenn Randers-Pehrson9dd1cdf2011-01-06 21:42:36 -0600444If you want CRC errors to be handled in a different manner than
445the default, use
446
447 png_set_crc_action(png_ptr, crit_action, ancil_action);
448
449The values for png_set_crc_action() say how libpng is to handle CRC errors in
450ancillary and critical chunks, and whether to use the data contained
451therein. Note that it is impossible to "discard" data in a critical
452chunk.
453
454Choices for (int) crit_action are
455 PNG_CRC_DEFAULT 0 error/quit
456 PNG_CRC_ERROR_QUIT 1 error/quit
457 PNG_CRC_WARN_USE 3 warn/use data
458 PNG_CRC_QUIET_USE 4 quiet/use data
459 PNG_CRC_NO_CHANGE 5 use the current value
460
461Choices for (int) ancil_action are
462 PNG_CRC_DEFAULT 0 error/quit
463 PNG_CRC_ERROR_QUIT 1 error/quit
464 PNG_CRC_WARN_DISCARD 2 warn/discard data
465 PNG_CRC_WARN_USE 3 warn/use data
466 PNG_CRC_QUIET_USE 4 quiet/use data
467 PNG_CRC_NO_CHANGE 5 use the current value
468
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500469Setting up callback code
470
471You can set up a callback function to handle any unknown chunks in the
472input stream. You must supply the function
473
Glenn Randers-Pehrson81ce8892011-01-24 08:04:37 -0600474 read_chunk_callback(png_structp png_ptr,
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500475 png_unknown_chunkp chunk);
476 {
477 /* The unknown chunk structure contains your
478 chunk data, along with similar data for any other
479 unknown chunks: */
480
481 png_byte name[5];
482 png_byte *data;
483 png_size_t size;
484
485 /* Note that libpng has already taken care of
486 the CRC handling */
487
488 /* put your code here. Search for your chunk in the
489 unknown chunk structure, process it, and return one
490 of the following: */
491
492 return (-n); /* chunk had an error */
493 return (0); /* did not recognize */
494 return (n); /* success */
495 }
496
497(You can give your function another name that you like instead of
498"read_chunk_callback")
499
500To inform libpng about your function, use
501
502 png_set_read_user_chunk_fn(png_ptr, user_chunk_ptr,
503 read_chunk_callback);
504
505This names not only the callback function, but also a user pointer that
506you can retrieve with
507
508 png_get_user_chunk_ptr(png_ptr);
509
510If you call the png_set_read_user_chunk_fn() function, then all unknown
511chunks will be saved when read, in case your callback function will need
512one or more of them. This behavior can be changed with the
513png_set_keep_unknown_chunks() function, described below.
514
515At this point, you can set up a callback function that will be
516called after each row has been read, which you can use to control
517a progress meter or the like. It's demonstrated in pngtest.c.
518You must supply a function
519
Glenn Randers-Pehrson81ce8892011-01-24 08:04:37 -0600520 void read_row_callback(png_structp png_ptr,
521 png_uint_32 row, int pass);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500522 {
523 /* put your code here */
524 }
525
526(You can give it another name that you like instead of "read_row_callback")
527
528To inform libpng about your function, use
529
530 png_set_read_status_fn(png_ptr, read_row_callback);
531
John Bowler59010e52011-02-16 06:16:31 -0600532When this function is called the row has already been completely processed and
533the 'row' and 'pass' refer to the next row to be handled. For the
534non-interlaced case the row that was just handled is simply one less than the
535passed in row number, and pass will always be 0. For the interlaced case the
536same applies unless the row value is 0, in which case the row just handled was
537the last one from one of the preceding passes. Because interlacing may skip a
538pass you cannot be sure that the preceding pass is just 'pass-1', if you really
539need to know what the last pass is record (row,pass) from the callback and use
540the last recorded value each time.
541
542As with the user transform you can find the output row using the
543PNG_ROW_FROM_PASS_ROW macro.
544
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500545Unknown-chunk handling
546
547Now you get to set the way the library processes unknown chunks in the
548input PNG stream. Both known and unknown chunks will be read. Normal
549behavior is that known chunks will be parsed into information in
550various info_ptr members while unknown chunks will be discarded. This
551behavior can be wasteful if your application will never use some known
552chunk types. To change this, you can call:
553
554 png_set_keep_unknown_chunks(png_ptr, keep,
555 chunk_list, num_chunks);
556 keep - 0: default unknown chunk handling
557 1: ignore; do not keep
558 2: keep only if safe-to-copy
559 3: keep even if unsafe-to-copy
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600560
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500561 You can use these definitions:
562 PNG_HANDLE_CHUNK_AS_DEFAULT 0
563 PNG_HANDLE_CHUNK_NEVER 1
564 PNG_HANDLE_CHUNK_IF_SAFE 2
565 PNG_HANDLE_CHUNK_ALWAYS 3
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600566
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500567 chunk_list - list of chunks affected (a byte string,
568 five bytes per chunk, NULL or '\0' if
569 num_chunks is 0)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600570
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500571 num_chunks - number of chunks affected; if 0, all
572 unknown chunks are affected. If nonzero,
573 only the chunks in the list are affected
574
575Unknown chunks declared in this way will be saved as raw data onto a
576list of png_unknown_chunk structures. If a chunk that is normally
577known to libpng is named in the list, it will be handled as unknown,
578according to the "keep" directive. If a chunk is named in successive
579instances of png_set_keep_unknown_chunks(), the final instance will
580take precedence. The IHDR and IEND chunks should not be named in
581chunk_list; if they are, libpng will process them normally anyway.
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -0500582If you know that your application will never make use of some particular
583chunks, use PNG_HANDLE_CHUNK_NEVER (or 1) as demonstrated below.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500584
585Here is an example of the usage of png_set_keep_unknown_chunks(),
586where the private "vpAg" chunk will later be processed by a user chunk
587callback function:
588
589 png_byte vpAg[5]={118, 112, 65, 103, (png_byte) '\0'};
590
591 #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
592 png_byte unused_chunks[]=
593 {
594 104, 73, 83, 84, (png_byte) '\0', /* hIST */
595 105, 84, 88, 116, (png_byte) '\0', /* iTXt */
596 112, 67, 65, 76, (png_byte) '\0', /* pCAL */
597 115, 67, 65, 76, (png_byte) '\0', /* sCAL */
598 115, 80, 76, 84, (png_byte) '\0', /* sPLT */
599 116, 73, 77, 69, (png_byte) '\0', /* tIME */
600 };
601 #endif
602
603 ...
604
605 #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
606 /* ignore all unknown chunks: */
607 png_set_keep_unknown_chunks(read_ptr, 1, NULL, 0);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600608
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500609 /* except for vpAg: */
610 png_set_keep_unknown_chunks(read_ptr, 2, vpAg, 1);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600611
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500612 /* also ignore unused known chunks: */
613 png_set_keep_unknown_chunks(read_ptr, 1, unused_chunks,
614 (int)sizeof(unused_chunks)/5);
615 #endif
616
617User limits
618
619The PNG specification allows the width and height of an image to be as
620large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns.
621Since very few applications really need to process such large images,
622we have imposed an arbitrary 1-million limit on rows and columns.
623Larger images will be rejected immediately with a png_error() call. If
Glenn Randers-Pehrson0cb906d2011-06-11 14:22:22 -0500624you wish to change this limit, you can use
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500625
626 png_set_user_limits(png_ptr, width_max, height_max);
627
628to set your own limits, or use width_max = height_max = 0x7fffffffL
629to allow all valid dimensions (libpng may reject some very large images
630anyway because of potential buffer overflow conditions).
631
632You should put this statement after you create the PNG structure and
633before calling png_read_info(), png_read_png(), or png_process_data().
Glenn Randers-Pehrsoncc277082011-06-10 21:17:34 -0500634
635When writing a PNG datastream, put this statement before calling
636png_write_info() or png_write_png().
637
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500638If you need to retrieve the limits that are being applied, use
639
640 width_max = png_get_user_width_max(png_ptr);
641 height_max = png_get_user_height_max(png_ptr);
642
643The PNG specification sets no limit on the number of ancillary chunks
644allowed in a PNG datastream. You can impose a limit on the total number
645of sPLT, tEXt, iTXt, zTXt, and unknown chunks that will be stored, with
646
647 png_set_chunk_cache_max(png_ptr, user_chunk_cache_max);
648
649where 0x7fffffffL means unlimited. You can retrieve this limit with
650
651 chunk_cache_max = png_get_chunk_cache_max(png_ptr);
652
Glenn Randers-Pehrsonef29a5e2009-10-31 19:37:05 -0500653This limit also applies to the number of buffers that can be allocated
Glenn Randers-Pehrson8f5846f2009-10-31 21:31:08 -0500654by png_decompress_chunk() while decompressing iTXt, zTXt, and iCCP chunks.
Glenn Randers-Pehrsonef29a5e2009-10-31 19:37:05 -0500655
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -0600656You can also set a limit on the amount of memory that a compressed chunk
657other than IDAT can occupy, with
658
659 png_set_chunk_malloc_max(png_ptr, user_chunk_malloc_max);
660
661and you can retrieve the limit with
662
663 chunk_malloc_max = png_get_chunk_malloc_max(png_ptr);
664
665Any chunks that would cause either of these limits to be exceeded will
666be ignored.
667
John Bowlercb0b2962011-05-12 21:48:29 -0500668Information about your system
669
670If you intend to display the PNG or to incorporate it in other image data you
671need to tell libpng information about your display or drawing surface so that
672libpng can convert the values in the image to match the display.
673
Glenn Randers-Pehrson733b1312011-06-15 13:21:01 -0500674From libpng-1.5.4 this information can be set before reading the PNG file
John Bowlercb0b2962011-05-12 21:48:29 -0500675header. In earlier versions png_set_gamma() existed but behaved incorrectly if
676called before the PNG file header had been read and png_set_alpha_mode() did not
677exist.
678
Glenn Randers-Pehrson733b1312011-06-15 13:21:01 -0500679If you need to support versions prior to libpng-1.5.4 test the version number
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -0500680as illustrated below using "PNG_LIBPNG_VER >= 10504" and follow the procedures
681described in the appropriate manual page.
John Bowlercb0b2962011-05-12 21:48:29 -0500682
683You give libpng the encoding expected by your system expressed as a 'gamma'
684value. You can also specify a default encoding for the PNG file in
685case the required information is missing from the file. By default libpng
686assumes that the PNG data matches your system, to keep this default call:
687
688 png_set_gamma(png_ptr, screen_gamma, 1/screen_gamma/*file gamma*/);
689
690or you can use the fixed point equivalent:
691
692 png_set_gamma_fixed(png_ptr, PNG_FP_1*screen_gamma, PNG_FP_1/screen_gamma);
693
694If you don't know the gamma for you system it is probably 2.2 - a good
695approximation to the IEC standard for display systems (sRGB). If images are
696too contrasty or washed out you got the value wrong - check your system
697documentation!
698
699Many systems permit the system gamma to be changed via a lookup table in the
700display driver, a few systems, including older Macs, change the response by
Glenn Randers-Pehrson733b1312011-06-15 13:21:01 -0500701default. As of 1.5.4 three special values are available to handle common
John Bowlercb0b2962011-05-12 21:48:29 -0500702situations:
703
704 PNG_DEFAULT_sRGB: Indicates that the system conforms to the IEC 61966-2-1
705 standard. This matches almost all systems.
706 PNG_GAMMA_MAC_18: Indicates that the system is an older (pre Mac OS 10.6)
707 Apple Macintosh system with the default settings.
708 PNG_GAMMA_LINEAR: Just the fixed point value for 1.0 - indicates that the
709 system expects data with no gamma encoding.
710
711You would use the linear (unencoded) value if you need to process the pixel
712values further because this avoids the need to decode and reencode each
713component value whenever arithmetic is performed. A lot of graphics software
714uses linear values for this reason, often with higher precision component values
715to preserve overall accuracy.
716
717The second thing you may need to tell libpng about is how your system handles
718alpha channel information. Some, but not all, PNG files contain an alpha
719channel. To display these files correctly you need to compose the data onto a
720suitable background, as described in the PNG specification.
721
722Libpng only supports composing onto a single color (using png_set_background;
723see below.) Otherwise you must do the composition yourself and, in this case,
724you may need to call png_set_alpha_mode:
725
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -0500726#if PNG_LIBPNG_VER >= 10504
John Bowlercb0b2962011-05-12 21:48:29 -0500727 png_set_alpha_mode(png_ptr, mode, screen_gamma);
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -0500728#endif
John Bowlercb0b2962011-05-12 21:48:29 -0500729
730The screen_gamma value is the same as the argument to png_set_gamma, however how
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500731it affects the output depends on the mode. png_set_alpha_mode() sets the file
John Bowlercb0b2962011-05-12 21:48:29 -0500732gamma default to 1/screen_gamma, so normally you don't need to call
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500733png_set_gamma. If you need different defaults call png_set_gamma() before
734png_set_alpha_mode() - if you call it after it will override the settings made
735by png_set_alpha_mode().
John Bowlercb0b2962011-05-12 21:48:29 -0500736
737The mode is as follows:
738
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500739 PNG_ALPHA_PNG: The data is encoded according to the PNG specification. Red,
740green and blue, or gray, components are gamma encoded color
741values and are not premultiplied by the alpha value. The
742alpha value is a linear measure of the contribution of the
743pixel to the corresponding final output pixel.
John Bowlercb0b2962011-05-12 21:48:29 -0500744
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500745You should normally use this format if you intend to perform
746color correction on the color values; most, maybe all, color
747correction software has no handling for the alpha channel and,
748anyway, the math to handle pre-multiplied component values is
749unnecessarily complex.
John Bowlercb0b2962011-05-12 21:48:29 -0500750
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500751Before you do any arithmetic on the component values you need
752to remove the gamma encoding and multiply out the alpha
753channel. See the PNG specification for more detail. It is
754important to note that when an image with an alpha channel is
755scaled, linear encoded, pre-multiplied component values must
756be used!
John Bowlercb0b2962011-05-12 21:48:29 -0500757
758The remaining modes assume you don't need to do any further color correction or
759that if you do your color correction software knows all about alpha (it
760probably doesn't!)
761
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500762 PNG_ALPHA_STANDARD: The data libpng produces is encoded in the standard way
763assumed by most correctly written graphics software.
764The gamma encoding will be removed by libpng and the
765linear component values will be pre-multiplied by the
766alpha channel.
John Bowlercb0b2962011-05-12 21:48:29 -0500767
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500768With this format the final image must be re-encoded to
769match the display gamma before the image is displayed.
770If your system doesn't do that, yet still seems to
771perform arithmetic on the pixels without decoding them,
772it is broken - check out the modes below.
John Bowlercb0b2962011-05-12 21:48:29 -0500773
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500774With PNG_ALPHA_STANDARD libpng always produces linear
775component values, whatever screen_gamma you supply. The
776screen_gamma value is, however, used as a default for
777the file gamma if the PNG file has no gamma information.
John Bowlercb0b2962011-05-12 21:48:29 -0500778
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500779If you call png_set_gamma() after png_set_alpha_mode() you
780will override the linear encoding. Instead the
781pre-multiplied pixel values will be gamma encoded but
782the alpha channel will still be linear. This may
783actually match the requirements of some broken software,
784but it is unlikely.
John Bowlercb0b2962011-05-12 21:48:29 -0500785
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500786While linear 8-bit data is often used it has
787insufficient precision for any image with a reasonable
788dynamic range. To avoid problems, and if your software
789supports it, use png_set_expand_16() to force all
790components to 16 bits.
John Bowlercb0b2962011-05-12 21:48:29 -0500791
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500792 PNG_ALPHA_OPTIMIZED: This mode is the same as PNG_ALPHA_STANDARD except that
793completely opaque pixels are gamma encoded according to
794the screen_gamma value. Pixels with alpha less than 1.0
795will still have linear components.
John Bowlercb0b2962011-05-12 21:48:29 -0500796
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500797Use this format if you have control over your
798compositing software and do don't do other arithmetic
799(such as scaling) on the data you get from libpng. Your
800compositing software can simply copy opaque pixels to
801the output but still has linear values for the
802non-opaque pixels.
John Bowlercb0b2962011-05-12 21:48:29 -0500803
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500804In normal compositing, where the alpha channel encodes
805partial pixel coverage (as opposed to broad area
806translucency), the inaccuracies of the 8-bit
807representation of non-opaque pixels are irrelevant.
John Bowlercb0b2962011-05-12 21:48:29 -0500808
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500809You can also try this format if your software is broken;
810it might look better.
John Bowlercb0b2962011-05-12 21:48:29 -0500811
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500812 PNG_ALPHA_BROKEN: This is PNG_ALPHA_STANDARD however all component values,
813including the alpha channel are gamma encoded. This is
814an appropriate format to try if your software, or more
815likely hardware, is totally broken: if it performs
816linear arithmetic directly on gamma encoded values.
John Bowlercb0b2962011-05-12 21:48:29 -0500817
818In most cases of broken software or hardware the bug in the final display
819manifests as a subtle halo around composited parts of the image. You may not
820even perceive this as a halo; the composited part of the image may simply appear
821separate from the background, as though it had been cut out of paper and pasted
822on afterward.
823
824If you don't have to deal with bugs in software or hardware, or if you can fix
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500825them, there are three recommended ways of using png_set_alpha_mode():
John Bowlercb0b2962011-05-12 21:48:29 -0500826
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500827 png_set_alpha_mode(png_ptr, PNG_ALPHA_PNG,
828 screen_gamma);
John Bowlercb0b2962011-05-12 21:48:29 -0500829
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500830You can do color correction on the result (libpng does not currently
831support color correction internally.) When you handle the alpha channel
832you need to undo the gamma encoding and multiply out the alpha.
833
834 png_set_alpha_mode(png_ptr, PNG_ALPHA_STANDARD,
835 screen_gamma);
John Bowlercb0b2962011-05-12 21:48:29 -0500836 png_set_expand_16(png_ptr);
John Bowlercb0b2962011-05-12 21:48:29 -0500837
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500838If you are using the high level interface don't call png_set_expand_16();
839instead pass PNG_TRANSFORM_EXPAND_16 to the interface.
John Bowlercb0b2962011-05-12 21:48:29 -0500840
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500841With this mode you can't do color correction, but you can do arithmetic,
842including composition and scaling, on the data without further processing.
843
844 png_set_alpha_mode(png_ptr, PNG_ALPHA_OPTIMIZED,
845 screen_gamma);
846
847You can avoid the expansion to 16-bit components with this mode, but you
848lose the ability to scale the image or perform other linear arithmetic.
849All you can do is compose the result onto a matching output. Since this
850mode is libpng specific you also need to write your own composition
851software.
John Bowlercb0b2962011-05-12 21:48:29 -0500852
853If you don't need, or can't handle, the alpha channel you can call
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500854png_set_background() to remove it by compositing against a fixed color. Don't
855call png_set_strip_alpha() to do this - it will leave spurious pixel values in
John Bowlercb0b2962011-05-12 21:48:29 -0500856transparent parts of this image.
857
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -0500858 png_set_background(png_ptr, &background_color,
859 PNG_BACKGROUND_GAMMA_SCREEN, 0, 1);
John Bowlercb0b2962011-05-12 21:48:29 -0500860
861The background_color is an RGB or grayscale value according to the data format
862libpng will produce for you. Because you don't yet know the format of the PNG
863file if you call png_set_background at this point you must arrange for the
864format produced by libpng to always have 8-bit or 16-bit components and then
865store the color as an 8-bit or 16-bit color as appropriate. The color contains
866separate gray and RGB component values, so you can let libpng produce gray or
867RGB output according to the input format, but low bit depth grayscale images
Glenn Randers-Pehrsonab389792011-07-09 19:35:22 -0500868must always be converted to at least 8-bit format. (Even though low bit depth
John Bowlercb0b2962011-05-12 21:48:29 -0500869grayscale images can't have an alpha channel they can have a transparent
870color!)
871
872You set the transforms you need later, either as flags to the high level
873interface or libpng API calls for the low level interface. For reference the
Glenn Randers-Pehrson733b1312011-06-15 13:21:01 -0500874settings and API calls required are:
John Bowlercb0b2962011-05-12 21:48:29 -0500875
8768-bit values:
Glenn Randers-Pehrsonfb29e512011-06-17 20:38:24 -0500877 PNG_TRANSFORM_SCALE_16 | PNG_EXPAND
878 png_set_expand(png_ptr); png_set_scale_16(png_ptr);
John Bowlercb0b2962011-05-12 21:48:29 -0500879
Glenn Randers-Pehrson733b1312011-06-15 13:21:01 -0500880 If you must get exactly the same inaccurate results
881 produced by default in versions prior to libpng-1.5.4,
Glenn Randers-Pehrsonfb29e512011-06-17 20:38:24 -0500882 use PNG_TRANSFORM_STRIP_16 and png_set_strip_16(png_ptr)
Glenn Randers-Pehrson733b1312011-06-15 13:21:01 -0500883 instead.
884
John Bowlercb0b2962011-05-12 21:48:29 -050088516-bit values:
886 PNG_TRANSFORM_EXPAND_16
887 png_set_expand_16(png_ptr);
888
889In either case palette image data will be expanded to RGB. If you just want
890color data you can add PNG_TRANSFORM_GRAY_TO_RGB or png_set_gray_to_rgb(png_ptr)
891to the list.
892
893Calling png_set_background before the PNG file header is read will not work
Glenn Randers-Pehrson733b1312011-06-15 13:21:01 -0500894prior to libpng-1.5.4. Because the failure may result in unexpected warnings or
John Bowlercb0b2962011-05-12 21:48:29 -0500895errors it is therefore much safer to call png_set_background after the head has
Glenn Randers-Pehrson733b1312011-06-15 13:21:01 -0500896been read. Unfortunately this means that prior to libpng-1.5.4 it cannot be
John Bowlercb0b2962011-05-12 21:48:29 -0500897used with the high level interface.
898
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500899The high-level read interface
900
901At this point there are two ways to proceed; through the high-level
902read interface, or through a sequence of low-level read operations.
903You can use the high-level interface if (a) you are willing to read
904the entire image into memory, and (b) the input transformations
905you want to do are limited to the following set:
906
907 PNG_TRANSFORM_IDENTITY No transformation
Glenn Randers-Pehrsonfb29e512011-06-17 20:38:24 -0500908 PNG_TRANSFORM_SCALE_16 Strip 16-bit samples to
909 8-bit accurately
910 PNG_TRANSFORM_STRIP_16 Chop 16-bit samples to
911 8-bit less accurately
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500912 PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel
913 PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit
914 samples to bytes
915 PNG_TRANSFORM_PACKSWAP Change order of packed
916 pixels to LSB first
917 PNG_TRANSFORM_EXPAND Perform set_expand()
918 PNG_TRANSFORM_INVERT_MONO Invert monochrome images
919 PNG_TRANSFORM_SHIFT Normalize pixels to the
920 sBIT depth
921 PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA
922 to BGRA
923 PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA
924 to AG
925 PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity
926 to transparency
927 PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples
Glenn Randers-Pehrson99708d52009-06-29 17:30:00 -0500928 PNG_TRANSFORM_GRAY_TO_RGB Expand grayscale samples
929 to RGB (or GA to RGBA)
John Bowlera9b34192011-05-08 19:46:51 -0500930 PNG_TRANSFORM_EXPAND_16 Expand samples to 16 bits
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500931
932(This excludes setting a background color, doing gamma transformation,
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -0500933quantizing, and setting filler.) If this is the case, simply do this:
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500934
935 png_read_png(png_ptr, info_ptr, png_transforms, NULL)
936
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -0600937where png_transforms is an integer containing the bitwise OR of some
938set of transformation flags. This call is equivalent to png_read_info(),
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500939followed the set of transformations indicated by the transform mask,
940then png_read_image(), and finally png_read_end().
941
942(The final parameter of this call is not yet used. Someday it might point
943to transformation parameters required by some future input transform.)
944
945You must use png_transforms and not call any png_set_transform() functions
946when you use png_read_png().
947
948After you have called png_read_png(), you can retrieve the image data
949with
950
951 row_pointers = png_get_rows(png_ptr, info_ptr);
952
953where row_pointers is an array of pointers to the pixel data for each row:
954
955 png_bytep row_pointers[height];
956
957If you know your image size and pixel size ahead of time, you can allocate
958row_pointers prior to calling png_read_png() with
959
960 if (height > PNG_UINT_32_MAX/png_sizeof(png_byte))
961 png_error (png_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600962 "Image is too tall to process in memory");
963
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500964 if (width > PNG_UINT_32_MAX/pixel_size)
965 png_error (png_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600966 "Image is too wide to process in memory");
967
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500968 row_pointers = png_malloc(png_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600969 height*png_sizeof(png_bytep));
970
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500971 for (int i=0; i<height, i++)
972 row_pointers[i]=NULL; /* security precaution */
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600973
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500974 for (int i=0; i<height, i++)
975 row_pointers[i]=png_malloc(png_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600976 width*pixel_size);
977
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500978 png_set_rows(png_ptr, info_ptr, &row_pointers);
979
980Alternatively you could allocate your image in one big block and define
981row_pointers[i] to point into the proper places in your block.
982
983If you use png_set_rows(), the application is responsible for freeing
984row_pointers (and row_pointers[i], if they were separately allocated).
985
986If you don't allocate row_pointers ahead of time, png_read_png() will
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600987do it, and it'll be free'ed by libpng when you call png_destroy_*().
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -0500988
989The low-level read interface
990
991If you are going the low-level route, you are now ready to read all
992the file information up to the actual image data. You do this with a
993call to png_read_info().
994
995 png_read_info(png_ptr, info_ptr);
996
997This will process all chunks up to but not including the image data.
998
John Bowlercb0b2962011-05-12 21:48:29 -0500999This also copies some of the data from the PNG file into the decode structure
1000for use in later transformations. Important information copied in is:
1001
10021) The PNG file gamma from the gAMA chunk. This overwrites the default value
1003provided by an earlier call to png_set_gamma or png_set_alpha_mode.
1004
Glenn Randers-Pehrson733b1312011-06-15 13:21:01 -050010052) Prior to libpng-1.5.4 the background color from a bKGd chunk. This
John Bowlercb0b2962011-05-12 21:48:29 -05001006damages the information provided by an earlier call to png_set_background
Glenn Randers-Pehrsonab389792011-07-09 19:35:22 -05001007resulting in unexpected behavior. Libpng-1.5.4 no longer does this.
John Bowlercb0b2962011-05-12 21:48:29 -05001008
10093) The number of significant bits in each component value. Libpng uses this to
1010optimize gamma handling by reducing the internal lookup table sizes.
1011
10124) The transparent color information from a tRNS chunk. This can be modified by
1013a later call to png_set_tRNS.
1014
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001015Querying the info structure
1016
1017Functions are used to get the information from the info_ptr once it
1018has been read. Note that these fields may not be completely filled
1019in until png_read_end() has read the chunk data following the image.
1020
1021 png_get_IHDR(png_ptr, info_ptr, &width, &height,
1022 &bit_depth, &color_type, &interlace_type,
1023 &compression_type, &filter_method);
1024
1025 width - holds the width of the image
1026 in pixels (up to 2^31).
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001027
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001028 height - holds the height of the image
1029 in pixels (up to 2^31).
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001030
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001031 bit_depth - holds the bit depth of one of the
1032 image channels. (valid values are
1033 1, 2, 4, 8, 16 and depend also on
1034 the color_type. See also
1035 significant bits (sBIT) below).
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001036
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001037 color_type - describes which color/alpha channels
1038 are present.
1039 PNG_COLOR_TYPE_GRAY
1040 (bit depths 1, 2, 4, 8, 16)
1041 PNG_COLOR_TYPE_GRAY_ALPHA
1042 (bit depths 8, 16)
1043 PNG_COLOR_TYPE_PALETTE
1044 (bit depths 1, 2, 4, 8)
1045 PNG_COLOR_TYPE_RGB
1046 (bit_depths 8, 16)
1047 PNG_COLOR_TYPE_RGB_ALPHA
1048 (bit_depths 8, 16)
1049
1050 PNG_COLOR_MASK_PALETTE
1051 PNG_COLOR_MASK_COLOR
1052 PNG_COLOR_MASK_ALPHA
1053
Glenn Randers-Pehrson2cb633b2011-01-21 08:31:29 -06001054 interlace_type - (PNG_INTERLACE_NONE or
1055 PNG_INTERLACE_ADAM7)
1056
1057 compression_type - (must be PNG_COMPRESSION_TYPE_BASE
1058 for PNG 1.0)
1059
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001060 filter_method - (must be PNG_FILTER_TYPE_BASE
1061 for PNG 1.0, and can also be
1062 PNG_INTRAPIXEL_DIFFERENCING if
1063 the PNG datastream is embedded in
1064 a MNG-1.0 datastream)
Glenn Randers-Pehrsonb35a7452009-09-30 23:12:13 -05001065
1066 Any or all of interlace_type, compression_type, or
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001067 filter_method can be NULL if you are
1068 not interested in their values.
1069
Glenn Randers-Pehrsonb35a7452009-09-30 23:12:13 -05001070 Note that png_get_IHDR() returns 32-bit data into
1071 the application's width and height variables.
1072 This is an unsafe situation if these are 16-bit
1073 variables. In such situations, the
1074 png_get_image_width() and png_get_image_height()
1075 functions described below are safer.
1076
1077 width = png_get_image_width(png_ptr,
1078 info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001079
Glenn Randers-Pehrsonb35a7452009-09-30 23:12:13 -05001080 height = png_get_image_height(png_ptr,
1081 info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001082
Glenn Randers-Pehrsonb35a7452009-09-30 23:12:13 -05001083 bit_depth = png_get_bit_depth(png_ptr,
1084 info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001085
Glenn Randers-Pehrsonb35a7452009-09-30 23:12:13 -05001086 color_type = png_get_color_type(png_ptr,
1087 info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001088
Glenn Randers-Pehrson2cb633b2011-01-21 08:31:29 -06001089 interlace_type = png_get_interlace_type(png_ptr,
Glenn Randers-Pehrsonb35a7452009-09-30 23:12:13 -05001090 info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001091
Glenn Randers-Pehrsonb35a7452009-09-30 23:12:13 -05001092 compression_type = png_get_compression_type(png_ptr,
1093 info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001094
Glenn Randers-Pehrson2cb633b2011-01-21 08:31:29 -06001095 filter_method = png_get_filter_type(png_ptr,
Glenn Randers-Pehrsonb35a7452009-09-30 23:12:13 -05001096 info_ptr);
1097
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001098 channels = png_get_channels(png_ptr, info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001099
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001100 channels - number of channels of info for the
1101 color type (valid values are 1 (GRAY,
1102 PALETTE), 2 (GRAY_ALPHA), 3 (RGB),
1103 4 (RGB_ALPHA or RGB + filler byte))
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001104
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001105 rowbytes = png_get_rowbytes(png_ptr, info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001106
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001107 rowbytes - number of bytes needed to hold a row
1108
1109 signature = png_get_signature(png_ptr, info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001110
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001111 signature - holds the signature read from the
1112 file (if any). The data is kept in
1113 the same offset it would be if the
1114 whole signature were read (i.e. if an
1115 application had already read in 4
1116 bytes of signature before starting
1117 libpng, the remaining 4 bytes would
1118 be in signature[4] through signature[7]
1119 (see png_set_sig_bytes())).
1120
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001121These are also important, but their validity depends on whether the chunk
1122has been read. The png_get_valid(png_ptr, info_ptr, PNG_INFO_<chunk>) and
1123png_get_<chunk>(png_ptr, info_ptr, ...) functions return non-zero if the
1124data has been read, or zero if it is missing. The parameters to the
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06001125png_get_<chunk> are set directly if they are simple data types, or a
1126pointer into the info_ptr is returned for any complex types.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001127
1128 png_get_PLTE(png_ptr, info_ptr, &palette,
1129 &num_palette);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001130
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001131 palette - the palette for the file
1132 (array of png_color)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001133
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001134 num_palette - number of entries in the palette
1135
Glenn Randers-Pehrson8d0bc0f2011-01-25 22:15:58 -06001136 png_get_gAMA(png_ptr, info_ptr, &file_gamma);
Glenn Randers-Pehrson27742382011-01-27 09:37:34 -06001137 png_get_gAMA_fixed(png_ptr, info_ptr, &int_file_gamma);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001138
Glenn Randers-Pehrson8d0bc0f2011-01-25 22:15:58 -06001139 file_gamma - the gamma at which the file is
1140 written (PNG_INFO_gAMA)
1141
1142 int_file_gamma - 100,000 times the gamma at which the
1143 file is written
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001144
1145 png_get_sRGB(png_ptr, info_ptr, &srgb_intent);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001146
Glenn Randers-Pehrson27742382011-01-27 09:37:34 -06001147 file_srgb_intent - the rendering intent (PNG_INFO_sRGB)
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001148 The presence of the sRGB chunk
1149 means that the pixel data is in the
1150 sRGB color space. This chunk also
1151 implies specific values of gAMA and
1152 cHRM.
1153
1154 png_get_iCCP(png_ptr, info_ptr, &name,
1155 &compression_type, &profile, &proflen);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001156
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06001157 name - The profile name.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001158
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06001159 compression_type - The compression type; always
1160 PNG_COMPRESSION_TYPE_BASE for PNG 1.0.
1161 You may give NULL to this argument to
1162 ignore it.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001163
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06001164 profile - International Color Consortium color
1165 profile data. May contain NULs.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001166
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06001167 proflen - length of profile data in bytes.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001168
1169 png_get_sBIT(png_ptr, info_ptr, &sig_bit);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001170
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001171 sig_bit - the number of significant bits for
1172 (PNG_INFO_sBIT) each of the gray,
1173 red, green, and blue channels,
1174 whichever are appropriate for the
1175 given color type (png_color_16)
1176
Glenn Randers-Pehrson866b62a2009-08-08 16:33:14 -05001177 png_get_tRNS(png_ptr, info_ptr, &trans_alpha,
1178 &num_trans, &trans_color);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001179
Glenn Randers-Pehrson866b62a2009-08-08 16:33:14 -05001180 trans_alpha - array of alpha (transparency)
1181 entries for palette (PNG_INFO_tRNS)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001182
Glenn Randers-Pehrsonf3c51e42011-01-15 10:25:25 -06001183 num_trans - number of transparent entries
1184 (PNG_INFO_tRNS)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001185
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001186 trans_color - graylevel or color sample values of
1187 the single transparent color for
1188 non-paletted images (PNG_INFO_tRNS)
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001189
1190 png_get_hIST(png_ptr, info_ptr, &hist);
1191 (PNG_INFO_hIST)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001192
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001193 hist - histogram of palette (array of
1194 png_uint_16)
1195
1196 png_get_tIME(png_ptr, info_ptr, &mod_time);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001197
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001198 mod_time - time image was last modified
1199 (PNG_VALID_tIME)
1200
1201 png_get_bKGD(png_ptr, info_ptr, &background);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001202
Glenn Randers-Pehrsonab389792011-07-09 19:35:22 -05001203 background - background color (of type
1204 png_color_16p) (PNG_VALID_bKGD)
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001205 valid 16-bit red, green and blue
1206 values, regardless of color_type
1207
1208 num_comments = png_get_text(png_ptr, info_ptr,
1209 &text_ptr, &num_text);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001210
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001211 num_comments - number of comments
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001212
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001213 text_ptr - array of png_text holding image
1214 comments
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001215
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001216 text_ptr[i].compression - type of compression used
1217 on "text" PNG_TEXT_COMPRESSION_NONE
1218 PNG_TEXT_COMPRESSION_zTXt
1219 PNG_ITXT_COMPRESSION_NONE
1220 PNG_ITXT_COMPRESSION_zTXt
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001221
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001222 text_ptr[i].key - keyword for comment. Must contain
1223 1-79 characters.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001224
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001225 text_ptr[i].text - text comments for current
1226 keyword. Can be empty.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001227
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001228 text_ptr[i].text_length - length of text string,
1229 after decompression, 0 for iTXt
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001230
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001231 text_ptr[i].itxt_length - length of itxt string,
1232 after decompression, 0 for tEXt/zTXt
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001233
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001234 text_ptr[i].lang - language of comment (empty
1235 string for unknown).
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001236
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001237 text_ptr[i].lang_key - keyword in UTF-8
1238 (empty string for unknown).
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001239
Glenn Randers-Pehrsonef29a5e2009-10-31 19:37:05 -05001240 Note that the itxt_length, lang, and lang_key
1241 members of the text_ptr structure only exist
1242 when the library is built with iTXt chunk support.
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05001243 Prior to libpng-1.4.0, the default build was
Glenn Randers-Pehrsond4e1ddb2011-07-27 20:09:57 -05001244 without iTXt chunk support.
Glenn Randers-Pehrsonef29a5e2009-10-31 19:37:05 -05001245
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001246 num_text - number of comments (same as
1247 num_comments; you can put NULL here
1248 to avoid the duplication)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001249
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001250 Note while png_set_text() will accept text, language,
1251 and translated keywords that can be NULL pointers, the
1252 structure returned by png_get_text will always contain
1253 regular zero-terminated C strings. They might be
1254 empty strings but they will never be NULL pointers.
1255
1256 num_spalettes = png_get_sPLT(png_ptr, info_ptr,
1257 &palette_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001258
1259 num_spalettes - number of sPLT chunks read.
1260
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001261 palette_ptr - array of palette structures holding
1262 contents of one or more sPLT chunks
1263 read.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001264
1265 png_get_oFFs(png_ptr, info_ptr, &offset_x, &offset_y,
1266 &unit_type);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001267
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001268 offset_x - positive offset from the left edge
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05001269 of the screen (can be negative)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001270
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001271 offset_y - positive offset from the top edge
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05001272 of the screen (can be negative)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001273
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001274 unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER
1275
1276 png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y,
1277 &unit_type);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001278
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001279 res_x - pixels/unit physical resolution in
1280 x direction
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001281
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001282 res_y - pixels/unit physical resolution in
1283 x direction
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001284
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001285 unit_type - PNG_RESOLUTION_UNKNOWN,
1286 PNG_RESOLUTION_METER
1287
1288 png_get_sCAL(png_ptr, info_ptr, &unit, &width,
1289 &height)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001290
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001291 unit - physical scale units (an integer)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001292
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001293 width - width of a pixel in physical scale units
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001294
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001295 height - height of a pixel in physical scale units
1296 (width and height are doubles)
1297
1298 png_get_sCAL_s(png_ptr, info_ptr, &unit, &width,
1299 &height)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001300
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001301 unit - physical scale units (an integer)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001302
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001303 width - width of a pixel in physical scale units
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05001304 (expressed as a string)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001305
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001306 height - height of a pixel in physical scale units
1307 (width and height are strings like "2.54")
1308
1309 num_unknown_chunks = png_get_unknown_chunks(png_ptr,
1310 info_ptr, &unknowns)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001311
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001312 unknowns - array of png_unknown_chunk
1313 structures holding unknown chunks
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001314
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001315 unknowns[i].name - name of unknown chunk
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001316
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001317 unknowns[i].data - data of unknown chunk
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001318
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001319 unknowns[i].size - size of unknown chunk's data
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001320
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001321 unknowns[i].location - position of chunk in file
1322
1323 The value of "i" corresponds to the order in which the
1324 chunks were read from the PNG file or inserted with the
1325 png_set_unknown_chunks() function.
1326
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05001327 The value of "location" is a bitwise "or" of
1328
1329 PNG_HAVE_IHDR (0x01)
1330 PNG_HAVE_PLTE (0x02)
1331 PNG_AFTER_IDAT (0x08)
1332
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001333The data from the pHYs chunk can be retrieved in several convenient
1334forms:
1335
1336 res_x = png_get_x_pixels_per_meter(png_ptr,
1337 info_ptr)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001338
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001339 res_y = png_get_y_pixels_per_meter(png_ptr,
1340 info_ptr)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001341
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001342 res_x_and_y = png_get_pixels_per_meter(png_ptr,
1343 info_ptr)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001344
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001345 res_x = png_get_x_pixels_per_inch(png_ptr,
1346 info_ptr)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001347
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001348 res_y = png_get_y_pixels_per_inch(png_ptr,
1349 info_ptr)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001350
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001351 res_x_and_y = png_get_pixels_per_inch(png_ptr,
1352 info_ptr)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001353
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001354 aspect_ratio = png_get_pixel_aspect_ratio(png_ptr,
1355 info_ptr)
1356
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001357 Each of these returns 0 [signifying "unknown"] if
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001358 the data is not present or if res_x is 0;
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001359 res_x_and_y is 0 if res_x != res_y
1360
1361 Note that because of the way the resolutions are
1362 stored internally, the inch conversions won't
1363 come out to exactly even number. For example,
1364 72 dpi is stored as 0.28346 pixels/meter, and
1365 when this is retrieved it is 71.9988 dpi, so
1366 be sure to round the returned value appropriately
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001367 if you want to display a reasonable-looking result.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001368
1369The data from the oFFs chunk can be retrieved in several convenient
1370forms:
1371
1372 x_offset = png_get_x_offset_microns(png_ptr, info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001373
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001374 y_offset = png_get_y_offset_microns(png_ptr, info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001375
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001376 x_offset = png_get_x_offset_inches(png_ptr, info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001377
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001378 y_offset = png_get_y_offset_inches(png_ptr, info_ptr);
1379
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001380 Each of these returns 0 [signifying "unknown" if both
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001381 x and y are 0] if the data is not present or if the
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001382 chunk is present but the unit is the pixel. The
1383 remark about inexact inch conversions applies here
1384 as well, because a value in inches can't always be
1385 converted to microns and back without some loss
1386 of precision.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001387
John Bowlercb0b2962011-05-12 21:48:29 -05001388For more information, see the
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001389PNG specification for chunk contents. Be careful with trusting
1390rowbytes, as some of the transformations could increase the space
1391needed to hold a row (expand, filler, gray_to_rgb, etc.).
1392See png_read_update_info(), below.
1393
1394A quick word about text_ptr and num_text. PNG stores comments in
1395keyword/text pairs, one pair per chunk, with no limit on the number
1396of text chunks, and a 2^31 byte limit on their size. While there are
1397suggested keywords, there is no requirement to restrict the use to these
1398strings. It is strongly suggested that keywords and text be sensible
1399to humans (that's the point), so don't use abbreviations. Non-printing
1400symbols are not allowed. See the PNG specification for more details.
1401There is also no requirement to have text after the keyword.
1402
1403Keywords should be limited to 79 Latin-1 characters without leading or
1404trailing spaces, but non-consecutive spaces are allowed within the
1405keyword. It is possible to have the same keyword any number of times.
1406The text_ptr is an array of png_text structures, each holding a
1407pointer to a language string, a pointer to a keyword and a pointer to
1408a text string. The text string, language code, and translated
1409keyword may be empty or NULL pointers. The keyword/text
1410pairs are put into the array in the order that they are received.
1411However, some or all of the text chunks may be after the image, so, to
1412make sure you have read all the text chunks, don't mess with these
1413until after you read the stuff after the image. This will be
1414mentioned again below in the discussion that goes with png_read_end().
1415
1416Input transformations
1417
1418After you've read the header information, you can set up the library
1419to handle any special transformations of the image data. The various
1420ways to transform the data will be described in the order that they
1421should occur. This is important, as some of these change the color
1422type and/or bit depth of the data, and some others only work on
John Bowlercb0b2962011-05-12 21:48:29 -05001423certain color types and bit depths.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001424
John Bowlercb0b2962011-05-12 21:48:29 -05001425Transformations you request are ignored if they don't have any meaning for a
1426particular input data format. However some transformations can have an effect
1427as a result of a previous transformation. If you specify a contradictory set of
1428transformations, for example both adding and removing the alpha channel, you
1429cannot predict the final result.
1430
1431The color used for the transparency values should be supplied in the same
1432format/depth as the current image data. It is stored in the same format/depth
1433as the image data in a tRNS chunk, so this is what libpng expects for this data.
1434
1435The color used for the background value depends on the need_expand argument as
1436described below.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001437
1438Data will be decoded into the supplied row buffers packed into bytes
1439unless the library has been told to transform it into another format.
1440For example, 4 bit/pixel paletted or grayscale data will be returned
14412 pixels/byte with the leftmost pixel in the high-order bits of the
1442byte, unless png_set_packing() is called. 8-bit RGB data will be stored
1443in RGB RGB RGB format unless png_set_filler() or png_set_add_alpha()
1444is called to insert filler bytes, either before or after each RGB triplet.
144516-bit RGB data will be returned RRGGBB RRGGBB, with the most significant
Glenn Randers-Pehrsonfb29e512011-06-17 20:38:24 -05001446byte of the color value first, unless png_set_scale_16() is called to
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001447transform it to regular RGB RGB triplets, or png_set_filler() or
1448png_set_add alpha() is called to insert filler bytes, either before or
1449after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can
Glenn Randers-Pehrsonfb29e512011-06-17 20:38:24 -05001450be modified with png_set_filler(), png_set_add_alpha(), png_set_strip_16(),
1451or png_set_scale_16().
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001452
1453The following code transforms grayscale images of less than 8 to 8 bits,
1454changes paletted images to RGB, and adds a full alpha channel if there is
1455transparency information in a tRNS chunk. This is most useful on
1456grayscale images with bit depths of 2 or 4 or if there is a multiple-image
1457viewing application that wishes to treat all images in the same way.
1458
1459 if (color_type == PNG_COLOR_TYPE_PALETTE)
1460 png_set_palette_to_rgb(png_ptr);
1461
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001462 if (png_get_valid(png_ptr, info_ptr,
1463 PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr);
1464
John Bowler63d059a2011-02-12 09:03:44 -06001465 if (color_type == PNG_COLOR_TYPE_GRAY &&
1466 bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr);
1467
1468The first two functions are actually aliases for png_set_expand(), added
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001469in libpng version 1.0.4, with the function names expanded to improve code
1470readability. In some future version they may actually do different
1471things.
1472
1473As of libpng version 1.2.9, png_set_expand_gray_1_2_4_to_8() was
1474added. It expands the sample depth without changing tRNS to alpha.
1475
John Bowler63d059a2011-02-12 09:03:44 -06001476As of libpng version 1.5.2, png_set_expand_16() was added. It behaves as
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05001477png_set_expand(); however, the resultant channels have 16 bits rather than 8.
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001478Use this when the output color or gray channels are made linear to avoid fairly
John Bowler63d059a2011-02-12 09:03:44 -06001479severe accuracy loss.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001480
John Bowler63d059a2011-02-12 09:03:44 -06001481 if (bit_depth < 16)
1482 png_set_expand_16(png_ptr);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001483
1484PNG can have files with 16 bits per channel. If you only can handle
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -050014858 bits per channel, this will strip the pixels down to 8-bit.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001486
1487 if (bit_depth == 16)
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05001488#if PNG_LIBPNG_VER >= 10504
Glenn Randers-Pehrsonfb29e512011-06-17 20:38:24 -05001489 png_set_scale_16(png_ptr);
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05001490#else
1491 png_set_strip_16(png_ptr);
1492#endif
1493
1494(The more accurate "png_set_scale_16()" API became available in libpng version
14951.5.4).
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001496
John Bowlercb0b2962011-05-12 21:48:29 -05001497If you need to process the alpha channel on the image separately from the image
1498data (for example if you convert it to a bitmap mask) it is possible to have
1499libpng strip the channel leaving just RGB or gray data:
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001500
1501 if (color_type & PNG_COLOR_MASK_ALPHA)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001502 png_set_strip_alpha(png_ptr);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001503
John Bowlercb0b2962011-05-12 21:48:29 -05001504If you strip the alpha channel you need to find some other way of dealing with
1505the information. If, instead, you want to convert the image to an opaque
1506version with no alpha channel use png_set_background; see below.
John Bowler63d059a2011-02-12 09:03:44 -06001507
1508As of libpng version 1.5.2, almost all useful expansions are supported, the
Glenn Randers-Pehrsoncd116fa2011-05-17 06:56:50 -05001509major ommissions are conversion of grayscale to indexed images (which can be
1510done trivially in the application) and conversion of indexed to grayscale (which
John Bowler63d059a2011-02-12 09:03:44 -06001511can be done by a trivial manipulation of the palette.)
1512
1513In the following table, the 01 means grayscale with depth<8, 31 means
1514indexed with depth<8, other numerals represent the color type, "T" means
1515the tRNS chunk is present, A means an alpha channel is present, and O
1516means tRNS or alpha is present but all pixels in the image are opaque.
1517
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06001518 FROM 01 31 0 0T 0O 2 2T 2O 3 3T 3O 4A 4O 6A 6O
John Bowler63d059a2011-02-12 09:03:44 -06001519 TO
1520 01 - [G] - - - - - - - - - - - - -
1521 31 [Q] Q [Q] [Q] [Q] Q Q Q Q Q Q [Q] [Q] Q Q
1522 0 1 G + . . G G G G G G B B GB GB
1523 0T lt Gt t + . Gt G G Gt G G Bt Bt GBt GBt
1524 0O lt Gt t . + Gt Gt G Gt Gt G Bt Bt GBt GBt
1525 2 C P C C C + . . C - - CB CB B B
1526 2T Ct - Ct C C t + t - - - CBt CBt Bt Bt
1527 2O Ct - Ct C C t t + - - - CBt CBt Bt Bt
1528 3 [Q] p [Q] [Q] [Q] Q Q Q + . . [Q] [Q] Q Q
1529 3T [Qt] p [Qt][Q] [Q] Qt Qt Qt t + t [Qt][Qt] Qt Qt
1530 3O [Qt] p [Qt][Q] [Q] Qt Qt Qt t t + [Qt][Qt] Qt Qt
1531 4A lA G A T T GA GT GT GA GT GT + BA G GBA
1532 4O lA GBA A T T GA GT GT GA GT GT BA + GBA G
1533 6A CA PA CA C C A T tT PA P P C CBA + BA
1534 6O CA PBA CA C C A tT T PA P P CBA C BA +
1535
1536Within the matrix,
1537 "+" identifies entries where 'from' and 'to' are the same.
1538 "-" means the transformation is not supported.
1539 "." means nothing is necessary (a tRNS chunk can just be ignored).
1540 "t" means the transformation is obtained by png_set_tRNS.
1541 "A" means the transformation is obtained by png_set_add_alpha().
1542 "X" means the transformation is obtained by png_set_expand().
1543 "1" means the transformation is obtained by
1544 png_set_expand_gray_1_2_4_to_8() (and by png_set_expand() if there
1545 is no transparency in the original or the final format).
1546 "C" means the transformation is obtained by png_set_gray_to_rgb().
Glenn Randers-Pehrsonc36074e2011-05-16 09:08:51 -05001547 "G" means the transformation is obtained by png_set_rgb_to_gray().
John Bowler63d059a2011-02-12 09:03:44 -06001548 "P" means the transformation is obtained by
1549 png_set_expand_palette_to_rgb().
1550 "p" means the transformation is obtained by png_set_packing().
1551 "Q" means the transformation is obtained by png_set_quantize().
1552 "T" means the transformation is obtained by png_set_tRNS_to_alpha().
1553 "B" means the transformation is obtained by png_set_background(), or
1554 png_strip_alpha().
John Bowler63d059a2011-02-12 09:03:44 -06001555
1556When an entry has multiple transforms listed all are required to cause the
1557right overall transformation. When two transforms are separated by a comma
1558either will do the job. When transforms are enclosed in [] the transform should
1559do the job but this is currently unimplemented - a different format will result
1560if the suggested transformations are used.
1561
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001562In PNG files, the alpha channel in an image
1563is the level of opacity. If you need the alpha channel in an image to
1564be the level of transparency instead of opacity, you can invert the
1565alpha channel (or the tRNS chunk data) after it's read, so that 0 is
1566fully opaque and 255 (in 8-bit or paletted images) or 65535 (in 16-bit
1567images) is fully transparent, with
1568
1569 png_set_invert_alpha(png_ptr);
1570
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001571PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as
1572they can, resulting in, for example, 8 pixels per byte for 1 bit
1573files. This code expands to 1 pixel per byte without changing the
1574values of the pixels:
1575
1576 if (bit_depth < 8)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001577 png_set_packing(png_ptr);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001578
1579PNG files have possible bit depths of 1, 2, 4, 8, and 16. All pixels
1580stored in a PNG image have been "scaled" or "shifted" up to the next
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06001581higher possible bit depth (e.g. from 5 bits/sample in the range [0,31]
1582to 8 bits/sample in the range [0, 255]). However, it is also possible
1583to convert the PNG pixel data back to the original bit depth of the
1584image. This call reduces the pixels back down to the original bit depth:
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001585
1586 png_color_8p sig_bit;
1587
1588 if (png_get_sBIT(png_ptr, info_ptr, &sig_bit))
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001589 png_set_shift(png_ptr, sig_bit);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001590
1591PNG files store 3-color pixels in red, green, blue order. This code
1592changes the storage of the pixels to blue, green, red:
1593
1594 if (color_type == PNG_COLOR_TYPE_RGB ||
1595 color_type == PNG_COLOR_TYPE_RGB_ALPHA)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001596 png_set_bgr(png_ptr);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001597
1598PNG files store RGB pixels packed into 3 or 6 bytes. This code expands them
1599into 4 or 8 bytes for windowing systems that need them in this format:
1600
1601 if (color_type == PNG_COLOR_TYPE_RGB)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001602 png_set_filler(png_ptr, filler, PNG_FILLER_BEFORE);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001603
1604where "filler" is the 8 or 16-bit number to fill with, and the location is
1605either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether
1606you want the filler before the RGB or after. This transformation
1607does not affect images that already have full alpha channels. To add an
1608opaque alpha channel, use filler=0xff or 0xffff and PNG_FILLER_AFTER which
1609will generate RGBA pixels.
1610
1611Note that png_set_filler() does not change the color type. If you want
1612to do that, you can add a true alpha channel with
1613
1614 if (color_type == PNG_COLOR_TYPE_RGB ||
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001615 color_type == PNG_COLOR_TYPE_GRAY)
1616 png_set_add_alpha(png_ptr, filler, PNG_FILLER_AFTER);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001617
1618where "filler" contains the alpha value to assign to each pixel.
1619This function was added in libpng-1.2.7.
1620
1621If you are reading an image with an alpha channel, and you need the
1622data as ARGB instead of the normal PNG format RGBA:
1623
1624 if (color_type == PNG_COLOR_TYPE_RGB_ALPHA)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001625 png_set_swap_alpha(png_ptr);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001626
1627For some uses, you may want a grayscale image to be represented as
1628RGB. This code will do that conversion:
1629
1630 if (color_type == PNG_COLOR_TYPE_GRAY ||
1631 color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001632 png_set_gray_to_rgb(png_ptr);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001633
1634Conversely, you can convert an RGB or RGBA image to grayscale or grayscale
1635with alpha.
1636
1637 if (color_type == PNG_COLOR_TYPE_RGB ||
1638 color_type == PNG_COLOR_TYPE_RGB_ALPHA)
John Bowlercb0b2962011-05-12 21:48:29 -05001639 png_set_rgb_to_gray(png_ptr, error_action, double red_weight,
1640 double green_weight);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001641
1642 error_action = 1: silently do the conversion
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001643
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001644 error_action = 2: issue a warning if the original
1645 image has any pixel where
1646 red != green or red != blue
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001647
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001648 error_action = 3: issue an error and abort the
1649 conversion if the original
1650 image has any pixel where
1651 red != green or red != blue
1652
John Bowlercb0b2962011-05-12 21:48:29 -05001653 red_weight: weight of red component
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001654
John Bowlercb0b2962011-05-12 21:48:29 -05001655 green_weight: weight of green component
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001656 If either weight is negative, default
John Bowlercb0b2962011-05-12 21:48:29 -05001657 weights are used.
1658
1659In the corresponding fixed point API the red_weight and green_weight values are
1660simply scaled by 100,000:
1661
1662 png_set_rgb_to_gray(png_ptr, error_action, png_fixed_point red_weight,
1663 png_fixed_point green_weight);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001664
1665If you have set error_action = 1 or 2, you can
1666later check whether the image really was gray, after processing
1667the image rows, with the png_get_rgb_to_gray_status(png_ptr) function.
1668It will return a png_byte that is zero if the image was gray or
John Bowlercb0b2962011-05-12 21:48:29 -050016691 if there were any non-gray pixels. Background and sBIT data
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001670will be silently converted to grayscale, using the green channel
John Bowlercb0b2962011-05-12 21:48:29 -05001671data for sBIT, regardless of the error_action setting.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001672
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05001673The default values come from the PNG file cHRM chunk if present; otherwise, the
John Bowlercb0b2962011-05-12 21:48:29 -05001674defaults correspond to the ITU-R recommendation 709, and also the sRGB color
1675space, as recommended in the Charles Poynton's Colour FAQ,
1676<http://www.poynton.com/>, in section 9:
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001677
John Bowlercb0b2962011-05-12 21:48:29 -05001678 <http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9>
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001679
1680 Y = 0.212671 * R + 0.715160 * G + 0.072169 * B
1681
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001682The calculation is done in a linear colorspace, if the image gamma
John Bowlerf21a0d02011-01-23 23:55:19 -06001683can be determined.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001684
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05001685The png_set_background() function has been described already; it tells libpng to
John Bowlercb0b2962011-05-12 21:48:29 -05001686composite images with alpha or simple transparency against the supplied
1687background color. For compatibility with versions of libpng earlier than
Glenn Randers-Pehrson733b1312011-06-15 13:21:01 -05001688libpng-1.5.4 it is recommended that you call the function after reading the file
John Bowlercb0b2962011-05-12 21:48:29 -05001689header, even if you don't want to use the color in a bKGD chunk, if one exists.
1690
1691If the PNG file contains a bKGD chunk (PNG_INFO_bKGD valid),
1692you may use this color, or supply another color more suitable for
1693the current display (e.g., the background color from a web page). You
1694need to tell libpng how the color is represented, both the format of the
Glenn Randers-Pehrsonab389792011-07-09 19:35:22 -05001695component values in the color (the number of bits) and the gamma encoding of the
John Bowlercb0b2962011-05-12 21:48:29 -05001696color. The function takes two arguments, background_gamma_mode and need_expand
Glenn Randers-Pehrsonab389792011-07-09 19:35:22 -05001697to convey this information, however only two combinations are likely to be
1698useful:
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001699
Glenn Randers-Pehrsoncb47e202011-07-10 06:55:14 -05001700 png_color_16 my_background;
1701 png_color_16p image_background;
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001702
1703 if (png_get_bKGD(png_ptr, info_ptr, &image_background))
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001704 png_set_background(png_ptr, image_background,
John Bowlercb0b2962011-05-12 21:48:29 -05001705 PNG_BACKGROUND_GAMMA_FILE, 1/*needs to be expanded*/, 1);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001706 else
Glenn Randers-Pehrsoncb47e202011-07-10 06:55:14 -05001707 png_set_background(png_ptr, &my_background,
John Bowlercb0b2962011-05-12 21:48:29 -05001708 PNG_BACKGROUND_GAMMA_SCREEN, 0/*do not expand*/, 1);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001709
John Bowlercb0b2962011-05-12 21:48:29 -05001710The second call was described above - my_background is in the format of the
1711final, display, output produced by libpng. Because you now know the format of
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -05001712the PNG it is possible to avoid the need to choose either 8-bit or 16-bit
1713output and to retain palette images (the palette colors will be modified
1714appropriately and the tRNS chunk removed.) However, if you are doing this,
1715take great care not to ask for transformations without checking first that
1716they apply!
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001717
John Bowlercb0b2962011-05-12 21:48:29 -05001718In the first call the background color has the original bit depth and color type
1719of the PNG file. So, for palette images the color is supplied as a palette
1720index and for low bit greyscale images the color is a reduced bit value in
1721image_background->gray.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001722
John Bowlercb0b2962011-05-12 21:48:29 -05001723If you didn't call png_set_gamma() before reading the file header, for example
1724if you need your code to remain compatible with older versions of libpng prior
Glenn Randers-Pehrson733b1312011-06-15 13:21:01 -05001725to libpng-1.5.4, this is the place to call it.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001726
John Bowlercb0b2962011-05-12 21:48:29 -05001727Do not call it if you called png_set_alpha_mode(); doing so will damage the
1728settings put in place by png_set_alpha_mode(). (If png_set_alpha_mode() is
1729supported then you can certainly do png_set_gamma() before reading the PNG
1730header.)
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001731
John Bowlerd273ad22011-05-07 21:00:28 -05001732This API unconditionally sets the screen and file gamma values, so it will
1733override the value in the PNG file unless it is called before the PNG file
1734reading starts. For this reason you must always call it with the PNG file
1735value when you call it in this position:
1736
Glenn Randers-Pehrson8d0bc0f2011-01-25 22:15:58 -06001737 if (png_get_gAMA(png_ptr, info_ptr, &file_gamma))
1738 png_set_gamma(png_ptr, screen_gamma, file_gamma);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001739
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001740 else
1741 png_set_gamma(png_ptr, screen_gamma, 0.45455);
1742
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05001743If you need to reduce an RGB file to a paletted file, or if a paletted
1744file has more entries then will fit on your screen, png_set_quantize()
Glenn Randers-Pehrson862cb202010-04-16 22:12:51 -05001745will do that. Note that this is a simple match quantization that merely
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05001746finds the closest color available. This should work fairly well with
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001747optimized palettes, but fairly badly with linear color cubes. If you
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05001748pass a palette that is larger than maximum_colors, the file will
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05001749reduce the number of colors in the palette so it will fit into
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05001750maximum_colors. If there is a histogram, libpng will use it to make
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05001751more intelligent choices when reducing the palette. If there is no
1752histogram, it may not do as good a job.
1753
1754 if (color_type & PNG_COLOR_MASK_COLOR)
1755 {
1756 if (png_get_valid(png_ptr, info_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001757 PNG_INFO_PLTE))
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05001758 {
1759 png_uint_16p histogram = NULL;
1760
1761 png_get_hIST(png_ptr, info_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001762 &histogram);
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05001763 png_set_quantize(png_ptr, palette, num_palette,
1764 max_screen_colors, histogram, 1);
1765 }
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001766
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05001767 else
1768 {
1769 png_color std_color_cube[MAX_SCREEN_COLORS] =
1770 { ... colors ... };
1771
1772 png_set_quantize(png_ptr, std_color_cube,
1773 MAX_SCREEN_COLORS, MAX_SCREEN_COLORS,
1774 NULL,0);
1775 }
1776 }
1777
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001778PNG files describe monochrome as black being zero and white being one.
1779The following code will reverse this (make black be one and white be
1780zero):
1781
1782 if (bit_depth == 1 && color_type == PNG_COLOR_TYPE_GRAY)
1783 png_set_invert_mono(png_ptr);
1784
1785This function can also be used to invert grayscale and gray-alpha images:
1786
1787 if (color_type == PNG_COLOR_TYPE_GRAY ||
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001788 color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001789 png_set_invert_mono(png_ptr);
1790
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -05001791PNG files store 16-bit pixels in network byte order (big-endian,
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001792ie. most significant bits first). This code changes the storage to the
1793other way (little-endian, i.e. least significant bits first, the
1794way PCs store them):
1795
1796 if (bit_depth == 16)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001797 png_set_swap(png_ptr);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001798
1799If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you
1800need to change the order the pixels are packed into bytes, you can use:
1801
1802 if (bit_depth < 8)
1803 png_set_packswap(png_ptr);
1804
1805Finally, you can write your own transformation function if none of
1806the existing ones meets your needs. This is done by setting a callback
1807with
1808
1809 png_set_read_user_transform_fn(png_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001810 read_transform_fn);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001811
1812You must supply the function
1813
Glenn Randers-Pehrson93215672011-02-13 19:42:19 -06001814 void read_transform_fn(png_structp png_ptr, png_row_infop
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001815 row_info, png_bytep data)
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001816
1817See pngtest.c for a working example. Your function will be called
John Bowler0a5c9c02011-01-22 17:36:34 -06001818after all of the other transformations have been processed. Take care with
1819interlaced images if you do the interlace yourself - the width of the row is the
1820width in 'row_info', not the overall image width.
1821
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05001822If supported, libpng provides two information routines that you can use to find
John Bowler0a5c9c02011-01-22 17:36:34 -06001823where you are in processing the image:
1824
1825 png_get_current_pass_number(png_structp png_ptr);
1826 png_get_current_row_number(png_structp png_ptr);
1827
1828Don't try using these outside a transform callback - firstly they are only
1829supported if user transforms are supported, secondly they may well return
1830unexpected results unless the row is actually being processed at the moment they
1831are called.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001832
John Bowlercd113452011-02-16 06:15:13 -06001833With interlaced
1834images the value returned is the row in the input sub-image image. Use
1835PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to
1836find the output pixel (x,y) given an interlaced sub-image pixel (row,col,pass).
1837
1838The discussion of interlace handling above contains more information on how to
1839use these values.
1840
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001841You can also set up a pointer to a user structure for use by your
1842callback function, and you can inform libpng that your transform
1843function will change the number of channels or bit depth with the
1844function
1845
1846 png_set_user_transform_info(png_ptr, user_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001847 user_depth, user_channels);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001848
1849The user's application, not libpng, is responsible for allocating and
1850freeing any memory required for the user structure.
1851
1852You can retrieve the pointer via the function
1853png_get_user_transform_ptr(). For example:
1854
1855 voidp read_user_transform_ptr =
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001856 png_get_user_transform_ptr(png_ptr);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001857
1858The last thing to handle is interlacing; this is covered in detail below,
1859but you must call the function here if you want libpng to handle expansion
1860of the interlaced image.
1861
1862 number_of_passes = png_set_interlace_handling(png_ptr);
1863
1864After setting the transformations, libpng can update your png_info
1865structure to reflect any transformations you've requested with this
1866call. This is most useful to update the info structure's rowbytes
1867field so you can use it to allocate your image memory. This function
1868will also update your palette with the correct screen_gamma and
1869background if these have been given with the calls above.
1870
1871 png_read_update_info(png_ptr, info_ptr);
1872
1873After you call png_read_update_info(), you can allocate any
1874memory you need to hold the image. The row data is simply
1875raw byte data for all forms of images. As the actual allocation
1876varies among applications, no example will be given. If you
1877are allocating one large chunk, you will need to build an
1878array of pointers to each row, as it will be needed for some
1879of the functions below.
1880
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001881Remember: Before you call png_read_update_info(), the png_get_
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06001882functions return the values corresponding to the original PNG image.
1883After you call png_read_update_info the values refer to the image
1884that libpng will output. Consequently you must call all the png_set_
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001885functions before you call png_read_update_info(). This is particularly
1886important for png_set_interlace_handling() - if you are going to call
1887png_read_update_info() you must call png_set_interlace_handling() before
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06001888it unless you want to receive interlaced output.
1889
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001890Reading image data
1891
1892After you've allocated memory, you can read the image data.
1893The simplest way to do this is in one function call. If you are
1894allocating enough memory to hold the whole image, you can just
1895call png_read_image() and libpng will read in all the image data
1896and put it in the memory area supplied. You will need to pass in
1897an array of pointers to each row.
1898
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06001899This function automatically handles interlacing, so you don't
1900need to call png_set_interlace_handling() (unless you call
1901png_read_update_info()) or call this function multiple times, or any
1902of that other stuff necessary with png_read_rows().
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001903
1904 png_read_image(png_ptr, row_pointers);
1905
1906where row_pointers is:
1907
1908 png_bytep row_pointers[height];
1909
1910You can point to void or char or whatever you use for pixels.
1911
1912If you don't want to read in the whole image at once, you can
1913use png_read_rows() instead. If there is no interlacing (check
1914interlace_type == PNG_INTERLACE_NONE), this is simple:
1915
1916 png_read_rows(png_ptr, row_pointers, NULL,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001917 number_of_rows);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001918
1919where row_pointers is the same as in the png_read_image() call.
1920
1921If you are doing this just one row at a time, you can do this with
1922a single row_pointer instead of an array of row_pointers:
1923
1924 png_bytep row_pointer = row;
1925 png_read_row(png_ptr, row_pointer, NULL);
1926
1927If the file is interlaced (interlace_type != 0 in the IHDR chunk), things
1928get somewhat harder. The only current (PNG Specification version 1.2)
John Bowler660c6e42010-12-19 06:22:23 -06001929interlacing type for PNG is (interlace_type == PNG_INTERLACE_ADAM7);
1930a somewhat complicated 2D interlace scheme, known as Adam7, that
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001931breaks down an image into seven smaller images of varying size, based
John Bowler660c6e42010-12-19 06:22:23 -06001932on an 8x8 grid. This number is defined (from libpng 1.5) as
1933PNG_INTERLACE_ADAM7_PASSES in png.h
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001934
1935libpng can fill out those images or it can give them to you "as is".
John Bowler660c6e42010-12-19 06:22:23 -06001936It is almost always better to have libpng handle the interlacing for you.
1937If you want the images filled out, there are two ways to do that. The one
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001938mentioned in the PNG specification is to expand each pixel to cover
1939those pixels that have not been read yet (the "rectangle" method).
1940This results in a blocky image for the first pass, which gradually
1941smooths out as more pixels are read. The other method is the "sparkle"
1942method, where pixels are drawn only in their final locations, with the
1943rest of the image remaining whatever colors they were initialized to
1944before the start of the read. The first method usually looks better,
1945but tends to be slower, as there are more pixels to put in the rows.
1946
John Bowler660c6e42010-12-19 06:22:23 -06001947If, as is likely, you want libpng to expand the images, call this before
1948calling png_start_read_image() or png_read_update_info():
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001949
1950 if (interlace_type == PNG_INTERLACE_ADAM7)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001951 number_of_passes
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001952 = png_set_interlace_handling(png_ptr);
1953
John Bowler660c6e42010-12-19 06:22:23 -06001954This will return the number of passes needed. Currently, this is seven,
1955but may change if another interlace type is added. This function can be
1956called even if the file is not interlaced, where it will return one pass.
1957You then need to read the whole image 'number_of_passes' times. Each time
1958will distribute the pixels from the current pass to the correct place in
1959the output image, so you need to supply the same rows to png_read_rows in
1960each pass.
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -05001961
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001962If you are not going to display the image after each pass, but are
1963going to wait until the entire image is read in, use the sparkle
1964effect. This effect is faster and the end result of either method
1965is exactly the same. If you are planning on displaying the image
1966after each pass, the "rectangle" effect is generally considered the
1967better looking one.
1968
1969If you only want the "sparkle" effect, just call png_read_rows() as
1970normal, with the third parameter NULL. Make sure you make pass over
1971the image number_of_passes times, and you don't change the data in the
1972rows between calls. You can change the locations of the data, just
1973not the data. Each pass only writes the pixels appropriate for that
1974pass, and assumes the data from previous passes is still valid.
1975
1976 png_read_rows(png_ptr, row_pointers, NULL,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001977 number_of_rows);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001978
1979If you only want the first effect (the rectangles), do the same as
1980before except pass the row buffer in the third parameter, and leave
1981the second parameter NULL.
1982
1983 png_read_rows(png_ptr, NULL, row_pointers,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001984 number_of_rows);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05001985
John Bowler660c6e42010-12-19 06:22:23 -06001986If you don't want libpng to handle the interlacing details, just call
1987png_read_rows() PNG_INTERLACE_ADAM7_PASSES times to read in all the images.
1988Each of the images is a valid image by itself, however you will almost
1989certainly need to distribute the pixels from each sub-image to the
1990correct place. This is where everything gets very tricky.
1991
1992If you want to retrieve the separate images you must pass the correct
1993number of rows to each successive call of png_read_rows(). The calculation
1994gets pretty complicated for small images, where some sub-images may
1995not even exist because either their width or height ends up zero.
1996libpng provides two macros to help you in 1.5 and later versions:
1997
1998 png_uint_32 width = PNG_PASS_COLS(image_width, pass_number);
1999 png_uint_32 height = PNG_PASS_ROWS(image_height, pass_number);
2000
2001Respectively these tell you the width and height of the sub-image
2002corresponding to the numbered pass. 'pass' is in in the range 0 to 6 -
2003this can be confusing because the specification refers to the same passes
2004as 1 to 7! Be careful, you must check both the width and height before
2005calling png_read_rows() and not call it for that pass if either is zero.
2006
2007You can, of course, read each sub-image row by row. If you want to
2008produce optimal code to make a pixel-by-pixel transformation of an
2009interlaced image this is the best approach; read each row of each pass,
2010transform it, and write it out to a new interlaced image.
2011
2012If you want to de-interlace the image yourself libpng provides further
2013macros to help that tell you where to place the pixels in the output image.
2014Because the interlacing scheme is rectangular - sub-image pixels are always
2015arranged on a rectangular grid - all you need to know for each pass is the
2016starting column and row in the output image of the first pixel plus the
2017spacing between each pixel. As of libpng 1.5 there are four macros to
2018retrieve this information:
2019
2020 png_uint_32 x = PNG_PASS_START_COL(pass);
2021 png_uint_32 y = PNG_PASS_START_ROW(pass);
2022 png_uint_32 xStep = 1U << PNG_PASS_COL_SHIFT(pass);
2023 png_uint_32 yStep = 1U << PNG_PASS_ROW_SHIFT(pass);
2024
2025These allow you to write the obvious loop:
2026
2027 png_uint_32 input_y = 0;
2028 png_uint_32 output_y = PNG_PASS_START_ROW(pass);
2029
2030 while (output_y < output_image_height)
2031 {
2032 png_uint_32 input_x = 0;
2033 png_uint_32 output_x = PNG_PASS_START_COL(pass);
2034
2035 while (output_x < output_image_width)
2036 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002037 image[output_y][output_x] =
2038 subimage[pass][input_y][input_x++];
2039
John Bowler660c6e42010-12-19 06:22:23 -06002040 output_x += xStep;
2041 }
2042
2043 ++input_y;
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002044 output_y += yStep;
John Bowler660c6e42010-12-19 06:22:23 -06002045 }
2046
2047Notice that the steps between successive output rows and columns are
2048returned as shifts. This is possible because the pixels in the subimages
2049are always a power of 2 apart - 1, 2, 4 or 8 pixels - in the original
2050image. In practice you may need to directly calculate the output coordinate
2051given an input coordinate. libpng provides two further macros for this
2052purpose:
2053
2054 png_uint_32 output_x = PNG_COL_FROM_PASS_COL(input_x, pass);
2055 png_uint_32 output_y = PNG_ROW_FROM_PASS_ROW(input_y, pass);
2056
2057Finally a pair of macros are provided to tell you if a particular image
2058row or column appears in a given pass:
2059
2060 int col_in_pass = PNG_COL_IN_INTERLACE_PASS(output_x, pass);
2061 int row_in_pass = PNG_ROW_IN_INTERLACE_PASS(output_y, pass);
2062
2063Bear in mind that you will probably also need to check the width and height
2064of the pass in addition to the above to be sure the pass even exists!
2065
2066With any luck you are convinced by now that you don't want to do your own
2067interlace handling. In reality normally the only good reason for doing this
2068is if you are processing PNG files on a pixel-by-pixel basis and don't want
2069to load the whole file into memory when it is interlaced.
2070
2071libpng includes a test program, pngvalid, that illustrates reading and
2072writing of interlaced images. If you can't get interlacing to work in your
2073code and don't want to leave it to libpng (the recommended approach) see
2074how pngvalid.c does it.
2075
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002076Finishing a sequential read
2077
2078After you are finished reading the image through the
2079low-level interface, you can finish reading the file. If you are
2080interested in comments or time, which may be stored either before or
2081after the image data, you should pass the separate png_info struct if
2082you want to keep the comments from before and after the image
Glenn Randers-Pehrson20786be2011-04-20 22:20:40 -05002083separate.
2084
2085 png_infop end_info = png_create_info_struct(png_ptr);
2086
2087 if (!end_info)
2088 {
2089 png_destroy_read_struct(&png_ptr, &info_ptr,
2090 (png_infopp)NULL);
2091 return (ERROR);
2092 }
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002093
2094 png_read_end(png_ptr, end_info);
2095
Glenn Randers-Pehrson20786be2011-04-20 22:20:40 -05002096If you are not interested, you should still call png_read_end()
2097but you can pass NULL, avoiding the need to create an end_info structure.
2098
2099 png_read_end(png_ptr, (png_infop)NULL);
2100
Glenn Randers-Pehrson99778e12011-04-20 17:43:52 -05002101If you don't call png_read_end(), then your file pointer will be
2102left pointing to the first chunk after the last IDAT, which is probably
2103not what you want if you expect to read something beyond the end of
2104the PNG datastream.
2105
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002106When you are done, you can free all memory allocated by libpng like this:
2107
2108 png_destroy_read_struct(&png_ptr, &info_ptr,
2109 &end_info);
2110
Glenn Randers-Pehrson20786be2011-04-20 22:20:40 -05002111or, if you didn't create an end_info structure,
2112
2113 png_destroy_read_struct(&png_ptr, &info_ptr,
2114 (png_infopp)NULL);
2115
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002116It is also possible to individually free the info_ptr members that
2117point to libpng-allocated storage with the following function:
2118
2119 png_free_data(png_ptr, info_ptr, mask, seq)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002120
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002121 mask - identifies data to be freed, a mask
2122 containing the bitwise OR of one or
2123 more of
2124 PNG_FREE_PLTE, PNG_FREE_TRNS,
2125 PNG_FREE_HIST, PNG_FREE_ICCP,
2126 PNG_FREE_PCAL, PNG_FREE_ROWS,
2127 PNG_FREE_SCAL, PNG_FREE_SPLT,
2128 PNG_FREE_TEXT, PNG_FREE_UNKN,
2129 or simply PNG_FREE_ALL
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002130
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002131 seq - sequence number of item to be freed
2132 (-1 for all items)
2133
2134This function may be safely called when the relevant storage has
2135already been freed, or has not yet been allocated, or was allocated
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06002136by the user and not by libpng, and will in those cases do nothing.
2137The "seq" parameter is ignored if only one item of the selected data
2138type, such as PLTE, is allowed. If "seq" is not -1, and multiple items
2139are allowed for the data type identified in the mask, such as text or
2140sPLT, only the n'th item in the structure is freed, where n is "seq".
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002141
2142The default behavior is only to free data that was allocated internally
2143by libpng. This can be changed, so that libpng will not free the data,
2144or so that it will free data that was allocated by the user with png_malloc()
2145or png_zalloc() and passed in via a png_set_*() function, with
2146
2147 png_data_freer(png_ptr, info_ptr, freer, mask)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002148
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002149 freer - one of
2150 PNG_DESTROY_WILL_FREE_DATA
2151 PNG_SET_WILL_FREE_DATA
2152 PNG_USER_WILL_FREE_DATA
2153
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002154 mask - which data elements are affected
2155 same choices as in png_free_data()
2156
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002157This function only affects data that has already been allocated.
2158You can call this function after reading the PNG data but before calling
2159any png_set_*() functions, to control whether the user or the png_set_*()
2160function is responsible for freeing any existing data that might be present,
2161and again after the png_set_*() functions to control whether the user
2162or png_destroy_*() is supposed to free the data. When the user assumes
2163responsibility for libpng-allocated data, the application must use
2164png_free() to free it, and when the user transfers responsibility to libpng
2165for data that the user has allocated, the user must have used png_malloc()
2166or png_zalloc() to allocate it.
2167
2168If you allocated your row_pointers in a single block, as suggested above in
2169the description of the high level read interface, you must not transfer
2170responsibility for freeing it to the png_set_rows or png_read_destroy function,
2171because they would also try to free the individual row_pointers[i].
2172
2173If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword
2174separately, do not transfer responsibility for freeing text_ptr to libpng,
2175because when libpng fills a png_text structure it combines these members with
2176the key member, and png_free_data() will free only text_ptr.key. Similarly,
2177if you transfer responsibility for free'ing text_ptr from libpng to your
2178application, your application must not separately free those members.
2179
2180The png_free_data() function will turn off the "valid" flag for anything
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06002181it frees. If you need to turn the flag off for a chunk that was freed by
2182your application instead of by libpng, you can use
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002183
2184 png_set_invalid(png_ptr, info_ptr, mask);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002185
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002186 mask - identifies the chunks to be made invalid,
2187 containing the bitwise OR of one or
2188 more of
2189 PNG_INFO_gAMA, PNG_INFO_sBIT,
2190 PNG_INFO_cHRM, PNG_INFO_PLTE,
2191 PNG_INFO_tRNS, PNG_INFO_bKGD,
2192 PNG_INFO_hIST, PNG_INFO_pHYs,
2193 PNG_INFO_oFFs, PNG_INFO_tIME,
2194 PNG_INFO_pCAL, PNG_INFO_sRGB,
2195 PNG_INFO_iCCP, PNG_INFO_sPLT,
2196 PNG_INFO_sCAL, PNG_INFO_IDAT
2197
2198For a more compact example of reading a PNG image, see the file example.c.
2199
2200Reading PNG files progressively
2201
2202The progressive reader is slightly different then the non-progressive
2203reader. Instead of calling png_read_info(), png_read_rows(), and
2204png_read_end(), you make one call to png_process_data(), which calls
2205callbacks when it has the info, a row, or the end of the image. You
2206set up these callbacks with png_set_progressive_read_fn(). You don't
2207have to worry about the input/output functions of libpng, as you are
2208giving the library the data directly in png_process_data(). I will
2209assume that you have read the section on reading PNG files above,
2210so I will only highlight the differences (although I will show
2211all of the code).
2212
2213png_structp png_ptr;
2214png_infop info_ptr;
2215
2216 /* An example code fragment of how you would
2217 initialize the progressive reader in your
2218 application. */
2219 int
2220 initialize_png_reader()
2221 {
2222 png_ptr = png_create_read_struct
2223 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
2224 user_error_fn, user_warning_fn);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002225
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002226 if (!png_ptr)
2227 return (ERROR);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002228
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002229 info_ptr = png_create_info_struct(png_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002230
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002231 if (!info_ptr)
2232 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002233 png_destroy_read_struct(&png_ptr,
2234 (png_infopp)NULL, (png_infopp)NULL);
2235 return (ERROR);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002236 }
2237
2238 if (setjmp(png_jmpbuf(png_ptr)))
2239 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002240 png_destroy_read_struct(&png_ptr, &info_ptr,
2241 (png_infopp)NULL);
2242 return (ERROR);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002243 }
2244
2245 /* This one's new. You can provide functions
2246 to be called when the header info is valid,
2247 when each row is completed, and when the image
2248 is finished. If you aren't using all functions,
2249 you can specify NULL parameters. Even when all
2250 three functions are NULL, you need to call
2251 png_set_progressive_read_fn(). You can use
2252 any struct as the user_ptr (cast to a void pointer
2253 for the function call), and retrieve the pointer
2254 from inside the callbacks using the function
2255
2256 png_get_progressive_ptr(png_ptr);
2257
2258 which will return a void pointer, which you have
2259 to cast appropriately.
2260 */
2261 png_set_progressive_read_fn(png_ptr, (void *)user_ptr,
2262 info_callback, row_callback, end_callback);
2263
2264 return 0;
2265 }
2266
2267 /* A code fragment that you call as you receive blocks
2268 of data */
2269 int
2270 process_data(png_bytep buffer, png_uint_32 length)
2271 {
2272 if (setjmp(png_jmpbuf(png_ptr)))
2273 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002274 png_destroy_read_struct(&png_ptr, &info_ptr,
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002275 (png_infopp)NULL);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002276 return (ERROR);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002277 }
2278
2279 /* This one's new also. Simply give it a chunk
2280 of data from the file stream (in order, of
2281 course). On machines with segmented memory
2282 models machines, don't give it any more than
2283 64K. The library seems to run fine with sizes
2284 of 4K. Although you can give it much less if
2285 necessary (I assume you can give it chunks of
2286 1 byte, I haven't tried less then 256 bytes
2287 yet). When this function returns, you may
2288 want to display any rows that were generated
2289 in the row callback if you don't already do
2290 so there.
2291 */
2292 png_process_data(png_ptr, info_ptr, buffer, length);
John Bowler0a5c9c02011-01-22 17:36:34 -06002293
2294 /* At this point you can call png_process_data_skip if
2295 you want to handle data the library will skip yourself;
2296 it simply returns the number of bytes to skip (and stops
2297 libpng skipping that number of bytes on the next
2298 png_process_data call).
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002299 return 0;
2300 }
2301
2302 /* This function is called (as set by
2303 png_set_progressive_read_fn() above) when enough data
2304 has been supplied so all of the header has been
2305 read.
2306 */
2307 void
2308 info_callback(png_structp png_ptr, png_infop info)
2309 {
2310 /* Do any setup here, including setting any of
2311 the transformations mentioned in the Reading
2312 PNG files section. For now, you _must_ call
2313 either png_start_read_image() or
2314 png_read_update_info() after all the
2315 transformations are set (even if you don't set
2316 any). You may start getting rows before
2317 png_process_data() returns, so this is your
2318 last chance to prepare for that.
John Bowler660c6e42010-12-19 06:22:23 -06002319
2320 This is where you turn on interlace handling,
2321 assuming you don't want to do it yourself.
John Bowler0a5c9c02011-01-22 17:36:34 -06002322
2323 If you need to you can stop the processing of
2324 your original input data at this point by calling
2325 png_process_data_pause. This returns the number
2326 of unprocessed bytes from the last png_process_data
2327 call - it is up to you to ensure that the next call
2328 sees these bytes again. If you don't want to bother
2329 with this you can get libpng to cache the unread
2330 bytes by setting the 'save' parameter (see png.h) but
2331 then libpng will have to copy the data internally.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002332 */
2333 }
2334
2335 /* This function is called when each row of image
2336 data is complete */
2337 void
2338 row_callback(png_structp png_ptr, png_bytep new_row,
2339 png_uint_32 row_num, int pass)
2340 {
2341 /* If the image is interlaced, and you turned
2342 on the interlace handler, this function will
2343 be called for every row in every pass. Some
2344 of these rows will not be changed from the
2345 previous pass. When the row is not changed,
2346 the new_row variable will be NULL. The rows
2347 and passes are called in order, so you don't
2348 really need the row_num and pass, but I'm
2349 supplying them because it may make your life
2350 easier.
2351
John Bowler660c6e42010-12-19 06:22:23 -06002352 If you did not turn on interlace handling then
2353 the callback is called for each row of each
2354 sub-image when the image is interlaced. In this
2355 case 'row_num' is the row in the sub-image, not
2356 the row in the output image as it is in all other
2357 cases.
2358
2359 For the non-NULL rows of interlaced images when
2360 you have switched on libpng interlace handling,
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002361 you must call png_progressive_combine_row()
2362 passing in the row and the old row. You can
2363 call this function for NULL rows (it will just
2364 return) and for non-interlaced images (it just
2365 does the memcpy for you) if it will make the
2366 code easier. Thus, you can just do this for
John Bowler660c6e42010-12-19 06:22:23 -06002367 all cases if you switch on interlace handling;
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002368 */
2369
2370 png_progressive_combine_row(png_ptr, old_row,
2371 new_row);
2372
2373 /* where old_row is what was displayed for
2374 previously for the row. Note that the first
2375 pass (pass == 0, really) will completely cover
2376 the old row, so the rows do not have to be
2377 initialized. After the first pass (and only
2378 for interlaced images), you will have to pass
2379 the current row, and the function will combine
2380 the old row and the new row.
John Bowler0a5c9c02011-01-22 17:36:34 -06002381
2382 You can also call png_process_data_pause in this
2383 callback - see above.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002384 */
2385 }
2386
2387 void
2388 end_callback(png_structp png_ptr, png_infop info)
2389 {
2390 /* This function is called after the whole image
2391 has been read, including any chunks after the
2392 image (up to and including the IEND). You
2393 will usually have the same info chunk as you
2394 had in the header, although some data may have
2395 been added to the comments and time fields.
2396
2397 Most people won't do much here, perhaps setting
2398 a flag that marks the image as finished.
2399 */
2400 }
2401
2402
2403
2404IV. Writing
2405
2406Much of this is very similar to reading. However, everything of
2407importance is repeated here, so you won't have to constantly look
2408back up in the reading section to understand writing.
2409
2410Setup
2411
2412You will want to do the I/O initialization before you get into libpng,
2413so if it doesn't work, you don't have anything to undo. If you are not
2414using the standard I/O functions, you will need to replace them with
2415custom writing functions. See the discussion under Customizing libpng.
2416
2417 FILE *fp = fopen(file_name, "wb");
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002418
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002419 if (!fp)
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002420 return (ERROR);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002421
2422Next, png_struct and png_info need to be allocated and initialized.
2423As these can be both relatively large, you may not want to store these
2424on the stack, unless you have stack space to spare. Of course, you
2425will want to check if they return NULL. If you are also reading,
2426you won't want to name your read structure and your write structure
2427both "png_ptr"; you can call them anything you like, such as
2428"read_ptr" and "write_ptr". Look at pngtest.c, for example.
2429
2430 png_structp png_ptr = png_create_write_struct
2431 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
2432 user_error_fn, user_warning_fn);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002433
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002434 if (!png_ptr)
2435 return (ERROR);
2436
2437 png_infop info_ptr = png_create_info_struct(png_ptr);
2438 if (!info_ptr)
2439 {
2440 png_destroy_write_struct(&png_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002441 (png_infopp)NULL);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002442 return (ERROR);
2443 }
2444
2445If you want to use your own memory allocation routines,
2446define PNG_USER_MEM_SUPPORTED and use
2447png_create_write_struct_2() instead of png_create_write_struct():
2448
2449 png_structp png_ptr = png_create_write_struct_2
2450 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
2451 user_error_fn, user_warning_fn, (png_voidp)
2452 user_mem_ptr, user_malloc_fn, user_free_fn);
2453
2454After you have these structures, you will need to set up the
2455error handling. When libpng encounters an error, it expects to
2456longjmp() back to your routine. Therefore, you will need to call
2457setjmp() and pass the png_jmpbuf(png_ptr). If you
2458write the file from different routines, you will need to update
2459the png_jmpbuf(png_ptr) every time you enter a new routine that will
2460call a png_*() function. See your documentation of setjmp/longjmp
2461for your compiler for more information on setjmp/longjmp. See
2462the discussion on libpng error handling in the Customizing Libpng
2463section below for more information on the libpng error handling.
2464
2465 if (setjmp(png_jmpbuf(png_ptr)))
2466 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002467 png_destroy_write_struct(&png_ptr, &info_ptr);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002468 fclose(fp);
2469 return (ERROR);
2470 }
2471 ...
2472 return;
2473
2474If you would rather avoid the complexity of setjmp/longjmp issues,
Glenn Randers-Pehrson54ac9a92010-04-02 17:06:22 -05002475you can compile libpng with PNG_NO_SETJMP, in which case
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002476errors will result in a call to PNG_ABORT() which defaults to abort().
2477
Glenn Randers-Pehrson54ac9a92010-04-02 17:06:22 -05002478You can #define PNG_ABORT() to a function that does something
2479more useful than abort(), as long as your function does not
2480return.
2481
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002482Now you need to set up the output code. The default for libpng is to
2483use the C function fwrite(). If you use this, you will need to pass a
2484valid FILE * in the function png_init_io(). Be sure that the file is
2485opened in binary mode. Again, if you wish to handle writing data in
2486another way, see the discussion on libpng I/O handling in the Customizing
2487Libpng section below.
2488
2489 png_init_io(png_ptr, fp);
2490
2491If you are embedding your PNG into a datastream such as MNG, and don't
2492want libpng to write the 8-byte signature, or if you have already
2493written the signature in your application, use
2494
2495 png_set_sig_bytes(png_ptr, 8);
2496
2497to inform libpng that it should not write a signature.
2498
2499Write callbacks
2500
2501At this point, you can set up a callback function that will be
2502called after each row has been written, which you can use to control
2503a progress meter or the like. It's demonstrated in pngtest.c.
2504You must supply a function
2505
Glenn Randers-Pehrson81ce8892011-01-24 08:04:37 -06002506 void write_row_callback(png_structp png_ptr, png_uint_32 row,
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002507 int pass);
2508 {
2509 /* put your code here */
2510 }
2511
2512(You can give it another name that you like instead of "write_row_callback")
2513
2514To inform libpng about your function, use
2515
2516 png_set_write_status_fn(png_ptr, write_row_callback);
2517
John Bowler59010e52011-02-16 06:16:31 -06002518When this function is called the row has already been completely processed and
2519it has also been written out. The 'row' and 'pass' refer to the next row to be
2520handled. For the
2521non-interlaced case the row that was just handled is simply one less than the
2522passed in row number, and pass will always be 0. For the interlaced case the
2523same applies unless the row value is 0, in which case the row just handled was
2524the last one from one of the preceding passes. Because interlacing may skip a
2525pass you cannot be sure that the preceding pass is just 'pass-1', if you really
2526need to know what the last pass is record (row,pass) from the callback and use
2527the last recorded value each time.
2528
2529As with the user transform you can find the output row using the
2530PNG_ROW_FROM_PASS_ROW macro.
2531
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002532You now have the option of modifying how the compression library will
2533run. The following functions are mainly for testing, but may be useful
2534in some cases, like if you need to write PNG files extremely fast and
2535are willing to give up some compression, or if you want to get the
2536maximum possible compression at the expense of slower writing. If you
2537have no special needs in this area, let the library do what it wants by
2538not calling this function at all, as it has been tuned to deliver a good
2539speed/compression ratio. The second parameter to png_set_filter() is
2540the filter method, for which the only valid values are 0 (as of the
2541July 1999 PNG specification, version 1.2) or 64 (if you are writing
2542a PNG datastream that is to be embedded in a MNG datastream). The third
2543parameter is a flag that indicates which filter type(s) are to be tested
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06002544for each scanline. See the PNG specification for details on the specific
2545filter types.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002546
2547
2548 /* turn on or off filtering, and/or choose
2549 specific filters. You can use either a single
2550 PNG_FILTER_VALUE_NAME or the bitwise OR of one
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002551 or more PNG_FILTER_NAME masks.
2552 */
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002553 png_set_filter(png_ptr, 0,
2554 PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE |
2555 PNG_FILTER_SUB | PNG_FILTER_VALUE_SUB |
2556 PNG_FILTER_UP | PNG_FILTER_VALUE_UP |
2557 PNG_FILTER_AVG | PNG_FILTER_VALUE_AVG |
2558 PNG_FILTER_PAETH | PNG_FILTER_VALUE_PAETH|
2559 PNG_ALL_FILTERS);
2560
John Bowler660c6e42010-12-19 06:22:23 -06002561If an application wants to start and stop using particular filters during
2562compression, it should start out with all of the filters (to ensure that
2563the previous row of pixels will be stored in case it's needed later),
2564and then add and remove them after the start of compression.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002565
2566If you are writing a PNG datastream that is to be embedded in a MNG
2567datastream, the second parameter can be either 0 or 64.
2568
2569The png_set_compression_*() functions interface to the zlib compression
2570library, and should mostly be ignored unless you really know what you are
2571doing. The only generally useful call is png_set_compression_level()
2572which changes how much time zlib spends on trying to compress the image
2573data. See the Compression Library (zlib.h and algorithm.txt, distributed
2574with zlib) for details on the compression levels.
2575
Glenn Randers-Pehrson38734ee2011-03-03 06:23:31 -06002576 #include zlib.h
2577
Glenn Randers-Pehrsona45f47c2011-04-01 15:31:26 -05002578 /* Set the zlib compression level */
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002579 png_set_compression_level(png_ptr,
2580 Z_BEST_COMPRESSION);
2581
Glenn Randers-Pehrsona45f47c2011-04-01 15:31:26 -05002582 /* Set other zlib parameters for compressing IDAT */
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002583 png_set_compression_mem_level(png_ptr, 8);
2584 png_set_compression_strategy(png_ptr,
2585 Z_DEFAULT_STRATEGY);
2586 png_set_compression_window_bits(png_ptr, 15);
2587 png_set_compression_method(png_ptr, 8);
2588 png_set_compression_buffer_size(png_ptr, 8192)
2589
Glenn Randers-Pehrsona45f47c2011-04-01 15:31:26 -05002590 /* Set zlib parameters for text compression
2591 * If you don't call these, the parameters
2592 * fall back on those defined for IDAT chunks
2593 */
Glenn Randers-Pehrson8eb88332011-04-01 00:16:50 -05002594 png_set_text_compression_mem_level(png_ptr, 8);
2595 png_set_text_compression_strategy(png_ptr,
2596 Z_DEFAULT_STRATEGY);
2597 png_set_text_compression_window_bits(png_ptr, 15);
2598 png_set_text_compression_method(png_ptr, 8);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002599
2600Setting the contents of info for output
2601
2602You now need to fill in the png_info structure with all the data you
2603wish to write before the actual image. Note that the only thing you
2604are allowed to write after the image is the text chunks and the time
2605chunk (as of PNG Specification 1.2, anyway). See png_write_end() and
2606the latest PNG specification for more information on that. If you
2607wish to write them before the image, fill them in now, and flag that
2608data as being valid. If you want to wait until after the data, don't
2609fill them until png_write_end(). For all the fields in png_info and
2610their data types, see png.h. For explanations of what the fields
2611contain, see the PNG specification.
2612
2613Some of the more important parts of the png_info are:
2614
2615 png_set_IHDR(png_ptr, info_ptr, width, height,
2616 bit_depth, color_type, interlace_type,
2617 compression_type, filter_method)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002618
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002619 width - holds the width of the image
2620 in pixels (up to 2^31).
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002621
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002622 height - holds the height of the image
2623 in pixels (up to 2^31).
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002624
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002625 bit_depth - holds the bit depth of one of the
2626 image channels.
2627 (valid values are 1, 2, 4, 8, 16
2628 and depend also on the
2629 color_type. See also significant
2630 bits (sBIT) below).
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002631
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002632 color_type - describes which color/alpha
2633 channels are present.
2634 PNG_COLOR_TYPE_GRAY
2635 (bit depths 1, 2, 4, 8, 16)
2636 PNG_COLOR_TYPE_GRAY_ALPHA
2637 (bit depths 8, 16)
2638 PNG_COLOR_TYPE_PALETTE
2639 (bit depths 1, 2, 4, 8)
2640 PNG_COLOR_TYPE_RGB
2641 (bit_depths 8, 16)
2642 PNG_COLOR_TYPE_RGB_ALPHA
2643 (bit_depths 8, 16)
2644
2645 PNG_COLOR_MASK_PALETTE
2646 PNG_COLOR_MASK_COLOR
2647 PNG_COLOR_MASK_ALPHA
2648
2649 interlace_type - PNG_INTERLACE_NONE or
2650 PNG_INTERLACE_ADAM7
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002651
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002652 compression_type - (must be
2653 PNG_COMPRESSION_TYPE_DEFAULT)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002654
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002655 filter_method - (must be PNG_FILTER_TYPE_DEFAULT
2656 or, if you are writing a PNG to
2657 be embedded in a MNG datastream,
2658 can also be
2659 PNG_INTRAPIXEL_DIFFERENCING)
2660
2661If you call png_set_IHDR(), the call must appear before any of the
Glenn Randers-Pehrsond60c8862009-06-15 21:56:14 -05002662other png_set_*() functions, because they might require access to some of
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002663the IHDR settings. The remaining png_set_*() functions can be called
2664in any order.
2665
Glenn Randers-Pehrson9dcde092009-06-08 08:31:59 -05002666If you wish, you can reset the compression_type, interlace_type, or
2667filter_method later by calling png_set_IHDR() again; if you do this, the
2668width, height, bit_depth, and color_type must be the same in each call.
Glenn Randers-Pehrson37e7e0b2009-06-02 13:46:41 -05002669
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002670 png_set_PLTE(png_ptr, info_ptr, palette,
2671 num_palette);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002672
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002673 palette - the palette for the file
2674 (array of png_color)
2675 num_palette - number of entries in the palette
2676
Glenn Randers-Pehrson8d0bc0f2011-01-25 22:15:58 -06002677 png_set_gAMA(png_ptr, info_ptr, file_gamma);
2678 png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002679
Glenn Randers-Pehrson8d0bc0f2011-01-25 22:15:58 -06002680 file_gamma - the gamma at which the image was
2681 created (PNG_INFO_gAMA)
2682
2683 int_file_gamma - 100,000 times the gamma at which
2684 the image was created
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002685
2686 png_set_sRGB(png_ptr, info_ptr, srgb_intent);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002687
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002688 srgb_intent - the rendering intent
2689 (PNG_INFO_sRGB) The presence of
2690 the sRGB chunk means that the pixel
2691 data is in the sRGB color space.
2692 This chunk also implies specific
2693 values of gAMA and cHRM. Rendering
2694 intent is the CSS-1 property that
2695 has been defined by the International
2696 Color Consortium
2697 (http://www.color.org).
2698 It can be one of
2699 PNG_sRGB_INTENT_SATURATION,
2700 PNG_sRGB_INTENT_PERCEPTUAL,
2701 PNG_sRGB_INTENT_ABSOLUTE, or
2702 PNG_sRGB_INTENT_RELATIVE.
2703
2704
2705 png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr,
2706 srgb_intent);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002707
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002708 srgb_intent - the rendering intent
2709 (PNG_INFO_sRGB) The presence of the
2710 sRGB chunk means that the pixel
2711 data is in the sRGB color space.
2712 This function also causes gAMA and
2713 cHRM chunks with the specific values
2714 that are consistent with sRGB to be
2715 written.
2716
2717 png_set_iCCP(png_ptr, info_ptr, name, compression_type,
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06002718 profile, proflen);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002719
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06002720 name - The profile name.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002721
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06002722 compression_type - The compression type; always
2723 PNG_COMPRESSION_TYPE_BASE for PNG 1.0.
2724 You may give NULL to this argument to
2725 ignore it.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002726
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06002727 profile - International Color Consortium color
2728 profile data. May contain NULs.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002729
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06002730 proflen - length of profile data in bytes.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002731
2732 png_set_sBIT(png_ptr, info_ptr, sig_bit);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002733
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002734 sig_bit - the number of significant bits for
2735 (PNG_INFO_sBIT) each of the gray, red,
2736 green, and blue channels, whichever are
2737 appropriate for the given color type
2738 (png_color_16)
2739
Glenn Randers-Pehrson866b62a2009-08-08 16:33:14 -05002740 png_set_tRNS(png_ptr, info_ptr, trans_alpha,
2741 num_trans, trans_color);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002742
Glenn Randers-Pehrson866b62a2009-08-08 16:33:14 -05002743 trans_alpha - array of alpha (transparency)
2744 entries for palette (PNG_INFO_tRNS)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002745
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05002746 num_trans - number of transparent entries
2747 (PNG_INFO_tRNS)
2748
Glenn Randers-Pehrson9dcde092009-06-08 08:31:59 -05002749 trans_color - graylevel or color sample values
2750 (in order red, green, blue) of the
2751 single transparent color for
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002752 non-paletted images (PNG_INFO_tRNS)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002753
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002754 png_set_hIST(png_ptr, info_ptr, hist);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002755
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002756 hist - histogram of palette (array of
Glenn Randers-Pehrson8d0bc0f2011-01-25 22:15:58 -06002757 png_uint_16) (PNG_INFO_hIST)
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002758
2759 png_set_tIME(png_ptr, info_ptr, mod_time);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002760
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002761 mod_time - time image was last modified
2762 (PNG_VALID_tIME)
2763
2764 png_set_bKGD(png_ptr, info_ptr, background);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002765
Glenn Randers-Pehrsonab389792011-07-09 19:35:22 -05002766 background - background color (of type
2767 png_color_16p) (PNG_VALID_bKGD)
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002768
2769 png_set_text(png_ptr, info_ptr, text_ptr, num_text);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002770
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002771 text_ptr - array of png_text holding image
2772 comments
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002773
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002774 text_ptr[i].compression - type of compression used
2775 on "text" PNG_TEXT_COMPRESSION_NONE
2776 PNG_TEXT_COMPRESSION_zTXt
2777 PNG_ITXT_COMPRESSION_NONE
2778 PNG_ITXT_COMPRESSION_zTXt
2779 text_ptr[i].key - keyword for comment. Must contain
2780 1-79 characters.
2781 text_ptr[i].text - text comments for current
2782 keyword. Can be NULL or empty.
2783 text_ptr[i].text_length - length of text string,
2784 after decompression, 0 for iTXt
2785 text_ptr[i].itxt_length - length of itxt string,
2786 after decompression, 0 for tEXt/zTXt
2787 text_ptr[i].lang - language of comment (NULL or
2788 empty for unknown).
2789 text_ptr[i].translated_keyword - keyword in UTF-8 (NULL
2790 or empty for unknown).
Glenn Randers-Pehrsonef29a5e2009-10-31 19:37:05 -05002791 Note that the itxt_length, lang, and lang_key
2792 members of the text_ptr structure only exist
2793 when the library is built with iTXt chunk support.
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05002794 Prior to libpng-1.4.0 the library was built by default
2795 without iTXt support.
Glenn Randers-Pehrsonef29a5e2009-10-31 19:37:05 -05002796
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002797 num_text - number of comments
2798
2799 png_set_sPLT(png_ptr, info_ptr, &palette_ptr,
2800 num_spalettes);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002801
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002802 palette_ptr - array of png_sPLT_struct structures
2803 to be added to the list of palettes
2804 in the info structure.
2805 num_spalettes - number of palette structures to be
2806 added.
2807
2808 png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y,
2809 unit_type);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002810
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002811 offset_x - positive offset from the left
2812 edge of the screen
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002813
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002814 offset_y - positive offset from the top
2815 edge of the screen
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002816
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002817 unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER
2818
2819 png_set_pHYs(png_ptr, info_ptr, res_x, res_y,
2820 unit_type);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002821
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002822 res_x - pixels/unit physical resolution
2823 in x direction
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002824
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002825 res_y - pixels/unit physical resolution
2826 in y direction
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002827
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002828 unit_type - PNG_RESOLUTION_UNKNOWN,
2829 PNG_RESOLUTION_METER
2830
2831 png_set_sCAL(png_ptr, info_ptr, unit, width, height)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002832
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002833 unit - physical scale units (an integer)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002834
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002835 width - width of a pixel in physical scale units
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002836
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002837 height - height of a pixel in physical scale units
2838 (width and height are doubles)
2839
2840 png_set_sCAL_s(png_ptr, info_ptr, unit, width, height)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002841
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002842 unit - physical scale units (an integer)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002843
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002844 width - width of a pixel in physical scale units
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05002845 expressed as a string
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002846
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002847 height - height of a pixel in physical scale units
2848 (width and height are strings like "2.54")
2849
2850 png_set_unknown_chunks(png_ptr, info_ptr, &unknowns,
2851 num_unknowns)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002852
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002853 unknowns - array of png_unknown_chunk
2854 structures holding unknown chunks
2855 unknowns[i].name - name of unknown chunk
2856 unknowns[i].data - data of unknown chunk
2857 unknowns[i].size - size of unknown chunk's data
2858 unknowns[i].location - position to write chunk in file
2859 0: do not write chunk
2860 PNG_HAVE_IHDR: before PLTE
2861 PNG_HAVE_PLTE: before IDAT
2862 PNG_AFTER_IDAT: after IDAT
2863
2864The "location" member is set automatically according to
2865what part of the output file has already been written.
2866You can change its value after calling png_set_unknown_chunks()
2867as demonstrated in pngtest.c. Within each of the "locations",
2868the chunks are sequenced according to their position in the
2869structure (that is, the value of "i", which is the order in which
2870the chunk was either read from the input file or defined with
2871png_set_unknown_chunks).
2872
2873A quick word about text and num_text. text is an array of png_text
2874structures. num_text is the number of valid structures in the array.
2875Each png_text structure holds a language code, a keyword, a text value,
2876and a compression type.
2877
2878The compression types have the same valid numbers as the compression
2879types of the image data. Currently, the only valid number is zero.
2880However, you can store text either compressed or uncompressed, unlike
2881images, which always have to be compressed. So if you don't want the
2882text compressed, set the compression type to PNG_TEXT_COMPRESSION_NONE.
2883Because tEXt and zTXt chunks don't have a language field, if you
2884specify PNG_TEXT_COMPRESSION_NONE or PNG_TEXT_COMPRESSION_zTXt
2885any language code or translated keyword will not be written out.
2886
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05002887Until text gets around a few hundred bytes, it is not worth compressing it.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002888After the text has been written out to the file, the compression type
2889is set to PNG_TEXT_COMPRESSION_NONE_WR or PNG_TEXT_COMPRESSION_zTXt_WR,
2890so that it isn't written out again at the end (in case you are calling
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002891png_write_end() with the same struct).
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002892
2893The keywords that are given in the PNG Specification are:
2894
2895 Title Short (one line) title or
2896 caption for image
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002897
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002898 Author Name of image's creator
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002899
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002900 Description Description of image (possibly long)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002901
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002902 Copyright Copyright notice
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002903
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002904 Creation Time Time of original image creation
2905 (usually RFC 1123 format, see below)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002906
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002907 Software Software used to create the image
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002908
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002909 Disclaimer Legal disclaimer
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002910
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002911 Warning Warning of nature of content
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002912
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002913 Source Device used to create the image
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002914
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05002915 Comment Miscellaneous comment; conversion
2916 from other image format
2917
2918The keyword-text pairs work like this. Keywords should be short
2919simple descriptions of what the comment is about. Some typical
2920keywords are found in the PNG specification, as is some recommendations
2921on keywords. You can repeat keywords in a file. You can even write
2922some text before the image and some after. For example, you may want
2923to put a description of the image before the image, but leave the
2924disclaimer until after, so viewers working over modem connections
2925don't have to wait for the disclaimer to go over the modem before
2926they start seeing the image. Finally, keywords should be full
2927words, not abbreviations. Keywords and text are in the ISO 8859-1
2928(Latin-1) character set (a superset of regular ASCII) and can not
2929contain NUL characters, and should not contain control or other
2930unprintable characters. To make the comments widely readable, stick
2931with basic ASCII, and avoid machine specific character set extensions
2932like the IBM-PC character set. The keyword must be present, but
2933you can leave off the text string on non-compressed pairs.
2934Compressed pairs must have a text string, as only the text string
2935is compressed anyway, so the compression would be meaningless.
2936
2937PNG supports modification time via the png_time structure. Two
2938conversion routines are provided, png_convert_from_time_t() for
2939time_t and png_convert_from_struct_tm() for struct tm. The
2940time_t routine uses gmtime(). You don't have to use either of
2941these, but if you wish to fill in the png_time structure directly,
2942you should provide the time in universal time (GMT) if possible
2943instead of your local time. Note that the year number is the full
2944year (e.g. 1998, rather than 98 - PNG is year 2000 compliant!), and
2945that months start with 1.
2946
2947If you want to store the time of the original image creation, you should
2948use a plain tEXt chunk with the "Creation Time" keyword. This is
2949necessary because the "creation time" of a PNG image is somewhat vague,
2950depending on whether you mean the PNG file, the time the image was
2951created in a non-PNG format, a still photo from which the image was
2952scanned, or possibly the subject matter itself. In order to facilitate
2953machine-readable dates, it is recommended that the "Creation Time"
2954tEXt chunk use RFC 1123 format dates (e.g. "22 May 1997 18:07:10 GMT"),
2955although this isn't a requirement. Unlike the tIME chunk, the
2956"Creation Time" tEXt chunk is not expected to be automatically changed
2957by the software. To facilitate the use of RFC 1123 dates, a function
2958png_convert_to_rfc1123(png_timep) is provided to convert from PNG
2959time to an RFC 1123 format string.
2960
2961Writing unknown chunks
2962
2963You can use the png_set_unknown_chunks function to queue up chunks
2964for writing. You give it a chunk name, raw data, and a size; that's
2965all there is to it. The chunks will be written by the next following
2966png_write_info_before_PLTE, png_write_info, or png_write_end function.
2967Any chunks previously read into the info structure's unknown-chunk
2968list will also be written out in a sequence that satisfies the PNG
2969specification's ordering rules.
2970
2971The high-level write interface
2972
2973At this point there are two ways to proceed; through the high-level
2974write interface, or through a sequence of low-level write operations.
2975You can use the high-level interface if your image data is present
2976in the info structure. All defined output
2977transformations are permitted, enabled by the following masks.
2978
2979 PNG_TRANSFORM_IDENTITY No transformation
2980 PNG_TRANSFORM_PACKING Pack 1, 2 and 4-bit samples
2981 PNG_TRANSFORM_PACKSWAP Change order of packed
2982 pixels to LSB first
2983 PNG_TRANSFORM_INVERT_MONO Invert monochrome images
2984 PNG_TRANSFORM_SHIFT Normalize pixels to the
2985 sBIT depth
2986 PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA
2987 to BGRA
2988 PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA
2989 to AG
2990 PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity
2991 to transparency
2992 PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples
2993 PNG_TRANSFORM_STRIP_FILLER Strip out filler
2994 bytes (deprecated).
2995 PNG_TRANSFORM_STRIP_FILLER_BEFORE Strip out leading
2996 filler bytes
2997 PNG_TRANSFORM_STRIP_FILLER_AFTER Strip out trailing
2998 filler bytes
2999
3000If you have valid image data in the info structure (you can use
3001png_set_rows() to put image data in the info structure), simply do this:
3002
3003 png_write_png(png_ptr, info_ptr, png_transforms, NULL)
3004
3005where png_transforms is an integer containing the bitwise OR of some set of
3006transformation flags. This call is equivalent to png_write_info(),
3007followed the set of transformations indicated by the transform mask,
3008then png_write_image(), and finally png_write_end().
3009
3010(The final parameter of this call is not yet used. Someday it might point
3011to transformation parameters required by some future output transform.)
3012
3013You must use png_transforms and not call any png_set_transform() functions
3014when you use png_write_png().
3015
3016The low-level write interface
3017
3018If you are going the low-level route instead, you are now ready to
3019write all the file information up to the actual image data. You do
3020this with a call to png_write_info().
3021
3022 png_write_info(png_ptr, info_ptr);
3023
3024Note that there is one transformation you may need to do before
3025png_write_info(). In PNG files, the alpha channel in an image is the
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06003026level of opacity. If your data is supplied as a level of transparency,
3027you can invert the alpha channel before you write it, so that 0 is
3028fully transparent and 255 (in 8-bit or paletted images) or 65535
3029(in 16-bit images) is fully opaque, with
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003030
3031 png_set_invert_alpha(png_ptr);
3032
3033This must appear before png_write_info() instead of later with the
3034other transformations because in the case of paletted images the tRNS
3035chunk data has to be inverted before the tRNS chunk is written. If
3036your image is not a paletted image, the tRNS data (which in such cases
3037represents a single color to be rendered as transparent) won't need to
3038be changed, and you can safely do this transformation after your
3039png_write_info() call.
3040
3041If you need to write a private chunk that you want to appear before
3042the PLTE chunk when PLTE is present, you can write the PNG info in
3043two steps, and insert code to write your own chunk between them:
3044
3045 png_write_info_before_PLTE(png_ptr, info_ptr);
3046 png_set_unknown_chunks(png_ptr, info_ptr, ...);
3047 png_write_info(png_ptr, info_ptr);
3048
3049After you've written the file information, you can set up the library
3050to handle any special transformations of the image data. The various
3051ways to transform the data will be described in the order that they
3052should occur. This is important, as some of these change the color
3053type and/or bit depth of the data, and some others only work on
3054certain color types and bit depths. Even though each transformation
3055checks to see if it has data that it can do something with, you should
3056make sure to only enable a transformation if it will be valid for the
3057data. For example, don't swap red and blue on grayscale data.
3058
3059PNG files store RGB pixels packed into 3 or 6 bytes. This code tells
3060the library to strip input data that has 4 or 8 bytes per pixel down
3061to 3 or 6 bytes (or strip 2 or 4-byte grayscale+filler data to 1 or 2
3062bytes per pixel).
3063
3064 png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
3065
3066where the 0 is unused, and the location is either PNG_FILLER_BEFORE or
3067PNG_FILLER_AFTER, depending upon whether the filler byte in the pixel
3068is stored XRGB or RGBX.
3069
3070PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as
3071they can, resulting in, for example, 8 pixels per byte for 1 bit files.
3072If the data is supplied at 1 pixel per byte, use this code, which will
3073correctly pack the pixels into a single byte:
3074
3075 png_set_packing(png_ptr);
3076
3077PNG files reduce possible bit depths to 1, 2, 4, 8, and 16. If your
3078data is of another bit depth, you can write an sBIT chunk into the
3079file so that decoders can recover the original data if desired.
3080
3081 /* Set the true bit depth of the image data */
3082 if (color_type & PNG_COLOR_MASK_COLOR)
3083 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003084 sig_bit.red = true_bit_depth;
3085 sig_bit.green = true_bit_depth;
3086 sig_bit.blue = true_bit_depth;
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003087 }
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003088
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003089 else
3090 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003091 sig_bit.gray = true_bit_depth;
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003092 }
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003093
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003094 if (color_type & PNG_COLOR_MASK_ALPHA)
3095 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003096 sig_bit.alpha = true_bit_depth;
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003097 }
3098
3099 png_set_sBIT(png_ptr, info_ptr, &sig_bit);
3100
3101If the data is stored in the row buffer in a bit depth other than
3102one supported by PNG (e.g. 3 bit data in the range 0-7 for a 4-bit PNG),
3103this will scale the values to appear to be the correct bit depth as
3104is required by PNG.
3105
3106 png_set_shift(png_ptr, &sig_bit);
3107
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -05003108PNG files store 16-bit pixels in network byte order (big-endian,
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003109ie. most significant bits first). This code would be used if they are
3110supplied the other way (little-endian, i.e. least significant bits
3111first, the way PCs store them):
3112
3113 if (bit_depth > 8)
3114 png_set_swap(png_ptr);
3115
3116If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you
3117need to change the order the pixels are packed into bytes, you can use:
3118
3119 if (bit_depth < 8)
3120 png_set_packswap(png_ptr);
3121
3122PNG files store 3 color pixels in red, green, blue order. This code
3123would be used if they are supplied as blue, green, red:
3124
3125 png_set_bgr(png_ptr);
3126
3127PNG files describe monochrome as black being zero and white being
3128one. This code would be used if the pixels are supplied with this reversed
3129(black being one and white being zero):
3130
3131 png_set_invert_mono(png_ptr);
3132
3133Finally, you can write your own transformation function if none of
3134the existing ones meets your needs. This is done by setting a callback
3135with
3136
3137 png_set_write_user_transform_fn(png_ptr,
3138 write_transform_fn);
3139
3140You must supply the function
3141
Glenn Randers-Pehrson93215672011-02-13 19:42:19 -06003142 void write_transform_fn(png_structp png_ptr, png_row_infop
3143 row_info, png_bytep data)
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003144
3145See pngtest.c for a working example. Your function will be called
John Bowler0a5c9c02011-01-22 17:36:34 -06003146before any of the other transformations are processed. If supported
3147libpng also supplies an information routine that may be called from
3148your callback:
3149
3150 png_get_current_row_number(png_ptr);
John Bowlercd113452011-02-16 06:15:13 -06003151 png_get_current_pass_number(png_ptr);
John Bowler0a5c9c02011-01-22 17:36:34 -06003152
John Bowlercd113452011-02-16 06:15:13 -06003153This returns the current row passed to the transform. With interlaced
3154images the value returned is the row in the input sub-image image. Use
3155PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to
3156find the output pixel (x,y) given an interlaced sub-image pixel (row,col,pass).
3157
3158The discussion of interlace handling above contains more information on how to
3159use these values.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003160
3161You can also set up a pointer to a user structure for use by your
3162callback function.
3163
3164 png_set_user_transform_info(png_ptr, user_ptr, 0, 0);
3165
3166The user_channels and user_depth parameters of this function are ignored
3167when writing; you can set them to zero as shown.
3168
3169You can retrieve the pointer via the function png_get_user_transform_ptr().
3170For example:
3171
3172 voidp write_user_transform_ptr =
3173 png_get_user_transform_ptr(png_ptr);
3174
3175It is possible to have libpng flush any pending output, either manually,
3176or automatically after a certain number of lines have been written. To
3177flush the output stream a single time call:
3178
3179 png_write_flush(png_ptr);
3180
3181and to have libpng flush the output stream periodically after a certain
3182number of scanlines have been written, call:
3183
3184 png_set_flush(png_ptr, nrows);
3185
3186Note that the distance between rows is from the last time png_write_flush()
3187was called, or the first row of the image if it has never been called.
3188So if you write 50 lines, and then png_set_flush 25, it will flush the
3189output on the next scanline, and every 25 lines thereafter, unless
3190png_write_flush() is called before 25 more lines have been written.
3191If nrows is too small (less than about 10 lines for a 640 pixel wide
3192RGB image) the image compression may decrease noticeably (although this
3193may be acceptable for real-time applications). Infrequent flushing will
3194only degrade the compression performance by a few percent over images
3195that do not use flushing.
3196
3197Writing the image data
3198
3199That's it for the transformations. Now you can write the image data.
3200The simplest way to do this is in one function call. If you have the
3201whole image in memory, you can just call png_write_image() and libpng
3202will write the image. You will need to pass in an array of pointers to
3203each row. This function automatically handles interlacing, so you don't
3204need to call png_set_interlace_handling() or call this function multiple
3205times, or any of that other stuff necessary with png_write_rows().
3206
3207 png_write_image(png_ptr, row_pointers);
3208
3209where row_pointers is:
3210
3211 png_byte *row_pointers[height];
3212
3213You can point to void or char or whatever you use for pixels.
3214
3215If you don't want to write the whole image at once, you can
3216use png_write_rows() instead. If the file is not interlaced,
3217this is simple:
3218
3219 png_write_rows(png_ptr, row_pointers,
3220 number_of_rows);
3221
3222row_pointers is the same as in the png_write_image() call.
3223
3224If you are just writing one row at a time, you can do this with
3225a single row_pointer instead of an array of row_pointers:
3226
3227 png_bytep row_pointer = row;
3228
3229 png_write_row(png_ptr, row_pointer);
3230
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06003231When the file is interlaced, things can get a good deal more complicated.
3232The only currently (as of the PNG Specification version 1.2, dated July
32331999) defined interlacing scheme for PNG files is the "Adam7" interlace
3234scheme, that breaks down an image into seven smaller images of varying
3235size. libpng will build these images for you, or you can do them
3236yourself. If you want to build them yourself, see the PNG specification
3237for details of which pixels to write when.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003238
3239If you don't want libpng to handle the interlacing details, just
3240use png_set_interlace_handling() and call png_write_rows() the
John Bowler660c6e42010-12-19 06:22:23 -06003241correct number of times to write all the sub-images
3242(png_set_interlace_handling() returns the number of sub-images.)
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003243
3244If you want libpng to build the sub-images, call this before you start
3245writing any rows:
3246
John Bowler660c6e42010-12-19 06:22:23 -06003247 number_of_passes = png_set_interlace_handling(png_ptr);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003248
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06003249This will return the number of passes needed. Currently, this is seven,
3250but may change if another interlace type is added.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003251
3252Then write the complete image number_of_passes times.
3253
John Bowler660c6e42010-12-19 06:22:23 -06003254 png_write_rows(png_ptr, row_pointers, number_of_rows);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003255
John Bowler660c6e42010-12-19 06:22:23 -06003256Think carefully before you write an interlaced image. Typically code that
3257reads such images reads all the image data into memory, uncompressed, before
3258doing any processing. Only code that can display an image on the fly can
3259take advantage of the interlacing and even then the image has to be exactly
3260the correct size for the output device, because scaling an image requires
3261adjacent pixels and these are not available until all the passes have been
3262read.
3263
3264If you do write an interlaced image you will hardly ever need to handle
3265the interlacing yourself. Call png_set_interlace_handling() and use the
3266approach described above.
3267
3268The only time it is conceivable that you will really need to write an
3269interlaced image pass-by-pass is when you have read one pass by pass and
3270made some pixel-by-pixel transformation to it, as described in the read
3271code above. In this case use the PNG_PASS_ROWS and PNG_PASS_COLS macros
3272to determine the size of each sub-image in turn and simply write the rows
3273you obtained from the read code.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003274
3275Finishing a sequential write
3276
3277After you are finished writing the image, you should finish writing
3278the file. If you are interested in writing comments or time, you should
3279pass an appropriately filled png_info pointer. If you are not interested,
3280you can pass NULL.
3281
3282 png_write_end(png_ptr, info_ptr);
3283
3284When you are done, you can free all memory used by libpng like this:
3285
3286 png_destroy_write_struct(&png_ptr, &info_ptr);
3287
3288It is also possible to individually free the info_ptr members that
3289point to libpng-allocated storage with the following function:
3290
3291 png_free_data(png_ptr, info_ptr, mask, seq)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003292
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003293 mask - identifies data to be freed, a mask
3294 containing the bitwise OR of one or
3295 more of
3296 PNG_FREE_PLTE, PNG_FREE_TRNS,
3297 PNG_FREE_HIST, PNG_FREE_ICCP,
3298 PNG_FREE_PCAL, PNG_FREE_ROWS,
3299 PNG_FREE_SCAL, PNG_FREE_SPLT,
3300 PNG_FREE_TEXT, PNG_FREE_UNKN,
3301 or simply PNG_FREE_ALL
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003302
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003303 seq - sequence number of item to be freed
3304 (-1 for all items)
3305
3306This function may be safely called when the relevant storage has
3307already been freed, or has not yet been allocated, or was allocated
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06003308by the user and not by libpng, and will in those cases do nothing.
3309The "seq" parameter is ignored if only one item of the selected data
3310type, such as PLTE, is allowed. If "seq" is not -1, and multiple items
3311are allowed for the data type identified in the mask, such as text or
3312sPLT, only the n'th item in the structure is freed, where n is "seq".
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003313
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06003314If you allocated data such as a palette that you passed in to libpng
3315with png_set_*, you must not free it until just before the call to
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003316png_destroy_write_struct().
3317
3318The default behavior is only to free data that was allocated internally
3319by libpng. This can be changed, so that libpng will not free the data,
3320or so that it will free data that was allocated by the user with png_malloc()
3321or png_zalloc() and passed in via a png_set_*() function, with
3322
3323 png_data_freer(png_ptr, info_ptr, freer, mask)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003324
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003325 freer - one of
3326 PNG_DESTROY_WILL_FREE_DATA
3327 PNG_SET_WILL_FREE_DATA
3328 PNG_USER_WILL_FREE_DATA
3329
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003330 mask - which data elements are affected
3331 same choices as in png_free_data()
3332
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003333For example, to transfer responsibility for some data from a read structure
3334to a write structure, you could use
3335
3336 png_data_freer(read_ptr, read_info_ptr,
3337 PNG_USER_WILL_FREE_DATA,
3338 PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003339
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003340 png_data_freer(write_ptr, write_info_ptr,
3341 PNG_DESTROY_WILL_FREE_DATA,
3342 PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST)
3343
3344thereby briefly reassigning responsibility for freeing to the user but
3345immediately afterwards reassigning it once more to the write_destroy
3346function. Having done this, it would then be safe to destroy the read
3347structure and continue to use the PLTE, tRNS, and hIST data in the write
3348structure.
3349
3350This function only affects data that has already been allocated.
3351You can call this function before calling after the png_set_*() functions
3352to control whether the user or png_destroy_*() is supposed to free the data.
3353When the user assumes responsibility for libpng-allocated data, the
3354application must use
3355png_free() to free it, and when the user transfers responsibility to libpng
3356for data that the user has allocated, the user must have used png_malloc()
3357or png_zalloc() to allocate it.
3358
3359If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword
3360separately, do not transfer responsibility for freeing text_ptr to libpng,
3361because when libpng fills a png_text structure it combines these members with
3362the key member, and png_free_data() will free only text_ptr.key. Similarly,
3363if you transfer responsibility for free'ing text_ptr from libpng to your
3364application, your application must not separately free those members.
3365For a more compact example of writing a PNG image, see the file example.c.
3366
3367V. Modifying/Customizing libpng:
3368
3369There are two issues here. The first is changing how libpng does
3370standard things like memory allocation, input/output, and error handling.
3371The second deals with more complicated things like adding new chunks,
3372adding new transformations, and generally changing how libpng works.
3373Both of those are compile-time issues; that is, they are generally
3374determined at the time the code is written, and there is rarely a need
3375to provide the user with a means of changing them.
3376
3377Memory allocation, input/output, and error handling
3378
3379All of the memory allocation, input/output, and error handling in libpng
3380goes through callbacks that are user-settable. The default routines are
3381in pngmem.c, pngrio.c, pngwio.c, and pngerror.c, respectively. To change
3382these functions, call the appropriate png_set_*_fn() function.
3383
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06003384Memory allocation is done through the functions png_malloc(), png_calloc(),
3385and png_free(). These currently just call the standard C functions.
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -05003386png_calloc() calls png_malloc() and then clears the newly
3387allocated memory to zero. There is limited support for certain systems
3388with segmented memory architectures and the types of pointers declared by
3389png.h match this; you will have to use appropriate pointers in your
3390application. Since it is
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06003391unlikely that the method of handling memory allocation on a platform
3392will change between applications, these functions must be modified in
3393the library at compile time. If you prefer to use a different method
3394of allocating and freeing data, you can use png_create_read_struct_2() or
3395png_create_write_struct_2() to register your own functions as described
3396above. These functions also provide a void pointer that can be retrieved
3397via
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003398
3399 mem_ptr=png_get_mem_ptr(png_ptr);
3400
3401Your replacement memory functions must have prototypes as follows:
3402
3403 png_voidp malloc_fn(png_structp png_ptr,
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06003404 png_alloc_size_t size);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003405
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003406 void free_fn(png_structp png_ptr, png_voidp ptr);
3407
3408Your malloc_fn() must return NULL in case of failure. The png_malloc()
3409function will normally call png_error() if it receives a NULL from the
3410system memory allocator or from your replacement malloc_fn().
3411
3412Your free_fn() will never be called with a NULL ptr, since libpng's
3413png_free() checks for NULL before calling free_fn().
3414
3415Input/Output in libpng is done through png_read() and png_write(),
3416which currently just call fread() and fwrite(). The FILE * is stored in
3417png_struct and is initialized via png_init_io(). If you wish to change
3418the method of I/O, the library supplies callbacks that you can set
3419through the function png_set_read_fn() and png_set_write_fn() at run
3420time, instead of calling the png_init_io() function. These functions
3421also provide a void pointer that can be retrieved via the function
3422png_get_io_ptr(). For example:
3423
3424 png_set_read_fn(png_structp read_ptr,
3425 voidp read_io_ptr, png_rw_ptr read_data_fn)
3426
3427 png_set_write_fn(png_structp write_ptr,
3428 voidp write_io_ptr, png_rw_ptr write_data_fn,
3429 png_flush_ptr output_flush_fn);
3430
3431 voidp read_io_ptr = png_get_io_ptr(read_ptr);
3432 voidp write_io_ptr = png_get_io_ptr(write_ptr);
3433
3434The replacement I/O functions must have prototypes as follows:
3435
3436 void user_read_data(png_structp png_ptr,
3437 png_bytep data, png_size_t length);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003438
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003439 void user_write_data(png_structp png_ptr,
3440 png_bytep data, png_size_t length);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003441
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003442 void user_flush_data(png_structp png_ptr);
3443
3444The user_read_data() function is responsible for detecting and
3445handling end-of-data errors.
3446
3447Supplying NULL for the read, write, or flush functions sets them back
3448to using the default C stream functions, which expect the io_ptr to
3449point to a standard *FILE structure. It is probably a mistake
3450to use NULL for one of write_data_fn and output_flush_fn but not both
3451of them, unless you have built libpng with PNG_NO_WRITE_FLUSH defined.
3452It is an error to read from a write stream, and vice versa.
3453
3454Error handling in libpng is done through png_error() and png_warning().
3455Errors handled through png_error() are fatal, meaning that png_error()
3456should never return to its caller. Currently, this is handled via
3457setjmp() and longjmp() (unless you have compiled libpng with
Glenn Randers-Pehrson54ac9a92010-04-02 17:06:22 -05003458PNG_NO_SETJMP, in which case it is handled via PNG_ABORT()),
Glenn Randers-Pehrson60988072010-04-13 22:11:06 -05003459but you could change this to do things like exit() if you should wish,
Glenn Randers-Pehrson54ac9a92010-04-02 17:06:22 -05003460as long as your function does not return.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003461
3462On non-fatal errors, png_warning() is called
3463to print a warning message, and then control returns to the calling code.
3464By default png_error() and png_warning() print a message on stderr via
3465fprintf() unless the library is compiled with PNG_NO_CONSOLE_IO defined
3466(because you don't want the messages) or PNG_NO_STDIO defined (because
3467fprintf() isn't available). If you wish to change the behavior of the error
3468functions, you will need to set up your own message callbacks. These
3469functions are normally supplied at the time that the png_struct is created.
3470It is also possible to redirect errors and warnings to your own replacement
3471functions after png_create_*_struct() has been called by calling:
3472
3473 png_set_error_fn(png_structp png_ptr,
3474 png_voidp error_ptr, png_error_ptr error_fn,
3475 png_error_ptr warning_fn);
3476
3477 png_voidp error_ptr = png_get_error_ptr(png_ptr);
3478
3479If NULL is supplied for either error_fn or warning_fn, then the libpng
3480default function will be used, calling fprintf() and/or longjmp() if a
3481problem is encountered. The replacement error functions should have
3482parameters as follows:
3483
3484 void user_error_fn(png_structp png_ptr,
3485 png_const_charp error_msg);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003486
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003487 void user_warning_fn(png_structp png_ptr,
3488 png_const_charp warning_msg);
3489
3490The motivation behind using setjmp() and longjmp() is the C++ throw and
3491catch exception handling methods. This makes the code much easier to write,
3492as there is no need to check every return code of every function call.
3493However, there are some uncertainties about the status of local variables
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06003494after a longjmp, so the user may want to be careful about doing anything
3495after setjmp returns non-zero besides returning itself. Consult your
3496compiler documentation for more details. For an alternative approach, you
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -05003497may wish to use the "cexcept" facility (see http://cexcept.sourceforge.net),
3498which is illustrated in pngvalid.c and in contrib/visupng.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003499
3500Custom chunks
3501
3502If you need to read or write custom chunks, you may need to get deeper
3503into the libpng code. The library now has mechanisms for storing
3504and writing chunks of unknown type; you can even declare callbacks
3505for custom chunks. However, this may not be good enough if the
3506library code itself needs to know about interactions between your
3507chunk and existing `intrinsic' chunks.
3508
3509If you need to write a new intrinsic chunk, first read the PNG
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06003510specification. Acquire a first level of understanding of how it works.
3511Pay particular attention to the sections that describe chunk names,
3512and look at how other chunks were designed, so you can do things
3513similarly. Second, check out the sections of libpng that read and
3514write chunks. Try to find a chunk that is similar to yours and use
3515it as a template. More details can be found in the comments inside
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -05003516the code. It is best to handle private or unknown chunks in a generic method,
3517via callback functions, instead of by modifying libpng functions. This
3518is illustrated in pngtest.c, which uses a callback function to handle a
3519private "vpAg" chunk and the new "sTER" chunk, which are both unknown to
3520libpng.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003521
3522If you wish to write your own transformation for the data, look through
3523the part of the code that does the transformations, and check out some of
3524the simpler ones to get an idea of how they work. Try to find a similar
3525transformation to the one you want to add and copy off of it. More details
3526can be found in the comments inside the code itself.
3527
Glenn Randers-Pehrson593fc042011-05-12 22:18:23 -05003528Configuring for 16-bit platforms
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003529
3530You will want to look into zconf.h to tell zlib (and thus libpng) that
3531it cannot allocate more then 64K at a time. Even if you can, the memory
3532won't be accessible. So limit zlib and libpng to 64K by defining MAXSEG_64K.
3533
3534Configuring for DOS
3535
3536For DOS users who only have access to the lower 640K, you will
3537have to limit zlib's memory usage via a png_set_compression_mem_level()
3538call. See zlib.h or zconf.h in the zlib library for more information.
3539
3540Configuring for Medium Model
3541
3542Libpng's support for medium model has been tested on most of the popular
3543compilers. Make sure MAXSEG_64K gets defined, USE_FAR_KEYWORD gets
3544defined, and FAR gets defined to far in pngconf.h, and you should be
3545all set. Everything in the library (except for zlib's structure) is
3546expecting far data. You must use the typedefs with the p or pp on
3547the end for pointers (or at least look at them and be careful). Make
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05003548note that the rows of data are defined as png_bytepp, which is
3549an "unsigned char far * far *".
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003550
3551Configuring for gui/windowing platforms:
3552
3553You will need to write new error and warning functions that use the GUI
3554interface, as described previously, and set them to be the error and
3555warning functions at the time that png_create_*_struct() is called,
3556in order to have them available during the structure initialization.
3557They can be changed later via png_set_error_fn(). On some compilers,
3558you may also have to change the memory allocators (png_malloc, etc.).
3559
3560Configuring for compiler xxx:
3561
3562All includes for libpng are in pngconf.h. If you need to add, change
3563or delete an include, this is the place to do it.
3564The includes that are not needed outside libpng are placed in pngpriv.h,
3565which is only used by the routines inside libpng itself.
3566The files in libpng proper only include pngpriv.h and png.h, which
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05003567in turn includes pngconf.h and, as of libpng-1.5.0, pnglibconf.h.
3568As of libpng-1.5.0, pngpriv.h also includes three other private header
3569files, pngstruct.h, pnginfo.h, and pngdebug.h, which contain material
3570that previously appeared in the public headers.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003571
3572Configuring zlib:
3573
3574There are special functions to configure the compression. Perhaps the
3575most useful one changes the compression level, which currently uses
3576input compression values in the range 0 - 9. The library normally
3577uses the default compression level (Z_DEFAULT_COMPRESSION = 6). Tests
3578have shown that for a large majority of images, compression values in
3579the range 3-6 compress nearly as well as higher levels, and do so much
3580faster. For online applications it may be desirable to have maximum speed
3581(Z_BEST_SPEED = 1). With versions of zlib after v0.99, you can also
3582specify no compression (Z_NO_COMPRESSION = 0), but this would create
3583files larger than just storing the raw bitmap. You can specify the
3584compression level by calling:
3585
Glenn Randers-Pehrson38734ee2011-03-03 06:23:31 -06003586 #include zlib.h
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003587 png_set_compression_level(png_ptr, level);
3588
3589Another useful one is to reduce the memory level used by the library.
3590The memory level defaults to 8, but it can be lowered if you are
3591short on memory (running DOS, for example, where you only have 640K).
3592Note that the memory level does have an effect on compression; among
3593other things, lower levels will result in sections of incompressible
3594data being emitted in smaller stored blocks, with a correspondingly
3595larger relative overhead of up to 15% in the worst case.
3596
Glenn Randers-Pehrson38734ee2011-03-03 06:23:31 -06003597 #include zlib.h
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003598 png_set_compression_mem_level(png_ptr, level);
3599
3600The other functions are for configuring zlib. They are not recommended
3601for normal use and may result in writing an invalid PNG file. See
3602zlib.h for more information on what these mean.
3603
Glenn Randers-Pehrson38734ee2011-03-03 06:23:31 -06003604 #include zlib.h
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003605 png_set_compression_strategy(png_ptr,
3606 strategy);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003607
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003608 png_set_compression_window_bits(png_ptr,
3609 window_bits);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003610
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003611 png_set_compression_method(png_ptr, method);
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05003612
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003613 png_set_compression_buffer_size(png_ptr, size);
3614
Glenn Randers-Pehrson7a287242011-07-26 12:03:11 -05003615As of libpng version 1.5.4, additional APIs became
3616available to set these separately for non-IDAT
3617compressed chunks such as zTXt, iTXt, and iCCP:
3618
3619 #include zlib.h
3620 #if PNG_LIBPNG_VER <= 10504
3621 png_set_text_compression_level(png_ptr, level);
3622
3623 png_set_text_compression_mem_level(png_ptr, level);
3624
3625 png_set_text_compression_strategy(png_ptr,
3626 strategy);
3627
3628 png_set_text_compression_window_bits(png_ptr,
3629 window_bits);
3630
3631 png_set_text_compression_method(png_ptr, method);
3632 #endif
3633
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003634Controlling row filtering
3635
3636If you want to control whether libpng uses filtering or not, which
3637filters are used, and how it goes about picking row filters, you
3638can call one of these functions. The selection and configuration
3639of row filters can have a significant impact on the size and
3640encoding speed and a somewhat lesser impact on the decoding speed
3641of an image. Filtering is enabled by default for RGB and grayscale
3642images (with and without alpha), but not for paletted images nor
3643for any images with bit depths less than 8 bits/pixel.
3644
3645The 'method' parameter sets the main filtering method, which is
3646currently only '0' in the PNG 1.2 specification. The 'filters'
3647parameter sets which filter(s), if any, should be used for each
3648scanline. Possible values are PNG_ALL_FILTERS and PNG_NO_FILTERS
3649to turn filtering on and off, respectively.
3650
3651Individual filter types are PNG_FILTER_NONE, PNG_FILTER_SUB,
3652PNG_FILTER_UP, PNG_FILTER_AVG, PNG_FILTER_PAETH, which can be bitwise
3653ORed together with '|' to specify one or more filters to use.
3654These filters are described in more detail in the PNG specification.
3655If you intend to change the filter type during the course of writing
3656the image, you should start with flags set for all of the filters
3657you intend to use so that libpng can initialize its internal
3658structures appropriately for all of the filter types. (Note that this
3659means the first row must always be adaptively filtered, because libpng
3660currently does not allocate the filter buffers until png_write_row()
3661is called for the first time.)
3662
3663 filters = PNG_FILTER_NONE | PNG_FILTER_SUB
3664 PNG_FILTER_UP | PNG_FILTER_AVG |
3665 PNG_FILTER_PAETH | PNG_ALL_FILTERS;
3666
3667 png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE,
3668 filters);
3669 The second parameter can also be
3670 PNG_INTRAPIXEL_DIFFERENCING if you are
3671 writing a PNG to be embedded in a MNG
3672 datastream. This parameter must be the
3673 same as the value of filter_method used
3674 in png_set_IHDR().
3675
3676It is also possible to influence how libpng chooses from among the
3677available filters. This is done in one or both of two ways - by
3678telling it how important it is to keep the same filter for successive
3679rows, and by telling it the relative computational costs of the filters.
3680
3681 double weights[3] = {1.5, 1.3, 1.1},
3682 costs[PNG_FILTER_VALUE_LAST] =
3683 {1.0, 1.3, 1.3, 1.5, 1.7};
3684
3685 png_set_filter_heuristics(png_ptr,
3686 PNG_FILTER_HEURISTIC_WEIGHTED, 3,
3687 weights, costs);
3688
3689The weights are multiplying factors that indicate to libpng that the
3690row filter should be the same for successive rows unless another row filter
3691is that many times better than the previous filter. In the above example,
3692if the previous 3 filters were SUB, SUB, NONE, the SUB filter could have a
3693"sum of absolute differences" 1.5 x 1.3 times higher than other filters
3694and still be chosen, while the NONE filter could have a sum 1.1 times
3695higher than other filters and still be chosen. Unspecified weights are
3696taken to be 1.0, and the specified weights should probably be declining
3697like those above in order to emphasize recent filters over older filters.
3698
3699The filter costs specify for each filter type a relative decoding cost
3700to be considered when selecting row filters. This means that filters
3701with higher costs are less likely to be chosen over filters with lower
3702costs, unless their "sum of absolute differences" is that much smaller.
3703The costs do not necessarily reflect the exact computational speeds of
3704the various filters, since this would unduly influence the final image
3705size.
3706
3707Note that the numbers above were invented purely for this example and
3708are given only to help explain the function usage. Little testing has
3709been done to find optimum values for either the costs or the weights.
3710
3711Removing unwanted object code
3712
3713There are a bunch of #define's in pngconf.h that control what parts of
3714libpng are compiled. All the defines end in _SUPPORTED. If you are
3715never going to use a capability, you can change the #define to #undef
3716before recompiling libpng and save yourself code and data space, or
3717you can turn off individual capabilities with defines that begin with
3718PNG_NO_.
3719
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003720In libpng-1.5.0 and later, the #define's are in pnglibconf.h instead.
3721
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003722You can also turn all of the transforms and ancillary chunk capabilities
3723off en masse with compiler directives that define
3724PNG_NO_READ[or WRITE]_TRANSFORMS, or PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS,
3725or all four,
3726along with directives to turn on any of the capabilities that you do
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06003727want. The PNG_NO_READ[or WRITE]_TRANSFORMS directives disable the extra
3728transformations but still leave the library fully capable of reading
3729and writing PNG files with all known public chunks. Use of the
3730PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS directive produces a library
3731that is incapable of reading or writing ancillary chunks. If you are
3732not using the progressive reading capability, you can turn that off
3733with PNG_NO_PROGRESSIVE_READ (don't confuse this with the INTERLACING
3734capability, which you'll still have).
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003735
3736All the reading and writing specific code are in separate files, so the
3737linker should only grab the files it needs. However, if you want to
3738make sure, or if you are building a stand alone library, all the
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -05003739reading files start with "pngr" and all the writing files start with "pngw".
3740The files that don't match either (like png.c, pngtrans.c, etc.)
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003741are used for both reading and writing, and always need to be included.
3742The progressive reader is in pngpread.c
3743
3744If you are creating or distributing a dynamically linked library (a .so
3745or DLL file), you should not remove or disable any parts of the library,
3746as this will cause applications linked with different versions of the
3747library to fail if they call functions not available in your library.
3748The size of the library itself should not be an issue, because only
3749those sections that are actually used will be loaded into memory.
3750
3751Requesting debug printout
3752
3753The macro definition PNG_DEBUG can be used to request debugging
3754printout. Set it to an integer value in the range 0 to 3. Higher
3755numbers result in increasing amounts of debugging information. The
3756information is printed to the "stderr" file, unless another file
3757name is specified in the PNG_DEBUG_FILE macro definition.
3758
3759When PNG_DEBUG > 0, the following functions (macros) become available:
3760
3761 png_debug(level, message)
3762 png_debug1(level, message, p1)
3763 png_debug2(level, message, p1, p2)
3764
3765in which "level" is compared to PNG_DEBUG to decide whether to print
3766the message, "message" is the formatted string to be printed,
3767and p1 and p2 are parameters that are to be embedded in the string
3768according to printf-style formatting directives. For example,
3769
3770 png_debug1(2, "foo=%d\n", foo);
3771
3772is expanded to
3773
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003774 if (PNG_DEBUG > 2)
3775 fprintf(PNG_DEBUG_FILE, "foo=%d\n", foo);
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003776
3777When PNG_DEBUG is defined but is zero, the macros aren't defined, but you
3778can still use PNG_DEBUG to control your own debugging:
3779
3780 #ifdef PNG_DEBUG
3781 fprintf(stderr, ...
3782 #endif
3783
3784When PNG_DEBUG = 1, the macros are defined, but only png_debug statements
3785having level = 0 will be printed. There aren't any such statements in
3786this version of libpng, but if you insert some they will be printed.
3787
3788VI. MNG support
3789
3790The MNG specification (available at http://www.libpng.org/pub/mng) allows
3791certain extensions to PNG for PNG images that are embedded in MNG datastreams.
3792Libpng can support some of these extensions. To enable them, use the
3793png_permit_mng_features() function:
3794
3795 feature_set = png_permit_mng_features(png_ptr, mask)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003796
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003797 mask is a png_uint_32 containing the bitwise OR of the
3798 features you want to enable. These include
3799 PNG_FLAG_MNG_EMPTY_PLTE
3800 PNG_FLAG_MNG_FILTER_64
3801 PNG_ALL_MNG_FEATURES
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003802
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003803 feature_set is a png_uint_32 that is the bitwise AND of
3804 your mask with the set of MNG features that is
3805 supported by the version of libpng that you are using.
3806
3807It is an error to use this function when reading or writing a standalone
3808PNG file with the PNG 8-byte signature. The PNG datastream must be wrapped
3809in a MNG datastream. As a minimum, it must have the MNG 8-byte signature
3810and the MHDR and MEND chunks. Libpng does not provide support for these
3811or any other MNG chunks; your application must provide its own support for
3812them. You may wish to consider using libmng (available at
3813http://www.libmng.com) instead.
3814
3815VII. Changes to Libpng from version 0.88
3816
3817It should be noted that versions of libpng later than 0.96 are not
3818distributed by the original libpng author, Guy Schalnat, nor by
3819Andreas Dilger, who had taken over from Guy during 1996 and 1997, and
3820distributed versions 0.89 through 0.96, but rather by another member
3821of the original PNG Group, Glenn Randers-Pehrson. Guy and Andreas are
3822still alive and well, but they have moved on to other things.
3823
3824The old libpng functions png_read_init(), png_write_init(),
3825png_info_init(), png_read_destroy(), and png_write_destroy() have been
3826moved to PNG_INTERNAL in version 0.95 to discourage their use. These
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003827functions will be removed from libpng version 1.4.0.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003828
3829The preferred method of creating and initializing the libpng structures is
3830via the png_create_read_struct(), png_create_write_struct(), and
3831png_create_info_struct() because they isolate the size of the structures
3832from the application, allow version error checking, and also allow the
3833use of custom error handling routines during the initialization, which
3834the old functions do not. The functions png_read_destroy() and
3835png_write_destroy() do not actually free the memory that libpng
3836allocated for these structs, but just reset the data structures, so they
3837can be used instead of png_destroy_read_struct() and
3838png_destroy_write_struct() if you feel there is too much system overhead
3839allocating and freeing the png_struct for each image read.
3840
3841Setting the error callbacks via png_set_message_fn() before
3842png_read_init() as was suggested in libpng-0.88 is no longer supported
3843because this caused applications that do not use custom error functions
3844to fail if the png_ptr was not initialized to zero. It is still possible
3845to set the error callbacks AFTER png_read_init(), or to change them with
3846png_set_error_fn(), which is essentially the same function, but with a new
3847name to force compilation errors with applications that try to use the old
3848method.
3849
3850Starting with version 1.0.7, you can find out which version of the library
3851you are using at run-time:
3852
3853 png_uint_32 libpng_vn = png_access_version_number();
3854
3855The number libpng_vn is constructed from the major version, minor
3856version with leading zero, and release number with leading zero,
3857(e.g., libpng_vn for version 1.0.7 is 10007).
3858
3859You can also check which version of png.h you used when compiling your
3860application:
3861
3862 png_uint_32 application_vn = PNG_LIBPNG_VER;
3863
3864VIII. Changes to Libpng from version 1.0.x to 1.2.x
3865
3866Support for user memory management was enabled by default. To
3867accomplish this, the functions png_create_read_struct_2(),
3868png_create_write_struct_2(), png_set_mem_fn(), png_get_mem_ptr(),
3869png_malloc_default(), and png_free_default() were added.
3870
Glenn Randers-Pehrsond6ea40a2009-11-02 07:32:00 -06003871Support for the iTXt chunk has been enabled by default as of
3872version 1.2.41.
3873
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003874Support for certain MNG features was enabled.
3875
3876Support for numbered error messages was added. However, we never got
3877around to actually numbering the error messages. The function
3878png_set_strip_error_numbers() was added (Note: the prototype for this
3879function was inadvertently removed from png.h in PNG_NO_ASSEMBLER_CODE
3880builds of libpng-1.2.15. It was restored in libpng-1.2.36).
3881
3882The png_malloc_warn() function was added at libpng-1.2.3. This issues
3883a png_warning and returns NULL instead of aborting when it fails to
3884acquire the requested memory allocation.
3885
3886Support for setting user limits on image width and height was enabled
3887by default. The functions png_set_user_limits(), png_get_user_width_max(),
3888and png_get_user_height_max() were added at libpng-1.2.6.
3889
3890The png_set_add_alpha() function was added at libpng-1.2.7.
3891
3892The function png_set_expand_gray_1_2_4_to_8() was added at libpng-1.2.9.
3893Unlike png_set_gray_1_2_4_to_8(), the new function does not expand the
3894tRNS chunk to alpha. The png_set_gray_1_2_4_to_8() function is
3895deprecated.
3896
3897A number of macro definitions in support of runtime selection of
3898assembler code features (especially Intel MMX code support) were
3899added at libpng-1.2.0:
3900
3901 PNG_ASM_FLAG_MMX_SUPPORT_COMPILED
3902 PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU
3903 PNG_ASM_FLAG_MMX_READ_COMBINE_ROW
3904 PNG_ASM_FLAG_MMX_READ_INTERLACE
3905 PNG_ASM_FLAG_MMX_READ_FILTER_SUB
3906 PNG_ASM_FLAG_MMX_READ_FILTER_UP
3907 PNG_ASM_FLAG_MMX_READ_FILTER_AVG
3908 PNG_ASM_FLAG_MMX_READ_FILTER_PAETH
3909 PNG_ASM_FLAGS_INITIALIZED
3910 PNG_MMX_READ_FLAGS
3911 PNG_MMX_FLAGS
3912 PNG_MMX_WRITE_FLAGS
3913 PNG_MMX_FLAGS
3914
3915We added the following functions in support of runtime
3916selection of assembler code features:
3917
3918 png_get_mmx_flagmask()
3919 png_set_mmx_thresholds()
3920 png_get_asm_flags()
3921 png_get_mmx_bitdepth_threshold()
3922 png_get_mmx_rowbytes_threshold()
3923 png_set_asm_flags()
3924
3925We replaced all of these functions with simple stubs in libpng-1.2.20,
3926when the Intel assembler code was removed due to a licensing issue.
3927
Glenn Randers-Pehrson3d893a02009-08-31 13:32:46 -05003928These macros are deprecated:
3929
3930 PNG_READ_TRANSFORMS_NOT_SUPPORTED
3931 PNG_PROGRESSIVE_READ_NOT_SUPPORTED
3932 PNG_NO_SEQUENTIAL_READ_SUPPORTED
3933 PNG_WRITE_TRANSFORMS_NOT_SUPPORTED
3934 PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED
3935 PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED
3936
3937They have been replaced, respectively, by:
3938
3939 PNG_NO_READ_TRANSFORMS
3940 PNG_NO_PROGRESSIVE_READ
3941 PNG_NO_SEQUENTIAL_READ
3942 PNG_NO_WRITE_TRANSFORMS
3943 PNG_NO_READ_ANCILLARY_CHUNKS
3944 PNG_NO_WRITE_ANCILLARY_CHUNKS
3945
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003946PNG_MAX_UINT was replaced with PNG_UINT_31_MAX. It has been
3947deprecated since libpng-1.0.16 and libpng-1.2.6.
3948
3949The function
3950 png_check_sig(sig, num)
3951was replaced with
3952 !png_sig_cmp(sig, 0, num)
3953It has been deprecated since libpng-0.90.
3954
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003955The function
3956 png_set_gray_1_2_4_to_8()
3957which also expands tRNS to alpha was replaced with
3958 png_set_expand_gray_1_2_4_to_8()
3959which does not. It has been deprecated since libpng-1.0.18 and 1.2.9.
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06003960
Glenn Randers-Pehrsond740c842009-11-04 19:01:54 -06003961IX. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x
3962
3963Private libpng prototypes and macro definitions were moved from
3964png.h and pngconf.h into a new pngpriv.h header file.
3965
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003966Functions png_set_benign_errors(), png_benign_error(), and
3967png_chunk_benign_error() were added.
3968
3969Support for setting the maximum amount of memory that the application
3970will allocate for reading chunks was added, as a security measure.
3971The functions png_set_chunk_cache_max() and png_get_chunk_cache_max()
3972were added to the library.
3973
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06003974We implemented support for I/O states by adding png_ptr member io_state
3975and functions png_get_io_chunk_name() and png_get_io_state() in pngget.c
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05003976
Glenn Randers-Pehrson4f25bf32009-10-29 23:34:44 -05003977We added PNG_TRANSFORM_GRAY_TO_RGB to the available high-level
3978input transforms.
3979
Glenn Randers-Pehrson4f25bf32009-10-29 23:34:44 -05003980Checking for and reporting of errors in the IHDR chunk is more thorough.
3981
Glenn Randers-Pehrson45af8192009-12-30 08:37:29 -06003982Support for global arrays was removed, to improve thread safety.
3983
3984Some obsolete/deprecated macros and functions have been removed.
3985
3986Typecasted NULL definitions such as
3987 #define png_voidp_NULL (png_voidp)NULL
3988were eliminated. If you used these in your application, just use
3989NULL instead.
3990
3991The png_struct and info_struct members "trans" and "trans_values" were
3992changed to "trans_alpha" and "trans_color", respectively.
3993
3994The obsolete, unused pnggccrd.c and pngvcrd.c files and related makefiles
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06003995were removed.
Glenn Randers-Pehrson45af8192009-12-30 08:37:29 -06003996
3997The PNG_1_0_X and PNG_1_2_X macros were eliminated.
3998
Glenn Randers-Pehrson4f25bf32009-10-29 23:34:44 -05003999The PNG_LEGACY_SUPPORTED macro was eliminated.
4000
4001Many WIN32_WCE #ifdefs were removed.
4002
4003The functions png_read_init(info_ptr), png_write_init(info_ptr),
4004png_info_init(info_ptr), png_read_destroy(), and png_write_destroy()
4005have been removed. They have been deprecated since libpng-0.95.
4006
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05004007The png_permit_empty_plte() was removed. It has been deprecated
4008since libpng-1.0.9. Use png_permit_mng_features() instead.
4009
4010We removed the obsolete stub functions png_get_mmx_flagmask(),
4011png_set_mmx_thresholds(), png_get_asm_flags(),
4012png_get_mmx_bitdepth_threshold(), png_get_mmx_rowbytes_threshold(),
4013png_set_asm_flags(), and png_mmx_supported()
4014
Glenn Randers-Pehrson45af8192009-12-30 08:37:29 -06004015We removed the obsolete png_check_sig(), png_memcpy_check(), and
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -05004016png_memset_check() functions. Instead use !png_sig_cmp(), memcpy(),
4017and memset(), respectively.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05004018
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06004019The function png_set_gray_1_2_4_to_8() was removed. It has been
4020deprecated since libpng-1.0.18 and 1.2.9, when it was replaced with
4021png_set_expand_gray_1_2_4_to_8() because the former function also
John Bowler63d059a2011-02-12 09:03:44 -06004022expanded any tRNS chunk to an alpha channel.
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06004023
Glenn Randers-Pehrson5b40b012010-11-25 07:16:29 -06004024Macros for png_get_uint_16, png_get_uint_32, and png_get_int_32
4025were added and are used by default instead of the corresponding
4026functions. Unfortunately,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06004027from libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
Glenn Randers-Pehrson5b40b012010-11-25 07:16:29 -06004028function) incorrectly returned a value of type png_uint_32.
4029
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05004030We changed the prototype for png_malloc() from
4031 png_malloc(png_structp png_ptr, png_uint_32 size)
4032to
4033 png_malloc(png_structp png_ptr, png_alloc_size_t size)
4034
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06004035This also applies to the prototype for the user replacement malloc_fn().
4036
Glenn Randers-Pehrson45af8192009-12-30 08:37:29 -06004037The png_calloc() function was added and is used in place of
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -05004038of "png_malloc(); memset();" except in the case in png_read_png()
Glenn Randers-Pehrson45af8192009-12-30 08:37:29 -06004039where the array consists of pointers; in this case a "for" loop is used
4040after the png_malloc() to set the pointers to NULL, to give robust.
4041behavior in case the application runs out of memory part-way through
4042the process.
4043
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05004044We changed the prototypes of png_get_compression_buffer_size() and
4045png_set_compression_buffer_size() to work with png_size_t instead of
4046png_uint_32.
4047
Glenn Randers-Pehrson45af8192009-12-30 08:37:29 -06004048Support for numbered error messages was removed by default, since we
4049never got around to actually numbering the error messages. The function
4050png_set_strip_error_numbers() was removed from the library by default.
4051
4052The png_zalloc() and png_zfree() functions are no longer exported.
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05004053The png_zalloc() function no longer zeroes out the memory that it
4054allocates.
4055
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05004056Support for dithering was disabled by default in libpng-1.4.0, because
Glenn Randers-Pehrson9f1cd702011-04-16 19:40:23 -05004057it has not been well tested and doesn't actually "dither".
4058The code was not
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05004059removed, however, and could be enabled by building libpng with
4060PNG_READ_DITHER_SUPPORTED defined. In libpng-1.4.2, this support
4061was reenabled, but the function was renamed png_set_quantize() to
4062reflect more accurately what it actually does. At the same time,
4063the PNG_DITHER_[RED,GREEN_BLUE]_BITS macros were also renamed to
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004064PNG_QUANTIZE_[RED,GREEN,BLUE]_BITS, and PNG_READ_DITHER_SUPPORTED
4065was renamed to PNG_READ_QUANTIZE_SUPPORTED.
Glenn Randers-Pehrson60988072010-04-13 22:11:06 -05004066
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05004067We removed the trailing '.' from the warning and error messages.
4068
Glenn Randers-Pehrson5b40b012010-11-25 07:16:29 -06004069X. Changes to Libpng from version 1.4.x to 1.5.x
4070
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06004071From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
Glenn Randers-Pehrson5b40b012010-11-25 07:16:29 -06004072function) incorrectly returned a value of type png_uint_32.
4073
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004074A. Changes that affect users of libpng
4075
4076There are no substantial API changes between the non-deprecated parts of
4077the 1.4.5 API and the 1.5.0 API, however the ability to directly access
4078the main libpng control structures, png_struct and png_info, deprecated
4079in earlier versions of libpng, has been completely removed from
4080libpng 1.5.
4081
Glenn Randers-Pehrson00879b12011-01-15 19:25:34 -06004082We no longer include zlib.h in png.h. Applications that need access
4083to information in zlib.h will need to add the '#include "zlib.h"'
4084directive. It does not matter whether it is placed prior to or after
4085the '"#include png.h"' directive.
4086
4087We moved the png_strcpy(), png_strncpy(), png_strlen(), png_memcpy(),
4088png_memcmp(), png_sprintf, and png_memcpy() macros into a private
4089header file (pngpriv.h) that is not accessible to applications.
4090
Glenn Randers-Pehrson9d23b402011-01-08 10:42:01 -06004091In png_get_iCCP, the type of "profile" was changed from png_charpp
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004092to png_bytepp, and in png_set_iCCP, from png_charp to png_const_bytep.
Glenn Randers-Pehrson9d23b402011-01-08 10:42:01 -06004093
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004094There are changes of form in png.h, including new and changed macros to
4095declare
Glenn Randers-Pehrsonf5ea1b72011-01-06 06:42:51 -06004096parts of the API. Some API functions with arguments that are pointers to
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004097data not modified within the function have been corrected to declare
4098these arguments with PNG_CONST.
4099
4100Much of the internal use of C macros to control the library build has also
4101changed and some of this is visible in the exported header files, in
4102particular the use of macros to control data and API elements visible
4103during application compilation may require significant revision to
4104application code. (It is extremely rare for an application to do this.)
4105
4106Any program that compiled against libpng 1.4 and did not use deprecated
4107features or access internal library structures should compile and work
Glenn Randers-Pehrsond08b6bd2011-02-19 15:50:17 -06004108against libpng 1.5, except for the change in the prototype for
4109png_get_iCCP() and png_set_iCCP() API functions mentioned above.
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004110
John Bowler660c6e42010-12-19 06:22:23 -06004111libpng 1.5.0 adds PNG_ PASS macros to help in the reading and writing of
4112interlaced images. The macros return the number of rows and columns in
4113each pass and information that can be used to de-interlace and (if
4114absolutely necessary) interlace an image.
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004115
4116libpng 1.5.0 adds an API png_longjmp(png_ptr, value). This API calls
Glenn Randers-Pehrsond08b6bd2011-02-19 15:50:17 -06004117the application-provided png_longjmp_ptr on the internal, but application
Glenn Randers-Pehrson33ced442011-04-27 14:58:06 -05004118initialized, longjmp buffer. It is provided as a convenience to avoid
4119the need to use the png_jmpbuf macro, which had the unnecessary side
4120effect of resetting the internal png_longjmp_ptr value.
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004121
4122libpng 1.5.0 includes a complete fixed point API. By default this is
4123present along with the corresponding floating point API. In general the
4124fixed point API is faster and smaller than the floating point one because
4125the PNG file format used fixed point, not floating point. This applies
4126even if the library uses floating point in internal calculations. A new
4127macro, PNG_FLOATING_ARITHMETIC_SUPPORTED, reveals whether the library
4128uses floating point arithmetic (the default) or fixed point arithmetic
4129internally for performance critical calculations such as gamma correction.
Glenn Randers-Pehrson00879b12011-01-15 19:25:34 -06004130In some cases, the gamma calculations may produce slightly different
4131results. This has changed the results in png_rgb_to_gray and in alpha
4132composition (png_set_background for example). This applies even if the
4133original image was already linear (gamma == 1.0) and, therefore, it is
4134not necessary to linearize the image. This is because libpng has *not*
4135been changed to optimize that case correctly, yet.
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004136
4137Fixed point support for the sCAL chunk comes with an important caveat;
4138the sCAL specification uses a decimal encoding of floating point values
4139and the accuracy of PNG fixed point values is insufficient for
4140representation of these values. Consequently a "string" API
4141(png_get_sCAL_s and png_set_sCAL_s) is the only reliable way of reading
4142arbitrary sCAL chunks in the absence of either the floating point API or
4143internal floating point calculations.
4144
4145Applications no longer need to include the optional distribution header
4146file pngusr.h or define the corresponding macros during application
4147build in order to see the correct variant of the libpng API. From 1.5.0
4148application code can check for the corresponding _SUPPORTED macro:
4149
4150#ifdef PNG_INCH_CONVERSIONS_SUPPORTED
4151 /* code that uses the inch conversion APIs. */
4152#endif
4153
4154This macro will only be defined if the inch conversion functions have been
4155compiled into libpng. The full set of macros, and whether or not support
4156has been compiled in, are available in the header file pnglibconf.h.
4157This header file is specific to the libpng build. Notice that prior to
41581.5.0 the _SUPPORTED macros would always have the default definition unless
4159reset by pngusr.h or by explicit settings on the compiler command line.
4160These settings may produce compiler warnings or errors in 1.5.0 because
4161of macro redefinition.
4162
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06004163From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004164function) incorrectly returned a value of type png_uint_32. libpng 1.5.0
4165is consistent with the implementation in 1.4.5 and 1.2.x (where the macro
4166did not exist.)
4167
4168Applications can now choose whether to use these macros or to call the
4169corresponding function by defining PNG_USE_READ_MACROS or
4170PNG_NO_USE_READ_MACROS before including png.h. Notice that this is
4171only supported from 1.5.0 -defining PNG_NO_USE_READ_MACROS prior to 1.5.0
4172 will lead to a link failure.
Glenn Randers-Pehrson59fa3e92011-01-06 07:07:06 -06004173
Glenn Randers-Pehrson733b1312011-06-15 13:21:01 -05004174Prior to libpng-1.5.4, the zlib compressor used the same set of parameters
Glenn Randers-Pehrson8eb88332011-04-01 00:16:50 -05004175when compressing the IDAT data and textual data such as zTXt and iCCP.
Glenn Randers-Pehrson733b1312011-06-15 13:21:01 -05004176In libpng-1.5.4 we reinitialized the zlib stream for each type of data.
Glenn Randers-Pehrson8eb88332011-04-01 00:16:50 -05004177We added five png_set_text_*() functions for setting the parameters to
4178use with textual data.
4179
Glenn Randers-Pehrson733b1312011-06-15 13:21:01 -05004180Prior to libpng-1.5.4, the PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
John Bowlerb2bee332011-06-10 23:24:58 -05004181option was off by default, and slightly inaccurate scaling occurred.
Glenn Randers-Pehrsonfb29e512011-06-17 20:38:24 -05004182This option can no longer be turned off, and the choice of accurate
4183or inaccurate 16-to-8 scaling is by using the new png_set_scale_16_to_8()
4184API for accurate scaling or the old png_set_strip_16_to_8() API for simple
4185chopping.
Glenn Randers-Pehrson0cb906d2011-06-11 14:22:22 -05004186
Glenn Randers-Pehrson733b1312011-06-15 13:21:01 -05004187Prior to libpng-1.5.4, the png_set_user_limits() function could only be
Glenn Randers-Pehrson0cb906d2011-06-11 14:22:22 -05004188used to reduce the width and height limits from the value of
4189PNG_USER_WIDTH_MAX and PNG_USER_HEIGHT_MAX, although this document said
4190that it could be used to override them. Now this function will reduce or
4191increase the limits.
John Bowlerb2bee332011-06-10 23:24:58 -05004192
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004193B. Changes to the build and configuration of libpng
4194
4195Details of internal changes to the library code can be found in the CHANGES
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -05004196file and in the GIT repository logs. These will be of no concern to the vast
4197majority of library users or builders, however the few who configure libpng
4198to a non-default feature set may need to change how this is done.
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004199
4200There should be no need for library builders to alter build scripts if
4201these use the distributed build support - configure or the makefiles -
4202however users of the makefiles may care to update their build scripts
4203to build pnglibconf.h where the corresponding makefile does not do so.
4204
4205Building libpng with a non-default configuration has changed completely.
4206The old method using pngusr.h should still work correctly even though the
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -05004207way pngusr.h is used in the build has been changed; however, library
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004208builders will probably want to examine the changes to take advantage of
4209new capabilities and to simplify their build system.
4210
4211B.1 Specific changes to library configuration capabilities
4212
4213The library now supports a complete fixed point implementation and can
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -05004214thus be used on systems that have no floating point support or very
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004215limited or slow support. Previously gamma correction, an essential part
4216of complete PNG support, required reasonably fast floating point.
4217
4218As part of this the choice of internal implementation has been made
4219independent of the choice of fixed versus floating point APIs and all the
4220missing fixed point APIs have been implemented.
4221
4222The exact mechanism used to control attributes of API functions has
4223changed. A single set of operating system independent macro definitions
4224is used and operating system specific directives are defined in
4225pnglibconf.h
4226
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004227As part of this the mechanism used to choose procedure call standards on
4228those systems that allow a choice has been changed. At present this only
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004229affects certain Microsoft (DOS, Windows) and IBM (OS/2) operating systems
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -05004230running on Intel processors. As before, PNGAPI is defined where required
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004231to control the exported API functions; however, two new macros, PNGCBAPI
4232and PNGCAPI, are used instead for callback functions (PNGCBAPI) and
4233(PNGCAPI) for functions that must match a C library prototype (currently
4234only png_longjmp_ptr, which must match the C longjmp function.) The new
4235approach is documented in pngconf.h
4236
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -05004237Despite these changes, libpng 1.5.0 only supports the native C function
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004238calling standard on those platforms tested so far (__cdecl on Microsoft
4239Windows). This is because the support requirements for alternative
4240calling conventions seem to no longer exist. Developers who find it
4241necessary to set PNG_API_RULE to 1 should advise the mailing list
4242(png-mng-implement) of this and library builders who use Openwatcom and
4243therefore set PNG_API_RULE to 2 should also contact the mailing list.
4244
4245A new test program, pngvalid, is provided in addition to pngtest.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004246pngvalid validates the arithmetic accuracy of the gamma correction
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004247calculations and includes a number of validations of the file format.
4248A subset of the full range of tests is run when "make check" is done
4249(in the 'configure' build.) pngvalid also allows total allocated memory
4250usage to be evaluated and performs additional memory overwrite validation.
4251
4252Many changes to individual feature macros have been made. The following
4253are the changes most likely to be noticed by library builders who
4254configure libpng:
4255
42561) All feature macros now have consistent naming:
4257
4258#define PNG_NO_feature turns the feature off
4259#define PNG_feature_SUPPORTED turns the feature on
4260
4261pnglibconf.h contains one line for each feature macro which is either:
4262
4263#define PNG_feature_SUPPORTED
4264
4265if the feature is supported or:
4266
4267/*#undef PNG_feature_SUPPORTED*/
4268
4269if it is not. Library code consistently checks for the 'SUPPORTED' macro.
Glenn Randers-Pehrsond0797f52011-07-12 10:28:02 -05004270It does not, and libpng applications should not, check for the 'NO' macro
4271which will not normally be defined even if the feature is not supported.
4272The 'NO' macros are only used internally for setting or not setting the
4273corresponding 'SUPPORTED' macros.
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004274
4275Compatibility with the old names is provided as follows:
4276
4277PNG_INCH_CONVERSIONS turns on PNG_INCH_CONVERSIONS_SUPPORTED
4278
4279And the following definitions disable the corresponding feature:
4280
4281PNG_SETJMP_NOT_SUPPORTED disables SETJMP
4282PNG_READ_TRANSFORMS_NOT_SUPPORTED disables READ_TRANSFORMS
4283PNG_NO_READ_COMPOSITED_NODIV disables READ_COMPOSITE_NODIV
4284PNG_WRITE_TRANSFORMS_NOT_SUPPORTED disables WRITE_TRANSFORMS
4285PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED disables READ_ANCILLARY_CHUNKS
4286PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED disables WRITE_ANCILLARY_CHUNKS
4287
4288Library builders should remove use of the above, inconsistent, names.
4289
42902) Warning and error message formatting was previously conditional on
4291the STDIO feature. The library has been changed to use the
4292CONSOLE_IO feature instead. This means that if CONSOLE_IO is disabled
4293the library no longer uses the printf(3) functions, even though the
4294default read/write implementations use (FILE) style stdio.h functions.
4295
42963) Three feature macros now control the fixed/floating point decisions:
4297
4298PNG_FLOATING_POINT_SUPPORTED enables the floating point APIs
4299
4300PNG_FIXED_POINT_SUPPORTED enables the fixed point APIs; however, in
4301practice these are normally required internally anyway (because the PNG
4302file format is fixed point), therefore in most cases PNG_NO_FIXED_POINT
4303merely stops the function from being exported.
4304
4305PNG_FLOATING_ARITHMETIC_SUPPORTED chooses between the internal floating
4306point implementation or the fixed point one. Typically the fixed point
4307implementation is larger and slower than the floating point implementation
4308on a system that supports floating point, however it may be faster on a
4309system which lacks floating point hardware and therefore uses a software
4310emulation.
4311
43124) Added PNG_{READ,WRITE}_INT_FUNCTIONS_SUPPORTED. This allows the
4313functions to read and write ints to be disabled independently of
4314PNG_USE_READ_MACROS, which allows libpng to be built with the functions
4315even though the default is to use the macros - this allows applications
4316to choose at app buildtime whether or not to use macros (previously
4317impossible because the functions weren't in the default build.)
4318
4319B.2 Changes to the configuration mechanism
4320
4321Prior to libpng-1.5.0 library builders who needed to configure libpng
4322had either to modify the exported pngconf.h header file to add system
4323specific configuration or had to write feature selection macros into
4324pngusr.h and cause this to be included into pngconf.h by defining
4325PNG_USER_CONFIG. The latter mechanism had the disadvantage that an
4326application built without PNG_USER_CONFIG defined would see the
4327unmodified, default, libpng API and thus would probably fail to link.
4328
4329These mechanisms still work in the configure build and in any makefile
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -05004330build that builds pnglibconf.h, although the feature selection macros
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004331have changed somewhat as described above. In 1.5.0, however, pngusr.h is
4332processed only once, when the exported header file pnglibconf.h is built.
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -05004333pngconf.h no longer includes pngusr.h, therefore pngusr.h is ignored after the
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004334build of pnglibconf.h and it is never included in an application build.
4335
4336The rarely used alternative of adding a list of feature macros to the
4337CFLAGS setting in the build also still works, however the macros will be
4338copied to pnglibconf.h and this may produce macro redefinition warnings
4339when the individual C files are compiled.
4340
4341All configuration now only works if pnglibconf.h is built from
4342scripts/pnglibconf.dfa. This requires the program awk. Brian Kernighan
4343(the original author of awk) maintains C source code of that awk and this
4344and all known later implementations (often called by subtly different
4345names - nawk and gawk for example) are adequate to build pnglibconf.h.
4346The Sun Microsystems (now Oracle) program 'awk' is an earlier version
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -05004347and does not work; this may also apply to other systems that have a
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004348functioning awk called 'nawk'.
4349
4350Configuration options are now documented in scripts/pnglibconf.dfa. This
4351file also includes dependency information that ensures a configuration is
4352consistent; that is, if a feature is switched off dependent features are
4353also removed. As a recommended alternative to using feature macros in
4354pngusr.h a system builder may also define equivalent options in pngusr.dfa
4355(or, indeed, any file) and add that to the configuration by setting
4356DFA_XTRA to the file name. The makefiles in contrib/pngminim illustrate
4357how to do this, and a case where pngusr.h is still required.
4358
Glenn Randers-Pehrson5b40b012010-11-25 07:16:29 -06004359XI. Detecting libpng
Glenn Randers-Pehrson37e7e0b2009-06-02 13:46:41 -05004360
4361The png_get_io_ptr() function has been present since libpng-0.88, has never
4362changed, and is unaffected by conditional compilation macros. It is the
4363best choice for use in configure scripts for detecting the presence of any
Glenn Randers-Pehrson99708d52009-06-29 17:30:00 -05004364libpng version since 0.88. In an autoconf "configure.in" you could use
4365
4366 AC_CHECK_LIB(png, png_get_io_ptr, ...
Glenn Randers-Pehrson37e7e0b2009-06-02 13:46:41 -05004367
Glenn Randers-Pehrson5b40b012010-11-25 07:16:29 -06004368XII. Source code repository
Glenn Randers-Pehrson glennrp@comcast.netb1c0d332009-05-15 20:39:34 -05004369
4370Since about February 2009, version 1.2.34, libpng has been under "git" source
4371control. The git repository was built from old libpng-x.y.z.tar.gz files
4372going back to version 0.70. You can access the git repository (read only)
4373at
4374
4375 git://libpng.git.sourceforge.net/gitroot/libpng
4376
4377or you can browse it via "gitweb" at
4378
4379 http://libpng.git.sourceforge.net/git/gitweb.cgi?p=libpng
4380
4381Patches can be sent to glennrp at users.sourceforge.net or to
4382png-mng-implement at lists.sourceforge.net or you can upload them to
4383the libpng bug tracker at
4384
4385 http://libpng.sourceforge.net
4386
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004387We also accept patches built from the tar or zip distributions, and
4388simple verbal discriptions of bug fixes, reported either to the
Glenn Randers-Pehrsona5e55472011-07-12 10:13:32 -05004389SourceForge bug tracker, to the png-mng-implement at lists.sf.net
4390mailing list, or directly to glennrp.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004391
Glenn Randers-Pehrson5b40b012010-11-25 07:16:29 -06004392XIII. Coding style
Glenn Randers-Pehrson glennrp@comcast.netb1c0d332009-05-15 20:39:34 -05004393
4394Our coding style is similar to the "Allman" style, with curly
4395braces on separate lines:
4396
4397 if (condition)
4398 {
4399 action;
4400 }
4401
4402 else if (another condition)
4403 {
4404 another action;
4405 }
4406
4407The braces can be omitted from simple one-line actions:
4408
4409 if (condition)
4410 return (0);
4411
4412We use 3-space indentation, except for continued statements which
4413are usually indented the same as the first line of the statement
4414plus four more spaces.
4415
Glenn Randers-Pehrson6076da82009-09-30 12:28:07 -05004416For macro definitions we use 2-space indentation, always leaving the "#"
4417in the first column.
4418
4419 #ifndef PNG_NO_FEATURE
4420 # ifndef PNG_FEATURE_SUPPORTED
4421 # define PNG_FEATURE_SUPPORTED
4422 # endif
4423 #endif
4424
Glenn Randers-Pehrson glennrp@comcast.netb1c0d332009-05-15 20:39:34 -05004425Comments appear with the leading "/*" at the same indentation as
4426the statement that follows the comment:
4427
4428 /* Single-line comment */
4429 statement;
4430
Glenn Randers-Pehrsone4c706a2010-03-06 14:51:54 -06004431 /* This is a multiple-line
4432 * comment.
Glenn Randers-Pehrson glennrp@comcast.netb1c0d332009-05-15 20:39:34 -05004433 */
4434 statement;
4435
Glenn Randers-Pehrsone4c706a2010-03-06 14:51:54 -06004436Very short comments can be placed after the end of the statement
Glenn Randers-Pehrson glennrp@comcast.netb1c0d332009-05-15 20:39:34 -05004437to which they pertain:
4438
4439 statement; /* comment */
4440
4441We don't use C++ style ("//") comments. We have, however,
4442used them in the past in some now-abandoned MMX assembler
4443code.
4444
Glenn Randers-Pehrson9dcde092009-06-08 08:31:59 -05004445Functions and their curly braces are not indented, and
Glenn Randers-Pehrson glennrp@comcast.netb1c0d332009-05-15 20:39:34 -05004446exported functions are marked with PNGAPI:
4447
4448 /* This is a public function that is visible to
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004449 * application programmers. It does thus-and-so.
Glenn Randers-Pehrson glennrp@comcast.netb1c0d332009-05-15 20:39:34 -05004450 */
4451 void PNGAPI
4452 png_exported_function(png_ptr, png_info, foo)
4453 {
4454 body;
4455 }
4456
Glenn Randers-Pehrson416976f2009-07-27 22:16:09 -05004457The prototypes for all exported functions appear in png.h,
4458above the comment that says
4459
4460 /* Maintainer: Put new public prototypes here ... */
Glenn Randers-Pehrson glennrp@comcast.netb1c0d332009-05-15 20:39:34 -05004461
4462We mark all non-exported functions with "/* PRIVATE */"":
4463
4464 void /* PRIVATE */
4465 png_non_exported_function(png_ptr, png_info, foo)
4466 {
4467 body;
4468 }
4469
Glenn Randers-Pehrson416976f2009-07-27 22:16:09 -05004470The prototypes for non-exported functions (except for those in
Glenn Randers-Pehrson4f25bf32009-10-29 23:34:44 -05004471pngtest) appear in
4472pngpriv.h
Glenn Randers-Pehrson416976f2009-07-27 22:16:09 -05004473above the comment that says
4474
4475 /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */
Glenn Randers-Pehrson glennrp@comcast.netb1c0d332009-05-15 20:39:34 -05004476
Glenn Randers-Pehrsoncbbe9a52011-01-29 16:12:11 -06004477To avoid polluting the global namespace, the names of all exported
4478functions and variables begin with "png_", and all publicly visible C
4479preprocessor macros begin with "PNG_". We request that applications that
4480use libpng *not* begin any of their own symbols with either of these strings.
Glenn Randers-Pehrson glennrp@comcast.netb1c0d332009-05-15 20:39:34 -05004481
4482We put a space after each comma and after each semicolon
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004483in "for" statements, and we put spaces before and after each
Glenn Randers-Pehrsone4c706a2010-03-06 14:51:54 -06004484C binary operator and after "for" or "while", and before
4485"?". We don't put a space between a typecast and the expression
4486being cast, nor do we put one between a function name and the
Glenn Randers-Pehrson glennrp@comcast.netb1c0d332009-05-15 20:39:34 -05004487left parenthesis that follows it:
4488
4489 for (i = 2; i > 0; --i)
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05004490 y[i] = a(x) + (int)b;
Glenn Randers-Pehrson glennrp@comcast.netb1c0d332009-05-15 20:39:34 -05004491
Glenn Randers-Pehrsond60c8862009-06-15 21:56:14 -05004492We prefer #ifdef and #ifndef to #if defined() and if !defined()
4493when there is only one macro being tested.
4494
Glenn Randers-Pehrson4e6b5e92009-09-23 10:24:53 -05004495We do not use the TAB character for indentation in the C sources.
4496
Glenn Randers-Pehrson62ca98e2009-12-20 15:14:57 -06004497Lines do not exceed 80 characters.
4498
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06004499Other rules can be inferred by inspecting the libpng source.
Glenn Randers-Pehrson glennrp@comcast.netb1c0d332009-05-15 20:39:34 -05004500
Glenn Randers-Pehrson5b40b012010-11-25 07:16:29 -06004501XIV. Y2K Compliance in libpng
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05004502
Glenn Randers-Pehrsond4e1ddb2011-07-27 20:09:57 -05004503July 28, 2011
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05004504
4505Since the PNG Development group is an ad-hoc body, we can't make
4506an official declaration.
4507
4508This is your unofficial assurance that libpng from version 0.71 and
Glenn Randers-Pehrsonaab2aa12011-07-27 12:33:29 -05004509upward through 1.5.5beta04 are Y2K compliant. It is my belief that earlier
Glenn Randers-Pehrson glennrp@comcast.net9a692c02009-05-15 20:38:11 -05004510versions were also Y2K compliant.
4511
4512Libpng only has three year fields. One is a 2-byte unsigned integer that
4513will hold years up to 65535. The other two hold the date in text
4514format, and will hold years up to 9999.
4515
4516The integer is
4517 "png_uint_16 year" in png_time_struct.
4518
4519The strings are
4520 "png_charp time_buffer" in png_struct and
4521 "near_time_buffer", which is a local character string in png.c.
4522
4523There are seven time-related functions:
4524
4525 png_convert_to_rfc_1123() in png.c
4526 (formerly png_convert_to_rfc_1152() in error)
4527 png_convert_from_struct_tm() in pngwrite.c, called
4528 in pngwrite.c
4529 png_convert_from_time_t() in pngwrite.c
4530 png_get_tIME() in pngget.c
4531 png_handle_tIME() in pngrutil.c, called in pngread.c
4532 png_set_tIME() in pngset.c
4533 png_write_tIME() in pngwutil.c, called in pngwrite.c
4534
4535All appear to handle dates properly in a Y2K environment. The
4536png_convert_from_time_t() function calls gmtime() to convert from system
4537clock time, which returns (year - 1900), which we properly convert to
4538the full 4-digit year. There is a possibility that applications using
4539libpng are not passing 4-digit years into the png_convert_to_rfc_1123()
4540function, or that they are incorrectly passing only a 2-digit year
4541instead of "year - 1900" into the png_convert_from_struct_tm() function,
4542but this is not under our control. The libpng documentation has always
4543stated that it works with 4-digit years, and the APIs have been
4544documented as such.
4545
4546The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned
4547integer to hold the year, and can hold years as large as 65535.
4548
4549zlib, upon which libpng depends, is also Y2K compliant. It contains
4550no date-related code.
4551
4552
4553 Glenn Randers-Pehrson
4554 libpng maintainer
4555 PNG Development Group