blob: eda50c7692ebacc926e5f766157fc53ec7178055 [file] [log] [blame]
John Bowlera9b34192011-05-08 19:46:51 -05001.TH LIBPNG 3 "May 9, 2011"
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06002.SH NAME
Glenn Randers-Pehrsond12c02f2011-05-07 22:06:24 -05003libpng \- Portable Network Graphics (PNG) Reference Library 1.5.3beta07
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06004.SH SYNOPSIS
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -05005\fI\fB
6
7\fB#include <png.h>\fP
8
9\fI\fB
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -060010
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -050011\fBpng_uint_32 png_access_version_number \fI(void\fP\fB);\fP
12
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050013\fI\fB
14
Glenn Randers-Pehrson6bc53be2006-06-16 07:52:03 -050015\fBvoid png_benign_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP
16
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050017\fI\fB
18
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -060019\fBvoid png_build_grayscale_palette (int \fP\fIbit_depth\fP\fB, png_colorp \fIpalette\fP\fB);\fP
20
21\fI\fB
22
23\fBpng_voidp png_calloc (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
24
25\fI\fB
26
Glenn Randers-Pehrson6bc53be2006-06-16 07:52:03 -050027\fBvoid png_chunk_benign_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP
28
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050029\fI\fB
30
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050031\fBvoid png_chunk_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -060032
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050033\fI\fB
34
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050035\fBvoid png_chunk_warning (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fImessage\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -060036
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050037\fI\fB
38
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050039\fBvoid png_convert_from_struct_tm (png_timep \fP\fIptime\fP\fB, struct tm FAR * \fIttime\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -060040
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050041\fI\fB
42
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050043\fBvoid png_convert_from_time_t (png_timep \fP\fIptime\fP\fB, time_t \fIttime\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -060044
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050045\fI\fB
46
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050047\fBpng_charp png_convert_to_rfc1123 (png_structp \fP\fIpng_ptr\fP\fB, png_timep \fIptime\fP\fB);\fP
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -060048
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050049\fI\fB
50
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050051\fBpng_infop png_create_info_struct (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -060052
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050053\fI\fB
54
Glenn Randers-Pehrson5e5c1e12000-11-10 12:26:19 -060055\fBpng_structp png_create_read_struct (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarn_fn\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050056
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050057\fI\fB
58
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -060059\fBpng_structp png_create_read_struct_2 (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fP\fIwarn_fn\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050060
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050061\fI\fB
62
Glenn Randers-Pehrson5e5c1e12000-11-10 12:26:19 -060063\fBpng_structp png_create_write_struct (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarn_fn\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050064
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050065\fI\fB
66
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -060067\fBpng_structp png_create_write_struct_2 (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fP\fIwarn_fn\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP
68
69\fI\fB
70
71\fBvoid png_data_freer (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIfreer\fP\fB, png_uint_32 \fImask)\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050072
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050073\fI\fB
74
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050075\fBvoid png_destroy_info_struct (png_structp \fP\fIpng_ptr\fP\fB, png_infopp \fIinfo_ptr_ptr\fP\fB);\fP
76
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050077\fI\fB
78
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050079\fBvoid png_destroy_read_struct (png_structpp \fP\fIpng_ptr_ptr\fP\fB, png_infopp \fP\fIinfo_ptr_ptr\fP\fB, png_infopp \fIend_info_ptr_ptr\fP\fB);\fP
80
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050081\fI\fB
82
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050083\fBvoid png_destroy_write_struct (png_structpp \fP\fIpng_ptr_ptr\fP\fB, png_infopp \fIinfo_ptr_ptr\fP\fB);\fP
84
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050085\fI\fB
86
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -060087\fBvoid png_err (png_structp \fIpng_ptr\fP\fB);\fP
88
89\fI\fB
90
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050091\fBvoid png_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP
92
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050093\fI\fB
94
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -050095\fBvoid png_free (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fIptr\fP\fB);\fP
96
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -050097\fI\fB
98
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -060099\fBvoid png_free_chunk_list (png_structp \fIpng_ptr\fP\fB);\fP
100
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500101\fI\fB
102
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600103\fBvoid png_free_default (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fIptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500104
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500105\fI\fB
106
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -0600107\fBvoid png_free_data (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fInum\fP\fB);\fP
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600108
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500109\fI\fB
110
John Bowler0a5c9c02011-01-22 17:36:34 -0600111\fBpng_byte png_get_bit_depth (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500112
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500113\fI\fB
114
John Bowler0a5c9c02011-01-22 17:36:34 -0600115\fBpng_uint_32 png_get_bKGD (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_16p \fI*background\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500116
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500117\fI\fB
118
John Bowler0a5c9c02011-01-22 17:36:34 -0600119\fBpng_byte png_get_channels (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500120
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500121\fI\fB
122
John Bowler0a5c9c02011-01-22 17:36:34 -0600123\fBpng_uint_32 png_get_cHRM (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, double \fP\fI*white_x\fP\fB, double \fP\fI*white_y\fP\fB, double \fP\fI*red_x\fP\fB, double \fP\fI*red_y\fP\fB, double \fP\fI*green_x\fP\fB, double \fP\fI*green_y\fP\fB, double \fP\fI*blue_x\fP\fB, double \fI*blue_y\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500124
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500125\fI\fB
126
John Bowler0a5c9c02011-01-22 17:36:34 -0600127\fBpng_uint_32 png_get_cHRM_fixed (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*white_x\fP\fB, png_uint_32 \fP\fI*white_y\fP\fB, png_uint_32 \fP\fI*red_x\fP\fB, png_uint_32 \fP\fI*red_y\fP\fB, png_uint_32 \fP\fI*green_x\fP\fB, png_uint_32 \fP\fI*green_y\fP\fB, png_uint_32 \fP\fI*blue_x\fP\fB, png_uint_32 \fI*blue_y\fP\fB);\fP
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600128
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500129\fI\fB
130
John Bowler0a5c9c02011-01-22 17:36:34 -0600131\fBpng_uint_32 png_get_chunk_cache_max (png_const_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrson800d1e92008-08-20 17:25:21 -0500132
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500133\fI\fB
134
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600135\fI\fB
136
John Bowler0a5c9c02011-01-22 17:36:34 -0600137\fBpng_alloc_size_t png_get_chunk_malloc_max (png_const_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600138
139\fI\fB
140
John Bowler0a5c9c02011-01-22 17:36:34 -0600141\fBpng_byte png_get_color_type (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500142
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500143\fI\fB
144
John Bowler0a5c9c02011-01-22 17:36:34 -0600145\fBpng_uint_32 png_get_compression_buffer_size (png_const_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrson800d1e92008-08-20 17:25:21 -0500146
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500147\fI\fB
148
John Bowler0a5c9c02011-01-22 17:36:34 -0600149\fBpng_byte png_get_compression_type (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500150
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500151\fI\fB
152
John Bowler0a5c9c02011-01-22 17:36:34 -0600153\fBpng_byte png_get_copyright (png_const_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500154
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500155\fI\fB
156
John Bowlerf19abd62011-01-22 18:29:24 -0600157\fBpng_uint_32 png_get_current_row_number \fI(png_const_structp\fP\fB);\fP
158
159\fI\fB
160
161\fBpng_byte png_get_current_pass_number \fI(png_const_structp\fP\fB);\fP
162
163\fI\fB
164
John Bowler0a5c9c02011-01-22 17:36:34 -0600165\fBpng_voidp png_get_error_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500166
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500167\fI\fB
168
John Bowler0a5c9c02011-01-22 17:36:34 -0600169\fBpng_byte png_get_filter_type (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500170
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500171\fI\fB
172
John Bowler0a5c9c02011-01-22 17:36:34 -0600173\fBpng_uint_32 png_get_gAMA (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, double \fI*file_gamma\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500174
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500175\fI\fB
176
John Bowler0a5c9c02011-01-22 17:36:34 -0600177\fBpng_uint_32 png_get_gAMA_fixed (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fI*int_file_gamma\fP\fB);\fP
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600178
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500179\fI\fB
180
John Bowler0a5c9c02011-01-22 17:36:34 -0600181\fBpng_byte png_get_header_ver (png_const_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrson5379b241999-11-27 10:22:33 -0600182
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500183\fI\fB
184
John Bowler0a5c9c02011-01-22 17:36:34 -0600185\fBpng_byte png_get_header_version (png_const_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500186
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500187\fI\fB
188
John Bowler0a5c9c02011-01-22 17:36:34 -0600189\fBpng_uint_32 png_get_hIST (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_16p \fI*hist\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500190
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500191\fI\fB
192
John Bowler0a5c9c02011-01-22 17:36:34 -0600193\fBpng_uint_32 png_get_iCCP (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_charpp \fP\fIname\fP\fB, int \fP\fI*compression_type\fP\fB, png_bytepp \fP\fIprofile\fP\fB, png_uint_32 \fI*proflen\fP\fB);\fP
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600194
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500195\fI\fB
196
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500197\fBpng_uint_32 png_get_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*width\fP\fB, png_uint_32 \fP\fI*height\fP\fB, int \fP\fI*bit_depth\fP\fB, int \fP\fI*color_type\fP\fB, int \fP\fI*interlace_type\fP\fB, int \fP\fI*compression_type\fP\fB, int \fI*filter_type\fP\fB);\fP
198
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500199\fI\fB
200
John Bowler0a5c9c02011-01-22 17:36:34 -0600201\fBpng_uint_32 png_get_image_height (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500202
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500203\fI\fB
204
John Bowler0a5c9c02011-01-22 17:36:34 -0600205\fBpng_uint_32 png_get_image_width (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500206
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500207\fI\fB
208
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500209\fBpng_int_32 png_get_int_32 (png_bytep \fIbuf\fP\fB);\fP
210
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500211\fI\fB
Glenn Randers-Pehrson7b34df32006-02-24 06:30:16 -0600212
John Bowler0a5c9c02011-01-22 17:36:34 -0600213\fBpng_byte png_get_interlace_type (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500214
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500215\fI\fB
216
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600217\fBpng_const_bytep png_get_io_chunk_name (png_structp \fIpng_ptr\fP\fB);\fP
218
219\fI\fB
220
John Bowler0a5c9c02011-01-22 17:36:34 -0600221\fBpng_uint_32 png_get_io_chunk_type (png_const_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona63dbed2011-01-22 08:51:19 -0600222
223\fI\fB
224
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500225\fBpng_voidp png_get_io_ptr (png_structp \fIpng_ptr\fP\fB);\fP
226
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500227\fI\fB
228
Glenn Randers-Pehrsona63dbed2011-01-22 08:51:19 -0600229\fBpng_uint_32 png_get_io_state (png_structp \fIpng_ptr\fP\fB);\fP
230
231\fI\fB
232
John Bowler0a5c9c02011-01-22 17:36:34 -0600233\fBpng_byte png_get_libpng_ver (png_const_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrson5379b241999-11-27 10:22:33 -0600234
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500235\fI\fB
236
John Bowler0a5c9c02011-01-22 17:36:34 -0600237\fBpng_voidp png_get_mem_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500238
239\fI\fB
240
John Bowler0a5c9c02011-01-22 17:36:34 -0600241\fBpng_uint_32 png_get_oFFs (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*offset_x\fP\fB, png_uint_32 \fP\fI*offset_y\fP\fB, int \fI*unit_type\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500242
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500243\fI\fB
244
John Bowler0a5c9c02011-01-22 17:36:34 -0600245\fBpng_uint_32 png_get_pCAL (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_charp \fP\fI*purpose\fP\fB, png_int_32 \fP\fI*X0\fP\fB, png_int_32 \fP\fI*X1\fP\fB, int \fP\fI*type\fP\fB, int \fP\fI*nparams\fP\fB, png_charp \fP\fI*units\fP\fB, png_charpp \fI*params\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500246
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500247\fI\fB
248
John Bowler0a5c9c02011-01-22 17:36:34 -0600249\fBpng_uint_32 png_get_pHYs (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*res_x\fP\fB, png_uint_32 \fP\fI*res_y\fP\fB, int \fI*unit_type\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500250
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500251\fI\fB
252
John Bowler0a5c9c02011-01-22 17:36:34 -0600253\fBfloat png_get_pixel_aspect_ratio (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500254
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500255\fI\fB
256
John Bowler0a5c9c02011-01-22 17:36:34 -0600257\fBpng_uint_32 png_get_pHYs_dpi (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*res_x\fP\fB, png_uint_32 \fP\fI*res_y\fP\fB, int \fI*unit_type\fP\fB);\fP
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600258
259\fI\fB
260
John Bowler0a5c9c02011-01-22 17:36:34 -0600261\fBpng_fixed_point png_get_pixel_aspect_ratio_fixed (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500262
263\fI\fB
264
John Bowler0a5c9c02011-01-22 17:36:34 -0600265\fBpng_uint_32 png_get_pixels_per_inch (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600266
267\fI\fB
268
John Bowler0a5c9c02011-01-22 17:36:34 -0600269\fBpng_uint_32 png_get_pixels_per_meter (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500270
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500271\fI\fB
272
John Bowler0a5c9c02011-01-22 17:36:34 -0600273\fBpng_voidp png_get_progressive_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500274
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500275\fI\fB
276
John Bowler0a5c9c02011-01-22 17:36:34 -0600277\fBpng_uint_32 png_get_PLTE (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_colorp \fP\fI*palette\fP\fB, int \fI*num_palette\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500278
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500279\fI\fB
280
John Bowler0a5c9c02011-01-22 17:36:34 -0600281\fBpng_byte png_get_rgb_to_gray_status (png_const_structp \fIpng_ptr)
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500282
John Bowler0a5c9c02011-01-22 17:36:34 -0600283\fBpng_uint_32 png_get_rowbytes (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500284
285\fI\fB
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500286
John Bowler0a5c9c02011-01-22 17:36:34 -0600287\fBpng_bytepp png_get_rows (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -0600288
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500289\fI\fB
290
John Bowler0a5c9c02011-01-22 17:36:34 -0600291\fBpng_uint_32 png_get_sBIT (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_8p \fI*sig_bit\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500292
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500293\fI\fB
294
John Bowler0a5c9c02011-01-22 17:36:34 -0600295\fBvoid png_get_sCAL (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, int* \fP\fIunit\fP\fB, double* \fP\fIwidth\fP\fB, double* \fIheight\fP\fB);\fP
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500296
297\fI\fB
298
John Bowler0a5c9c02011-01-22 17:36:34 -0600299\fBvoid png_get_sCAL_fixed (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, int* \fP\fIunit\fP\fB, png_fixed_pointp \fP\fIwidth\fP\fB, png_fixed_pointp \fIheight\fP\fB);\fP
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500300
301\fI\fB
302
John Bowler0a5c9c02011-01-22 17:36:34 -0600303\fBvoid png_get_sCAL_s (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, int* \fP\fIunit\fP\fB, png_charpp \fP\fIwidth\fP\fB, png_charpp \fIheight\fP\fB);\fP
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500304
305\fI\fB
306
John Bowler0a5c9c02011-01-22 17:36:34 -0600307\fBpng_bytep png_get_signature (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500308
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500309\fI\fB
310
John Bowler0a5c9c02011-01-22 17:36:34 -0600311\fBpng_uint_32 png_get_sPLT (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_spalette_p \fI*splt_ptr\fP\fB);\fP
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600312
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500313\fI\fB
314
Glenn Randers-Pehrson8d0bc0f2011-01-25 22:15:58 -0600315\fBpng_uint_32 png_get_sRGB (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, int \fI*file_srgb_intent\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500316
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500317\fI\fB
318
John Bowler0a5c9c02011-01-22 17:36:34 -0600319\fBpng_uint_32 png_get_text (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_textp \fP\fI*text_ptr\fP\fB, int \fI*num_text\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500320
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500321\fI\fB
322
John Bowler0a5c9c02011-01-22 17:36:34 -0600323\fBpng_uint_32 png_get_tIME (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_timep \fI*mod_time\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500324
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500325\fI\fB
326
John Bowler0a5c9c02011-01-22 17:36:34 -0600327\fBpng_uint_32 png_get_tRNS (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fI*trans_alpha\fP\fB, int \fP\fI*num_trans\fP\fB, png_color_16p \fI*trans_color\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500328
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500329\fI\fB
330
331\fB/* This function is really an inline macro. \fI*/
332
333\fBpng_uint_16 png_get_uint_16 (png_bytep \fIbuf\fP\fB);\fP
334
335\fI\fB
Glenn Randers-Pehrson7b34df32006-02-24 06:30:16 -0600336
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -0600337\fBpng_uint_32 png_get_uint_31 (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIbuf\fP\fB);\fP
Glenn Randers-Pehrson7b34df32006-02-24 06:30:16 -0600338
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500339\fI\fB
340
341\fB/* This function is really an inline macro. \fI*/
342
343\fBpng_uint_32 png_get_uint_32 (png_bytep \fIbuf\fP\fB);\fP
344
345\fI\fB
Glenn Randers-Pehrson7b34df32006-02-24 06:30:16 -0600346
John Bowler0a5c9c02011-01-22 17:36:34 -0600347\fBpng_uint_32 png_get_unknown_chunks (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_unknown_chunkpp \fIunknowns\fP\fB);\fP
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600348
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500349\fI\fB
350
John Bowler0a5c9c02011-01-22 17:36:34 -0600351\fBpng_voidp png_get_user_chunk_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600352
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500353\fI\fB
354
John Bowler0a5c9c02011-01-22 17:36:34 -0600355\fBpng_uint_32 png_get_user_height_max (png_const_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrson272489d2004-08-04 06:34:52 -0500356
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500357\fI\fB
358
John Bowler0a5c9c02011-01-22 17:36:34 -0600359\fBpng_voidp png_get_user_transform_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500360
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500361\fI\fB
362
John Bowler0a5c9c02011-01-22 17:36:34 -0600363\fBpng_uint_32 png_get_user_width_max (png_const_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrson272489d2004-08-04 06:34:52 -0500364
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500365\fI\fB
366
John Bowler0a5c9c02011-01-22 17:36:34 -0600367\fBpng_uint_32 png_get_valid (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIflag\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500368
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500369\fI\fB
370
John Bowler0a5c9c02011-01-22 17:36:34 -0600371\fBfloat png_get_x_offset_inches (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500372
373\fI\fB
374
John Bowler0a5c9c02011-01-22 17:36:34 -0600375\fBpng_fixed_point png_get_x_offset_inches_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500376
377\fI\fB
378
John Bowler0a5c9c02011-01-22 17:36:34 -0600379\fBpng_int_32 png_get_x_offset_microns (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500380
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500381\fI\fB
382
John Bowler0a5c9c02011-01-22 17:36:34 -0600383\fBpng_int_32 png_get_x_offset_pixels (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500384
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500385\fI\fB
386
John Bowler0a5c9c02011-01-22 17:36:34 -0600387\fBpng_uint_32 png_get_x_pixels_per_inch (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600388
389\fI\fB
390
John Bowler0a5c9c02011-01-22 17:36:34 -0600391\fBpng_uint_32 png_get_x_pixels_per_meter (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500392
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500393\fI\fB
394
John Bowler0a5c9c02011-01-22 17:36:34 -0600395\fBfloat png_get_y_offset_inches (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500396
397\fI\fB
398
John Bowler0a5c9c02011-01-22 17:36:34 -0600399\fBpng_fixed_point png_get_y_offset_inches_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500400
401\fI\fB
402
John Bowler0a5c9c02011-01-22 17:36:34 -0600403\fBpng_int_32 png_get_y_offset_microns (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500404
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500405\fI\fB
406
John Bowler0a5c9c02011-01-22 17:36:34 -0600407\fBpng_int_32 png_get_y_offset_pixels (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500408
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500409\fI\fB
410
John Bowler0a5c9c02011-01-22 17:36:34 -0600411\fBpng_uint_32 png_get_y_pixels_per_inch (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600412
413\fI\fB
414
John Bowler0a5c9c02011-01-22 17:36:34 -0600415\fBpng_uint_32 png_get_y_pixels_per_meter (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500416
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500417\fI\fB
418
Glenn Randers-Pehrsonc1bfe682002-03-06 22:08:00 -0600419\fBint png_handle_as_unknown (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIchunk_name\fP\fB);\fP
420
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500421\fI\fB
422
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600423\fBvoid png_info_init_3 (png_infopp \fP\fIinfo_ptr\fP\fB, png_size_t \fIpng_info_struct_size\fP\fB);\fP
424
425\fI\fB
426
Glenn Randers-Pehrson8b6a8892001-05-18 04:54:50 -0500427\fBvoid png_init_io (png_structp \fP\fIpng_ptr\fP\fB, FILE \fI*fp\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500428
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500429\fI\fB
430
Glenn Randers-Pehrsonf98726a2010-02-19 09:54:53 -0600431\fBvoid png_longjmp (png_structp \fP\fIpng_ptr\fP\fB, int \fIval\fP\fB);\fP
432
433\fI\fB
434
Glenn Randers-Pehrsonbeb572e2006-08-19 13:59:24 -0500435\fBpng_voidp png_malloc (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
Glenn Randers-Pehrson8b6a8892001-05-18 04:54:50 -0500436
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500437\fI\fB
438
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600439\fBpng_voidp png_malloc_default (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
440
441\fI\fB
442
443\fBpng_voidp png_malloc_warn (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
444
445\fI\fB
446
447\fBpng_uint_32 png_permit_mng_features (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fImng_features_permitted\fP\fB);\fP
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500448
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500449\fI\fB
450
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500451\fBvoid png_process_data (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fIbuffer\fP\fB, png_size_t \fIbuffer_size\fP\fB);\fP
452
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500453\fI\fB
454
John Bowlerf19abd62011-01-22 18:29:24 -0600455\fBpng_size_t png_process_data_pause \fP\fI(png_structp\fP\fB, int \fIsave\fP\fB);\fP
456
457\fI\fB
458
459\fBpng_uint_32 png_process_data_skip \fI(png_structp\fP\fB);\fP
460
461\fI\fB
462
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500463\fBvoid png_progressive_combine_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIold_row\fP\fB, png_bytep \fInew_row\fP\fB);\fP
464
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500465\fI\fB
466
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500467\fBvoid png_read_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
468
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500469\fI\fB
470
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500471\fBvoid png_read_image (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fIimage\fP\fB);\fP
472
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500473\fI\fB
474
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500475\fBvoid png_read_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
476
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500477\fI\fB
478
Glenn Randers-Pehrson5e5c1e12000-11-10 12:26:19 -0600479\fBvoid png_read_png (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fItransforms\fP\fB, png_voidp \fIparams\fP\fB);\fP
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600480
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500481\fI\fB
482
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500483\fBvoid png_read_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIrow\fP\fB, png_bytep \fIdisplay_row\fP\fB);\fP
484
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500485\fI\fB
486
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500487\fBvoid png_read_rows (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fP\fIrow\fP\fB, png_bytepp \fP\fIdisplay_row\fP\fB, png_uint_32 \fInum_rows\fP\fB);\fP
488
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500489\fI\fB
490
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500491\fBvoid png_read_update_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
492
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500493\fI\fB
494
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600495\fBint png_reset_zstream (png_structp \fIpng_ptr\fP\fB);\fP
496
497\fI\fB
498
499\fBvoid png_save_int_32 (png_bytep \fP\fIbuf\fP\fB, png_int_32 \fIi\fP\fB);\fP
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500500
501\fI\fB
Glenn Randers-Pehrson7b34df32006-02-24 06:30:16 -0600502
503\fBvoid png_save_uint_16 (png_bytep \fP\fIbuf\fP\fB, unsigned int \fIi\fP\fB);\fP
504
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500505\fI\fB
506
Glenn Randers-Pehrson7b34df32006-02-24 06:30:16 -0600507\fBvoid png_save_uint_32 (png_bytep \fP\fIbuf\fP\fB, png_uint_32 \fIi\fP\fB);\fP
508
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500509\fI\fB
510
511\fBvoid png_set_add_alpha (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIfiller\fP\fB, int \fIflags\fP\fB);\fP
512
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500513\fI\fB
Glenn Randers-Pehrson67864af2004-08-28 23:30:07 -0500514
Glenn Randers-Pehrsonc7822512011-05-07 21:23:43 -0500515\fBvoid png_set_alpha_mode (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fImode\fP\fB, double \fIoutput_gamma\fP\fB);\fP
516
517\fI\fB
518
519\fBvoid png_set_alpha_mode_fixed (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fImode\fP\fB, png_fixed_point \fIoutput_gamma\fP\fB);\fP
520
521\fI\fB
522
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500523\fBvoid png_set_background (png_structp \fP\fIpng_ptr\fP\fB, png_color_16p \fP\fIbackground_color\fP\fB, int \fP\fIbackground_gamma_code\fP\fB, int \fP\fIneed_expand\fP\fB, double \fIbackground_gamma\fP\fB);\fP
524
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500525\fI\fB
526
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500527\fBvoid png_set_background_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_color_16p \fP\fIbackground_color\fP\fB, int \fP\fIbackground_gamma_code\fP\fB, int \fP\fIneed_expand\fP\fB, png_uint_32 \fIbackground_gamma\fP\fB);\fP
528
529\fI\fB
530
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600531\fBvoid png_set_benign_errors (png_structp \fP\fIpng_ptr\fP\fB, int \fIallowed\fP\fB);\fP
532
533\fI\fB
534
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500535\fBvoid png_set_bgr (png_structp \fIpng_ptr\fP\fB);\fP
536
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500537\fI\fB
538
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500539\fBvoid png_set_bKGD (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_16p \fIbackground\fP\fB);\fP
540
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500541\fI\fB
542
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500543\fBvoid png_set_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fP\fIwhite_x\fP\fB, double \fP\fIwhite_y\fP\fB, double \fP\fIred_x\fP\fB, double \fP\fIred_y\fP\fB, double \fP\fIgreen_x\fP\fB, double \fP\fIgreen_y\fP\fB, double \fP\fIblue_x\fP\fB, double \fIblue_y\fP\fB);\fP
544
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500545\fI\fB
546
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600547\fBvoid png_set_cHRM_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIwhite_x\fP\fB, png_uint_32 \fP\fIwhite_y\fP\fB, png_uint_32 \fP\fIred_x\fP\fB, png_uint_32 \fP\fIred_y\fP\fB, png_uint_32 \fP\fIgreen_x\fP\fB, png_uint_32 \fP\fIgreen_y\fP\fB, png_uint_32 \fP\fIblue_x\fP\fB, png_uint_32 \fIblue_y\fP\fB);\fP
548
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500549\fI\fB
550
Glenn Randers-Pehrson800d1e92008-08-20 17:25:21 -0500551\fBvoid png_set_chunk_cache_max (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIuser_chunk_cache_max\fP\fB);\fP
552
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500553\fI\fB
554
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500555\fBvoid png_set_compression_level (png_structp \fP\fIpng_ptr\fP\fB, int \fIlevel\fP\fB);\fP
556
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500557\fI\fB
558
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500559\fBvoid png_set_compression_mem_level (png_structp \fP\fIpng_ptr\fP\fB, int \fImem_level\fP\fB);\fP
560
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500561\fI\fB
562
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500563\fBvoid png_set_compression_method (png_structp \fP\fIpng_ptr\fP\fB, int \fImethod\fP\fB);\fP
564
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500565\fI\fB
566
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500567\fBvoid png_set_compression_strategy (png_structp \fP\fIpng_ptr\fP\fB, int \fIstrategy\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600568
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500569\fI\fB
570
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500571\fBvoid png_set_compression_window_bits (png_structp \fP\fIpng_ptr\fP\fB, int \fIwindow_bits\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600572
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500573\fI\fB
574
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500575\fBvoid png_set_crc_action (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIcrit_action\fP\fB, int \fIancil_action\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600576
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500577\fI\fB
578
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500579\fBvoid png_set_error_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarning_fn\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600580
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500581\fI\fB
582
Glenn Randers-Pehrsond08b6bd2011-02-19 15:50:17 -0600583\fBvoid png_set_expand (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsonc85f5f62011-02-13 05:56:07 -0600584
585\fI\fB
586
Glenn Randers-Pehrsond08b6bd2011-02-19 15:50:17 -0600587\fBvoid png_set_expand_16 (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -0600588
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500589\fI\fB
590
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600591\fBvoid png_set_expand_gray_1_2_4_to_8 (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrson1ce08362006-03-08 23:35:59 -0600592
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500593\fI\fB
594
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500595\fBvoid png_set_filler (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIfiller\fP\fB, int \fIflags\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600596
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500597\fI\fB
598
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500599\fBvoid png_set_filter (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fImethod\fP\fB, int \fIfilters\fP\fB);\fP
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -0600600
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500601\fI\fB
602
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500603\fBvoid png_set_filter_heuristics (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIheuristic_method\fP\fB, int \fP\fInum_weights\fP\fB, png_doublep \fP\fIfilter_weights\fP\fB, png_doublep \fIfilter_costs\fP\fB);\fP
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -0500604
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500605\fI\fB
606
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500607\fBvoid png_set_filter_heuristics_fixed (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIheuristic_method\fP\fB, int \fP\fInum_weights\fP\fB, png_fixed_point_p \fP\fIfilter_weights\fP\fB, png_fixed_point_p \fIfilter_costs\fP\fB);\fP
608
609\fI\fB
610
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500611\fBvoid png_set_flush (png_structp \fP\fIpng_ptr\fP\fB, int \fInrows\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600612
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500613\fI\fB
614
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500615\fBvoid png_set_gamma (png_structp \fP\fIpng_ptr\fP\fB, double \fP\fIscreen_gamma\fP\fB, double \fIdefault_file_gamma\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600616
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500617\fI\fB
618
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500619\fBvoid png_set_gamma_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIscreen_gamma\fP\fB, png_uint_32 \fIdefault_file_gamma\fP\fB);\fP
620
621\fI\fB
622
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500623\fBvoid png_set_gAMA (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fIfile_gamma\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600624
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500625\fI\fB
626
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600627\fBvoid png_set_gAMA_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIfile_gamma\fP\fB);\fP
628
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500629\fI\fB
630
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600631\fBvoid png_set_gray_1_2_4_to_8 (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600632
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500633\fI\fB
634
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500635\fBvoid png_set_gray_to_rgb (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600636
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500637\fI\fB
638
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500639\fBvoid png_set_hIST (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_16p \fIhist\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600640
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500641\fI\fB
642
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -0600643\fBvoid png_set_iCCP (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_const_charp \fP\fIname\fP\fB, int \fP\fIcompression_type\fP\fB, png_const_bytep \fP\fIprofile\fP\fB, png_uint_32 \fIproflen\fP\fB);\fP
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600644
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500645\fI\fB
646
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500647\fBint png_set_interlace_handling (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600648
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500649\fI\fB
650
Glenn Randers-Pehrsonfc4a1432000-05-17 17:39:34 -0500651\fBvoid png_set_invalid (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fImask\fP\fB);\fP
652
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500653\fI\fB
654
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500655\fBvoid png_set_invert_alpha (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600656
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500657\fI\fB
658
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500659\fBvoid png_set_invert_mono (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600660
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500661\fI\fB
662
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500663\fBvoid png_set_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIwidth\fP\fB, png_uint_32 \fP\fIheight\fP\fB, int \fP\fIbit_depth\fP\fB, int \fP\fIcolor_type\fP\fB, int \fP\fIinterlace_type\fP\fB, int \fP\fIcompression_type\fP\fB, int \fIfilter_type\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600664
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500665\fI\fB
666
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600667\fBvoid png_set_keep_unknown_chunks (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIkeep\fP\fB, png_bytep \fP\fIchunk_list\fP\fB, int \fInum_chunks\fP\fB);\fP
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600668
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500669\fI\fB
670
Glenn Randers-Pehrson1e6ed732009-11-20 22:06:56 -0600671\fBjmp_buf* png_set_longjmp_fn (png_structp \fP\fIpng_ptr\fP\fB, png_longjmp_ptr \fP\fIlongjmp_fn\fP\fB, size_t \fIjmp_buf_size\fP\fB);\fP
672
673\fI\fB
674
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -0600675\fBvoid png_set_chunk_malloc_max (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIuser_chunk_cache_max\fP\fB);\fP
676
677\fI\fB
678
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600679\fBvoid png_set_compression_buffer_size (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIsize\fP\fB);\fP
680
681\fI\fB
682
683\fBvoid png_set_mem_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600684
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500685\fI\fB
686
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500687\fBvoid png_set_oFFs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIoffset_x\fP\fB, png_uint_32 \fP\fIoffset_y\fP\fB, int \fIunit_type\fP\fB);\fP
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -0600688
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500689\fI\fB
690
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500691\fBvoid png_set_packing (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600692
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500693\fI\fB
694
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500695\fBvoid png_set_packswap (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600696
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500697\fI\fB
698
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600699\fBvoid png_set_palette_to_rgb (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600700
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500701\fI\fB
702
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500703\fBvoid png_set_pCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_charp \fP\fIpurpose\fP\fB, png_int_32 \fP\fIX0\fP\fB, png_int_32 \fP\fIX1\fP\fB, int \fP\fItype\fP\fB, int \fP\fInparams\fP\fB, png_charp \fP\fIunits\fP\fB, png_charpp \fIparams\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600704
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500705\fI\fB
706
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500707\fBvoid png_set_pHYs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIres_x\fP\fB, png_uint_32 \fP\fIres_y\fP\fB, int \fIunit_type\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600708
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500709\fI\fB
710
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500711\fBvoid png_set_progressive_read_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIprogressive_ptr\fP\fB, png_progressive_info_ptr \fP\fIinfo_fn\fP\fB, png_progressive_row_ptr \fP\fIrow_fn\fP\fB, png_progressive_end_ptr \fIend_fn\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600712
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500713\fI\fB
714
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500715\fBvoid png_set_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, int \fInum_palette\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600716
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500717\fI\fB
718
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -0500719\fBvoid png_set_quantize (png_structp \fP\fIpng_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, int \fP\fInum_palette\fP\fB, int \fP\fImaximum_colors\fP\fB, png_uint_16p \fP\fIhistogram\fP\fB, int \fIfull_quantize\fP\fB);\fP
720
721\fI\fB
722
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500723\fBvoid png_set_read_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIio_ptr\fP\fB, png_rw_ptr \fIread_data_fn\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600724
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500725\fI\fB
726
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500727\fBvoid png_set_read_status_fn (png_structp \fP\fIpng_ptr\fP\fB, png_read_status_ptr \fIread_row_fn\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600728
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500729\fI\fB
730
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600731\fBvoid png_set_read_user_chunk_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIuser_chunk_ptr\fP\fB, png_user_chunk_ptr \fIread_user_chunk_fn\fP\fB);\fP
732
733\fI\fB
734
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500735\fBvoid png_set_read_user_transform_fn (png_structp \fP\fIpng_ptr\fP\fB, png_user_transform_ptr \fIread_user_transform_fn\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600736
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500737\fI\fB
738
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -0600739\fBvoid png_set_rgb_to_gray (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIerror_action\fP\fB, double \fP\fIred\fP\fB, double \fIgreen\fP\fB);\fP
740
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500741\fI\fB
742
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500743\fBvoid png_set_rgb_to_gray_fixed (png_structp \fP\fIpng_ptr\fP\fB, int error_action png_uint_32 \fP\fIred\fP\fB, png_uint_32 \fIgreen\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600744
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500745\fI\fB
746
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -0600747\fBvoid png_set_rows (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytepp \fIrow_pointers\fP\fB);\fP
748
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500749\fI\fB
750
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500751\fBvoid png_set_sBIT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_8p \fIsig_bit\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600752
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500753\fI\fB
754
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -0500755\fBvoid png_set_sCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIunit\fP\fB, double \fP\fIwidth\fP\fB, double \fIheight\fP\fB);\fP
756
757\fI\fB
758
759\fBvoid png_set_sCAL_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIunit\fP\fB, png_fixed_point \fP\fIwidth\fP\fB, png_fixed_point \fIheight\fP\fB);\fP
760
761\fI\fB
762
763\fBvoid png_set_sCAL_s (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIunit\fP\fB, png_charp \fP\fIwidth\fP\fB, png_charp \fIheight\fP\fB);\fP
764
765\fI\fB
766
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500767\fBvoid png_set_shift (png_structp \fP\fIpng_ptr\fP\fB, png_color_8p \fItrue_bits\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600768
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500769\fI\fB
770
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500771\fBvoid png_set_sig_bytes (png_structp \fP\fIpng_ptr\fP\fB, int \fInum_bytes\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600772
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500773\fI\fB
774
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -0600775\fBvoid png_set_sPLT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_spalette_p \fP\fIsplt_ptr\fP\fB, int \fInum_spalettes\fP\fB);\fP
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600776
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500777\fI\fB
778
Glenn Randers-Pehrson8d0bc0f2011-01-25 22:15:58 -0600779\fBvoid png_set_sRGB (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fIsrgb_intent\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600780
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500781\fI\fB
782
Glenn Randers-Pehrson8d0bc0f2011-01-25 22:15:58 -0600783\fBvoid png_set_sRGB_gAMA_and_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fIsrgb_intent\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600784
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500785\fI\fB
786
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500787\fBvoid png_set_strip_16 (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600788
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500789\fI\fB
790
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500791\fBvoid png_set_strip_alpha (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600792
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500793\fI\fB
794
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600795\fBvoid png_set_strip_error_numbers (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIstrip_mode\fP\fB);\fP
796
797\fI\fB
798
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500799\fBvoid png_set_swap (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600800
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500801\fI\fB
802
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500803\fBvoid png_set_swap_alpha (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600804
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500805\fI\fB
806
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500807\fBvoid png_set_text (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_textp \fP\fItext_ptr\fP\fB, int \fInum_text\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600808
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500809\fI\fB
810
Glenn Randers-Pehrson8eb88332011-04-01 00:16:50 -0500811\fBvoid png_set_text_compression_level (png_structp \fP\fIpng_ptr\fP\fB, int \fIlevel\fP\fB);\fP
812
813\fI\fB
814
815\fBvoid png_set_text_compression_mem_level (png_structp \fP\fIpng_ptr\fP\fB, int \fImem_level\fP\fB);\fP
816
817\fI\fB
818
819\fBvoid png_set_text_compression_strategy (png_structp \fP\fIpng_ptr\fP\fB, int \fIstrategy\fP\fB);\fP
820
821\fI\fB
822
823\fBvoid png_set_text_compression_window_bits (png_structp \fP\fIpng_ptr\fP\fB, int \fIwindow_bits\fP\fB);\fP
824
825\fI\fB
826
827\fBvoid \fP\fIpng_set_text_compression_method\fP\fB, (png_structp \fP\fIpng_ptr\fP\fB, int \fImethod)\fP\fB);\fP
828
829\fI\fB
830
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500831\fBvoid png_set_tIME (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_timep \fImod_time\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600832
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500833\fI\fB
834
Glenn Randers-Pehrsonf3c51e42011-01-15 10:25:25 -0600835\fBvoid png_set_tRNS (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fItrans_alpha\fP\fB, int \fP\fInum_trans\fP\fB, png_color_16p \fItrans_color\fP\fB);\fP
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -0500836
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500837\fI\fB
838
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600839\fBvoid png_set_tRNS_to_alpha (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600840
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500841\fI\fB
842
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600843\fBpng_uint_32 png_set_unknown_chunks (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_unknown_chunkp \fP\fIunknowns\fP\fB, int \fP\fInum\fP\fB, int \fIlocation\fP\fB);\fP
844
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500845\fI\fB
846
Glenn Randers-Pehrsonbb98bcb2011-01-22 16:27:39 -0600847\fBvoid png_set_unknown_chunk_location (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIchunk\fP\fB, int \fIlocation\fP\fB);\fP
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -0600848
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500849\fI\fB
850
Glenn Randers-Pehrson272489d2004-08-04 06:34:52 -0500851\fBvoid png_set_user_limits (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIuser_width_max\fP\fB, png_uint_32 \fIuser_height_max\fP\fB);\fP
852
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500853\fI\fB
854
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500855\fBvoid png_set_user_transform_info (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIuser_transform_ptr\fP\fB, int \fP\fIuser_transform_depth\fP\fB, int \fIuser_transform_channels\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600856
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500857\fI\fB
858
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500859\fBvoid png_set_write_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIio_ptr\fP\fB, png_rw_ptr \fP\fIwrite_data_fn\fP\fB, png_flush_ptr \fIoutput_flush_fn\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600860
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500861\fI\fB
862
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500863\fBvoid png_set_write_status_fn (png_structp \fP\fIpng_ptr\fP\fB, png_write_status_ptr \fIwrite_row_fn\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600864
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500865\fI\fB
866
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500867\fBvoid png_set_write_user_transform_fn (png_structp \fP\fIpng_ptr\fP\fB, png_user_transform_ptr \fIwrite_user_transform_fn\fP\fB);\fP
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -0600868
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500869\fI\fB
870
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500871\fBint png_sig_cmp (png_bytep \fP\fIsig\fP\fB, png_size_t \fP\fIstart\fP\fB, png_size_t \fInum_to_check\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600872
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500873\fI\fB
874
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500875\fBvoid png_start_read_image (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600876
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500877\fI\fB
878
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500879\fBvoid png_warning (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fImessage\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600880
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500881\fI\fB
882
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500883\fBvoid png_write_chunk (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIchunk_name\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600884
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500885\fI\fB
886
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500887\fBvoid png_write_chunk_data (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600888
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500889\fI\fB
890
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500891\fBvoid png_write_chunk_end (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600892
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500893\fI\fB
894
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500895\fBvoid png_write_chunk_start (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIchunk_name\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600896
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500897\fI\fB
898
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500899\fBvoid png_write_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600900
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500901\fI\fB
902
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500903\fBvoid png_write_flush (png_structp \fIpng_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600904
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500905\fI\fB
906
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500907\fBvoid png_write_image (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fIimage\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600908
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500909\fI\fB
910
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500911\fBvoid png_write_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600912
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500913\fI\fB
914
Glenn Randers-Pehrson5379b241999-11-27 10:22:33 -0600915\fBvoid png_write_info_before_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
916
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500917\fI\fB
918
Glenn Randers-Pehrson5e5c1e12000-11-10 12:26:19 -0600919\fBvoid png_write_png (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fItransforms\fP\fB, png_voidp \fIparams\fP\fB);\fP
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600920
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500921\fI\fB
922
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500923\fBvoid png_write_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIrow\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600924
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500925\fI\fB
926
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500927\fBvoid png_write_rows (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fP\fIrow\fP\fB, png_uint_32 \fInum_rows\fP\fB);\fP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600928
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500929\fI\fB
930
Glenn Randers-Pehrson6bc53be2006-06-16 07:52:03 -0500931\fBvoid png_write_sig (png_structp \fIpng_ptr\fP\fB);\fP
932
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500933\fI\fB
934
Glenn Randers-Pehrson5b5dcf82004-07-17 22:45:44 -0500935\fBvoidpf png_zalloc (voidpf \fP\fIpng_ptr\fP\fB, uInt \fP\fIitems\fP\fB, uInt \fIsize\fP\fB);\fP
936
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500937\fI\fB
938
Glenn Randers-Pehrson5b5dcf82004-07-17 22:45:44 -0500939\fBvoid png_zfree (voidpf \fP\fIpng_ptr\fP\fB, voidpf \fIptr\fP\fB);\fP
940
Glenn Randers-Pehrsonad81d712009-07-30 15:39:00 -0500941\fI\fB
942
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -0600943.SH DESCRIPTION
944The
945.I libpng
946library supports encoding, decoding, and various manipulations of
947the Portable Network Graphics (PNG) format image files. It uses the
948.IR zlib(3)
949compression library.
Glenn Randers-Pehrson557b2562010-10-17 12:55:04 -0500950Following is a copy of the libpng-manual.txt file that accompanies libpng.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600951.SH LIBPNG.TXT
Glenn Randers-Pehrson557b2562010-10-17 12:55:04 -0500952libpng-manual.txt - A description on how to use and modify libpng
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600953
John Bowlera9b34192011-05-08 19:46:51 -0500954 libpng version 1.5.3beta07 - May 9, 2011
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600955 Updated and distributed by Glenn Randers-Pehrson
Glenn Randers-Pehrson5dd2b8e2004-11-24 07:50:16 -0600956 <glennrp at users.sourceforge.net>
Glenn Randers-Pehrson9f45c8e2011-01-15 19:35:03 -0600957 Copyright (c) 1998-2011 Glenn Randers-Pehrson
Glenn Randers-Pehrson037023b2009-06-24 10:27:36 -0500958
Glenn Randers-Pehrsonbfbf8652009-06-26 21:46:52 -0500959 This document is released under the libpng license.
Glenn Randers-Pehrsonc332bbc2009-06-25 13:43:50 -0500960 For conditions of distribution and use, see the disclaimer
Glenn Randers-Pehrson037023b2009-06-24 10:27:36 -0500961 and license in png.h
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600962
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -0500963 Based on:
964
John Bowlera9b34192011-05-08 19:46:51 -0500965 libpng versions 0.97, January 1998, through 1.5.3beta07 - May 9, 2011
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -0500966 Updated and distributed by Glenn Randers-Pehrson
Glenn Randers-Pehrson9f45c8e2011-01-15 19:35:03 -0600967 Copyright (c) 1998-2011 Glenn Randers-Pehrson
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600968
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -0600969 libpng 1.0 beta 6 version 0.96 May 28, 1997
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -0600970 Updated and distributed by Andreas Dilger
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600971 Copyright (c) 1996, 1997 Andreas Dilger
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600972
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -0600973 libpng 1.0 beta 2 - version 0.88 January 26, 1996
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600974 For conditions of distribution and use, see copyright
975 notice in png.h. Copyright (c) 1995, 1996 Guy Eric
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -0600976 Schalnat, Group 42, Inc.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600977
978 Updated/rewritten per request in the libpng FAQ
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -0600979 Copyright (c) 1995, 1996 Frank J. T. Wojcik
980 December 18, 1995 & January 20, 1996
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600981
982.SH I. Introduction
983
984This file describes how to use and modify the PNG reference library
985(known as libpng) for your own use. There are five sections to this
986file: introduction, structures, reading, writing, and modification and
987configuration notes for various special platforms. In addition to this
988file, example.c is a good starting point for using the library, as
989it is heavily commented and should include everything most people
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -0600990will need. We assume that libpng is already installed; see the
991INSTALL file for instructions on how to install libpng.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600992
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -0500993For examples of libpng usage, see the files "example.c", "pngtest.c",
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -0600994and the files in the "contrib" directory, all of which are included in
995the libpng distribution.
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -0500996
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -0600997Libpng was written as a companion to the PNG specification, as a way
998of reducing the amount of time and effort it takes to support the PNG
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -0500999file format in application programs.
1000
Glenn Randers-Pehrsona4981d42004-08-25 22:00:45 -05001001The PNG specification (second edition), November 2003, is available as
1002a W3C Recommendation and as an ISO Standard (ISO/IEC 15948:2003 (E)) at
1003<http://www.w3.org/TR/2003/REC-PNG-20031110/
1004The W3C and ISO documents have identical technical content.
1005
1006The PNG-1.2 specification is available at
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05001007<http://www.libpng.org/pub/png/documents/>. It is technically equivalent
1008to the PNG specification (second edition) but has some additional material.
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05001009
1010The PNG-1.0 specification is available
Glenn Randers-Pehrsona4981d42004-08-25 22:00:45 -05001011as RFC 2083 <http://www.libpng.org/pub/png/documents/> and as a
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05001012W3C Recommendation <http://www.w3.org/TR/REC.png.html>.
1013
1014Some additional chunks are described in the special-purpose public chunks
Glenn Randers-Pehrsona4981d42004-08-25 22:00:45 -05001015documents at <http://www.libpng.org/pub/png/documents/>.
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05001016
1017Other information
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06001018about PNG, and the latest version of libpng, can be found at the PNG home
Glenn Randers-Pehrsona4981d42004-08-25 22:00:45 -05001019page, <http://www.libpng.org/pub/png/>.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001020
1021Most users will not have to modify the library significantly; advanced
1022users may want to modify it more. All attempts were made to make it as
1023complete as possible, while keeping the code easy to understand.
1024Currently, this library only supports C. Support for other languages
1025is being considered.
1026
1027Libpng has been designed to handle multiple sessions at one time,
1028to be easily modifiable, to be portable to the vast majority of
1029machines (ANSI, K&R, 16-, 32-, and 64-bit) available, and to be easy
1030to use. The ultimate goal of libpng is to promote the acceptance of
1031the PNG file format in whatever way possible. While there is still
1032work to be done (see the TODO file), libpng should cover the
1033majority of the needs of its users.
1034
1035Libpng uses zlib for its compression and decompression of PNG files.
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06001036Further information about zlib, and the latest version of zlib, can
Glenn Randers-Pehrsond56aca72000-11-23 11:51:42 -06001037be found at the zlib home page, <http://www.info-zip.org/pub/infozip/zlib/>.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001038The zlib compression utility is a general purpose utility that is
1039useful for more than PNG files, and can be used without libpng.
1040See the documentation delivered with zlib for more details.
1041You can usually find the source files for the zlib utility wherever you
1042find the libpng source files.
1043
1044Libpng is thread safe, provided the threads are using different
1045instances of the structures. Each thread should have its own
1046png_struct and png_info instances, and thus its own image.
1047Libpng does not protect itself against two threads using the
Glenn Randers-Pehrson56f63962008-10-06 10:16:17 -05001048same instance of a structure.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001049
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001050.SH II. Structures
1051
1052There are two main structures that are important to libpng, png_struct
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -05001053and png_info. Both are internal structures that are no longer exposed
1054in the libpng interface (as of libpng 1.5.0).
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001055
1056The png_info structure is designed to provide information about the
1057PNG file. At one time, the fields of png_info were intended to be
1058directly accessible to the user. However, this tended to cause problems
1059with applications using dynamically loaded libraries, and as a result
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -05001060a set of interface functions for png_info (the png_get_*() and png_set_*()
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -05001061functions) was developed.
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -05001062
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -05001063The png_struct structure is the object used by the library to decode a
1064single image. As of 1.5.0 this structure is also not exposed.
1065
1066Almost all libpng APIs require a pointer to a png_struct as the first argument.
1067Many (in particular the png_set and png_get APIs) also require a pointer
1068to png_info as the second argument. Some application visible macros
1069defined in png.h designed for basic data access (reading and writing
1070integers in the PNG format) break this rule, but it's almost always safe
1071to assume that a (png_struct*) has to be passed to call an API function.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001072
1073The png.h header file is an invaluable reference for programming with libpng.
1074And while I'm on the topic, make sure you include the libpng header file:
1075
1076#include <png.h>
1077
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -05001078.SS Types
1079
1080The png.h header file defines a number of integral types used by the
1081APIs. Most of these are fairly obvious; for example types corresponding
1082to integers of particular sizes and types for passing color values.
1083
1084One exception is how non-integral numbers are handled. For application
1085convenience most APIs that take such numbers have C (double) arguments,
1086however internally PNG, and libpng, use 32 bit signed integers and encode
1087the value by multiplying by 100,000. As of libpng 1.5.0 a convenience
1088macro PNG_FP_1 is defined in png.h along with a type (png_fixed_point)
1089which is simply (png_int_32).
1090
1091All APIs that take (double) arguments also have an matching API that
1092takes the corresponding fixed point integer arguments. The fixed point
1093API has the same name as the floating point one with _fixed appended.
1094The actual range of values permitted in the APIs is frequently less than
1095the full range of (png_fixed_point) (-21474 to +21474). When APIs require
1096a non-negative argument the type is recorded as png_uint_32 above. Consult
1097the header file and the text below for more information.
1098
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06001099Special care must be take with sCAL chunk handling because the chunk itself
1100uses non-integral values encoded as strings containing decimal floating point
1101numbers. See the comments in the header file.
1102
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -05001103.SS Configuration
1104
1105The main header file function declarations are frequently protected by C
1106preprocessing directives of the form:
1107
1108 #ifdef PNG_feature_SUPPORTED
1109 declare-function
1110 #endif
1111
1112The library can be built without support for these APIs, although a
1113standard build will have all implemented APIs. Application programs
1114should check the feature macros before using an API for maximum
1115portability. From libpng 1.5.0 the feature macros set during the build
1116of libpng are recorded in the header file "pnglibconf.h" and this file
1117is always included by png.h.
1118
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06001119If you don't need to change the library configuration from the default skip to
1120the next section ("Reading").
1121
1122Notice that some of the makefiles in the 'scripts' directory and (in 1.5.0) all
1123of the build project files in the 'projects' directory simply copy
1124scripts/pnglibconf.h.prebuilt to pnglibconf.h. This means that these build
1125systems do not permit easy auto-configuration of the library - they only
1126support the default configuration.
1127
1128The easiest way to make minor changes to the libpng configuration when
1129auto-configuration is supported is to add definitions to the command line
1130using (typically) CPPFLAGS. For example:
1131
1132CPPFLAGS=-DPNG_NO_FLOATING_ARITHMETIC
1133
1134will change the internal libpng math implementation for gamma correction and
1135other arithmetic calculations to fixed point, avoiding the need for fast
1136floating point support. The result can be seen in the generated pnglibconf.h -
1137make sure it contains the changed feature macro setting.
1138
1139If you need to make more extensive configuration changes - more than one or two
1140feature macro settings - you can either add -DPNG_USER_CONFIG to the build
1141command line and put a list of feature macro settings in pngusr.h or you can set
1142DFA_XTRA (a makefile variable) to a file containing the same information in the
1143form of 'option' settings.
1144
1145A. Changing pnglibconf.h
1146
1147A variety of methods exist to build libpng. Not all of these support
1148reconfiguration of pnglibconf.h. To reconfigure pnglibconf.h it must either be
1149rebuilt from scripts/pnglibconf.dfa using awk or it must be edited by hand.
1150
1151Hand editing is achieved by copying scripts/pnglibconf.h.prebuilt and changing
1152the lines defining the supported features, paying very close attention to the
1153'option' information in scripts/pnglibconf.dfa that describes those features and
1154their requirements. This is easy to get wrong.
1155
1156B. Configuration using DFA_XTRA
1157
1158Rebuilding from pnglibconf.dfa is easy if a functioning 'awk', or a later
1159variant such as 'nawk' or 'gawk', is available. The configure build will
1160automatically find an appropriate awk and build pnglibconf.h.
1161scripts/pnglibconf.mak contains a set of make rules for doing the same thing if
1162configure is not used, and many of the makefiles in the scripts directory use
1163this approach.
1164
1165When rebuilding simply write new file containing changed options and set
1166DFA_XTRA to the name of this file. This causes the build to append the new file
1167to the end of scripts/pnglibconf.dfa. pngusr.dfa should contain lines of the
1168following forms:
1169
1170everything = off
1171
1172This turns all optional features off. Include it at the start of pngusr.dfa to
1173make it easier to build a minimal configuration. You will need to turn at least
1174some features on afterward to enable either reading or writing code, or both.
1175
1176option feature on
1177option feature off
1178
1179Enable or disable a single feature. This will automatically enable other
1180features required by a feature that is turned on or disable other features that
1181require a feature which is turned off. Conflicting settings will cause an error
1182message to be emitted by awk.
1183
1184setting feature default value
1185
1186Changes the default value of setting 'feature' to 'value'. There are a small
1187number of settings listed at the top of pnglibconf.h, they are documented in the
1188source code. Most of these values have performance implications for the library
1189but most of them have no visible effect on the API. Some can also be overridden
1190from the API.
1191
1192C. Configuration using PNG_USR_CONFIG
1193
1194If -DPNG_USR_CONFIG is added to the CFLAGS when pnglibconf.h is built the file
1195pngusr.h will automatically be included before the options in
1196scripts/pnglibconf.dfa are processed. pngusr.h should contain only macro
1197definitions turning features on or off or setting settings.
1198
1199Apart from the global setting "everything = off" all the options listed above
1200can be set using macros in pngusr.h:
1201
1202#define PNG_feature_SUPPORTED
1203
1204is equivalent to:
1205
1206option feature on
1207
1208#define PNG_NO_feature
1209
1210is equivalent to:
1211
1212option feature off
1213
1214#define PNG_feature value
1215
1216is equivalent to:
1217
1218setting feature default value
1219
1220Notice that in both cases, pngusr.dfa and pngusr.h, the contents of the
1221pngusr file you supply override the contents of scripts/pnglibconf.dfa
1222
1223If confusing or incomprehensible behavior results it is possible to
1224examine the intermediate file pnglibconf.dfn to find the full set of
1225dependency information for each setting and option. Simply locate the
1226feature in the file and read the C comments that precede it.
1227
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001228.SH III. Reading
1229
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001230We'll now walk you through the possible functions to call when reading
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001231in a PNG file sequentially, briefly explaining the syntax and purpose
1232of each one. See example.c and png.h for more detail. While
1233progressive reading is covered in the next section, you will still
1234need some of the functions discussed in this section to read a PNG
1235file.
1236
1237.SS Setup
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001238
1239You will want to do the I/O initialization(*) before you get into libpng,
1240so if it doesn't work, you don't have much to undo. Of course, you
1241will also want to insure that you are, in fact, dealing with a PNG
1242file. Libpng provides a simple check to see if a file is a PNG file.
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001243To use it, pass in the first 1 to 8 bytes of the file to the function
Glenn Randers-Pehrson6a9c2ce2009-03-27 19:30:10 -05001244png_sig_cmp(), and it will return 0 (false) if the bytes match the
1245corresponding bytes of the PNG signature, or nonzero (true) otherwise.
1246Of course, the more bytes you pass in, the greater the accuracy of the
1247prediction.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001248
1249If you are intending to keep the file pointer open for use in libpng,
1250you must ensure you don't read more than 8 bytes from the beginning
1251of the file, and you also have to make a call to png_set_sig_bytes_read()
1252with the number of bytes you read from the beginning. Libpng will
1253then only check the bytes (if any) that your program didn't read.
1254
1255(*): If you are not using the standard I/O functions, you will need
1256to replace them with custom functions. See the discussion under
1257Customizing libpng.
1258
1259
1260 FILE *fp = fopen(file_name, "rb");
1261 if (!fp)
1262 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001263 return (ERROR);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001264 }
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001265
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001266 fread(header, 1, number, fp);
Glenn Randers-Pehrsonc9442291999-01-06 21:50:16 -06001267 is_png = !png_sig_cmp(header, 0, number);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001268
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001269 if (!is_png)
1270 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001271 return (NOT_PNG);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001272 }
1273
1274
1275Next, png_struct and png_info need to be allocated and initialized. In
1276order to ensure that the size of these structures is correct even with a
1277dynamically linked libpng, there are functions to initialize and
1278allocate the structures. We also pass the library version, optional
1279pointers to error handling functions, and a pointer to a data struct for
1280use by the error functions, if necessary (the pointer and functions can
1281be NULL if the default error handlers are to be used). See the section
1282on Changes to Libpng below regarding the old initialization functions.
Glenn Randers-Pehrson104622b2000-05-29 08:58:03 -05001283The structure allocation functions quietly return NULL if they fail to
1284create the structure, so your application should check for that.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001285
1286 png_structp png_ptr = png_create_read_struct
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001287 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001288 user_error_fn, user_warning_fn);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001289
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001290 if (!png_ptr)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001291 return (ERROR);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001292
1293 png_infop info_ptr = png_create_info_struct(png_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001294
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001295 if (!info_ptr)
1296 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001297 png_destroy_read_struct(&png_ptr,
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001298 (png_infopp)NULL, (png_infopp)NULL);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001299 return (ERROR);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001300 }
1301
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05001302If you want to use your own memory allocation routines,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001303use a libpng that was built with PNG_USER_MEM_SUPPORTED defined, and use
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05001304png_create_read_struct_2() instead of png_create_read_struct():
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001305
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05001306 png_structp png_ptr = png_create_read_struct_2
Glenn Randers-Pehrson20786be2011-04-20 22:20:40 -05001307 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05001308 user_error_fn, user_warning_fn, (png_voidp)
1309 user_mem_ptr, user_malloc_fn, user_free_fn);
1310
1311The error handling routines passed to png_create_read_struct()
1312and the memory alloc/free routines passed to png_create_struct_2()
1313are only necessary if you are not using the libpng supplied error
1314handling and memory alloc/free functions.
1315
1316When libpng encounters an error, it expects to longjmp back
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06001317to your routine. Therefore, you will need to call setjmp and pass
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06001318your png_jmpbuf(png_ptr). If you read the file from different
John Bowlere6dc85b2011-04-27 14:47:15 -05001319routines, you will need to update the longjmp buffer every time you enter
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06001320a new routine that will call a png_*() function.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001321
1322See your documentation of setjmp/longjmp for your compiler for more
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -06001323information on setjmp/longjmp. See the discussion on libpng error
1324handling in the Customizing Libpng section below for more information
1325on the libpng error handling. If an error occurs, and libpng longjmp's
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001326back to your setjmp, you will want to call png_destroy_read_struct() to
1327free any memory.
1328
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06001329 if (setjmp(png_jmpbuf(png_ptr)))
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001330 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001331 png_destroy_read_struct(&png_ptr, &info_ptr,
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001332 &end_info);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001333 fclose(fp);
1334 return (ERROR);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001335 }
1336
Glenn Randers-Pehrson20786be2011-04-20 22:20:40 -05001337Pass (png_infopp)NULL instead of &end_info if you didn't create
1338an end_info structure.
1339
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001340If you would rather avoid the complexity of setjmp/longjmp issues,
Glenn Randers-Pehrson54ac9a92010-04-02 17:06:22 -05001341you can compile libpng with PNG_NO_SETJMP, in which case
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001342errors will result in a call to PNG_ABORT() which defaults to abort().
1343
Glenn Randers-Pehrson54ac9a92010-04-02 17:06:22 -05001344You can #define PNG_ABORT() to a function that does something
1345more useful than abort(), as long as your function does not
1346return.
1347
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001348Now you need to set up the input code. The default for libpng is to
1349use the C function fread(). If you use this, you will need to pass a
1350valid FILE * in the function png_init_io(). Be sure that the file is
1351opened in binary mode. If you wish to handle reading data in another
1352way, you need not call the png_init_io() function, but you must then
1353implement the libpng I/O methods discussed in the Customizing Libpng
1354section below.
1355
1356 png_init_io(png_ptr, fp);
1357
1358If you had previously opened the file and read any of the signature from
1359the beginning in order to see if this was a PNG file, you need to let
1360libpng know that there are some bytes missing from the start of the file.
1361
1362 png_set_sig_bytes(png_ptr, number);
1363
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06001364You can change the zlib compression buffer size to be used while
1365reading compressed data with
1366
1367 png_set_compression_buffer_size(png_ptr, buffer_size);
1368
1369where the default size is 8192 bytes. Note that the buffer size
1370is changed immediately and the buffer is reallocated immediately,
1371instead of setting a flag to be acted upon later.
1372
Glenn Randers-Pehrson9dd1cdf2011-01-06 21:42:36 -06001373If you want CRC errors to be handled in a different manner than
1374the default, use
1375
1376 png_set_crc_action(png_ptr, crit_action, ancil_action);
1377
1378The values for png_set_crc_action() say how libpng is to handle CRC errors in
1379ancillary and critical chunks, and whether to use the data contained
1380therein. Note that it is impossible to "discard" data in a critical
1381chunk.
1382
1383Choices for (int) crit_action are
1384 PNG_CRC_DEFAULT 0 error/quit
1385 PNG_CRC_ERROR_QUIT 1 error/quit
1386 PNG_CRC_WARN_USE 3 warn/use data
1387 PNG_CRC_QUIET_USE 4 quiet/use data
1388 PNG_CRC_NO_CHANGE 5 use the current value
1389
1390Choices for (int) ancil_action are
1391 PNG_CRC_DEFAULT 0 error/quit
1392 PNG_CRC_ERROR_QUIT 1 error/quit
1393 PNG_CRC_WARN_DISCARD 2 warn/discard data
1394 PNG_CRC_WARN_USE 3 warn/use data
1395 PNG_CRC_QUIET_USE 4 quiet/use data
1396 PNG_CRC_NO_CHANGE 5 use the current value
1397
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001398.SS Setting up callback code
1399
1400You can set up a callback function to handle any unknown chunks in the
1401input stream. You must supply the function
1402
Glenn Randers-Pehrson81ce8892011-01-24 08:04:37 -06001403 read_chunk_callback(png_structp png_ptr,
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001404 png_unknown_chunkp chunk);
1405 {
1406 /* The unknown chunk structure contains your
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05001407 chunk data, along with similar data for any other
1408 unknown chunks: */
1409
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001410 png_byte name[5];
1411 png_byte *data;
1412 png_size_t size;
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05001413
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001414 /* Note that libpng has already taken care of
1415 the CRC handling */
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001416
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05001417 /* put your code here. Search for your chunk in the
1418 unknown chunk structure, process it, and return one
1419 of the following: */
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001420
1421 return (-n); /* chunk had an error */
1422 return (0); /* did not recognize */
1423 return (n); /* success */
1424 }
1425
1426(You can give your function another name that you like instead of
1427"read_chunk_callback")
1428
1429To inform libpng about your function, use
1430
1431 png_set_read_user_chunk_fn(png_ptr, user_chunk_ptr,
1432 read_chunk_callback);
1433
1434This names not only the callback function, but also a user pointer that
1435you can retrieve with
1436
1437 png_get_user_chunk_ptr(png_ptr);
1438
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05001439If you call the png_set_read_user_chunk_fn() function, then all unknown
1440chunks will be saved when read, in case your callback function will need
1441one or more of them. This behavior can be changed with the
1442png_set_keep_unknown_chunks() function, described below.
1443
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -06001444At this point, you can set up a callback function that will be
1445called after each row has been read, which you can use to control
1446a progress meter or the like. It's demonstrated in pngtest.c.
1447You must supply a function
1448
Glenn Randers-Pehrson81ce8892011-01-24 08:04:37 -06001449 void read_row_callback(png_structp png_ptr,
1450 png_uint_32 row, int pass);
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -06001451 {
1452 /* put your code here */
1453 }
1454
1455(You can give it another name that you like instead of "read_row_callback")
1456
1457To inform libpng about your function, use
1458
1459 png_set_read_status_fn(png_ptr, read_row_callback);
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05001460
John Bowler59010e52011-02-16 06:16:31 -06001461When this function is called the row has already been completely processed and
1462the 'row' and 'pass' refer to the next row to be handled. For the
1463non-interlaced case the row that was just handled is simply one less than the
1464passed in row number, and pass will always be 0. For the interlaced case the
1465same applies unless the row value is 0, in which case the row just handled was
1466the last one from one of the preceding passes. Because interlacing may skip a
1467pass you cannot be sure that the preceding pass is just 'pass-1', if you really
1468need to know what the last pass is record (row,pass) from the callback and use
1469the last recorded value each time.
1470
1471As with the user transform you can find the output row using the
1472PNG_ROW_FROM_PASS_ROW macro.
1473
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001474.SS Unknown-chunk handling
1475
1476Now you get to set the way the library processes unknown chunks in the
1477input PNG stream. Both known and unknown chunks will be read. Normal
1478behavior is that known chunks will be parsed into information in
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05001479various info_ptr members while unknown chunks will be discarded. This
1480behavior can be wasteful if your application will never use some known
1481chunk types. To change this, you can call:
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001482
Glenn Randers-Pehrson272489d2004-08-04 06:34:52 -05001483 png_set_keep_unknown_chunks(png_ptr, keep,
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001484 chunk_list, num_chunks);
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05001485 keep - 0: default unknown chunk handling
1486 1: ignore; do not keep
Glenn Randers-Pehrsond029a752004-08-09 21:50:32 -05001487 2: keep only if safe-to-copy
1488 3: keep even if unsafe-to-copy
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001489
Glenn Randers-Pehrsond029a752004-08-09 21:50:32 -05001490 You can use these definitions:
1491 PNG_HANDLE_CHUNK_AS_DEFAULT 0
1492 PNG_HANDLE_CHUNK_NEVER 1
1493 PNG_HANDLE_CHUNK_IF_SAFE 2
1494 PNG_HANDLE_CHUNK_ALWAYS 3
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001495
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001496 chunk_list - list of chunks affected (a byte string,
1497 five bytes per chunk, NULL or '\0' if
1498 num_chunks is 0)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001499
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001500 num_chunks - number of chunks affected; if 0, all
Glenn Randers-Pehrsondff799e2004-08-07 21:42:49 -05001501 unknown chunks are affected. If nonzero,
1502 only the chunks in the list are affected
1503
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001504Unknown chunks declared in this way will be saved as raw data onto a
1505list of png_unknown_chunk structures. If a chunk that is normally
1506known to libpng is named in the list, it will be handled as unknown,
1507according to the "keep" directive. If a chunk is named in successive
1508instances of png_set_keep_unknown_chunks(), the final instance will
Glenn Randers-Pehrsond029a752004-08-09 21:50:32 -05001509take precedence. The IHDR and IEND chunks should not be named in
1510chunk_list; if they are, libpng will process them normally anyway.
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001511
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05001512Here is an example of the usage of png_set_keep_unknown_chunks(),
1513where the private "vpAg" chunk will later be processed by a user chunk
1514callback function:
1515
1516 png_byte vpAg[5]={118, 112, 65, 103, (png_byte) '\0'};
1517
1518 #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
1519 png_byte unused_chunks[]=
1520 {
1521 104, 73, 83, 84, (png_byte) '\0', /* hIST */
1522 105, 84, 88, 116, (png_byte) '\0', /* iTXt */
1523 112, 67, 65, 76, (png_byte) '\0', /* pCAL */
1524 115, 67, 65, 76, (png_byte) '\0', /* sCAL */
1525 115, 80, 76, 84, (png_byte) '\0', /* sPLT */
1526 116, 73, 77, 69, (png_byte) '\0', /* tIME */
1527 };
1528 #endif
1529
1530 ...
1531
1532 #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
1533 /* ignore all unknown chunks: */
1534 png_set_keep_unknown_chunks(read_ptr, 1, NULL, 0);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001535
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05001536 /* except for vpAg: */
1537 png_set_keep_unknown_chunks(read_ptr, 2, vpAg, 1);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001538
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05001539 /* also ignore unused known chunks: */
1540 png_set_keep_unknown_chunks(read_ptr, 1, unused_chunks,
1541 (int)sizeof(unused_chunks)/5);
1542 #endif
1543
Glenn Randers-Pehrson800d1e92008-08-20 17:25:21 -05001544.SS User limits
1545
1546The PNG specification allows the width and height of an image to be as
1547large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns.
1548Since very few applications really need to process such large images,
1549we have imposed an arbitrary 1-million limit on rows and columns.
1550Larger images will be rejected immediately with a png_error() call. If
1551you wish to override this limit, you can use
1552
1553 png_set_user_limits(png_ptr, width_max, height_max);
1554
1555to set your own limits, or use width_max = height_max = 0x7fffffffL
1556to allow all valid dimensions (libpng may reject some very large images
1557anyway because of potential buffer overflow conditions).
1558
1559You should put this statement after you create the PNG structure and
1560before calling png_read_info(), png_read_png(), or png_process_data().
1561If you need to retrieve the limits that are being applied, use
1562
1563 width_max = png_get_user_width_max(png_ptr);
1564 height_max = png_get_user_height_max(png_ptr);
1565
1566The PNG specification sets no limit on the number of ancillary chunks
1567allowed in a PNG datastream. You can impose a limit on the total number
1568of sPLT, tEXt, iTXt, zTXt, and unknown chunks that will be stored, with
1569
1570 png_set_chunk_cache_max(png_ptr, user_chunk_cache_max);
1571
1572where 0x7fffffffL means unlimited. You can retrieve this limit with
1573
1574 chunk_cache_max = png_get_chunk_cache_max(png_ptr);
1575
Glenn Randers-Pehrson8f5846f2009-10-31 21:31:08 -05001576This limit also applies to the number of buffers that can be allocated
1577by png_decompress_chunk() while decompressing iTXt, zTXt, and iCCP chunks.
1578
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06001579You can also set a limit on the amount of memory that a compressed chunk
1580other than IDAT can occupy, with
1581
1582 png_set_chunk_malloc_max(png_ptr, user_chunk_malloc_max);
1583
1584and you can retrieve the limit with
1585
1586 chunk_malloc_max = png_get_chunk_malloc_max(png_ptr);
1587
1588Any chunks that would cause either of these limits to be exceeded will
1589be ignored.
1590
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001591.SS The high-level read interface
1592
1593At this point there are two ways to proceed; through the high-level
1594read interface, or through a sequence of low-level read operations.
1595You can use the high-level interface if (a) you are willing to read
1596the entire image into memory, and (b) the input transformations
1597you want to do are limited to the following set:
1598
1599 PNG_TRANSFORM_IDENTITY No transformation
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001600 PNG_TRANSFORM_STRIP_16 Strip 16-bit samples to
1601 8 bits
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001602 PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001603 PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit
1604 samples to bytes
1605 PNG_TRANSFORM_PACKSWAP Change order of packed
1606 pixels to LSB first
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001607 PNG_TRANSFORM_EXPAND Perform set_expand()
1608 PNG_TRANSFORM_INVERT_MONO Invert monochrome images
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001609 PNG_TRANSFORM_SHIFT Normalize pixels to the
1610 sBIT depth
1611 PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA
1612 to BGRA
1613 PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA
1614 to AG
1615 PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity
1616 to transparency
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001617 PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples
Glenn Randers-Pehrson99708d52009-06-29 17:30:00 -05001618 PNG_TRANSFORM_GRAY_TO_RGB Expand grayscale samples
1619 to RGB (or GA to RGBA)
John Bowlera9b34192011-05-08 19:46:51 -05001620 PNG_TRANSFORM_EXPAND_16 Expand samples to 16 bits
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001621
1622(This excludes setting a background color, doing gamma transformation,
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05001623quantizing, and setting filler.) If this is the case, simply do this:
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001624
1625 png_read_png(png_ptr, info_ptr, png_transforms, NULL)
1626
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06001627where png_transforms is an integer containing the bitwise OR of some
1628set of transformation flags. This call is equivalent to png_read_info(),
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001629followed the set of transformations indicated by the transform mask,
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05001630then png_read_image(), and finally png_read_end().
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001631
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05001632(The final parameter of this call is not yet used. Someday it might point
1633to transformation parameters required by some future input transform.)
1634
Glenn Randers-Pehrsona4981d42004-08-25 22:00:45 -05001635You must use png_transforms and not call any png_set_transform() functions
1636when you use png_read_png().
1637
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05001638After you have called png_read_png(), you can retrieve the image data
1639with
1640
1641 row_pointers = png_get_rows(png_ptr, info_ptr);
1642
1643where row_pointers is an array of pointers to the pixel data for each row:
1644
1645 png_bytep row_pointers[height];
1646
1647If you know your image size and pixel size ahead of time, you can allocate
1648row_pointers prior to calling png_read_png() with
1649
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05001650 if (height > PNG_UINT_32_MAX/png_sizeof(png_byte))
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -05001651 png_error (png_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001652 "Image is too tall to process in memory");
1653
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -05001654 if (width > PNG_UINT_32_MAX/pixel_size)
1655 png_error (png_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001656 "Image is too wide to process in memory");
1657
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001658 row_pointers = png_malloc(png_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001659 height*png_sizeof(png_bytep));
1660
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05001661 for (int i=0; i<height, i++)
1662 row_pointers[i]=NULL; /* security precaution */
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001663
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05001664 for (int i=0; i<height, i++)
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001665 row_pointers[i]=png_malloc(png_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001666 width*pixel_size);
1667
Glenn Randers-Pehrsond56aca72000-11-23 11:51:42 -06001668 png_set_rows(png_ptr, info_ptr, &row_pointers);
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05001669
1670Alternatively you could allocate your image in one big block and define
1671row_pointers[i] to point into the proper places in your block.
1672
1673If you use png_set_rows(), the application is responsible for freeing
1674row_pointers (and row_pointers[i], if they were separately allocated).
1675
1676If you don't allocate row_pointers ahead of time, png_read_png() will
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001677do it, and it'll be free'ed by libpng when you call png_destroy_*().
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001678
1679.SS The low-level read interface
1680
1681If you are going the low-level route, you are now ready to read all
1682the file information up to the actual image data. You do this with a
1683call to png_read_info().
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001684
1685 png_read_info(png_ptr, info_ptr);
1686
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001687This will process all chunks up to but not including the image data.
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001688
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001689.SS Querying the info structure
1690
1691Functions are used to get the information from the info_ptr once it
1692has been read. Note that these fields may not be completely filled
1693in until png_read_end() has read the chunk data following the image.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001694
1695 png_get_IHDR(png_ptr, info_ptr, &width, &height,
1696 &bit_depth, &color_type, &interlace_type,
Glenn Randers-Pehrson408b4212000-12-18 09:33:57 -06001697 &compression_type, &filter_method);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001698
1699 width - holds the width of the image
1700 in pixels (up to 2^31).
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001701
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001702 height - holds the height of the image
1703 in pixels (up to 2^31).
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001704
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001705 bit_depth - holds the bit depth of one of the
1706 image channels. (valid values are
1707 1, 2, 4, 8, 16 and depend also on
1708 the color_type. See also
1709 significant bits (sBIT) below).
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001710
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001711 color_type - describes which color/alpha channels
1712 are present.
1713 PNG_COLOR_TYPE_GRAY
1714 (bit depths 1, 2, 4, 8, 16)
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06001715 PNG_COLOR_TYPE_GRAY_ALPHA
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001716 (bit depths 8, 16)
1717 PNG_COLOR_TYPE_PALETTE
1718 (bit depths 1, 2, 4, 8)
1719 PNG_COLOR_TYPE_RGB
1720 (bit_depths 8, 16)
1721 PNG_COLOR_TYPE_RGB_ALPHA
1722 (bit_depths 8, 16)
1723
1724 PNG_COLOR_MASK_PALETTE
1725 PNG_COLOR_MASK_COLOR
1726 PNG_COLOR_MASK_ALPHA
1727
Glenn Randers-Pehrson2cb633b2011-01-21 08:31:29 -06001728 interlace_type - (PNG_INTERLACE_NONE or
1729 PNG_INTERLACE_ADAM7)
1730
1731 compression_type - (must be PNG_COMPRESSION_TYPE_BASE
1732 for PNG 1.0)
1733
Glenn Randers-Pehrson408b4212000-12-18 09:33:57 -06001734 filter_method - (must be PNG_FILTER_TYPE_BASE
1735 for PNG 1.0, and can also be
1736 PNG_INTRAPIXEL_DIFFERENCING if
1737 the PNG datastream is embedded in
1738 a MNG-1.0 datastream)
Glenn Randers-Pehrson0bfb58f2009-09-30 23:07:22 -05001739
1740 Any or all of interlace_type, compression_type, or
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001741 filter_method can be NULL if you are
1742 not interested in their values.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001743
Glenn Randers-Pehrson0bfb58f2009-09-30 23:07:22 -05001744 Note that png_get_IHDR() returns 32-bit data into
1745 the application's width and height variables.
1746 This is an unsafe situation if these are 16-bit
1747 variables. In such situations, the
1748 png_get_image_width() and png_get_image_height()
1749 functions described below are safer.
1750
1751 width = png_get_image_width(png_ptr,
1752 info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001753
Glenn Randers-Pehrson0bfb58f2009-09-30 23:07:22 -05001754 height = png_get_image_height(png_ptr,
1755 info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001756
Glenn Randers-Pehrson0bfb58f2009-09-30 23:07:22 -05001757 bit_depth = png_get_bit_depth(png_ptr,
1758 info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001759
Glenn Randers-Pehrson0bfb58f2009-09-30 23:07:22 -05001760 color_type = png_get_color_type(png_ptr,
1761 info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001762
Glenn Randers-Pehrson2cb633b2011-01-21 08:31:29 -06001763 interlace_type = png_get_interlace_type(png_ptr,
Glenn Randers-Pehrson0bfb58f2009-09-30 23:07:22 -05001764 info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001765
Glenn Randers-Pehrson0bfb58f2009-09-30 23:07:22 -05001766 compression_type = png_get_compression_type(png_ptr,
1767 info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001768
Glenn Randers-Pehrson2cb633b2011-01-21 08:31:29 -06001769 filter_method = png_get_filter_type(png_ptr,
Glenn Randers-Pehrson0bfb58f2009-09-30 23:07:22 -05001770 info_ptr);
1771
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001772 channels = png_get_channels(png_ptr, info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001773
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001774 channels - number of channels of info for the
1775 color type (valid values are 1 (GRAY,
1776 PALETTE), 2 (GRAY_ALPHA), 3 (RGB),
1777 4 (RGB_ALPHA or RGB + filler byte))
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001778
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001779 rowbytes = png_get_rowbytes(png_ptr, info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001780
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001781 rowbytes - number of bytes needed to hold a row
1782
1783 signature = png_get_signature(png_ptr, info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001784
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001785 signature - holds the signature read from the
1786 file (if any). The data is kept in
1787 the same offset it would be if the
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06001788 whole signature were read (i.e. if an
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001789 application had already read in 4
1790 bytes of signature before starting
1791 libpng, the remaining 4 bytes would
1792 be in signature[4] through signature[7]
1793 (see png_set_sig_bytes())).
1794
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001795These are also important, but their validity depends on whether the chunk
1796has been read. The png_get_valid(png_ptr, info_ptr, PNG_INFO_<chunk>) and
1797png_get_<chunk>(png_ptr, info_ptr, ...) functions return non-zero if the
1798data has been read, or zero if it is missing. The parameters to the
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06001799png_get_<chunk> are set directly if they are simple data types, or a
1800pointer into the info_ptr is returned for any complex types.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001801
1802 png_get_PLTE(png_ptr, info_ptr, &palette,
1803 &num_palette);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001804
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001805 palette - the palette for the file
1806 (array of png_color)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001807
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001808 num_palette - number of entries in the palette
1809
Glenn Randers-Pehrson8d0bc0f2011-01-25 22:15:58 -06001810 png_get_gAMA(png_ptr, info_ptr, &file_gamma);
Glenn Randers-Pehrson27742382011-01-27 09:37:34 -06001811 png_get_gAMA_fixed(png_ptr, info_ptr, &int_file_gamma);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001812
Glenn Randers-Pehrson8d0bc0f2011-01-25 22:15:58 -06001813 file_gamma - the gamma at which the file is
1814 written (PNG_INFO_gAMA)
1815
1816 int_file_gamma - 100,000 times the gamma at which the
1817 file is written
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001818
1819 png_get_sRGB(png_ptr, info_ptr, &srgb_intent);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001820
Glenn Randers-Pehrson27742382011-01-27 09:37:34 -06001821 file_srgb_intent - the rendering intent (PNG_INFO_sRGB)
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001822 The presence of the sRGB chunk
1823 means that the pixel data is in the
1824 sRGB color space. This chunk also
1825 implies specific values of gAMA and
1826 cHRM.
1827
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001828 png_get_iCCP(png_ptr, info_ptr, &name,
1829 &compression_type, &profile, &proflen);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001830
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06001831 name - The profile name.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001832
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06001833 compression_type - The compression type; always
1834 PNG_COMPRESSION_TYPE_BASE for PNG 1.0.
1835 You may give NULL to this argument to
1836 ignore it.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001837
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06001838 profile - International Color Consortium color
1839 profile data. May contain NULs.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001840
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06001841 proflen - length of profile data in bytes.
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001842
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001843 png_get_sBIT(png_ptr, info_ptr, &sig_bit);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001844
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001845 sig_bit - the number of significant bits for
1846 (PNG_INFO_sBIT) each of the gray,
1847 red, green, and blue channels,
1848 whichever are appropriate for the
1849 given color type (png_color_16)
1850
Glenn Randers-Pehrson866b62a2009-08-08 16:33:14 -05001851 png_get_tRNS(png_ptr, info_ptr, &trans_alpha,
1852 &num_trans, &trans_color);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001853
Glenn Randers-Pehrson866b62a2009-08-08 16:33:14 -05001854 trans_alpha - array of alpha (transparency)
1855 entries for palette (PNG_INFO_tRNS)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001856
Glenn Randers-Pehrsonf3c51e42011-01-15 10:25:25 -06001857 num_trans - number of transparent entries
1858 (PNG_INFO_tRNS)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001859
Glenn Randers-Pehrson56f63962008-10-06 10:16:17 -05001860 trans_color - graylevel or color sample values of
Glenn Randers-Pehrson3d5a5202000-07-01 15:37:28 -05001861 the single transparent color for
1862 non-paletted images (PNG_INFO_tRNS)
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001863
1864 png_get_hIST(png_ptr, info_ptr, &hist);
1865 (PNG_INFO_hIST)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001866
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001867 hist - histogram of palette (array of
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001868 png_uint_16)
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001869
1870 png_get_tIME(png_ptr, info_ptr, &mod_time);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001871
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001872 mod_time - time image was last modified
1873 (PNG_VALID_tIME)
1874
1875 png_get_bKGD(png_ptr, info_ptr, &background);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001876
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001877 background - background color (PNG_VALID_bKGD)
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001878 valid 16-bit red, green and blue
1879 values, regardless of color_type
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001880
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -06001881 num_comments = png_get_text(png_ptr, info_ptr,
1882 &text_ptr, &num_text);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001883
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -06001884 num_comments - number of comments
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001885
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001886 text_ptr - array of png_text holding image
1887 comments
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001888
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001889 text_ptr[i].compression - type of compression used
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001890 on "text" PNG_TEXT_COMPRESSION_NONE
1891 PNG_TEXT_COMPRESSION_zTXt
1892 PNG_ITXT_COMPRESSION_NONE
1893 PNG_ITXT_COMPRESSION_zTXt
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001894
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001895 text_ptr[i].key - keyword for comment. Must contain
1896 1-79 characters.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001897
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001898 text_ptr[i].text - text comments for current
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05001899 keyword. Can be empty.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001900
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001901 text_ptr[i].text_length - length of text string,
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001902 after decompression, 0 for iTXt
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001903
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001904 text_ptr[i].itxt_length - length of itxt string,
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001905 after decompression, 0 for tEXt/zTXt
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001906
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001907 text_ptr[i].lang - language of comment (empty
1908 string for unknown).
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001909
Glenn Randers-Pehrson73d57cb2002-03-25 18:49:08 -06001910 text_ptr[i].lang_key - keyword in UTF-8
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001911 (empty string for unknown).
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001912
Glenn Randers-Pehrson8f5846f2009-10-31 21:31:08 -05001913 Note that the itxt_length, lang, and lang_key
1914 members of the text_ptr structure only exist
1915 when the library is built with iTXt chunk support.
1916
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001917 num_text - number of comments (same as
1918 num_comments; you can put NULL here
1919 to avoid the duplication)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001920
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001921 Note while png_set_text() will accept text, language,
1922 and translated keywords that can be NULL pointers, the
1923 structure returned by png_get_text will always contain
1924 regular zero-terminated C strings. They might be
1925 empty strings but they will never be NULL pointers.
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001926
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001927 num_spalettes = png_get_sPLT(png_ptr, info_ptr,
1928 &palette_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001929
1930 num_spalettes - number of sPLT chunks read.
1931
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001932 palette_ptr - array of palette structures holding
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001933 contents of one or more sPLT chunks
1934 read.
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001935
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001936 png_get_oFFs(png_ptr, info_ptr, &offset_x, &offset_y,
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001937 &unit_type);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001938
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001939 offset_x - positive offset from the left edge
1940 of the screen
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001941
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001942 offset_y - positive offset from the top edge
1943 of the screen
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001944
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001945 unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER
1946
1947 png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y,
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001948 &unit_type);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001949
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001950 res_x - pixels/unit physical resolution in
1951 x direction
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001952
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001953 res_y - pixels/unit physical resolution in
1954 x direction
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001955
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06001956 unit_type - PNG_RESOLUTION_UNKNOWN,
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001957 PNG_RESOLUTION_METER
1958
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001959 png_get_sCAL(png_ptr, info_ptr, &unit, &width,
1960 &height)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001961
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001962 unit - physical scale units (an integer)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001963
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001964 width - width of a pixel in physical scale units
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001965
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001966 height - height of a pixel in physical scale units
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001967 (width and height are doubles)
1968
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001969 png_get_sCAL_s(png_ptr, info_ptr, &unit, &width,
1970 &height)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001971
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001972 unit - physical scale units (an integer)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001973
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001974 width - width of a pixel in physical scale units
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001975
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001976 height - height of a pixel in physical scale units
1977 (width and height are strings like "2.54")
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001978
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001979 num_unknown_chunks = png_get_unknown_chunks(png_ptr,
1980 info_ptr, &unknowns)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001981
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001982 unknowns - array of png_unknown_chunk
1983 structures holding unknown chunks
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001984
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001985 unknowns[i].name - name of unknown chunk
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001986
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001987 unknowns[i].data - data of unknown chunk
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001988
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001989 unknowns[i].size - size of unknown chunk's data
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06001990
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06001991 unknowns[i].location - position of chunk in file
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06001992
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06001993 The value of "i" corresponds to the order in which the
1994 chunks were read from the PNG file or inserted with the
1995 png_set_unknown_chunks() function.
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05001996
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06001997The data from the pHYs chunk can be retrieved in several convenient
1998forms:
1999
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06002000 res_x = png_get_x_pixels_per_meter(png_ptr,
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06002001 info_ptr)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002002
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06002003 res_y = png_get_y_pixels_per_meter(png_ptr,
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06002004 info_ptr)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002005
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002006 res_x_and_y = png_get_pixels_per_meter(png_ptr,
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06002007 info_ptr)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002008
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05002009 res_x = png_get_x_pixels_per_inch(png_ptr,
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06002010 info_ptr)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002011
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05002012 res_y = png_get_y_pixels_per_inch(png_ptr,
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06002013 info_ptr)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002014
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05002015 res_x_and_y = png_get_pixels_per_inch(png_ptr,
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06002016 info_ptr)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002017
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002018 aspect_ratio = png_get_pixel_aspect_ratio(png_ptr,
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06002019 info_ptr)
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002020
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002021 Each of these returns 0 [signifying "unknown"] if
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002022 the data is not present or if res_x is 0;
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002023 res_x_and_y is 0 if res_x != res_y
2024
2025 Note that because of the way the resolutions are
2026 stored internally, the inch conversions won't
2027 come out to exactly even number. For example,
2028 72 dpi is stored as 0.28346 pixels/meter, and
2029 when this is retrieved it is 71.9988 dpi, so
2030 be sure to round the returned value appropriately
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06002031 if you want to display a reasonable-looking result.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002032
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05002033The data from the oFFs chunk can be retrieved in several convenient
2034forms:
2035
2036 x_offset = png_get_x_offset_microns(png_ptr, info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002037
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05002038 y_offset = png_get_y_offset_microns(png_ptr, info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002039
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05002040 x_offset = png_get_x_offset_inches(png_ptr, info_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002041
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05002042 y_offset = png_get_y_offset_inches(png_ptr, info_ptr);
2043
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002044 Each of these returns 0 [signifying "unknown" if both
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06002045 x and y are 0] if the data is not present or if the
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002046 chunk is present but the unit is the pixel. The
2047 remark about inexact inch conversions applies here
2048 as well, because a value in inches can't always be
2049 converted to microns and back without some loss
2050 of precision.
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05002051
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002052For more information, see the png_info definition in png.h and the
2053PNG specification for chunk contents. Be careful with trusting
2054rowbytes, as some of the transformations could increase the space
2055needed to hold a row (expand, filler, gray_to_rgb, etc.).
2056See png_read_update_info(), below.
2057
2058A quick word about text_ptr and num_text. PNG stores comments in
2059keyword/text pairs, one pair per chunk, with no limit on the number
2060of text chunks, and a 2^31 byte limit on their size. While there are
2061suggested keywords, there is no requirement to restrict the use to these
2062strings. It is strongly suggested that keywords and text be sensible
2063to humans (that's the point), so don't use abbreviations. Non-printing
2064symbols are not allowed. See the PNG specification for more details.
2065There is also no requirement to have text after the keyword.
2066
2067Keywords should be limited to 79 Latin-1 characters without leading or
2068trailing spaces, but non-consecutive spaces are allowed within the
2069keyword. It is possible to have the same keyword any number of times.
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002070The text_ptr is an array of png_text structures, each holding a
2071pointer to a language string, a pointer to a keyword and a pointer to
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05002072a text string. The text string, language code, and translated
2073keyword may be empty or NULL pointers. The keyword/text
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002074pairs are put into the array in the order that they are received.
2075However, some or all of the text chunks may be after the image, so, to
2076make sure you have read all the text chunks, don't mess with these
2077until after you read the stuff after the image. This will be
2078mentioned again below in the discussion that goes with png_read_end().
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002079
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06002080.SS Input transformations
2081
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002082After you've read the header information, you can set up the library
2083to handle any special transformations of the image data. The various
2084ways to transform the data will be described in the order that they
2085should occur. This is important, as some of these change the color
2086type and/or bit depth of the data, and some others only work on
2087certain color types and bit depths. Even though each transformation
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06002088checks to see if it has data that it can do something with, you should
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002089make sure to only enable a transformation if it will be valid for the
2090data. For example, don't swap red and blue on grayscale data.
2091
2092The colors used for the background and transparency values should be
2093supplied in the same format/depth as the current image data. They
2094are stored in the same format/depth as the image data in a bKGD or tRNS
2095chunk, so this is what libpng expects for this data. The colors are
2096transformed to keep in sync with the image data when an application
2097calls the png_read_update_info() routine (see below).
2098
2099Data will be decoded into the supplied row buffers packed into bytes
2100unless the library has been told to transform it into another format.
2101For example, 4 bit/pixel paletted or grayscale data will be returned
21022 pixels/byte with the leftmost pixel in the high-order bits of the
2103byte, unless png_set_packing() is called. 8-bit RGB data will be stored
Glenn Randers-Pehrson5b779162004-09-04 13:25:08 -05002104in RGB RGB RGB format unless png_set_filler() or png_set_add_alpha()
2105is called to insert filler bytes, either before or after each RGB triplet.
210616-bit RGB data will be returned RRGGBB RRGGBB, with the most significant
2107byte of the color value first, unless png_set_strip_16() is called to
Glenn Randers-Pehrson16e11662004-11-01 14:13:40 -06002108transform it to regular RGB RGB triplets, or png_set_filler() or
2109png_set_add alpha() is called to insert filler bytes, either before or
2110after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can
2111be modified with
Glenn Randers-Pehrson5b779162004-09-04 13:25:08 -05002112png_set_filler(), png_set_add_alpha(), or png_set_strip_16().
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002113
2114The following code transforms grayscale images of less than 8 to 8 bits,
2115changes paletted images to RGB, and adds a full alpha channel if there is
2116transparency information in a tRNS chunk. This is most useful on
2117grayscale images with bit depths of 2 or 4 or if there is a multiple-image
2118viewing application that wishes to treat all images in the same way.
2119
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05002120 if (color_type == PNG_COLOR_TYPE_PALETTE)
2121 png_set_palette_to_rgb(png_ptr);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002122
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002123 if (png_get_valid(png_ptr, info_ptr,
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05002124 PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr);
2125
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06002126 if (color_type == PNG_COLOR_TYPE_GRAY &&
2127 bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr);
2128
2129The first two functions are actually aliases for png_set_expand(), added
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05002130in libpng version 1.0.4, with the function names expanded to improve code
2131readability. In some future version they may actually do different
2132things.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002133
Glenn Randers-Pehrson1ce08362006-03-08 23:35:59 -06002134As of libpng version 1.2.9, png_set_expand_gray_1_2_4_to_8() was
2135added. It expands the sample depth without changing tRNS to alpha.
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05002136
John Bowler63d059a2011-02-12 09:03:44 -06002137As of libpng version 1.5.2, png_set_expand_16() was added. It behaves as
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06002138png_set_expand(), however, the resultant channels have 16 bits rather than 8.
2139Use this when the output color or gray channels are made linear to avoid fairly
John Bowler63d059a2011-02-12 09:03:44 -06002140severe accuracy loss.
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05002141
John Bowler63d059a2011-02-12 09:03:44 -06002142 if (bit_depth < 16)
2143 png_set_expand_16(png_ptr);
Glenn Randers-Pehrson1ce08362006-03-08 23:35:59 -06002144
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002145PNG can have files with 16 bits per channel. If you only can handle
21468 bits per channel, this will strip the pixels down to 8 bit.
2147
2148 if (bit_depth == 16)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002149 png_set_strip_16(png_ptr);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002150
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002151If, for some reason, you don't need the alpha channel on an image,
2152and you want to remove it rather than combining it with the background
2153(but the image author certainly had in mind that you *would* combine
2154it with the background, so that's what you should probably do):
2155
2156 if (color_type & PNG_COLOR_MASK_ALPHA)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002157 png_set_strip_alpha(png_ptr);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002158
John Bowler63d059a2011-02-12 09:03:44 -06002159See below for png_set_background(), which does the correct composition on a
2160single opaque color. This is probably what you should do in all cases rather
2161than use png_set_strip_alpha() - unless you know for sure that it is the wrong
2162thing to do.
2163
2164As of libpng version 1.5.2, almost all useful expansions are supported, the
2165major ommissions are convertion of grayscale to indexed images (which can be
2166done trivially in the application) and convertion of indexed to grayscale (which
2167can be done by a trivial manipulation of the palette.)
2168
2169In the following table, the 01 means grayscale with depth<8, 31 means
2170indexed with depth<8, other numerals represent the color type, "T" means
2171the tRNS chunk is present, A means an alpha channel is present, and O
2172means tRNS or alpha is present but all pixels in the image are opaque.
2173
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06002174 FROM 01 31 0 0T 0O 2 2T 2O 3 3T 3O 4A 4O 6A 6O
John Bowler63d059a2011-02-12 09:03:44 -06002175 TO
2176 01 - [G] - - - - - - - - - - - - -
2177 31 [Q] Q [Q] [Q] [Q] Q Q Q Q Q Q [Q] [Q] Q Q
2178 0 1 G + . . G G G G G G B B GB GB
2179 0T lt Gt t + . Gt G G Gt G G Bt Bt GBt GBt
2180 0O lt Gt t . + Gt Gt G Gt Gt G Bt Bt GBt GBt
2181 2 C P C C C + . . C - - CB CB B B
2182 2T Ct - Ct C C t + t - - - CBt CBt Bt Bt
2183 2O Ct - Ct C C t t + - - - CBt CBt Bt Bt
2184 3 [Q] p [Q] [Q] [Q] Q Q Q + . . [Q] [Q] Q Q
2185 3T [Qt] p [Qt][Q] [Q] Qt Qt Qt t + t [Qt][Qt] Qt Qt
2186 3O [Qt] p [Qt][Q] [Q] Qt Qt Qt t t + [Qt][Qt] Qt Qt
2187 4A lA G A T T GA GT GT GA GT GT + BA G GBA
2188 4O lA GBA A T T GA GT GT GA GT GT BA + GBA G
2189 6A CA PA CA C C A T tT PA P P C CBA + BA
2190 6O CA PBA CA C C A tT T PA P P CBA C BA +
2191
2192Within the matrix,
2193 "+" identifies entries where 'from' and 'to' are the same.
2194 "-" means the transformation is not supported.
2195 "." means nothing is necessary (a tRNS chunk can just be ignored).
2196 "t" means the transformation is obtained by png_set_tRNS.
2197 "A" means the transformation is obtained by png_set_add_alpha().
2198 "X" means the transformation is obtained by png_set_expand().
2199 "1" means the transformation is obtained by
2200 png_set_expand_gray_1_2_4_to_8() (and by png_set_expand() if there
2201 is no transparency in the original or the final format).
2202 "C" means the transformation is obtained by png_set_gray_to_rgb().
2203 "G" means the transformation is obtained by png_set_rgb_to_gray() or
2204 png_set_rgb_to_Y().
2205 "P" means the transformation is obtained by
2206 png_set_expand_palette_to_rgb().
2207 "p" means the transformation is obtained by png_set_packing().
2208 "Q" means the transformation is obtained by png_set_quantize().
2209 "T" means the transformation is obtained by png_set_tRNS_to_alpha().
2210 "B" means the transformation is obtained by png_set_background(), or
2211 png_strip_alpha().
John Bowler63d059a2011-02-12 09:03:44 -06002212
2213When an entry has multiple transforms listed all are required to cause the
2214right overall transformation. When two transforms are separated by a comma
2215either will do the job. When transforms are enclosed in [] the transform should
2216do the job but this is currently unimplemented - a different format will result
2217if the suggested transformations are used.
2218
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002219In PNG files, the alpha channel in an image
2220is the level of opacity. If you need the alpha channel in an image to
2221be the level of transparency instead of opacity, you can invert the
2222alpha channel (or the tRNS chunk data) after it's read, so that 0 is
2223fully opaque and 255 (in 8-bit or paletted images) or 65535 (in 16-bit
2224images) is fully transparent, with
2225
2226 png_set_invert_alpha(png_ptr);
2227
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002228PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as
2229they can, resulting in, for example, 8 pixels per byte for 1 bit
2230files. This code expands to 1 pixel per byte without changing the
2231values of the pixels:
2232
2233 if (bit_depth < 8)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002234 png_set_packing(png_ptr);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002235
2236PNG files have possible bit depths of 1, 2, 4, 8, and 16. All pixels
2237stored in a PNG image have been "scaled" or "shifted" up to the next
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06002238higher possible bit depth (e.g. from 5 bits/sample in the range [0,31]
2239to 8 bits/sample in the range [0, 255]). However, it is also possible
2240to convert the PNG pixel data back to the original bit depth of the
2241image. This call reduces the pixels back down to the original bit depth:
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002242
Glenn Randers-Pehrson1ea0ff32001-08-07 22:25:59 -05002243 png_color_8p sig_bit;
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002244
2245 if (png_get_sBIT(png_ptr, info_ptr, &sig_bit))
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002246 png_set_shift(png_ptr, sig_bit);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002247
2248PNG files store 3-color pixels in red, green, blue order. This code
2249changes the storage of the pixels to blue, green, red:
2250
2251 if (color_type == PNG_COLOR_TYPE_RGB ||
2252 color_type == PNG_COLOR_TYPE_RGB_ALPHA)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002253 png_set_bgr(png_ptr);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002254
Glenn Randers-Pehrson1b8e5672001-08-25 06:46:06 -05002255PNG files store RGB pixels packed into 3 or 6 bytes. This code expands them
2256into 4 or 8 bytes for windowing systems that need them in this format:
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002257
Glenn Randers-Pehrson1b8e5672001-08-25 06:46:06 -05002258 if (color_type == PNG_COLOR_TYPE_RGB)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002259 png_set_filler(png_ptr, filler, PNG_FILLER_BEFORE);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002260
Glenn Randers-Pehrson896239b1998-04-21 15:03:57 -05002261where "filler" is the 8 or 16-bit number to fill with, and the location is
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002262either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether
2263you want the filler before the RGB or after. This transformation
Glenn Randers-Pehrson1b8e5672001-08-25 06:46:06 -05002264does not affect images that already have full alpha channels. To add an
2265opaque alpha channel, use filler=0xff or 0xffff and PNG_FILLER_AFTER which
2266will generate RGBA pixels.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002267
Glenn Randers-Pehrson5b779162004-09-04 13:25:08 -05002268Note that png_set_filler() does not change the color type. If you want
2269to do that, you can add a true alpha channel with
2270
2271 if (color_type == PNG_COLOR_TYPE_RGB ||
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002272 color_type == PNG_COLOR_TYPE_GRAY)
2273 png_set_add_alpha(png_ptr, filler, PNG_FILLER_AFTER);
Glenn Randers-Pehrson5b779162004-09-04 13:25:08 -05002274
2275where "filler" contains the alpha value to assign to each pixel.
Glenn Randers-Pehrson16e11662004-11-01 14:13:40 -06002276This function was added in libpng-1.2.7.
Glenn Randers-Pehrson5b779162004-09-04 13:25:08 -05002277
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002278If you are reading an image with an alpha channel, and you need the
2279data as ARGB instead of the normal PNG format RGBA:
2280
2281 if (color_type == PNG_COLOR_TYPE_RGB_ALPHA)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002282 png_set_swap_alpha(png_ptr);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002283
2284For some uses, you may want a grayscale image to be represented as
2285RGB. This code will do that conversion:
2286
2287 if (color_type == PNG_COLOR_TYPE_GRAY ||
2288 color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002289 png_set_gray_to_rgb(png_ptr);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002290
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002291Conversely, you can convert an RGB or RGBA image to grayscale or grayscale
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002292with alpha.
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002293
2294 if (color_type == PNG_COLOR_TYPE_RGB ||
2295 color_type == PNG_COLOR_TYPE_RGB_ALPHA)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002296 png_set_rgb_to_gray_fixed(png_ptr, error_action,
2297 int red_weight, int green_weight);
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002298
2299 error_action = 1: silently do the conversion
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002300
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002301 error_action = 2: issue a warning if the original
2302 image has any pixel where
2303 red != green or red != blue
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002304
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002305 error_action = 3: issue an error and abort the
2306 conversion if the original
2307 image has any pixel where
2308 red != green or red != blue
2309
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002310 red_weight: weight of red component times 100000
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002311
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002312 green_weight: weight of green component times 100000
2313 If either weight is negative, default
2314 weights (21268, 71514) are used.
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002315
2316If you have set error_action = 1 or 2, you can
2317later check whether the image really was gray, after processing
2318the image rows, with the png_get_rgb_to_gray_status(png_ptr) function.
2319It will return a png_byte that is zero if the image was gray or
23201 if there were any non-gray pixels. bKGD and sBIT data
2321will be silently converted to grayscale, using the green channel
2322data, regardless of the error_action setting.
2323
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002324With red_weight+green_weight<=100000,
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002325the normalized graylevel is computed:
2326
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002327 int rw = red_weight * 65536;
2328 int gw = green_weight * 65536;
2329 int bw = 65536 - (rw + gw);
2330 gray = (rw*red + gw*green + bw*blue)/65536;
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002331
2332The default values approximate those recommended in the Charles
2333Poynton's Color FAQ, <http://www.inforamp.net/~poynton/>
Glenn Randers-Pehrson5dd2b8e2004-11-24 07:50:16 -06002334Copyright (c) 1998-01-04 Charles Poynton <poynton at inforamp.net>
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002335
2336 Y = 0.212671 * R + 0.715160 * G + 0.072169 * B
2337
Glenn Randers-Pehrson9962b842011-01-24 00:12:14 -06002338Libpng approximates this with integers scaled by 32768:
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002339
Glenn Randers-Pehrson9962b842011-01-24 00:12:14 -06002340 Y = (6968 * R + 23434 * G + 2366 * B)/32768
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002341
2342The calculation is done in a linear colorspace, if the image gamma
Glenn Randers-Pehrson9962b842011-01-24 00:12:14 -06002343can be determined.
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002344
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06002345If you have a grayscale and you are using png_set_expand_gray_1_2_4_to_8(),
Glenn Randers-Pehrson73d57cb2002-03-25 18:49:08 -06002346png_set_expand(), or png_set_gray_to_rgb to change to truecolor or to
Glenn Randers-Pehrsond0dce401998-05-09 10:02:29 -05002347a higher bit-depth, you must either supply the background color as a gray
2348value at the original file bit-depth (need_expand = 1) or else supply the
2349background color as an RGB triplet at the final, expanded bit depth
2350(need_expand = 0). Similarly, if you are reading a paletted image, you
2351must either supply the background color as a palette index (need_expand = 1)
2352or as an RGB triplet that may or may not be in the palette (need_expand = 0).
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002353
2354 png_color_16 my_background;
2355 png_color_16p image_background;
2356
Glenn Randers-Pehrsond0dce401998-05-09 10:02:29 -05002357 if (png_get_bKGD(png_ptr, info_ptr, &image_background))
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002358 png_set_background(png_ptr, image_background,
2359 PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002360 else
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002361 png_set_background(png_ptr, &my_background,
2362 PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002363
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05002364The png_set_background() function tells libpng to composite images
2365with alpha or simple transparency against the supplied background
2366color. If the PNG file contains a bKGD chunk (PNG_INFO_bKGD valid),
2367you may use this color, or supply another color more suitable for
2368the current display (e.g., the background color from a web page). You
2369need to tell libpng whether the color is in the gamma space of the
2370display (PNG_BACKGROUND_GAMMA_SCREEN for colors you supply), the file
2371(PNG_BACKGROUND_GAMMA_FILE for colors from the bKGD chunk), or one
2372that is neither of these gammas (PNG_BACKGROUND_GAMMA_UNIQUE - I don't
2373know why anyone would use this, but it's here).
2374
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002375To properly display PNG images on any kind of system, the application needs
2376to know what the display gamma is. Ideally, the user will know this, and
2377the application will allow them to set it. One method of allowing the user
Glenn Randers-Pehrsonbcfd15d1999-10-01 14:22:25 -05002378to set the display gamma separately for each system is to check for a
2379SCREEN_GAMMA or DISPLAY_GAMMA environment variable, which will hopefully be
2380correctly set.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002381
Glenn Randers-Pehrsonbcfd15d1999-10-01 14:22:25 -05002382Note that display_gamma is the overall gamma correction required to produce
2383pleasing results, which depends on the lighting conditions in the surrounding
2384environment. In a dim or brightly lit room, no compensation other than
2385the physical gamma exponent of the monitor is needed, while in a dark room
2386a slightly smaller exponent is better.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002387
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05002388 double gamma, screen_gamma;
2389
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002390 if (/* We have a user-defined screen
2391 gamma value */)
2392 {
2393 screen_gamma = user_defined_screen_gamma;
2394 }
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002395
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002396 /* One way that applications can share the same
2397 screen gamma value */
2398 else if ((gamma_str = getenv("SCREEN_GAMMA"))
2399 != NULL)
2400 {
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05002401 screen_gamma = (double)atof(gamma_str);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002402 }
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002403
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002404 /* If we don't have another value */
2405 else
2406 {
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002407 screen_gamma = 2.2; /* A good guess for a
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06002408 PC monitor in a bright office or a dim room */
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002409
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002410 screen_gamma = 2.0; /* A good guess for a
2411 PC monitor in a dark room */
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002412
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002413 screen_gamma = 1.7 or 1.0; /* A good
2414 guess for Mac systems */
2415 }
2416
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -05002417The functions png_set_gamma() and its fixed point equivalent
2418png_set_gamma_fixed() handle gamma transformations of the data.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002419Pass both the file gamma and the current screen_gamma. If the file does
2420not have a gamma value, you can pass one anyway if you have an idea what
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002421it is (usually 0.45455 is a good guess for GIF images on PCs). Note
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002422that file gammas are inverted from screen gammas. See the discussions
2423on gamma in the PNG specification for an excellent description of what
2424gamma is, and why all applications should support it. It is strongly
2425recommended that PNG viewers support gamma correction.
2426
Glenn Randers-Pehrsonc7822512011-05-07 21:23:43 -05002427This API unconditionally sets the screen and file gamma values, so it will
2428override the value in the PNG file unless it is called before the PNG file
2429reading starts. For this reason you must always call it with the PNG file
2430value when you call it in this position:
2431
Glenn Randers-Pehrson8d0bc0f2011-01-25 22:15:58 -06002432 if (png_get_gAMA(png_ptr, info_ptr, &file_gamma))
2433 png_set_gamma(png_ptr, screen_gamma, file_gamma);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002434
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002435 else
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002436 png_set_gamma(png_ptr, screen_gamma, 0.45455);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002437
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05002438If you need to reduce an RGB file to a paletted file, or if a paletted
2439file has more entries then will fit on your screen, png_set_quantize()
Glenn Randers-Pehrson862cb202010-04-16 22:12:51 -05002440will do that. Note that this is a simple match quantization that merely
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05002441finds the closest color available. This should work fairly well with
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002442optimized palettes, but fairly badly with linear color cubes. If you
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05002443pass a palette that is larger then maximum_colors, the file will
2444reduce the number of colors in the palette so it will fit into
2445maximum_colors. If there is a histogram, it will use it to make
2446more intelligent choices when reducing the palette. If there is no
2447histogram, it may not do as good a job.
2448
2449 if (color_type & PNG_COLOR_MASK_COLOR)
2450 {
2451 if (png_get_valid(png_ptr, info_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002452 PNG_INFO_PLTE))
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05002453 {
2454 png_uint_16p histogram = NULL;
2455
2456 png_get_hIST(png_ptr, info_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002457 &histogram);
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05002458 png_set_quantize(png_ptr, palette, num_palette,
2459 max_screen_colors, histogram, 1);
2460 }
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002461
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05002462 else
2463 {
2464 png_color std_color_cube[MAX_SCREEN_COLORS] =
2465 { ... colors ... };
2466
2467 png_set_quantize(png_ptr, std_color_cube,
2468 MAX_SCREEN_COLORS, MAX_SCREEN_COLORS,
2469 NULL,0);
2470 }
2471 }
2472
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002473PNG files describe monochrome as black being zero and white being one.
2474The following code will reverse this (make black be one and white be
2475zero):
2476
Glenn Randers-Pehrson1ea0ff32001-08-07 22:25:59 -05002477 if (bit_depth == 1 && color_type == PNG_COLOR_TYPE_GRAY)
2478 png_set_invert_mono(png_ptr);
2479
2480This function can also be used to invert grayscale and gray-alpha images:
2481
2482 if (color_type == PNG_COLOR_TYPE_GRAY ||
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002483 color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002484 png_set_invert_mono(png_ptr);
2485
2486PNG files store 16 bit pixels in network byte order (big-endian,
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06002487ie. most significant bits first). This code changes the storage to the
2488other way (little-endian, i.e. least significant bits first, the
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002489way PCs store them):
2490
2491 if (bit_depth == 16)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002492 png_set_swap(png_ptr);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002493
2494If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you
2495need to change the order the pixels are packed into bytes, you can use:
2496
2497 if (bit_depth < 8)
2498 png_set_packswap(png_ptr);
2499
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002500Finally, you can write your own transformation function if none of
2501the existing ones meets your needs. This is done by setting a callback
2502with
2503
2504 png_set_read_user_transform_fn(png_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002505 read_transform_fn);
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002506
2507You must supply the function
2508
Glenn Randers-Pehrson93215672011-02-13 19:42:19 -06002509 void read_transform_fn(png_structp png_ptr, png_row_infop
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002510 row_info, png_bytep data)
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002511
2512See pngtest.c for a working example. Your function will be called
John Bowlerf19abd62011-01-22 18:29:24 -06002513after all of the other transformations have been processed. Take care with
2514interlaced images if you do the interlace yourself - the width of the row is the
2515width in 'row_info', not the overall image width.
2516
2517If supported libpng provides two information routines that you can use to find
2518where you are in processing the image:
2519
2520 png_get_current_pass_number(png_structp png_ptr);
2521 png_get_current_row_number(png_structp png_ptr);
2522
2523Don't try using these outside a transform callback - firstly they are only
2524supported if user transforms are supported, secondly they may well return
2525unexpected results unless the row is actually being processed at the moment they
2526are called.
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002527
John Bowlercd113452011-02-16 06:15:13 -06002528With interlaced
2529images the value returned is the row in the input sub-image image. Use
2530PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to
2531find the output pixel (x,y) given an interlaced sub-image pixel (row,col,pass).
2532
2533The discussion of interlace handling above contains more information on how to
2534use these values.
2535
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002536You can also set up a pointer to a user structure for use by your
2537callback function, and you can inform libpng that your transform
2538function will change the number of channels or bit depth with the
2539function
2540
2541 png_set_user_transform_info(png_ptr, user_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002542 user_depth, user_channels);
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002543
2544The user's application, not libpng, is responsible for allocating and
2545freeing any memory required for the user structure.
2546
2547You can retrieve the pointer via the function
2548png_get_user_transform_ptr(). For example:
2549
2550 voidp read_user_transform_ptr =
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002551 png_get_user_transform_ptr(png_ptr);
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002552
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002553The last thing to handle is interlacing; this is covered in detail below,
2554but you must call the function here if you want libpng to handle expansion
2555of the interlaced image.
2556
2557 number_of_passes = png_set_interlace_handling(png_ptr);
2558
2559After setting the transformations, libpng can update your png_info
2560structure to reflect any transformations you've requested with this
2561call. This is most useful to update the info structure's rowbytes
2562field so you can use it to allocate your image memory. This function
2563will also update your palette with the correct screen_gamma and
2564background if these have been given with the calls above.
2565
2566 png_read_update_info(png_ptr, info_ptr);
2567
2568After you call png_read_update_info(), you can allocate any
2569memory you need to hold the image. The row data is simply
2570raw byte data for all forms of images. As the actual allocation
2571varies among applications, no example will be given. If you
2572are allocating one large chunk, you will need to build an
2573array of pointers to each row, as it will be needed for some
2574of the functions below.
2575
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002576Remember: Before you call png_read_update_info(), the png_get_
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06002577functions return the values corresponding to the original PNG image.
2578After you call png_read_update_info the values refer to the image
2579that libpng will output. Consequently you must call all the png_set_
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002580functions before you call png_read_update_info(). This is particularly
2581important for png_set_interlace_handling() - if you are going to call
2582png_read_update_info() you must call png_set_interlace_handling() before
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06002583it unless you want to receive interlaced output.
2584
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06002585.SS Reading image data
2586
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002587After you've allocated memory, you can read the image data.
2588The simplest way to do this is in one function call. If you are
2589allocating enough memory to hold the whole image, you can just
2590call png_read_image() and libpng will read in all the image data
2591and put it in the memory area supplied. You will need to pass in
2592an array of pointers to each row.
2593
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06002594This function automatically handles interlacing, so you don't
2595need to call png_set_interlace_handling() (unless you call
2596png_read_update_info()) or call this function multiple times, or any
2597of that other stuff necessary with png_read_rows().
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002598
2599 png_read_image(png_ptr, row_pointers);
2600
2601where row_pointers is:
2602
2603 png_bytep row_pointers[height];
2604
2605You can point to void or char or whatever you use for pixels.
2606
2607If you don't want to read in the whole image at once, you can
2608use png_read_rows() instead. If there is no interlacing (check
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06002609interlace_type == PNG_INTERLACE_NONE), this is simple:
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002610
2611 png_read_rows(png_ptr, row_pointers, NULL,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002612 number_of_rows);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002613
2614where row_pointers is the same as in the png_read_image() call.
2615
2616If you are doing this just one row at a time, you can do this with
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002617a single row_pointer instead of an array of row_pointers:
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002618
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002619 png_bytep row_pointer = row;
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05002620 png_read_row(png_ptr, row_pointer, NULL);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002621
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05002622If the file is interlaced (interlace_type != 0 in the IHDR chunk), things
2623get somewhat harder. The only current (PNG Specification version 1.2)
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06002624interlacing type for PNG is (interlace_type == PNG_INTERLACE_ADAM7);
2625a somewhat complicated 2D interlace scheme, known as Adam7, that
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002626breaks down an image into seven smaller images of varying size, based
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06002627on an 8x8 grid. This number is defined (from libpng 1.5) as
2628PNG_INTERLACE_ADAM7_PASSES in png.h
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002629
2630libpng can fill out those images or it can give them to you "as is".
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06002631It is almost always better to have libpng handle the interlacing for you.
2632If you want the images filled out, there are two ways to do that. The one
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002633mentioned in the PNG specification is to expand each pixel to cover
2634those pixels that have not been read yet (the "rectangle" method).
2635This results in a blocky image for the first pass, which gradually
2636smooths out as more pixels are read. The other method is the "sparkle"
2637method, where pixels are drawn only in their final locations, with the
2638rest of the image remaining whatever colors they were initialized to
2639before the start of the read. The first method usually looks better,
2640but tends to be slower, as there are more pixels to put in the rows.
2641
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06002642If, as is likely, you want libpng to expand the images, call this before
2643calling png_start_read_image() or png_read_update_info():
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002644
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06002645 if (interlace_type == PNG_INTERLACE_ADAM7)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002646 number_of_passes
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002647 = png_set_interlace_handling(png_ptr);
2648
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06002649This will return the number of passes needed. Currently, this is seven,
2650but may change if another interlace type is added. This function can be
2651called even if the file is not interlaced, where it will return one pass.
2652You then need to read the whole image 'number_of_passes' times. Each time
2653will distribute the pixels from the current pass to the correct place in
2654the output image, so you need to supply the same rows to png_read_rows in
2655each pass.
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -05002656
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002657If you are not going to display the image after each pass, but are
2658going to wait until the entire image is read in, use the sparkle
2659effect. This effect is faster and the end result of either method
2660is exactly the same. If you are planning on displaying the image
2661after each pass, the "rectangle" effect is generally considered the
2662better looking one.
2663
2664If you only want the "sparkle" effect, just call png_read_rows() as
2665normal, with the third parameter NULL. Make sure you make pass over
2666the image number_of_passes times, and you don't change the data in the
2667rows between calls. You can change the locations of the data, just
2668not the data. Each pass only writes the pixels appropriate for that
2669pass, and assumes the data from previous passes is still valid.
2670
2671 png_read_rows(png_ptr, row_pointers, NULL,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002672 number_of_rows);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002673
2674If you only want the first effect (the rectangles), do the same as
2675before except pass the row buffer in the third parameter, and leave
2676the second parameter NULL.
2677
2678 png_read_rows(png_ptr, NULL, row_pointers,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002679 number_of_rows);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002680
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06002681If you don't want libpng to handle the interlacing details, just call
2682png_read_rows() PNG_INTERLACE_ADAM7_PASSES times to read in all the images.
2683Each of the images is a valid image by itself, however you will almost
2684certainly need to distribute the pixels from each sub-image to the
2685correct place. This is where everything gets very tricky.
2686
2687If you want to retrieve the separate images you must pass the correct
2688number of rows to each successive call of png_read_rows(). The calculation
2689gets pretty complicated for small images, where some sub-images may
2690not even exist because either their width or height ends up zero.
2691libpng provides two macros to help you in 1.5 and later versions:
2692
2693 png_uint_32 width = PNG_PASS_COLS(image_width, pass_number);
2694 png_uint_32 height = PNG_PASS_ROWS(image_height, pass_number);
2695
2696Respectively these tell you the width and height of the sub-image
2697corresponding to the numbered pass. 'pass' is in in the range 0 to 6 -
2698this can be confusing because the specification refers to the same passes
2699as 1 to 7! Be careful, you must check both the width and height before
2700calling png_read_rows() and not call it for that pass if either is zero.
2701
2702You can, of course, read each sub-image row by row. If you want to
2703produce optimal code to make a pixel-by-pixel transformation of an
2704interlaced image this is the best approach; read each row of each pass,
2705transform it, and write it out to a new interlaced image.
2706
2707If you want to de-interlace the image yourself libpng provides further
2708macros to help that tell you where to place the pixels in the output image.
2709Because the interlacing scheme is rectangular - sub-image pixels are always
2710arranged on a rectangular grid - all you need to know for each pass is the
2711starting column and row in the output image of the first pixel plus the
2712spacing between each pixel. As of libpng 1.5 there are four macros to
2713retrieve this information:
2714
2715 png_uint_32 x = PNG_PASS_START_COL(pass);
2716 png_uint_32 y = PNG_PASS_START_ROW(pass);
2717 png_uint_32 xStep = 1U << PNG_PASS_COL_SHIFT(pass);
2718 png_uint_32 yStep = 1U << PNG_PASS_ROW_SHIFT(pass);
2719
2720These allow you to write the obvious loop:
2721
2722 png_uint_32 input_y = 0;
2723 png_uint_32 output_y = PNG_PASS_START_ROW(pass);
2724
2725 while (output_y < output_image_height)
2726 {
2727 png_uint_32 input_x = 0;
2728 png_uint_32 output_x = PNG_PASS_START_COL(pass);
2729
2730 while (output_x < output_image_width)
2731 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002732 image[output_y][output_x] =
2733 subimage[pass][input_y][input_x++];
2734
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06002735 output_x += xStep;
2736 }
2737
2738 ++input_y;
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002739 output_y += yStep;
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06002740 }
2741
2742Notice that the steps between successive output rows and columns are
2743returned as shifts. This is possible because the pixels in the subimages
2744are always a power of 2 apart - 1, 2, 4 or 8 pixels - in the original
2745image. In practice you may need to directly calculate the output coordinate
2746given an input coordinate. libpng provides two further macros for this
2747purpose:
2748
2749 png_uint_32 output_x = PNG_COL_FROM_PASS_COL(input_x, pass);
2750 png_uint_32 output_y = PNG_ROW_FROM_PASS_ROW(input_y, pass);
2751
2752Finally a pair of macros are provided to tell you if a particular image
2753row or column appears in a given pass:
2754
2755 int col_in_pass = PNG_COL_IN_INTERLACE_PASS(output_x, pass);
2756 int row_in_pass = PNG_ROW_IN_INTERLACE_PASS(output_y, pass);
2757
2758Bear in mind that you will probably also need to check the width and height
2759of the pass in addition to the above to be sure the pass even exists!
2760
2761With any luck you are convinced by now that you don't want to do your own
2762interlace handling. In reality normally the only good reason for doing this
2763is if you are processing PNG files on a pixel-by-pixel basis and don't want
2764to load the whole file into memory when it is interlaced.
2765
2766libpng includes a test program, pngvalid, that illustrates reading and
2767writing of interlaced images. If you can't get interlacing to work in your
2768code and don't want to leave it to libpng (the recommended approach) see
2769how pngvalid.c does it.
2770
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06002771.SS Finishing a sequential read
2772
Glenn Randers-Pehrson9c3ab682006-02-20 22:09:05 -06002773After you are finished reading the image through the
2774low-level interface, you can finish reading the file. If you are
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06002775interested in comments or time, which may be stored either before or
2776after the image data, you should pass the separate png_info struct if
2777you want to keep the comments from before and after the image
Glenn Randers-Pehrson20786be2011-04-20 22:20:40 -05002778separate.
2779
2780 png_infop end_info = png_create_info_struct(png_ptr);
2781
2782 if (!end_info)
2783 {
2784 png_destroy_read_struct(&png_ptr, &info_ptr,
2785 (png_infopp)NULL);
2786 return (ERROR);
2787 }
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002788
2789 png_read_end(png_ptr, end_info);
2790
Glenn Randers-Pehrson20786be2011-04-20 22:20:40 -05002791If you are not interested, you should still call png_read_end()
2792but you can pass NULL, avoiding the need to create an end_info structure.
2793
2794 png_read_end(png_ptr, (png_infop)NULL);
2795
Glenn Randers-Pehrson99778e12011-04-20 17:43:52 -05002796If you don't call png_read_end(), then your file pointer will be
2797left pointing to the first chunk after the last IDAT, which is probably
2798not what you want if you expect to read something beyond the end of
2799the PNG datastream.
2800
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002801When you are done, you can free all memory allocated by libpng like this:
2802
2803 png_destroy_read_struct(&png_ptr, &info_ptr,
2804 &end_info);
2805
Glenn Randers-Pehrson20786be2011-04-20 22:20:40 -05002806or, if you didn't create an end_info structure,
2807
2808 png_destroy_read_struct(&png_ptr, &info_ptr,
2809 (png_infopp)NULL);
2810
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002811It is also possible to individually free the info_ptr members that
Glenn Randers-Pehrsonfc4a1432000-05-17 17:39:34 -05002812point to libpng-allocated storage with the following function:
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002813
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06002814 png_free_data(png_ptr, info_ptr, mask, seq)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002815
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05002816 mask - identifies data to be freed, a mask
Glenn Randers-Pehrsonebd7f9a2006-10-19 09:37:56 -05002817 containing the bitwise OR of one or
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05002818 more of
2819 PNG_FREE_PLTE, PNG_FREE_TRNS,
2820 PNG_FREE_HIST, PNG_FREE_ICCP,
2821 PNG_FREE_PCAL, PNG_FREE_ROWS,
2822 PNG_FREE_SCAL, PNG_FREE_SPLT,
2823 PNG_FREE_TEXT, PNG_FREE_UNKN,
2824 or simply PNG_FREE_ALL
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002825
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06002826 seq - sequence number of item to be freed
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05002827 (-1 for all items)
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002828
Glenn Randers-Pehrsonfc4a1432000-05-17 17:39:34 -05002829This function may be safely called when the relevant storage has
Glenn Randers-Pehrson68ea2432000-04-01 21:10:05 -06002830already been freed, or has not yet been allocated, or was allocated
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06002831by the user and not by libpng, and will in those cases do nothing.
2832The "seq" parameter is ignored if only one item of the selected data
2833type, such as PLTE, is allowed. If "seq" is not -1, and multiple items
2834are allowed for the data type identified in the mask, such as text or
2835sPLT, only the n'th item in the structure is freed, where n is "seq".
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06002836
Glenn Randers-Pehrson38e6e772000-04-09 19:06:13 -05002837The default behavior is only to free data that was allocated internally
2838by libpng. This can be changed, so that libpng will not free the data,
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05002839or so that it will free data that was allocated by the user with png_malloc()
2840or png_zalloc() and passed in via a png_set_*() function, with
Glenn Randers-Pehrson38e6e772000-04-09 19:06:13 -05002841
2842 png_data_freer(png_ptr, info_ptr, freer, mask)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002843
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05002844 freer - one of
2845 PNG_DESTROY_WILL_FREE_DATA
2846 PNG_SET_WILL_FREE_DATA
2847 PNG_USER_WILL_FREE_DATA
Glenn Randers-Pehrson38e6e772000-04-09 19:06:13 -05002848
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002849 mask - which data elements are affected
2850 same choices as in png_free_data()
2851
Glenn Randers-Pehrson38e6e772000-04-09 19:06:13 -05002852This function only affects data that has already been allocated.
2853You can call this function after reading the PNG data but before calling
2854any png_set_*() functions, to control whether the user or the png_set_*()
2855function is responsible for freeing any existing data that might be present,
2856and again after the png_set_*() functions to control whether the user
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05002857or png_destroy_*() is supposed to free the data. When the user assumes
2858responsibility for libpng-allocated data, the application must use
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05002859png_free() to free it, and when the user transfers responsibility to libpng
2860for data that the user has allocated, the user must have used png_malloc()
Glenn Randers-Pehrsonb1828932001-06-23 08:03:17 -05002861or png_zalloc() to allocate it.
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05002862
2863If you allocated your row_pointers in a single block, as suggested above in
2864the description of the high level read interface, you must not transfer
2865responsibility for freeing it to the png_set_rows or png_read_destroy function,
2866because they would also try to free the individual row_pointers[i].
Glenn Randers-Pehrson38e6e772000-04-09 19:06:13 -05002867
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05002868If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword
2869separately, do not transfer responsibility for freeing text_ptr to libpng,
2870because when libpng fills a png_text structure it combines these members with
2871the key member, and png_free_data() will free only text_ptr.key. Similarly,
2872if you transfer responsibility for free'ing text_ptr from libpng to your
2873application, your application must not separately free those members.
2874
Glenn Randers-Pehrsonfc4a1432000-05-17 17:39:34 -05002875The png_free_data() function will turn off the "valid" flag for anything
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06002876it frees. If you need to turn the flag off for a chunk that was freed by
2877your application instead of by libpng, you can use
Glenn Randers-Pehrsonfc4a1432000-05-17 17:39:34 -05002878
2879 png_set_invalid(png_ptr, info_ptr, mask);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002880
Glenn Randers-Pehrsonfc4a1432000-05-17 17:39:34 -05002881 mask - identifies the chunks to be made invalid,
Glenn Randers-Pehrsonebd7f9a2006-10-19 09:37:56 -05002882 containing the bitwise OR of one or
Glenn Randers-Pehrsond56aca72000-11-23 11:51:42 -06002883 more of
Glenn Randers-Pehrsonfc4a1432000-05-17 17:39:34 -05002884 PNG_INFO_gAMA, PNG_INFO_sBIT,
2885 PNG_INFO_cHRM, PNG_INFO_PLTE,
2886 PNG_INFO_tRNS, PNG_INFO_bKGD,
2887 PNG_INFO_hIST, PNG_INFO_pHYs,
2888 PNG_INFO_oFFs, PNG_INFO_tIME,
2889 PNG_INFO_pCAL, PNG_INFO_sRGB,
2890 PNG_INFO_iCCP, PNG_INFO_sPLT,
2891 PNG_INFO_sCAL, PNG_INFO_IDAT
2892
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002893For a more compact example of reading a PNG image, see the file example.c.
2894
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06002895.SS Reading PNG files progressively
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002896
2897The progressive reader is slightly different then the non-progressive
2898reader. Instead of calling png_read_info(), png_read_rows(), and
2899png_read_end(), you make one call to png_process_data(), which calls
2900callbacks when it has the info, a row, or the end of the image. You
2901set up these callbacks with png_set_progressive_read_fn(). You don't
2902have to worry about the input/output functions of libpng, as you are
2903giving the library the data directly in png_process_data(). I will
2904assume that you have read the section on reading PNG files above,
2905so I will only highlight the differences (although I will show
2906all of the code).
2907
2908png_structp png_ptr;
2909png_infop info_ptr;
2910
2911 /* An example code fragment of how you would
2912 initialize the progressive reader in your
2913 application. */
2914 int
2915 initialize_png_reader()
2916 {
2917 png_ptr = png_create_read_struct
Glenn Randers-Pehrsond0dce401998-05-09 10:02:29 -05002918 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002919 user_error_fn, user_warning_fn);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002920
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002921 if (!png_ptr)
Glenn Randers-Pehrson104622b2000-05-29 08:58:03 -05002922 return (ERROR);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002923
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002924 info_ptr = png_create_info_struct(png_ptr);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002925
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002926 if (!info_ptr)
2927 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002928 png_destroy_read_struct(&png_ptr,
2929 (png_infopp)NULL, (png_infopp)NULL);
2930 return (ERROR);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002931 }
2932
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002933 if (setjmp(png_jmpbuf(png_ptr)))
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002934 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002935 png_destroy_read_struct(&png_ptr, &info_ptr,
2936 (png_infopp)NULL);
2937 return (ERROR);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002938 }
2939
2940 /* This one's new. You can provide functions
2941 to be called when the header info is valid,
2942 when each row is completed, and when the image
2943 is finished. If you aren't using all functions,
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002944 you can specify NULL parameters. Even when all
2945 three functions are NULL, you need to call
2946 png_set_progressive_read_fn(). You can use
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002947 any struct as the user_ptr (cast to a void pointer
2948 for the function call), and retrieve the pointer
2949 from inside the callbacks using the function
2950
2951 png_get_progressive_ptr(png_ptr);
2952
2953 which will return a void pointer, which you have
2954 to cast appropriately.
2955 */
2956 png_set_progressive_read_fn(png_ptr, (void *)user_ptr,
2957 info_callback, row_callback, end_callback);
2958
2959 return 0;
2960 }
2961
2962 /* A code fragment that you call as you receive blocks
2963 of data */
2964 int
2965 process_data(png_bytep buffer, png_uint_32 length)
2966 {
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06002967 if (setjmp(png_jmpbuf(png_ptr)))
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002968 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002969 png_destroy_read_struct(&png_ptr, &info_ptr,
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002970 (png_infopp)NULL);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06002971 return (ERROR);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002972 }
2973
2974 /* This one's new also. Simply give it a chunk
2975 of data from the file stream (in order, of
2976 course). On machines with segmented memory
2977 models machines, don't give it any more than
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002978 64K. The library seems to run fine with sizes
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002979 of 4K. Although you can give it much less if
2980 necessary (I assume you can give it chunks of
2981 1 byte, I haven't tried less then 256 bytes
2982 yet). When this function returns, you may
2983 want to display any rows that were generated
2984 in the row callback if you don't already do
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002985 so there.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002986 */
2987 png_process_data(png_ptr, info_ptr, buffer, length);
John Bowlerf19abd62011-01-22 18:29:24 -06002988
2989 /* At this point you can call png_process_data_skip if
2990 you want to handle data the library will skip yourself;
2991 it simply returns the number of bytes to skip (and stops
2992 libpng skipping that number of bytes on the next
2993 png_process_data call).
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002994 return 0;
2995 }
2996
2997 /* This function is called (as set by
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06002998 png_set_progressive_read_fn() above) when enough data
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06002999 has been supplied so all of the header has been
3000 read.
3001 */
3002 void
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -06003003 info_callback(png_structp png_ptr, png_infop info)
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003004 {
3005 /* Do any setup here, including setting any of
3006 the transformations mentioned in the Reading
3007 PNG files section. For now, you _must_ call
3008 either png_start_read_image() or
3009 png_read_update_info() after all the
3010 transformations are set (even if you don't set
3011 any). You may start getting rows before
3012 png_process_data() returns, so this is your
3013 last chance to prepare for that.
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06003014
3015 This is where you turn on interlace handling,
3016 assuming you don't want to do it yourself.
John Bowlerf19abd62011-01-22 18:29:24 -06003017
3018 If you need to you can stop the processing of
3019 your original input data at this point by calling
3020 png_process_data_pause. This returns the number
3021 of unprocessed bytes from the last png_process_data
3022 call - it is up to you to ensure that the next call
3023 sees these bytes again. If you don't want to bother
3024 with this you can get libpng to cache the unread
3025 bytes by setting the 'save' parameter (see png.h) but
3026 then libpng will have to copy the data internally.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003027 */
3028 }
3029
3030 /* This function is called when each row of image
3031 data is complete */
3032 void
3033 row_callback(png_structp png_ptr, png_bytep new_row,
Glenn Randers-Pehrsone68f5a32001-05-14 09:20:53 -05003034 png_uint_32 row_num, int pass)
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003035 {
3036 /* If the image is interlaced, and you turned
3037 on the interlace handler, this function will
3038 be called for every row in every pass. Some
3039 of these rows will not be changed from the
3040 previous pass. When the row is not changed,
3041 the new_row variable will be NULL. The rows
3042 and passes are called in order, so you don't
3043 really need the row_num and pass, but I'm
3044 supplying them because it may make your life
3045 easier.
3046
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06003047 If you did not turn on interlace handling then
3048 the callback is called for each row of each
3049 sub-image when the image is interlaced. In this
3050 case 'row_num' is the row in the sub-image, not
3051 the row in the output image as it is in all other
3052 cases.
3053
3054 For the non-NULL rows of interlaced images when
3055 you have switched on libpng interlace handling,
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003056 you must call png_progressive_combine_row()
3057 passing in the row and the old row. You can
3058 call this function for NULL rows (it will just
3059 return) and for non-interlaced images (it just
3060 does the memcpy for you) if it will make the
3061 code easier. Thus, you can just do this for
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06003062 all cases if you switch on interlace handling;
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003063 */
3064
3065 png_progressive_combine_row(png_ptr, old_row,
3066 new_row);
3067
3068 /* where old_row is what was displayed for
Glenn Randers-Pehrson345bc271998-06-14 14:43:31 -05003069 previously for the row. Note that the first
3070 pass (pass == 0, really) will completely cover
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003071 the old row, so the rows do not have to be
3072 initialized. After the first pass (and only
3073 for interlaced images), you will have to pass
3074 the current row, and the function will combine
3075 the old row and the new row.
John Bowlerf19abd62011-01-22 18:29:24 -06003076
3077 You can also call png_process_data_pause in this
3078 callback - see above.
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06003079 */
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003080 }
3081
3082 void
3083 end_callback(png_structp png_ptr, png_infop info)
3084 {
3085 /* This function is called after the whole image
3086 has been read, including any chunks after the
3087 image (up to and including the IEND). You
3088 will usually have the same info chunk as you
3089 had in the header, although some data may have
3090 been added to the comments and time fields.
3091
3092 Most people won't do much here, perhaps setting
3093 a flag that marks the image as finished.
3094 */
3095 }
3096
Glenn Randers-Pehrson896239b1998-04-21 15:03:57 -05003097
3098
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06003099.SH IV. Writing
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003100
3101Much of this is very similar to reading. However, everything of
3102importance is repeated here, so you won't have to constantly look
3103back up in the reading section to understand writing.
3104
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003105.SS Setup
3106
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003107You will want to do the I/O initialization before you get into libpng,
3108so if it doesn't work, you don't have anything to undo. If you are not
3109using the standard I/O functions, you will need to replace them with
3110custom writing functions. See the discussion under Customizing libpng.
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06003111
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003112 FILE *fp = fopen(file_name, "wb");
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003113
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003114 if (!fp)
Glenn Randers-Pehrson104622b2000-05-29 08:58:03 -05003115 return (ERROR);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003116
3117Next, png_struct and png_info need to be allocated and initialized.
3118As these can be both relatively large, you may not want to store these
3119on the stack, unless you have stack space to spare. Of course, you
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -06003120will want to check if they return NULL. If you are also reading,
3121you won't want to name your read structure and your write structure
3122both "png_ptr"; you can call them anything you like, such as
3123"read_ptr" and "write_ptr". Look at pngtest.c, for example.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003124
3125 png_structp png_ptr = png_create_write_struct
Glenn Randers-Pehrsond0dce401998-05-09 10:02:29 -05003126 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003127 user_error_fn, user_warning_fn);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003128
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003129 if (!png_ptr)
Glenn Randers-Pehrson104622b2000-05-29 08:58:03 -05003130 return (ERROR);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003131
3132 png_infop info_ptr = png_create_info_struct(png_ptr);
3133 if (!info_ptr)
3134 {
3135 png_destroy_write_struct(&png_ptr,
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003136 (png_infopp)NULL);
Glenn Randers-Pehrson104622b2000-05-29 08:58:03 -05003137 return (ERROR);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003138 }
3139
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05003140If you want to use your own memory allocation routines,
3141define PNG_USER_MEM_SUPPORTED and use
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05003142png_create_write_struct_2() instead of png_create_write_struct():
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05003143
3144 png_structp png_ptr = png_create_write_struct_2
3145 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
3146 user_error_fn, user_warning_fn, (png_voidp)
3147 user_mem_ptr, user_malloc_fn, user_free_fn);
3148
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003149After you have these structures, you will need to set up the
3150error handling. When libpng encounters an error, it expects to
3151longjmp() back to your routine. Therefore, you will need to call
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06003152setjmp() and pass the png_jmpbuf(png_ptr). If you
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003153write the file from different routines, you will need to update
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06003154the png_jmpbuf(png_ptr) every time you enter a new routine that will
3155call a png_*() function. See your documentation of setjmp/longjmp
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003156for your compiler for more information on setjmp/longjmp. See
3157the discussion on libpng error handling in the Customizing Libpng
3158section below for more information on the libpng error handling.
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06003159
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06003160 if (setjmp(png_jmpbuf(png_ptr)))
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06003161 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003162 png_destroy_write_struct(&png_ptr, &info_ptr);
Glenn Randers-Pehrson104622b2000-05-29 08:58:03 -05003163 fclose(fp);
3164 return (ERROR);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003165 }
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06003166 ...
3167 return;
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003168
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003169If you would rather avoid the complexity of setjmp/longjmp issues,
Glenn Randers-Pehrson54ac9a92010-04-02 17:06:22 -05003170you can compile libpng with PNG_NO_SETJMP, in which case
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003171errors will result in a call to PNG_ABORT() which defaults to abort().
3172
Glenn Randers-Pehrson54ac9a92010-04-02 17:06:22 -05003173You can #define PNG_ABORT() to a function that does something
3174more useful than abort(), as long as your function does not
3175return.
3176
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003177Now you need to set up the output code. The default for libpng is to
3178use the C function fwrite(). If you use this, you will need to pass a
3179valid FILE * in the function png_init_io(). Be sure that the file is
3180opened in binary mode. Again, if you wish to handle writing data in
3181another way, see the discussion on libpng I/O handling in the Customizing
3182Libpng section below.
3183
3184 png_init_io(png_ptr, fp);
3185
Glenn Randers-Pehrsond60b8fa2006-04-20 21:31:14 -05003186If you are embedding your PNG into a datastream such as MNG, and don't
3187want libpng to write the 8-byte signature, or if you have already
3188written the signature in your application, use
3189
3190 png_set_sig_bytes(png_ptr, 8);
3191
3192to inform libpng that it should not write a signature.
3193
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003194.SS Write callbacks
3195
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -06003196At this point, you can set up a callback function that will be
3197called after each row has been written, which you can use to control
3198a progress meter or the like. It's demonstrated in pngtest.c.
3199You must supply a function
3200
Glenn Randers-Pehrson81ce8892011-01-24 08:04:37 -06003201 void write_row_callback(png_structp png_ptr, png_uint_32 row,
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06003202 int pass);
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -06003203 {
3204 /* put your code here */
3205 }
3206
3207(You can give it another name that you like instead of "write_row_callback")
3208
3209To inform libpng about your function, use
3210
3211 png_set_write_status_fn(png_ptr, write_row_callback);
3212
John Bowler59010e52011-02-16 06:16:31 -06003213When this function is called the row has already been completely processed and
3214it has also been written out. The 'row' and 'pass' refer to the next row to be
3215handled. For the
3216non-interlaced case the row that was just handled is simply one less than the
3217passed in row number, and pass will always be 0. For the interlaced case the
3218same applies unless the row value is 0, in which case the row just handled was
3219the last one from one of the preceding passes. Because interlacing may skip a
3220pass you cannot be sure that the preceding pass is just 'pass-1', if you really
3221need to know what the last pass is record (row,pass) from the callback and use
3222the last recorded value each time.
3223
3224As with the user transform you can find the output row using the
3225PNG_ROW_FROM_PASS_ROW macro.
3226
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003227You now have the option of modifying how the compression library will
3228run. The following functions are mainly for testing, but may be useful
3229in some cases, like if you need to write PNG files extremely fast and
3230are willing to give up some compression, or if you want to get the
3231maximum possible compression at the expense of slower writing. If you
3232have no special needs in this area, let the library do what it wants by
3233not calling this function at all, as it has been tuned to deliver a good
3234speed/compression ratio. The second parameter to png_set_filter() is
Glenn Randers-Pehrson408b4212000-12-18 09:33:57 -06003235the filter method, for which the only valid values are 0 (as of the
3236July 1999 PNG specification, version 1.2) or 64 (if you are writing
3237a PNG datastream that is to be embedded in a MNG datastream). The third
3238parameter is a flag that indicates which filter type(s) are to be tested
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06003239for each scanline. See the PNG specification for details on the specific
3240filter types.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003241
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06003242
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003243 /* turn on or off filtering, and/or choose
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06003244 specific filters. You can use either a single
Glenn Randers-Pehrsonebd7f9a2006-10-19 09:37:56 -05003245 PNG_FILTER_VALUE_NAME or the bitwise OR of one
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003246 or more PNG_FILTER_NAME masks.
3247 */
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003248 png_set_filter(png_ptr, 0,
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05003249 PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE |
3250 PNG_FILTER_SUB | PNG_FILTER_VALUE_SUB |
3251 PNG_FILTER_UP | PNG_FILTER_VALUE_UP |
Glenn Randers-Pehrson76546822009-05-16 07:25:42 -05003252 PNG_FILTER_AVG | PNG_FILTER_VALUE_AVG |
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05003253 PNG_FILTER_PAETH | PNG_FILTER_VALUE_PAETH|
3254 PNG_ALL_FILTERS);
3255
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06003256If an application wants to start and stop using particular filters during
3257compression, it should start out with all of the filters (to ensure that
3258the previous row of pixels will be stored in case it's needed later),
3259and then add and remove them after the start of compression.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003260
Glenn Randers-Pehrson408b4212000-12-18 09:33:57 -06003261If you are writing a PNG datastream that is to be embedded in a MNG
3262datastream, the second parameter can be either 0 or 64.
3263
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -06003264The png_set_compression_*() functions interface to the zlib compression
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003265library, and should mostly be ignored unless you really know what you are
3266doing. The only generally useful call is png_set_compression_level()
3267which changes how much time zlib spends on trying to compress the image
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05003268data. See the Compression Library (zlib.h and algorithm.txt, distributed
3269with zlib) for details on the compression levels.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003270
Glenn Randers-Pehrson38734ee2011-03-03 06:23:31 -06003271 #include zlib.h
3272
Glenn Randers-Pehrsona45f47c2011-04-01 15:31:26 -05003273 /* Set the zlib compression level */
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003274 png_set_compression_level(png_ptr,
3275 Z_BEST_COMPRESSION);
3276
Glenn Randers-Pehrsona45f47c2011-04-01 15:31:26 -05003277 /* Set other zlib parameters for compressing IDAT */
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003278 png_set_compression_mem_level(png_ptr, 8);
3279 png_set_compression_strategy(png_ptr,
3280 Z_DEFAULT_STRATEGY);
3281 png_set_compression_window_bits(png_ptr, 15);
3282 png_set_compression_method(png_ptr, 8);
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05003283 png_set_compression_buffer_size(png_ptr, 8192)
3284
Glenn Randers-Pehrsona45f47c2011-04-01 15:31:26 -05003285 /* Set zlib parameters for text compression
3286 * If you don't call these, the parameters
3287 * fall back on those defined for IDAT chunks
3288 */
Glenn Randers-Pehrson8eb88332011-04-01 00:16:50 -05003289 png_set_text_compression_mem_level(png_ptr, 8);
3290 png_set_text_compression_strategy(png_ptr,
3291 Z_DEFAULT_STRATEGY);
3292 png_set_text_compression_window_bits(png_ptr, 15);
3293 png_set_text_compression_method(png_ptr, 8);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003294
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003295.SS Setting the contents of info for output
3296
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003297You now need to fill in the png_info structure with all the data you
3298wish to write before the actual image. Note that the only thing you
3299are allowed to write after the image is the text chunks and the time
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05003300chunk (as of PNG Specification 1.2, anyway). See png_write_end() and
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003301the latest PNG specification for more information on that. If you
3302wish to write them before the image, fill them in now, and flag that
3303data as being valid. If you want to wait until after the data, don't
3304fill them until png_write_end(). For all the fields in png_info and
3305their data types, see png.h. For explanations of what the fields
3306contain, see the PNG specification.
3307
3308Some of the more important parts of the png_info are:
3309
3310 png_set_IHDR(png_ptr, info_ptr, width, height,
3311 bit_depth, color_type, interlace_type,
Glenn Randers-Pehrson408b4212000-12-18 09:33:57 -06003312 compression_type, filter_method)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003313
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003314 width - holds the width of the image
3315 in pixels (up to 2^31).
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003316
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003317 height - holds the height of the image
3318 in pixels (up to 2^31).
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003319
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003320 bit_depth - holds the bit depth of one of the
3321 image channels.
3322 (valid values are 1, 2, 4, 8, 16
3323 and depend also on the
3324 color_type. See also significant
3325 bits (sBIT) below).
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003326
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003327 color_type - describes which color/alpha
3328 channels are present.
3329 PNG_COLOR_TYPE_GRAY
3330 (bit depths 1, 2, 4, 8, 16)
3331 PNG_COLOR_TYPE_GRAY_ALPHA
3332 (bit depths 8, 16)
3333 PNG_COLOR_TYPE_PALETTE
3334 (bit depths 1, 2, 4, 8)
3335 PNG_COLOR_TYPE_RGB
3336 (bit_depths 8, 16)
3337 PNG_COLOR_TYPE_RGB_ALPHA
3338 (bit_depths 8, 16)
3339
3340 PNG_COLOR_MASK_PALETTE
3341 PNG_COLOR_MASK_COLOR
3342 PNG_COLOR_MASK_ALPHA
3343
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06003344 interlace_type - PNG_INTERLACE_NONE or
3345 PNG_INTERLACE_ADAM7
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003346
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003347 compression_type - (must be
3348 PNG_COMPRESSION_TYPE_DEFAULT)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003349
Glenn Randers-Pehrson408b4212000-12-18 09:33:57 -06003350 filter_method - (must be PNG_FILTER_TYPE_DEFAULT
3351 or, if you are writing a PNG to
3352 be embedded in a MNG datastream,
3353 can also be
3354 PNG_INTRAPIXEL_DIFFERENCING)
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003355
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05003356If you call png_set_IHDR(), the call must appear before any of the
Glenn Randers-Pehrsond60c8862009-06-15 21:56:14 -05003357other png_set_*() functions, because they might require access to some of
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05003358the IHDR settings. The remaining png_set_*() functions can be called
3359in any order.
3360
Glenn Randers-Pehrsonb5444a12009-06-08 08:36:19 -05003361If you wish, you can reset the compression_type, interlace_type, or
3362filter_method later by calling png_set_IHDR() again; if you do this, the
3363width, height, bit_depth, and color_type must be the same in each call.
Glenn Randers-Pehrson424c9852009-06-02 13:45:15 -05003364
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003365 png_set_PLTE(png_ptr, info_ptr, palette,
3366 num_palette);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003367
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003368 palette - the palette for the file
3369 (array of png_color)
3370 num_palette - number of entries in the palette
3371
Glenn Randers-Pehrson8d0bc0f2011-01-25 22:15:58 -06003372 png_set_gAMA(png_ptr, info_ptr, file_gamma);
3373 png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003374
Glenn Randers-Pehrson8d0bc0f2011-01-25 22:15:58 -06003375 file_gamma - the gamma at which the image was
3376 created (PNG_INFO_gAMA)
3377
3378 int_file_gamma - 100,000 times the gamma at which
3379 the image was created
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003380
3381 png_set_sRGB(png_ptr, info_ptr, srgb_intent);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003382
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003383 srgb_intent - the rendering intent
3384 (PNG_INFO_sRGB) The presence of
3385 the sRGB chunk means that the pixel
3386 data is in the sRGB color space.
3387 This chunk also implies specific
3388 values of gAMA and cHRM. Rendering
3389 intent is the CSS-1 property that
3390 has been defined by the International
3391 Color Consortium
3392 (http://www.color.org).
3393 It can be one of
Glenn Randers-Pehrson5379b241999-11-27 10:22:33 -06003394 PNG_sRGB_INTENT_SATURATION,
3395 PNG_sRGB_INTENT_PERCEPTUAL,
3396 PNG_sRGB_INTENT_ABSOLUTE, or
3397 PNG_sRGB_INTENT_RELATIVE.
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06003398
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003399
3400 png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr,
3401 srgb_intent);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003402
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003403 srgb_intent - the rendering intent
3404 (PNG_INFO_sRGB) The presence of the
3405 sRGB chunk means that the pixel
3406 data is in the sRGB color space.
3407 This function also causes gAMA and
3408 cHRM chunks with the specific values
3409 that are consistent with sRGB to be
3410 written.
3411
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06003412 png_set_iCCP(png_ptr, info_ptr, name, compression_type,
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06003413 profile, proflen);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003414
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06003415 name - The profile name.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003416
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06003417 compression_type - The compression type; always
3418 PNG_COMPRESSION_TYPE_BASE for PNG 1.0.
3419 You may give NULL to this argument to
3420 ignore it.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003421
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06003422 profile - International Color Consortium color
3423 profile data. May contain NULs.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003424
Glenn Randers-Pehrson4a5a1ec2011-01-15 11:43:28 -06003425 proflen - length of profile data in bytes.
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06003426
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003427 png_set_sBIT(png_ptr, info_ptr, sig_bit);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003428
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003429 sig_bit - the number of significant bits for
3430 (PNG_INFO_sBIT) each of the gray, red,
3431 green, and blue channels, whichever are
3432 appropriate for the given color type
3433 (png_color_16)
3434
Glenn Randers-Pehrson866b62a2009-08-08 16:33:14 -05003435 png_set_tRNS(png_ptr, info_ptr, trans_alpha,
3436 num_trans, trans_color);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003437
Glenn Randers-Pehrson866b62a2009-08-08 16:33:14 -05003438 trans_alpha - array of alpha (transparency)
3439 entries for palette (PNG_INFO_tRNS)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003440
Glenn Randers-Pehrsonb5444a12009-06-08 08:36:19 -05003441 trans_color - graylevel or color sample values
3442 (in order red, green, blue) of the
3443 single transparent color for
Glenn Randers-Pehrson3d5a5202000-07-01 15:37:28 -05003444 non-paletted images (PNG_INFO_tRNS)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003445
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003446 num_trans - number of transparent entries
3447 (PNG_INFO_tRNS)
3448
3449 png_set_hIST(png_ptr, info_ptr, hist);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003450
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003451 hist - histogram of palette (array of
Glenn Randers-Pehrson8d0bc0f2011-01-25 22:15:58 -06003452 png_uint_16) (PNG_INFO_hIST)
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003453
3454 png_set_tIME(png_ptr, info_ptr, mod_time);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003455
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003456 mod_time - time image was last modified
3457 (PNG_VALID_tIME)
3458
3459 png_set_bKGD(png_ptr, info_ptr, background);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003460
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003461 background - background color (PNG_VALID_bKGD)
3462
3463 png_set_text(png_ptr, info_ptr, text_ptr, num_text);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003464
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003465 text_ptr - array of png_text holding image
3466 comments
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003467
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05003468 text_ptr[i].compression - type of compression used
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003469 on "text" PNG_TEXT_COMPRESSION_NONE
3470 PNG_TEXT_COMPRESSION_zTXt
3471 PNG_ITXT_COMPRESSION_NONE
3472 PNG_ITXT_COMPRESSION_zTXt
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05003473 text_ptr[i].key - keyword for comment. Must contain
3474 1-79 characters.
3475 text_ptr[i].text - text comments for current
3476 keyword. Can be NULL or empty.
3477 text_ptr[i].text_length - length of text string,
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003478 after decompression, 0 for iTXt
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05003479 text_ptr[i].itxt_length - length of itxt string,
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003480 after decompression, 0 for tEXt/zTXt
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05003481 text_ptr[i].lang - language of comment (NULL or
3482 empty for unknown).
3483 text_ptr[i].translated_keyword - keyword in UTF-8 (NULL
3484 or empty for unknown).
Glenn Randers-Pehrson8f5846f2009-10-31 21:31:08 -05003485 Note that the itxt_length, lang, and lang_key
3486 members of the text_ptr structure only exist
3487 when the library is built with iTXt chunk support.
3488
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003489 num_text - number of comments
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003490
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06003491 png_set_sPLT(png_ptr, info_ptr, &palette_ptr,
3492 num_spalettes);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003493
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06003494 palette_ptr - array of png_sPLT_struct structures
3495 to be added to the list of palettes
3496 in the info structure.
3497 num_spalettes - number of palette structures to be
3498 added.
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06003499
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003500 png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y,
3501 unit_type);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003502
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003503 offset_x - positive offset from the left
3504 edge of the screen
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003505
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003506 offset_y - positive offset from the top
3507 edge of the screen
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003508
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003509 unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER
3510
3511 png_set_pHYs(png_ptr, info_ptr, res_x, res_y,
3512 unit_type);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003513
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003514 res_x - pixels/unit physical resolution
3515 in x direction
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003516
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003517 res_y - pixels/unit physical resolution
3518 in y direction
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003519
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06003520 unit_type - PNG_RESOLUTION_UNKNOWN,
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003521 PNG_RESOLUTION_METER
3522
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06003523 png_set_sCAL(png_ptr, info_ptr, unit, width, height)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003524
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05003525 unit - physical scale units (an integer)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003526
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06003527 width - width of a pixel in physical scale units
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003528
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06003529 height - height of a pixel in physical scale units
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05003530 (width and height are doubles)
3531
3532 png_set_sCAL_s(png_ptr, info_ptr, unit, width, height)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003533
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05003534 unit - physical scale units (an integer)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003535
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05003536 width - width of a pixel in physical scale units
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003537
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05003538 height - height of a pixel in physical scale units
3539 (width and height are strings like "2.54")
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06003540
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06003541 png_set_unknown_chunks(png_ptr, info_ptr, &unknowns,
3542 num_unknowns)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003543
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06003544 unknowns - array of png_unknown_chunk
3545 structures holding unknown chunks
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06003546 unknowns[i].name - name of unknown chunk
3547 unknowns[i].data - data of unknown chunk
Glenn Randers-Pehrson4accabb2000-04-14 14:20:47 -05003548 unknowns[i].size - size of unknown chunk's data
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003549 unknowns[i].location - position to write chunk in file
3550 0: do not write chunk
3551 PNG_HAVE_IHDR: before PLTE
3552 PNG_HAVE_PLTE: before IDAT
3553 PNG_AFTER_IDAT: after IDAT
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06003554
3555The "location" member is set automatically according to
3556what part of the output file has already been written.
3557You can change its value after calling png_set_unknown_chunks()
3558as demonstrated in pngtest.c. Within each of the "locations",
3559the chunks are sequenced according to their position in the
3560structure (that is, the value of "i", which is the order in which
3561the chunk was either read from the input file or defined with
3562png_set_unknown_chunks).
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003563
3564A quick word about text and num_text. text is an array of png_text
3565structures. num_text is the number of valid structures in the array.
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05003566Each png_text structure holds a language code, a keyword, a text value,
3567and a compression type.
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06003568
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003569The compression types have the same valid numbers as the compression
3570types of the image data. Currently, the only valid number is zero.
3571However, you can store text either compressed or uncompressed, unlike
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06003572images, which always have to be compressed. So if you don't want the
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003573text compressed, set the compression type to PNG_TEXT_COMPRESSION_NONE.
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05003574Because tEXt and zTXt chunks don't have a language field, if you
3575specify PNG_TEXT_COMPRESSION_NONE or PNG_TEXT_COMPRESSION_zTXt
3576any language code or translated keyword will not be written out.
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06003577
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003578Until text gets around 1000 bytes, it is not worth compressing it.
3579After the text has been written out to the file, the compression type
3580is set to PNG_TEXT_COMPRESSION_NONE_WR or PNG_TEXT_COMPRESSION_zTXt_WR,
3581so that it isn't written out again at the end (in case you are calling
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003582png_write_end() with the same struct).
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003583
3584The keywords that are given in the PNG Specification are:
3585
3586 Title Short (one line) title or
3587 caption for image
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003588
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003589 Author Name of image's creator
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003590
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003591 Description Description of image (possibly long)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003592
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003593 Copyright Copyright notice
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003594
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003595 Creation Time Time of original image creation
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06003596 (usually RFC 1123 format, see below)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003597
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003598 Software Software used to create the image
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003599
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003600 Disclaimer Legal disclaimer
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003601
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003602 Warning Warning of nature of content
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003603
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003604 Source Device used to create the image
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003605
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003606 Comment Miscellaneous comment; conversion
3607 from other image format
3608
3609The keyword-text pairs work like this. Keywords should be short
3610simple descriptions of what the comment is about. Some typical
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06003611keywords are found in the PNG specification, as is some recommendations
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003612on keywords. You can repeat keywords in a file. You can even write
3613some text before the image and some after. For example, you may want
3614to put a description of the image before the image, but leave the
3615disclaimer until after, so viewers working over modem connections
3616don't have to wait for the disclaimer to go over the modem before
3617they start seeing the image. Finally, keywords should be full
3618words, not abbreviations. Keywords and text are in the ISO 8859-1
3619(Latin-1) character set (a superset of regular ASCII) and can not
3620contain NUL characters, and should not contain control or other
3621unprintable characters. To make the comments widely readable, stick
3622with basic ASCII, and avoid machine specific character set extensions
3623like the IBM-PC character set. The keyword must be present, but
3624you can leave off the text string on non-compressed pairs.
3625Compressed pairs must have a text string, as only the text string
3626is compressed anyway, so the compression would be meaningless.
3627
3628PNG supports modification time via the png_time structure. Two
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05003629conversion routines are provided, png_convert_from_time_t() for
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003630time_t and png_convert_from_struct_tm() for struct tm. The
3631time_t routine uses gmtime(). You don't have to use either of
3632these, but if you wish to fill in the png_time structure directly,
3633you should provide the time in universal time (GMT) if possible
3634instead of your local time. Note that the year number is the full
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06003635year (e.g. 1998, rather than 98 - PNG is year 2000 compliant!), and
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003636that months start with 1.
3637
3638If you want to store the time of the original image creation, you should
3639use a plain tEXt chunk with the "Creation Time" keyword. This is
3640necessary because the "creation time" of a PNG image is somewhat vague,
3641depending on whether you mean the PNG file, the time the image was
3642created in a non-PNG format, a still photo from which the image was
3643scanned, or possibly the subject matter itself. In order to facilitate
3644machine-readable dates, it is recommended that the "Creation Time"
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06003645tEXt chunk use RFC 1123 format dates (e.g. "22 May 1997 18:07:10 GMT"),
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003646although this isn't a requirement. Unlike the tIME chunk, the
3647"Creation Time" tEXt chunk is not expected to be automatically changed
3648by the software. To facilitate the use of RFC 1123 dates, a function
3649png_convert_to_rfc1123(png_timep) is provided to convert from PNG
3650time to an RFC 1123 format string.
3651
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003652.SS Writing unknown chunks
3653
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06003654You can use the png_set_unknown_chunks function to queue up chunks
3655for writing. You give it a chunk name, raw data, and a size; that's
3656all there is to it. The chunks will be written by the next following
3657png_write_info_before_PLTE, png_write_info, or png_write_end function.
3658Any chunks previously read into the info structure's unknown-chunk
3659list will also be written out in a sequence that satisfies the PNG
3660specification's ordering rules.
3661
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003662.SS The high-level write interface
3663
3664At this point there are two ways to proceed; through the high-level
3665write interface, or through a sequence of low-level write operations.
3666You can use the high-level interface if your image data is present
Glenn Randers-Pehrson38e6e772000-04-09 19:06:13 -05003667in the info structure. All defined output
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -06003668transformations are permitted, enabled by the following masks.
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003669
3670 PNG_TRANSFORM_IDENTITY No transformation
3671 PNG_TRANSFORM_PACKING Pack 1, 2 and 4-bit samples
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06003672 PNG_TRANSFORM_PACKSWAP Change order of packed
3673 pixels to LSB first
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003674 PNG_TRANSFORM_INVERT_MONO Invert monochrome images
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06003675 PNG_TRANSFORM_SHIFT Normalize pixels to the
3676 sBIT depth
3677 PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA
3678 to BGRA
3679 PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA
3680 to AG
3681 PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity
3682 to transparency
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003683 PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples
Glenn Randers-Pehrson1eb14e92008-12-10 07:14:45 -06003684 PNG_TRANSFORM_STRIP_FILLER Strip out filler
3685 bytes (deprecated).
3686 PNG_TRANSFORM_STRIP_FILLER_BEFORE Strip out leading
3687 filler bytes
3688 PNG_TRANSFORM_STRIP_FILLER_AFTER Strip out trailing
3689 filler bytes
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003690
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05003691If you have valid image data in the info structure (you can use
3692png_set_rows() to put image data in the info structure), simply do this:
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003693
3694 png_write_png(png_ptr, info_ptr, png_transforms, NULL)
3695
Glenn Randers-Pehrsonebd7f9a2006-10-19 09:37:56 -05003696where png_transforms is an integer containing the bitwise OR of some set of
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003697transformation flags. This call is equivalent to png_write_info(),
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05003698followed the set of transformations indicated by the transform mask,
3699then png_write_image(), and finally png_write_end().
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003700
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05003701(The final parameter of this call is not yet used. Someday it might point
3702to transformation parameters required by some future output transform.)
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003703
Glenn Randers-Pehrsona4981d42004-08-25 22:00:45 -05003704You must use png_transforms and not call any png_set_transform() functions
3705when you use png_write_png().
3706
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003707.SS The low-level write interface
3708
3709If you are going the low-level route instead, you are now ready to
3710write all the file information up to the actual image data. You do
3711this with a call to png_write_info().
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003712
3713 png_write_info(png_ptr, info_ptr);
3714
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003715Note that there is one transformation you may need to do before
3716png_write_info(). In PNG files, the alpha channel in an image is the
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06003717level of opacity. If your data is supplied as a level of transparency,
3718you can invert the alpha channel before you write it, so that 0 is
3719fully transparent and 255 (in 8-bit or paletted images) or 65535
3720(in 16-bit images) is fully opaque, with
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003721
3722 png_set_invert_alpha(png_ptr);
3723
3724This must appear before png_write_info() instead of later with the
3725other transformations because in the case of paletted images the tRNS
3726chunk data has to be inverted before the tRNS chunk is written. If
3727your image is not a paletted image, the tRNS data (which in such cases
3728represents a single color to be rendered as transparent) won't need to
3729be changed, and you can safely do this transformation after your
3730png_write_info() call.
3731
Glenn Randers-Pehrson5379b241999-11-27 10:22:33 -06003732If you need to write a private chunk that you want to appear before
3733the PLTE chunk when PLTE is present, you can write the PNG info in
3734two steps, and insert code to write your own chunk between them:
3735
3736 png_write_info_before_PLTE(png_ptr, info_ptr);
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06003737 png_set_unknown_chunks(png_ptr, info_ptr, ...);
Glenn Randers-Pehrson5379b241999-11-27 10:22:33 -06003738 png_write_info(png_ptr, info_ptr);
3739
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003740After you've written the file information, you can set up the library
3741to handle any special transformations of the image data. The various
3742ways to transform the data will be described in the order that they
3743should occur. This is important, as some of these change the color
3744type and/or bit depth of the data, and some others only work on
3745certain color types and bit depths. Even though each transformation
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06003746checks to see if it has data that it can do something with, you should
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003747make sure to only enable a transformation if it will be valid for the
3748data. For example, don't swap red and blue on grayscale data.
3749
Glenn Randers-Pehrson896239b1998-04-21 15:03:57 -05003750PNG files store RGB pixels packed into 3 or 6 bytes. This code tells
Glenn Randers-Pehrson68ea2432000-04-01 21:10:05 -06003751the library to strip input data that has 4 or 8 bytes per pixel down
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06003752to 3 or 6 bytes (or strip 2 or 4-byte grayscale+filler data to 1 or 2
3753bytes per pixel).
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003754
3755 png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
3756
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06003757where the 0 is unused, and the location is either PNG_FILLER_BEFORE or
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05003758PNG_FILLER_AFTER, depending upon whether the filler byte in the pixel
3759is stored XRGB or RGBX.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003760
3761PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as
3762they can, resulting in, for example, 8 pixels per byte for 1 bit files.
3763If the data is supplied at 1 pixel per byte, use this code, which will
3764correctly pack the pixels into a single byte:
3765
3766 png_set_packing(png_ptr);
3767
3768PNG files reduce possible bit depths to 1, 2, 4, 8, and 16. If your
3769data is of another bit depth, you can write an sBIT chunk into the
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05003770file so that decoders can recover the original data if desired.
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06003771
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003772 /* Set the true bit depth of the image data */
3773 if (color_type & PNG_COLOR_MASK_COLOR)
3774 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003775 sig_bit.red = true_bit_depth;
3776 sig_bit.green = true_bit_depth;
3777 sig_bit.blue = true_bit_depth;
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003778 }
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003779
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003780 else
3781 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003782 sig_bit.gray = true_bit_depth;
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003783 }
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003784
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003785 if (color_type & PNG_COLOR_MASK_ALPHA)
3786 {
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003787 sig_bit.alpha = true_bit_depth;
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003788 }
3789
3790 png_set_sBIT(png_ptr, info_ptr, &sig_bit);
3791
3792If the data is stored in the row buffer in a bit depth other than
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06003793one supported by PNG (e.g. 3 bit data in the range 0-7 for a 4-bit PNG),
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003794this will scale the values to appear to be the correct bit depth as
3795is required by PNG.
3796
3797 png_set_shift(png_ptr, &sig_bit);
3798
3799PNG files store 16 bit pixels in network byte order (big-endian,
3800ie. most significant bits first). This code would be used if they are
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06003801supplied the other way (little-endian, i.e. least significant bits
3802first, the way PCs store them):
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003803
3804 if (bit_depth > 8)
3805 png_set_swap(png_ptr);
3806
3807If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you
3808need to change the order the pixels are packed into bytes, you can use:
3809
3810 if (bit_depth < 8)
3811 png_set_packswap(png_ptr);
3812
3813PNG files store 3 color pixels in red, green, blue order. This code
3814would be used if they are supplied as blue, green, red:
3815
3816 png_set_bgr(png_ptr);
3817
3818PNG files describe monochrome as black being zero and white being
3819one. This code would be used if the pixels are supplied with this reversed
3820(black being one and white being zero):
3821
3822 png_set_invert_mono(png_ptr);
3823
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -06003824Finally, you can write your own transformation function if none of
3825the existing ones meets your needs. This is done by setting a callback
3826with
3827
3828 png_set_write_user_transform_fn(png_ptr,
3829 write_transform_fn);
3830
3831You must supply the function
3832
Glenn Randers-Pehrson93215672011-02-13 19:42:19 -06003833 void write_transform_fn(png_structp png_ptr, png_row_infop
3834 row_info, png_bytep data)
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -06003835
3836See pngtest.c for a working example. Your function will be called
John Bowlerf19abd62011-01-22 18:29:24 -06003837before any of the other transformations are processed. If supported
3838libpng also supplies an information routine that may be called from
3839your callback:
3840
3841 png_get_current_row_number(png_ptr);
John Bowlercd113452011-02-16 06:15:13 -06003842 png_get_current_pass_number(png_ptr);
John Bowlerf19abd62011-01-22 18:29:24 -06003843
John Bowlercd113452011-02-16 06:15:13 -06003844This returns the current row passed to the transform. With interlaced
3845images the value returned is the row in the input sub-image image. Use
3846PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to
3847find the output pixel (x,y) given an interlaced sub-image pixel (row,col,pass).
3848
3849The discussion of interlace handling above contains more information on how to
3850use these values.
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05003851
3852You can also set up a pointer to a user structure for use by your
3853callback function.
3854
3855 png_set_user_transform_info(png_ptr, user_ptr, 0, 0);
3856
3857The user_channels and user_depth parameters of this function are ignored
3858when writing; you can set them to zero as shown.
3859
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05003860You can retrieve the pointer via the function png_get_user_transform_ptr().
3861For example:
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05003862
3863 voidp write_user_transform_ptr =
3864 png_get_user_transform_ptr(png_ptr);
Glenn Randers-Pehrson08a33431998-03-07 06:06:55 -06003865
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003866It is possible to have libpng flush any pending output, either manually,
3867or automatically after a certain number of lines have been written. To
3868flush the output stream a single time call:
3869
3870 png_write_flush(png_ptr);
3871
3872and to have libpng flush the output stream periodically after a certain
3873number of scanlines have been written, call:
3874
3875 png_set_flush(png_ptr, nrows);
3876
3877Note that the distance between rows is from the last time png_write_flush()
3878was called, or the first row of the image if it has never been called.
3879So if you write 50 lines, and then png_set_flush 25, it will flush the
3880output on the next scanline, and every 25 lines thereafter, unless
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06003881png_write_flush() is called before 25 more lines have been written.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003882If nrows is too small (less than about 10 lines for a 640 pixel wide
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06003883RGB image) the image compression may decrease noticeably (although this
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003884may be acceptable for real-time applications). Infrequent flushing will
3885only degrade the compression performance by a few percent over images
3886that do not use flushing.
3887
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003888.SS Writing the image data
3889
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003890That's it for the transformations. Now you can write the image data.
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06003891The simplest way to do this is in one function call. If you have the
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003892whole image in memory, you can just call png_write_image() and libpng
3893will write the image. You will need to pass in an array of pointers to
3894each row. This function automatically handles interlacing, so you don't
3895need to call png_set_interlace_handling() or call this function multiple
3896times, or any of that other stuff necessary with png_write_rows().
3897
3898 png_write_image(png_ptr, row_pointers);
3899
3900where row_pointers is:
3901
Glenn Randers-Pehrson896239b1998-04-21 15:03:57 -05003902 png_byte *row_pointers[height];
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003903
3904You can point to void or char or whatever you use for pixels.
3905
Glenn Randers-Pehrson896239b1998-04-21 15:03:57 -05003906If you don't want to write the whole image at once, you can
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003907use png_write_rows() instead. If the file is not interlaced,
3908this is simple:
3909
3910 png_write_rows(png_ptr, row_pointers,
3911 number_of_rows);
3912
3913row_pointers is the same as in the png_write_image() call.
3914
3915If you are just writing one row at a time, you can do this with
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06003916a single row_pointer instead of an array of row_pointers:
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003917
3918 png_bytep row_pointer = row;
3919
Glenn Randers-Pehrson520a7642000-03-21 05:13:06 -06003920 png_write_row(png_ptr, row_pointer);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003921
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06003922When the file is interlaced, things can get a good deal more complicated.
3923The only currently (as of the PNG Specification version 1.2, dated July
39241999) defined interlacing scheme for PNG files is the "Adam7" interlace
3925scheme, that breaks down an image into seven smaller images of varying
3926size. libpng will build these images for you, or you can do them
3927yourself. If you want to build them yourself, see the PNG specification
3928for details of which pixels to write when.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003929
3930If you don't want libpng to handle the interlacing details, just
3931use png_set_interlace_handling() and call png_write_rows() the
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06003932correct number of times to write all the sub-images
3933(png_set_interlace_handling() returns the number of sub-images.)
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003934
3935If you want libpng to build the sub-images, call this before you start
3936writing any rows:
3937
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06003938 number_of_passes = png_set_interlace_handling(png_ptr);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003939
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06003940This will return the number of passes needed. Currently, this is seven,
3941but may change if another interlace type is added.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003942
3943Then write the complete image number_of_passes times.
3944
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06003945 png_write_rows(png_ptr, row_pointers, number_of_rows);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003946
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06003947Think carefully before you write an interlaced image. Typically code that
3948reads such images reads all the image data into memory, uncompressed, before
3949doing any processing. Only code that can display an image on the fly can
3950take advantage of the interlacing and even then the image has to be exactly
3951the correct size for the output device, because scaling an image requires
3952adjacent pixels and these are not available until all the passes have been
3953read.
3954
3955If you do write an interlaced image you will hardly ever need to handle
3956the interlacing yourself. Call png_set_interlace_handling() and use the
3957approach described above.
3958
3959The only time it is conceivable that you will really need to write an
3960interlaced image pass-by-pass is when you have read one pass by pass and
3961made some pixel-by-pixel transformation to it, as described in the read
3962code above. In this case use the PNG_PASS_ROWS and PNG_PASS_COLS macros
3963to determine the size of each sub-image in turn and simply write the rows
3964you obtained from the read code.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003965
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06003966.SS Finishing a sequential write
3967
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06003968After you are finished writing the image, you should finish writing
3969the file. If you are interested in writing comments or time, you should
3970pass an appropriately filled png_info pointer. If you are not interested,
3971you can pass NULL.
3972
3973 png_write_end(png_ptr, info_ptr);
3974
3975When you are done, you can free all memory used by libpng like this:
3976
3977 png_destroy_write_struct(&png_ptr, &info_ptr);
3978
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06003979It is also possible to individually free the info_ptr members that
Glenn Randers-Pehrsonfc4a1432000-05-17 17:39:34 -05003980point to libpng-allocated storage with the following function:
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06003981
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06003982 png_free_data(png_ptr, info_ptr, mask, seq)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003983
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05003984 mask - identifies data to be freed, a mask
Glenn Randers-Pehrsonebd7f9a2006-10-19 09:37:56 -05003985 containing the bitwise OR of one or
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05003986 more of
3987 PNG_FREE_PLTE, PNG_FREE_TRNS,
3988 PNG_FREE_HIST, PNG_FREE_ICCP,
3989 PNG_FREE_PCAL, PNG_FREE_ROWS,
3990 PNG_FREE_SCAL, PNG_FREE_SPLT,
3991 PNG_FREE_TEXT, PNG_FREE_UNKN,
3992 or simply PNG_FREE_ALL
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06003993
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06003994 seq - sequence number of item to be freed
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05003995 (-1 for all items)
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06003996
Glenn Randers-Pehrsonfc4a1432000-05-17 17:39:34 -05003997This function may be safely called when the relevant storage has
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05003998already been freed, or has not yet been allocated, or was allocated
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06003999by the user and not by libpng, and will in those cases do nothing.
4000The "seq" parameter is ignored if only one item of the selected data
4001type, such as PLTE, is allowed. If "seq" is not -1, and multiple items
4002are allowed for the data type identified in the mask, such as text or
4003sPLT, only the n'th item in the structure is freed, where n is "seq".
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06004004
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06004005If you allocated data such as a palette that you passed in to libpng
4006with png_set_*, you must not free it until just before the call to
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -06004007png_destroy_write_struct().
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004008
Glenn Randers-Pehrson38e6e772000-04-09 19:06:13 -05004009The default behavior is only to free data that was allocated internally
4010by libpng. This can be changed, so that libpng will not free the data,
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05004011or so that it will free data that was allocated by the user with png_malloc()
4012or png_zalloc() and passed in via a png_set_*() function, with
Glenn Randers-Pehrson38e6e772000-04-09 19:06:13 -05004013
4014 png_data_freer(png_ptr, info_ptr, freer, mask)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004015
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05004016 freer - one of
4017 PNG_DESTROY_WILL_FREE_DATA
4018 PNG_SET_WILL_FREE_DATA
4019 PNG_USER_WILL_FREE_DATA
Glenn Randers-Pehrson38e6e772000-04-09 19:06:13 -05004020
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004021 mask - which data elements are affected
4022 same choices as in png_free_data()
4023
Glenn Randers-Pehrson38e6e772000-04-09 19:06:13 -05004024For example, to transfer responsibility for some data from a read structure
4025to a write structure, you could use
4026
4027 png_data_freer(read_ptr, read_info_ptr,
4028 PNG_USER_WILL_FREE_DATA,
4029 PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004030
Glenn Randers-Pehrson38e6e772000-04-09 19:06:13 -05004031 png_data_freer(write_ptr, write_info_ptr,
4032 PNG_DESTROY_WILL_FREE_DATA,
4033 PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST)
4034
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05004035thereby briefly reassigning responsibility for freeing to the user but
Glenn Randers-Pehrson38e6e772000-04-09 19:06:13 -05004036immediately afterwards reassigning it once more to the write_destroy
4037function. Having done this, it would then be safe to destroy the read
4038structure and continue to use the PLTE, tRNS, and hIST data in the write
4039structure.
4040
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05004041This function only affects data that has already been allocated.
4042You can call this function before calling after the png_set_*() functions
4043to control whether the user or png_destroy_*() is supposed to free the data.
4044When the user assumes responsibility for libpng-allocated data, the
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05004045application must use
4046png_free() to free it, and when the user transfers responsibility to libpng
4047for data that the user has allocated, the user must have used png_malloc()
4048or png_zalloc() to allocate it.
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05004049
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05004050If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword
4051separately, do not transfer responsibility for freeing text_ptr to libpng,
4052because when libpng fills a png_text structure it combines these members with
4053the key member, and png_free_data() will free only text_ptr.key. Similarly,
4054if you transfer responsibility for free'ing text_ptr from libpng to your
4055application, your application must not separately free those members.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004056For a more compact example of writing a PNG image, see the file example.c.
4057
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06004058.SH V. Modifying/Customizing libpng:
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004059
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05004060There are two issues here. The first is changing how libpng does
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004061standard things like memory allocation, input/output, and error handling.
4062The second deals with more complicated things like adding new chunks,
4063adding new transformations, and generally changing how libpng works.
Glenn Randers-Pehrson231e6872001-01-12 15:13:06 -06004064Both of those are compile-time issues; that is, they are generally
4065determined at the time the code is written, and there is rarely a need
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05004066to provide the user with a means of changing them.
Glenn Randers-Pehrson231e6872001-01-12 15:13:06 -06004067
4068Memory allocation, input/output, and error handling
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004069
4070All of the memory allocation, input/output, and error handling in libpng
Glenn Randers-Pehrson231e6872001-01-12 15:13:06 -06004071goes through callbacks that are user-settable. The default routines are
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05004072in pngmem.c, pngrio.c, pngwio.c, and pngerror.c, respectively. To change
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -06004073these functions, call the appropriate png_set_*_fn() function.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004074
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06004075Memory allocation is done through the functions png_malloc(), png_calloc(),
4076and png_free(). These currently just call the standard C functions.
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -05004077png_calloc() calls png_malloc() and then clears the newly
4078allocated memory to zero. There is limited support for certain systems
4079with segmented memory architectures and the types of pointers declared by
4080png.h match this; you will have to use appropriate pointers in your
4081application. Since it is
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06004082unlikely that the method of handling memory allocation on a platform
4083will change between applications, these functions must be modified in
4084the library at compile time. If you prefer to use a different method
4085of allocating and freeing data, you can use png_create_read_struct_2() or
4086png_create_write_struct_2() to register your own functions as described
4087above. These functions also provide a void pointer that can be retrieved
4088via
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05004089
4090 mem_ptr=png_get_mem_ptr(png_ptr);
4091
4092Your replacement memory functions must have prototypes as follows:
4093
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06004094 png_voidp malloc_fn(png_structp png_ptr,
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06004095 png_alloc_size_t size);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004096
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05004097 void free_fn(png_structp png_ptr, png_voidp ptr);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004098
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -05004099Your malloc_fn() must return NULL in case of failure. The png_malloc()
4100function will normally call png_error() if it receives a NULL from the
4101system memory allocator or from your replacement malloc_fn().
Glenn Randers-Pehrson82ae3832001-04-20 10:32:10 -05004102
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05004103Your free_fn() will never be called with a NULL ptr, since libpng's
4104png_free() checks for NULL before calling free_fn().
4105
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004106Input/Output in libpng is done through png_read() and png_write(),
4107which currently just call fread() and fwrite(). The FILE * is stored in
4108png_struct and is initialized via png_init_io(). If you wish to change
4109the method of I/O, the library supplies callbacks that you can set
4110through the function png_set_read_fn() and png_set_write_fn() at run
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05004111time, instead of calling the png_init_io() function. These functions
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004112also provide a void pointer that can be retrieved via the function
4113png_get_io_ptr(). For example:
4114
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05004115 png_set_read_fn(png_structp read_ptr,
4116 voidp read_io_ptr, png_rw_ptr read_data_fn)
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004117
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05004118 png_set_write_fn(png_structp write_ptr,
4119 voidp write_io_ptr, png_rw_ptr write_data_fn,
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004120 png_flush_ptr output_flush_fn);
4121
Glenn Randers-Pehrsonf7d1a171998-06-06 15:31:35 -05004122 voidp read_io_ptr = png_get_io_ptr(read_ptr);
4123 voidp write_io_ptr = png_get_io_ptr(write_ptr);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004124
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05004125The replacement I/O functions must have prototypes as follows:
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004126
4127 void user_read_data(png_structp png_ptr,
Glenn Randers-Pehrson837a3d12002-05-10 20:19:58 -05004128 png_bytep data, png_size_t length);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004129
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004130 void user_write_data(png_structp png_ptr,
Glenn Randers-Pehrson837a3d12002-05-10 20:19:58 -05004131 png_bytep data, png_size_t length);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004132
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004133 void user_flush_data(png_structp png_ptr);
4134
Glenn Randers-Pehrsonebd7f9a2006-10-19 09:37:56 -05004135The user_read_data() function is responsible for detecting and
4136handling end-of-data errors.
4137
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004138Supplying NULL for the read, write, or flush functions sets them back
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05004139to using the default C stream functions, which expect the io_ptr to
4140point to a standard *FILE structure. It is probably a mistake
4141to use NULL for one of write_data_fn and output_flush_fn but not both
4142of them, unless you have built libpng with PNG_NO_WRITE_FLUSH defined.
4143It is an error to read from a write stream, and vice versa.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004144
4145Error handling in libpng is done through png_error() and png_warning().
4146Errors handled through png_error() are fatal, meaning that png_error()
4147should never return to its caller. Currently, this is handled via
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06004148setjmp() and longjmp() (unless you have compiled libpng with
Glenn Randers-Pehrson54ac9a92010-04-02 17:06:22 -05004149PNG_NO_SETJMP, in which case it is handled via PNG_ABORT()),
Glenn Randers-Pehrson60988072010-04-13 22:11:06 -05004150but you could change this to do things like exit() if you should wish,
Glenn Randers-Pehrson54ac9a92010-04-02 17:06:22 -05004151as long as your function does not return.
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06004152
4153On non-fatal errors, png_warning() is called
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004154to print a warning message, and then control returns to the calling code.
4155By default png_error() and png_warning() print a message on stderr via
Glenn Randers-Pehrson38e6e772000-04-09 19:06:13 -05004156fprintf() unless the library is compiled with PNG_NO_CONSOLE_IO defined
4157(because you don't want the messages) or PNG_NO_STDIO defined (because
4158fprintf() isn't available). If you wish to change the behavior of the error
4159functions, you will need to set up your own message callbacks. These
4160functions are normally supplied at the time that the png_struct is created.
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05004161It is also possible to redirect errors and warnings to your own replacement
4162functions after png_create_*_struct() has been called by calling:
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004163
4164 png_set_error_fn(png_structp png_ptr,
4165 png_voidp error_ptr, png_error_ptr error_fn,
4166 png_error_ptr warning_fn);
4167
4168 png_voidp error_ptr = png_get_error_ptr(png_ptr);
4169
4170If NULL is supplied for either error_fn or warning_fn, then the libpng
4171default function will be used, calling fprintf() and/or longjmp() if a
4172problem is encountered. The replacement error functions should have
4173parameters as follows:
4174
4175 void user_error_fn(png_structp png_ptr,
4176 png_const_charp error_msg);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004177
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004178 void user_warning_fn(png_structp png_ptr,
4179 png_const_charp warning_msg);
4180
4181The motivation behind using setjmp() and longjmp() is the C++ throw and
4182catch exception handling methods. This makes the code much easier to write,
4183as there is no need to check every return code of every function call.
4184However, there are some uncertainties about the status of local variables
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06004185after a longjmp, so the user may want to be careful about doing anything
4186after setjmp returns non-zero besides returning itself. Consult your
4187compiler documentation for more details. For an alternative approach, you
4188may wish to use the "cexcept" facility (see http://cexcept.sourceforge.net).
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004189
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06004190.SS Custom chunks
4191
4192If you need to read or write custom chunks, you may need to get deeper
4193into the libpng code. The library now has mechanisms for storing
4194and writing chunks of unknown type; you can even declare callbacks
Glenn Randers-Pehrson9c3ab682006-02-20 22:09:05 -06004195for custom chunks. However, this may not be good enough if the
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06004196library code itself needs to know about interactions between your
4197chunk and existing `intrinsic' chunks.
4198
4199If you need to write a new intrinsic chunk, first read the PNG
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06004200specification. Acquire a first level of understanding of how it works.
4201Pay particular attention to the sections that describe chunk names,
4202and look at how other chunks were designed, so you can do things
4203similarly. Second, check out the sections of libpng that read and
4204write chunks. Try to find a chunk that is similar to yours and use
4205it as a template. More details can be found in the comments inside
4206the code. It is best to handle unknown chunks in a generic method,
4207via callback functions, instead of by modifying libpng functions.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004208
4209If you wish to write your own transformation for the data, look through
4210the part of the code that does the transformations, and check out some of
4211the simpler ones to get an idea of how they work. Try to find a similar
4212transformation to the one you want to add and copy off of it. More details
4213can be found in the comments inside the code itself.
4214
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06004215.SS Configuring for 16 bit platforms
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004216
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05004217You will want to look into zconf.h to tell zlib (and thus libpng) that
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004218it cannot allocate more then 64K at a time. Even if you can, the memory
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06004219won't be accessible. So limit zlib and libpng to 64K by defining MAXSEG_64K.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004220
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06004221.SS Configuring for DOS
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004222
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06004223For DOS users who only have access to the lower 640K, you will
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004224have to limit zlib's memory usage via a png_set_compression_mem_level()
4225call. See zlib.h or zconf.h in the zlib library for more information.
4226
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06004227.SS Configuring for Medium Model
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004228
4229Libpng's support for medium model has been tested on most of the popular
4230compilers. Make sure MAXSEG_64K gets defined, USE_FAR_KEYWORD gets
4231defined, and FAR gets defined to far in pngconf.h, and you should be
4232all set. Everything in the library (except for zlib's structure) is
4233expecting far data. You must use the typedefs with the p or pp on
4234the end for pointers (or at least look at them and be careful). Make
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06004235note that the rows of data are defined as png_bytepp, which is an
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004236unsigned char far * far *.
4237
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06004238.SS Configuring for gui/windowing platforms:
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004239
4240You will need to write new error and warning functions that use the GUI
4241interface, as described previously, and set them to be the error and
Glenn Randers-Pehrsona77ef622000-02-18 13:48:52 -06004242warning functions at the time that png_create_*_struct() is called,
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004243in order to have them available during the structure initialization.
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06004244They can be changed later via png_set_error_fn(). On some compilers,
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004245you may also have to change the memory allocators (png_malloc, etc.).
4246
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06004247.SS Configuring for compiler xxx:
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004248
Glenn Randers-Pehrsonbeb572e2006-08-19 13:59:24 -05004249All includes for libpng are in pngconf.h. If you need to add, change
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05004250or delete an include, this is the place to do it.
4251The includes that are not needed outside libpng are placed in pngpriv.h,
4252which is only used by the routines inside libpng itself.
4253The files in libpng proper only include pngpriv.h and png.h, which
4254in turn includes pngconf.h.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004255
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06004256.SS Configuring zlib:
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004257
4258There are special functions to configure the compression. Perhaps the
4259most useful one changes the compression level, which currently uses
4260input compression values in the range 0 - 9. The library normally
4261uses the default compression level (Z_DEFAULT_COMPRESSION = 6). Tests
4262have shown that for a large majority of images, compression values in
4263the range 3-6 compress nearly as well as higher levels, and do so much
4264faster. For online applications it may be desirable to have maximum speed
4265(Z_BEST_SPEED = 1). With versions of zlib after v0.99, you can also
4266specify no compression (Z_NO_COMPRESSION = 0), but this would create
4267files larger than just storing the raw bitmap. You can specify the
4268compression level by calling:
4269
Glenn Randers-Pehrson38734ee2011-03-03 06:23:31 -06004270 #include zlib.h
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004271 png_set_compression_level(png_ptr, level);
4272
4273Another useful one is to reduce the memory level used by the library.
4274The memory level defaults to 8, but it can be lowered if you are
4275short on memory (running DOS, for example, where you only have 640K).
Glenn Randers-Pehrson4fb046a2002-04-15 09:25:51 -05004276Note that the memory level does have an effect on compression; among
4277other things, lower levels will result in sections of incompressible
4278data being emitted in smaller stored blocks, with a correspondingly
4279larger relative overhead of up to 15% in the worst case.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004280
Glenn Randers-Pehrson38734ee2011-03-03 06:23:31 -06004281 #include zlib.h
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004282 png_set_compression_mem_level(png_ptr, level);
4283
4284The other functions are for configuring zlib. They are not recommended
4285for normal use and may result in writing an invalid PNG file. See
4286zlib.h for more information on what these mean.
4287
Glenn Randers-Pehrson38734ee2011-03-03 06:23:31 -06004288 #include zlib.h
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004289 png_set_compression_strategy(png_ptr,
4290 strategy);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004291
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004292 png_set_compression_window_bits(png_ptr,
4293 window_bits);
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004294
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004295 png_set_compression_method(png_ptr, method);
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05004296 png_set_compression_buffer_size(png_ptr, size);
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004297
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06004298.SS Controlling row filtering
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004299
4300If you want to control whether libpng uses filtering or not, which
4301filters are used, and how it goes about picking row filters, you
4302can call one of these functions. The selection and configuration
4303of row filters can have a significant impact on the size and
4304encoding speed and a somewhat lesser impact on the decoding speed
4305of an image. Filtering is enabled by default for RGB and grayscale
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06004306images (with and without alpha), but not for paletted images nor
4307for any images with bit depths less than 8 bits/pixel.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004308
4309The 'method' parameter sets the main filtering method, which is
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05004310currently only '0' in the PNG 1.2 specification. The 'filters'
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004311parameter sets which filter(s), if any, should be used for each
4312scanline. Possible values are PNG_ALL_FILTERS and PNG_NO_FILTERS
4313to turn filtering on and off, respectively.
4314
4315Individual filter types are PNG_FILTER_NONE, PNG_FILTER_SUB,
4316PNG_FILTER_UP, PNG_FILTER_AVG, PNG_FILTER_PAETH, which can be bitwise
Glenn Randers-Pehrson6942d532000-05-01 09:31:54 -05004317ORed together with '|' to specify one or more filters to use.
Glenn Randers-Pehrson4fb046a2002-04-15 09:25:51 -05004318These filters are described in more detail in the PNG specification.
4319If you intend to change the filter type during the course of writing
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004320the image, you should start with flags set for all of the filters
4321you intend to use so that libpng can initialize its internal
Glenn Randers-Pehrson4fb046a2002-04-15 09:25:51 -05004322structures appropriately for all of the filter types. (Note that this
4323means the first row must always be adaptively filtered, because libpng
4324currently does not allocate the filter buffers until png_write_row()
4325is called for the first time.)
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004326
4327 filters = PNG_FILTER_NONE | PNG_FILTER_SUB
Glenn Randers-Pehrson76546822009-05-16 07:25:42 -05004328 PNG_FILTER_UP | PNG_FILTER_AVG |
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05004329 PNG_FILTER_PAETH | PNG_ALL_FILTERS;
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05004330
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004331 png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE,
4332 filters);
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06004333 The second parameter can also be
4334 PNG_INTRAPIXEL_DIFFERENCING if you are
4335 writing a PNG to be embedded in a MNG
4336 datastream. This parameter must be the
4337 same as the value of filter_method used
4338 in png_set_IHDR().
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004339
4340It is also possible to influence how libpng chooses from among the
Glenn Randers-Pehrson4fb046a2002-04-15 09:25:51 -05004341available filters. This is done in one or both of two ways - by
4342telling it how important it is to keep the same filter for successive
4343rows, and by telling it the relative computational costs of the filters.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004344
4345 double weights[3] = {1.5, 1.3, 1.1},
4346 costs[PNG_FILTER_VALUE_LAST] =
4347 {1.0, 1.3, 1.3, 1.5, 1.7};
4348
Glenn Randers-Pehrson4fb046a2002-04-15 09:25:51 -05004349 png_set_filter_heuristics(png_ptr,
4350 PNG_FILTER_HEURISTIC_WEIGHTED, 3,
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004351 weights, costs);
4352
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06004353The weights are multiplying factors that indicate to libpng that the
4354row filter should be the same for successive rows unless another row filter
4355is that many times better than the previous filter. In the above example,
4356if the previous 3 filters were SUB, SUB, NONE, the SUB filter could have a
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004357"sum of absolute differences" 1.5 x 1.3 times higher than other filters
4358and still be chosen, while the NONE filter could have a sum 1.1 times
4359higher than other filters and still be chosen. Unspecified weights are
4360taken to be 1.0, and the specified weights should probably be declining
4361like those above in order to emphasize recent filters over older filters.
4362
4363The filter costs specify for each filter type a relative decoding cost
4364to be considered when selecting row filters. This means that filters
4365with higher costs are less likely to be chosen over filters with lower
4366costs, unless their "sum of absolute differences" is that much smaller.
4367The costs do not necessarily reflect the exact computational speeds of
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06004368the various filters, since this would unduly influence the final image
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004369size.
4370
4371Note that the numbers above were invented purely for this example and
4372are given only to help explain the function usage. Little testing has
4373been done to find optimum values for either the costs or the weights.
4374
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06004375.SS Removing unwanted object code
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004376
4377There are a bunch of #define's in pngconf.h that control what parts of
4378libpng are compiled. All the defines end in _SUPPORTED. If you are
Glenn Randers-Pehrsond0dce401998-05-09 10:02:29 -05004379never going to use a capability, you can change the #define to #undef
4380before recompiling libpng and save yourself code and data space, or
4381you can turn off individual capabilities with defines that begin with
4382PNG_NO_.
4383
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004384In libpng-1.5.0 and later, the #define's are in pnglibconf.h instead.
4385
Glenn Randers-Pehrsond0dce401998-05-09 10:02:29 -05004386You can also turn all of the transforms and ancillary chunk capabilities
Glenn Randers-Pehrson228bd392000-04-23 23:14:02 -05004387off en masse with compiler directives that define
Glenn Randers-Pehrsond0dce401998-05-09 10:02:29 -05004388PNG_NO_READ[or WRITE]_TRANSFORMS, or PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS,
4389or all four,
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004390along with directives to turn on any of the capabilities that you do
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06004391want. The PNG_NO_READ[or WRITE]_TRANSFORMS directives disable the extra
4392transformations but still leave the library fully capable of reading
4393and writing PNG files with all known public chunks. Use of the
4394PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS directive produces a library
4395that is incapable of reading or writing ancillary chunks. If you are
4396not using the progressive reading capability, you can turn that off
4397with PNG_NO_PROGRESSIVE_READ (don't confuse this with the INTERLACING
4398capability, which you'll still have).
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004399
4400All the reading and writing specific code are in separate files, so the
4401linker should only grab the files it needs. However, if you want to
4402make sure, or if you are building a stand alone library, all the
4403reading files start with pngr and all the writing files start with
4404pngw. The files that don't match either (like png.c, pngtrans.c, etc.)
4405are used for both reading and writing, and always need to be included.
4406The progressive reader is in pngpread.c
4407
4408If you are creating or distributing a dynamically linked library (a .so
4409or DLL file), you should not remove or disable any parts of the library,
4410as this will cause applications linked with different versions of the
4411library to fail if they call functions not available in your library.
4412The size of the library itself should not be an issue, because only
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06004413those sections that are actually used will be loaded into memory.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004414
Glenn Randers-Pehrson61c32d92000-02-04 23:40:16 -06004415.SS Requesting debug printout
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004416
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06004417The macro definition PNG_DEBUG can be used to request debugging
4418printout. Set it to an integer value in the range 0 to 3. Higher
4419numbers result in increasing amounts of debugging information. The
4420information is printed to the "stderr" file, unless another file
4421name is specified in the PNG_DEBUG_FILE macro definition.
4422
4423When PNG_DEBUG > 0, the following functions (macros) become available:
4424
4425 png_debug(level, message)
4426 png_debug1(level, message, p1)
4427 png_debug2(level, message, p1, p2)
4428
4429in which "level" is compared to PNG_DEBUG to decide whether to print
4430the message, "message" is the formatted string to be printed,
4431and p1 and p2 are parameters that are to be embedded in the string
4432according to printf-style formatting directives. For example,
4433
4434 png_debug1(2, "foo=%d\n", foo);
4435
4436is expanded to
4437
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004438 if (PNG_DEBUG > 2)
4439 fprintf(PNG_DEBUG_FILE, "foo=%d\n", foo);
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06004440
4441When PNG_DEBUG is defined but is zero, the macros aren't defined, but you
4442can still use PNG_DEBUG to control your own debugging:
4443
4444 #ifdef PNG_DEBUG
4445 fprintf(stderr, ...
4446 #endif
4447
4448When PNG_DEBUG = 1, the macros are defined, but only png_debug statements
4449having level = 0 will be printed. There aren't any such statements in
4450this version of libpng, but if you insert some they will be printed.
4451
Glenn Randers-Pehrson56f63962008-10-06 10:16:17 -05004452.SH VI. MNG support
Glenn Randers-Pehrson2ad31ae2000-12-15 08:54:42 -06004453
4454The MNG specification (available at http://www.libpng.org/pub/mng) allows
4455certain extensions to PNG for PNG images that are embedded in MNG datastreams.
4456Libpng can support some of these extensions. To enable them, use the
4457png_permit_mng_features() function:
4458
4459 feature_set = png_permit_mng_features(png_ptr, mask)
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004460
Glenn Randers-Pehrsonebd7f9a2006-10-19 09:37:56 -05004461 mask is a png_uint_32 containing the bitwise OR of the
Glenn Randers-Pehrson2ad31ae2000-12-15 08:54:42 -06004462 features you want to enable. These include
4463 PNG_FLAG_MNG_EMPTY_PLTE
4464 PNG_FLAG_MNG_FILTER_64
4465 PNG_ALL_MNG_FEATURES
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004466
Glenn Randers-Pehrsonebd7f9a2006-10-19 09:37:56 -05004467 feature_set is a png_uint_32 that is the bitwise AND of
Glenn Randers-Pehrson2ad31ae2000-12-15 08:54:42 -06004468 your mask with the set of MNG features that is
4469 supported by the version of libpng that you are using.
4470
Glenn Randers-Pehrson408b4212000-12-18 09:33:57 -06004471It is an error to use this function when reading or writing a standalone
4472PNG file with the PNG 8-byte signature. The PNG datastream must be wrapped
Glenn Randers-Pehrsonf05f8032000-12-23 14:27:39 -06004473in a MNG datastream. As a minimum, it must have the MNG 8-byte signature
4474and the MHDR and MEND chunks. Libpng does not provide support for these
4475or any other MNG chunks; your application must provide its own support for
4476them. You may wish to consider using libmng (available at
4477http://www.libmng.com) instead.
Glenn Randers-Pehrson408b4212000-12-18 09:33:57 -06004478
Glenn Randers-Pehrson8fb550c2009-03-21 08:15:32 -05004479.SH VII. Changes to Libpng from version 0.88
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004480
4481It should be noted that versions of libpng later than 0.96 are not
4482distributed by the original libpng author, Guy Schalnat, nor by
4483Andreas Dilger, who had taken over from Guy during 1996 and 1997, and
4484distributed versions 0.89 through 0.96, but rather by another member
4485of the original PNG Group, Glenn Randers-Pehrson. Guy and Andreas are
4486still alive and well, but they have moved on to other things.
4487
4488The old libpng functions png_read_init(), png_write_init(),
Glenn Randers-Pehrson8b6a8892001-05-18 04:54:50 -05004489png_info_init(), png_read_destroy(), and png_write_destroy() have been
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -05004490moved to PNG_INTERNAL in version 0.95 to discourage their use. These
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004491functions will be removed from libpng version 1.4.0.
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -05004492
4493The preferred method of creating and initializing the libpng structures is
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004494via the png_create_read_struct(), png_create_write_struct(), and
4495png_create_info_struct() because they isolate the size of the structures
4496from the application, allow version error checking, and also allow the
4497use of custom error handling routines during the initialization, which
4498the old functions do not. The functions png_read_destroy() and
4499png_write_destroy() do not actually free the memory that libpng
4500allocated for these structs, but just reset the data structures, so they
4501can be used instead of png_destroy_read_struct() and
4502png_destroy_write_struct() if you feel there is too much system overhead
4503allocating and freeing the png_struct for each image read.
4504
4505Setting the error callbacks via png_set_message_fn() before
4506png_read_init() as was suggested in libpng-0.88 is no longer supported
Glenn Randers-Pehrson5c6aeb21998-12-29 11:47:59 -06004507because this caused applications that do not use custom error functions
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004508to fail if the png_ptr was not initialized to zero. It is still possible
4509to set the error callbacks AFTER png_read_init(), or to change them with
Glenn Randers-Pehrson75294572000-05-06 14:09:57 -05004510png_set_error_fn(), which is essentially the same function, but with a new
4511name to force compilation errors with applications that try to use the old
4512method.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06004513
Glenn Randers-Pehrson1ef65b62000-05-12 06:19:53 -05004514Starting with version 1.0.7, you can find out which version of the library
4515you are using at run-time:
4516
4517 png_uint_32 libpng_vn = png_access_version_number();
4518
4519The number libpng_vn is constructed from the major version, minor
4520version with leading zero, and release number with leading zero,
4521(e.g., libpng_vn for version 1.0.7 is 10007).
4522
4523You can also check which version of png.h you used when compiling your
4524application:
4525
4526 png_uint_32 application_vn = PNG_LIBPNG_VER;
4527
Glenn Randers-Pehrson6a9c2ce2009-03-27 19:30:10 -05004528.SH VIII. Changes to Libpng from version 1.0.x to 1.2.x
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -06004529
Glenn Randers-Pehrson6a9c2ce2009-03-27 19:30:10 -05004530Support for user memory management was enabled by default. To
4531accomplish this, the functions png_create_read_struct_2(),
4532png_create_write_struct_2(), png_set_mem_fn(), png_get_mem_ptr(),
4533png_malloc_default(), and png_free_default() were added.
4534
Glenn Randers-Pehrsond6ea40a2009-11-02 07:32:00 -06004535Support for the iTXt chunk has been enabled by default as of
4536version 1.2.41.
4537
Glenn Randers-Pehrson6a9c2ce2009-03-27 19:30:10 -05004538Support for certain MNG features was enabled.
4539
4540Support for numbered error messages was added. However, we never got
4541around to actually numbering the error messages. The function
4542png_set_strip_error_numbers() was added (Note: the prototype for this
4543function was inadvertently removed from png.h in PNG_NO_ASSEMBLER_CODE
4544builds of libpng-1.2.15. It was restored in libpng-1.2.36).
4545
4546The png_malloc_warn() function was added at libpng-1.2.3. This issues
4547a png_warning and returns NULL instead of aborting when it fails to
4548acquire the requested memory allocation.
4549
4550Support for setting user limits on image width and height was enabled
4551by default. The functions png_set_user_limits(), png_get_user_width_max(),
4552and png_get_user_height_max() were added at libpng-1.2.6.
4553
4554The png_set_add_alpha() function was added at libpng-1.2.7.
4555
4556The function png_set_expand_gray_1_2_4_to_8() was added at libpng-1.2.9.
4557Unlike png_set_gray_1_2_4_to_8(), the new function does not expand the
4558tRNS chunk to alpha. The png_set_gray_1_2_4_to_8() function is
4559deprecated.
4560
4561A number of macro definitions in support of runtime selection of
4562assembler code features (especially Intel MMX code support) were
4563added at libpng-1.2.0:
4564
4565 PNG_ASM_FLAG_MMX_SUPPORT_COMPILED
4566 PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU
4567 PNG_ASM_FLAG_MMX_READ_COMBINE_ROW
4568 PNG_ASM_FLAG_MMX_READ_INTERLACE
4569 PNG_ASM_FLAG_MMX_READ_FILTER_SUB
4570 PNG_ASM_FLAG_MMX_READ_FILTER_UP
4571 PNG_ASM_FLAG_MMX_READ_FILTER_AVG
4572 PNG_ASM_FLAG_MMX_READ_FILTER_PAETH
4573 PNG_ASM_FLAGS_INITIALIZED
4574 PNG_MMX_READ_FLAGS
4575 PNG_MMX_FLAGS
4576 PNG_MMX_WRITE_FLAGS
4577 PNG_MMX_FLAGS
4578
4579We added the following functions in support of runtime
4580selection of assembler code features:
4581
4582 png_get_mmx_flagmask()
4583 png_set_mmx_thresholds()
4584 png_get_asm_flags()
4585 png_get_mmx_bitdepth_threshold()
4586 png_get_mmx_rowbytes_threshold()
4587 png_set_asm_flags()
4588
4589We replaced all of these functions with simple stubs in libpng-1.2.20,
4590when the Intel assembler code was removed due to a licensing issue.
4591
Glenn Randers-Pehrson3d893a02009-08-31 13:32:46 -05004592These macros are deprecated:
4593
4594 PNG_READ_TRANSFORMS_NOT_SUPPORTED
4595 PNG_PROGRESSIVE_READ_NOT_SUPPORTED
4596 PNG_NO_SEQUENTIAL_READ_SUPPORTED
4597 PNG_WRITE_TRANSFORMS_NOT_SUPPORTED
4598 PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED
4599 PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED
4600
4601They have been replaced, respectively, by:
4602
4603 PNG_NO_READ_TRANSFORMS
4604 PNG_NO_PROGRESSIVE_READ
4605 PNG_NO_SEQUENTIAL_READ
4606 PNG_NO_WRITE_TRANSFORMS
4607 PNG_NO_READ_ANCILLARY_CHUNKS
4608 PNG_NO_WRITE_ANCILLARY_CHUNKS
4609
Glenn Randers-Pehrson6a9c2ce2009-03-27 19:30:10 -05004610PNG_MAX_UINT was replaced with PNG_UINT_31_MAX. It has been
4611deprecated since libpng-1.0.16 and libpng-1.2.6.
4612
4613The function
4614 png_check_sig(sig, num)
4615was replaced with
4616 !png_sig_cmp(sig, 0, num)
4617It has been deprecated since libpng-0.90.
4618
Glenn Randers-Pehrson6a9c2ce2009-03-27 19:30:10 -05004619The function
4620 png_set_gray_1_2_4_to_8()
4621which also expands tRNS to alpha was replaced with
4622 png_set_expand_gray_1_2_4_to_8()
4623which does not. It has been deprecated since libpng-1.0.18 and 1.2.9.
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06004624
Glenn Randers-Pehrsond740c842009-11-04 19:01:54 -06004625.SH IX. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x
4626
4627Private libpng prototypes and macro definitions were moved from
4628png.h and pngconf.h into a new pngpriv.h header file.
4629
Glenn Randers-Pehrson6a9c2ce2009-03-27 19:30:10 -05004630Functions png_set_benign_errors(), png_benign_error(), and
4631png_chunk_benign_error() were added.
4632
4633Support for setting the maximum amount of memory that the application
4634will allocate for reading chunks was added, as a security measure.
4635The functions png_set_chunk_cache_max() and png_get_chunk_cache_max()
4636were added to the library.
4637
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06004638We implemented support for I/O states by adding png_ptr member io_state
4639and functions png_get_io_chunk_name() and png_get_io_state() in pngget.c
Glenn Randers-Pehrson6a9c2ce2009-03-27 19:30:10 -05004640
Glenn Randers-Pehrson5df7edb2009-10-29 23:32:44 -05004641We added PNG_TRANSFORM_GRAY_TO_RGB to the available high-level
4642input transforms.
4643
Glenn Randers-Pehrson5df7edb2009-10-29 23:32:44 -05004644Checking for and reporting of errors in the IHDR chunk is more thorough.
4645
Glenn Randers-Pehrson45af8192009-12-30 08:37:29 -06004646Support for global arrays was removed, to improve thread safety.
4647
4648Some obsolete/deprecated macros and functions have been removed.
4649
4650Typecasted NULL definitions such as
4651 #define png_voidp_NULL (png_voidp)NULL
4652were eliminated. If you used these in your application, just use
4653NULL instead.
4654
4655The png_struct and info_struct members "trans" and "trans_values" were
4656changed to "trans_alpha" and "trans_color", respectively.
4657
4658The obsolete, unused pnggccrd.c and pngvcrd.c files and related makefiles
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06004659were removed.
Glenn Randers-Pehrson45af8192009-12-30 08:37:29 -06004660
4661The PNG_1_0_X and PNG_1_2_X macros were eliminated.
4662
Glenn Randers-Pehrson5df7edb2009-10-29 23:32:44 -05004663The PNG_LEGACY_SUPPORTED macro was eliminated.
4664
4665Many WIN32_WCE #ifdefs were removed.
4666
4667The functions png_read_init(info_ptr), png_write_init(info_ptr),
4668png_info_init(info_ptr), png_read_destroy(), and png_write_destroy()
4669have been removed. They have been deprecated since libpng-0.95.
4670
Glenn Randers-Pehrson6a9c2ce2009-03-27 19:30:10 -05004671The png_permit_empty_plte() was removed. It has been deprecated
4672since libpng-1.0.9. Use png_permit_mng_features() instead.
4673
4674We removed the obsolete stub functions png_get_mmx_flagmask(),
4675png_set_mmx_thresholds(), png_get_asm_flags(),
4676png_get_mmx_bitdepth_threshold(), png_get_mmx_rowbytes_threshold(),
4677png_set_asm_flags(), and png_mmx_supported()
4678
Glenn Randers-Pehrson45af8192009-12-30 08:37:29 -06004679We removed the obsolete png_check_sig(), png_memcpy_check(), and
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -05004680png_memset_check() functions. Instead use !png_sig_cmp(), memcpy(),
4681and memset(), respectively.
Glenn Randers-Pehrson6a9c2ce2009-03-27 19:30:10 -05004682
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06004683The function png_set_gray_1_2_4_to_8() was removed. It has been
4684deprecated since libpng-1.0.18 and 1.2.9, when it was replaced with
4685png_set_expand_gray_1_2_4_to_8() because the former function also
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06004686expanded any tRNS chunk to an alpha channel.
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06004687
Glenn Randers-Pehrson5b40b012010-11-25 07:16:29 -06004688Macros for png_get_uint_16, png_get_uint_32, and png_get_int_32
4689were added and are used by default instead of the corresponding
4690functions. Unfortunately,
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06004691from 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 -06004692function) incorrectly returned a value of type png_uint_32.
4693
Glenn Randers-Pehrson6a9c2ce2009-03-27 19:30:10 -05004694We changed the prototype for png_malloc() from
4695 png_malloc(png_structp png_ptr, png_uint_32 size)
4696to
4697 png_malloc(png_structp png_ptr, png_alloc_size_t size)
4698
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06004699This also applies to the prototype for the user replacement malloc_fn().
4700
Glenn Randers-Pehrson45af8192009-12-30 08:37:29 -06004701The png_calloc() function was added and is used in place of
Glenn Randers-Pehrson2be8b642010-07-29 19:09:18 -05004702of "png_malloc(); memset();" except in the case in png_read_png()
Glenn Randers-Pehrson45af8192009-12-30 08:37:29 -06004703where the array consists of pointers; in this case a "for" loop is used
4704after the png_malloc() to set the pointers to NULL, to give robust.
4705behavior in case the application runs out of memory part-way through
4706the process.
4707
Glenn Randers-Pehrson6a9c2ce2009-03-27 19:30:10 -05004708We changed the prototypes of png_get_compression_buffer_size() and
4709png_set_compression_buffer_size() to work with png_size_t instead of
4710png_uint_32.
4711
Glenn Randers-Pehrson45af8192009-12-30 08:37:29 -06004712Support for numbered error messages was removed by default, since we
4713never got around to actually numbering the error messages. The function
4714png_set_strip_error_numbers() was removed from the library by default.
4715
4716The png_zalloc() and png_zfree() functions are no longer exported.
Glenn Randers-Pehrson6a9c2ce2009-03-27 19:30:10 -05004717The png_zalloc() function no longer zeroes out the memory that it
4718allocates.
4719
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05004720Support for dithering was disabled by default in libpng-1.4.0, because
Glenn Randers-Pehrson9f1cd702011-04-16 19:40:23 -05004721it has not been well tested and doesn't actually "dither".
4722The code was not
Glenn Randers-Pehrson3cd7cff2010-04-16 19:27:08 -05004723removed, however, and could be enabled by building libpng with
4724PNG_READ_DITHER_SUPPORTED defined. In libpng-1.4.2, this support
4725was reenabled, but the function was renamed png_set_quantize() to
4726reflect more accurately what it actually does. At the same time,
4727the PNG_DITHER_[RED,GREEN_BLUE]_BITS macros were also renamed to
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004728PNG_QUANTIZE_[RED,GREEN,BLUE]_BITS, and PNG_READ_DITHER_SUPPORTED
4729was renamed to PNG_READ_QUANTIZE_SUPPORTED.
Glenn Randers-Pehrson60988072010-04-13 22:11:06 -05004730
Glenn Randers-Pehrson6a9c2ce2009-03-27 19:30:10 -05004731We removed the trailing '.' from the warning and error messages.
4732
Glenn Randers-Pehrson5b40b012010-11-25 07:16:29 -06004733.SH X. Changes to Libpng from version 1.4.x to 1.5.x
4734
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06004735From 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 -06004736function) incorrectly returned a value of type png_uint_32.
4737
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004738A. Changes that affect users of libpng
4739
4740There are no substantial API changes between the non-deprecated parts of
4741the 1.4.5 API and the 1.5.0 API, however the ability to directly access
4742the main libpng control structures, png_struct and png_info, deprecated
4743in earlier versions of libpng, has been completely removed from
4744libpng 1.5.
4745
Glenn Randers-Pehrson00879b12011-01-15 19:25:34 -06004746We no longer include zlib.h in png.h. Applications that need access
4747to information in zlib.h will need to add the '#include "zlib.h"'
4748directive. It does not matter whether it is placed prior to or after
4749the '"#include png.h"' directive.
4750
4751We moved the png_strcpy(), png_strncpy(), png_strlen(), png_memcpy(),
4752png_memcmp(), png_sprintf, and png_memcpy() macros into a private
4753header file (pngpriv.h) that is not accessible to applications.
4754
Glenn Randers-Pehrson9d23b402011-01-08 10:42:01 -06004755In png_get_iCCP, the type of "profile" was changed from png_charpp
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004756to png_bytepp, and in png_set_iCCP, from png_charp to png_const_bytep.
Glenn Randers-Pehrson9d23b402011-01-08 10:42:01 -06004757
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004758There are changes of form in png.h, including new and changed macros to
4759declare
Glenn Randers-Pehrsonf5ea1b72011-01-06 06:42:51 -06004760parts of the API. Some API functions with arguments that are pointers to
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004761data not modified within the function have been corrected to declare
4762these arguments with PNG_CONST.
4763
4764Much of the internal use of C macros to control the library build has also
4765changed and some of this is visible in the exported header files, in
4766particular the use of macros to control data and API elements visible
4767during application compilation may require significant revision to
4768application code. (It is extremely rare for an application to do this.)
4769
4770Any program that compiled against libpng 1.4 and did not use deprecated
4771features or access internal library structures should compile and work
Glenn Randers-Pehrsond08b6bd2011-02-19 15:50:17 -06004772against libpng 1.5, except for the change in the prototype for
4773png_get_iCCP() and png_set_iCCP() API functions mentioned above.
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004774
Glenn Randers-Pehrson6e974102010-12-19 16:44:22 -06004775libpng 1.5.0 adds PNG_ PASS macros to help in the reading and writing of
4776interlaced images. The macros return the number of rows and columns in
4777each pass and information that can be used to de-interlace and (if
4778absolutely necessary) interlace an image.
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004779
4780libpng 1.5.0 adds an API png_longjmp(png_ptr, value). This API calls
Glenn Randers-Pehrsond08b6bd2011-02-19 15:50:17 -06004781the application-provided png_longjmp_ptr on the internal, but application
Glenn Randers-Pehrson33ced442011-04-27 14:58:06 -05004782initialized, jmpbuf. It is provided as a convenience to avoid the need
4783initialized, longjmp buffer. It is provided as a convenience to avoid
4784the need to use the png_jmpbuf macro, which had the unnecessary side
4785effect of resetting the internal png_longjmp_ptr value.
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004786
4787libpng 1.5.0 includes a complete fixed point API. By default this is
4788present along with the corresponding floating point API. In general the
4789fixed point API is faster and smaller than the floating point one because
4790the PNG file format used fixed point, not floating point. This applies
4791even if the library uses floating point in internal calculations. A new
4792macro, PNG_FLOATING_ARITHMETIC_SUPPORTED, reveals whether the library
4793uses floating point arithmetic (the default) or fixed point arithmetic
4794internally for performance critical calculations such as gamma correction.
Glenn Randers-Pehrson00879b12011-01-15 19:25:34 -06004795In some cases, the gamma calculations may produce slightly different
4796results. This has changed the results in png_rgb_to_gray and in alpha
4797composition (png_set_background for example). This applies even if the
4798original image was already linear (gamma == 1.0) and, therefore, it is
4799not necessary to linearize the image. This is because libpng has *not*
4800been changed to optimize that case correctly, yet.
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004801
4802Fixed point support for the sCAL chunk comes with an important caveat;
4803the sCAL specification uses a decimal encoding of floating point values
4804and the accuracy of PNG fixed point values is insufficient for
4805representation of these values. Consequently a "string" API
4806(png_get_sCAL_s and png_set_sCAL_s) is the only reliable way of reading
4807arbitrary sCAL chunks in the absence of either the floating point API or
4808internal floating point calculations.
4809
4810Applications no longer need to include the optional distribution header
4811file pngusr.h or define the corresponding macros during application
4812build in order to see the correct variant of the libpng API. From 1.5.0
4813application code can check for the corresponding _SUPPORTED macro:
4814
4815#ifdef PNG_INCH_CONVERSIONS_SUPPORTED
4816 /* code that uses the inch conversion APIs. */
4817#endif
4818
4819This macro will only be defined if the inch conversion functions have been
4820compiled into libpng. The full set of macros, and whether or not support
4821has been compiled in, are available in the header file pnglibconf.h.
4822This header file is specific to the libpng build. Notice that prior to
48231.5.0 the _SUPPORTED macros would always have the default definition unless
4824reset by pngusr.h or by explicit settings on the compiler command line.
4825These settings may produce compiler warnings or errors in 1.5.0 because
4826of macro redefinition.
4827
Glenn Randers-Pehrsonc36bb792011-02-12 09:49:07 -06004828From 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 -06004829function) incorrectly returned a value of type png_uint_32. libpng 1.5.0
4830is consistent with the implementation in 1.4.5 and 1.2.x (where the macro
4831did not exist.)
4832
4833Applications can now choose whether to use these macros or to call the
4834corresponding function by defining PNG_USE_READ_MACROS or
4835PNG_NO_USE_READ_MACROS before including png.h. Notice that this is
4836only supported from 1.5.0 -defining PNG_NO_USE_READ_MACROS prior to 1.5.0
4837 will lead to a link failure.
Glenn Randers-Pehrson59fa3e92011-01-06 07:07:06 -06004838
Glenn Randers-Pehrson8eb88332011-04-01 00:16:50 -05004839Prior to libpng-1.5.3, the zlib compressor used the same set of parameters
4840when compressing the IDAT data and textual data such as zTXt and iCCP.
4841In libpng-1.5.3 we reinitialized the zlib stream for each type of data.
4842We added five png_set_text_*() functions for setting the parameters to
4843use with textual data.
4844
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004845B. Changes to the build and configuration of libpng
4846
4847Details of internal changes to the library code can be found in the CHANGES
4848file. These will be of no concern to the vast majority of library users or
4849builders, however the few who configure libpng to a non-default feature
4850set may need to change how this is done.
4851
4852There should be no need for library builders to alter build scripts if
4853these use the distributed build support - configure or the makefiles -
4854however users of the makefiles may care to update their build scripts
4855to build pnglibconf.h where the corresponding makefile does not do so.
4856
4857Building libpng with a non-default configuration has changed completely.
4858The old method using pngusr.h should still work correctly even though the
4859way pngusr.h is used in the build has been changed, however library
4860builders will probably want to examine the changes to take advantage of
4861new capabilities and to simplify their build system.
4862
4863B.1 Specific changes to library configuration capabilities
4864
4865The library now supports a complete fixed point implementation and can
4866thus be used on systems which have no floating point support or very
4867limited or slow support. Previously gamma correction, an essential part
4868of complete PNG support, required reasonably fast floating point.
4869
4870As part of this the choice of internal implementation has been made
4871independent of the choice of fixed versus floating point APIs and all the
4872missing fixed point APIs have been implemented.
4873
4874The exact mechanism used to control attributes of API functions has
4875changed. A single set of operating system independent macro definitions
4876is used and operating system specific directives are defined in
4877pnglibconf.h
4878
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004879As part of this the mechanism used to choose procedure call standards on
4880those systems that allow a choice has been changed. At present this only
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004881affects certain Microsoft (DOS, Windows) and IBM (OS/2) operating systems
4882running on Intel processors. As before PNGAPI is defined where required
4883to control the exported API functions; however, two new macros, PNGCBAPI
4884and PNGCAPI, are used instead for callback functions (PNGCBAPI) and
4885(PNGCAPI) for functions that must match a C library prototype (currently
4886only png_longjmp_ptr, which must match the C longjmp function.) The new
4887approach is documented in pngconf.h
4888
4889Despite these changes libpng 1.5.0 only supports the native C function
4890calling standard on those platforms tested so far (__cdecl on Microsoft
4891Windows). This is because the support requirements for alternative
4892calling conventions seem to no longer exist. Developers who find it
4893necessary to set PNG_API_RULE to 1 should advise the mailing list
4894(png-mng-implement) of this and library builders who use Openwatcom and
4895therefore set PNG_API_RULE to 2 should also contact the mailing list.
4896
4897A new test program, pngvalid, is provided in addition to pngtest.
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004898pngvalid validates the arithmetic accuracy of the gamma correction
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004899calculations and includes a number of validations of the file format.
4900A subset of the full range of tests is run when "make check" is done
4901(in the 'configure' build.) pngvalid also allows total allocated memory
4902usage to be evaluated and performs additional memory overwrite validation.
4903
4904Many changes to individual feature macros have been made. The following
4905are the changes most likely to be noticed by library builders who
4906configure libpng:
4907
49081) All feature macros now have consistent naming:
4909
4910#define PNG_NO_feature turns the feature off
4911#define PNG_feature_SUPPORTED turns the feature on
4912
4913pnglibconf.h contains one line for each feature macro which is either:
4914
4915#define PNG_feature_SUPPORTED
4916
4917if the feature is supported or:
4918
4919/*#undef PNG_feature_SUPPORTED*/
4920
4921if it is not. Library code consistently checks for the 'SUPPORTED' macro.
4922It does not, and should not, check for the 'NO' macro which will not
4923normally be defined even if the feature is not supported.
4924
4925Compatibility with the old names is provided as follows:
4926
4927PNG_INCH_CONVERSIONS turns on PNG_INCH_CONVERSIONS_SUPPORTED
4928
4929And the following definitions disable the corresponding feature:
4930
4931PNG_SETJMP_NOT_SUPPORTED disables SETJMP
4932PNG_READ_TRANSFORMS_NOT_SUPPORTED disables READ_TRANSFORMS
4933PNG_NO_READ_COMPOSITED_NODIV disables READ_COMPOSITE_NODIV
4934PNG_WRITE_TRANSFORMS_NOT_SUPPORTED disables WRITE_TRANSFORMS
4935PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED disables READ_ANCILLARY_CHUNKS
4936PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED disables WRITE_ANCILLARY_CHUNKS
4937
4938Library builders should remove use of the above, inconsistent, names.
4939
49402) Warning and error message formatting was previously conditional on
4941the STDIO feature. The library has been changed to use the
4942CONSOLE_IO feature instead. This means that if CONSOLE_IO is disabled
4943the library no longer uses the printf(3) functions, even though the
4944default read/write implementations use (FILE) style stdio.h functions.
4945
49463) Three feature macros now control the fixed/floating point decisions:
4947
4948PNG_FLOATING_POINT_SUPPORTED enables the floating point APIs
4949
4950PNG_FIXED_POINT_SUPPORTED enables the fixed point APIs; however, in
4951practice these are normally required internally anyway (because the PNG
4952file format is fixed point), therefore in most cases PNG_NO_FIXED_POINT
4953merely stops the function from being exported.
4954
4955PNG_FLOATING_ARITHMETIC_SUPPORTED chooses between the internal floating
4956point implementation or the fixed point one. Typically the fixed point
4957implementation is larger and slower than the floating point implementation
4958on a system that supports floating point, however it may be faster on a
4959system which lacks floating point hardware and therefore uses a software
4960emulation.
4961
49624) Added PNG_{READ,WRITE}_INT_FUNCTIONS_SUPPORTED. This allows the
4963functions to read and write ints to be disabled independently of
4964PNG_USE_READ_MACROS, which allows libpng to be built with the functions
4965even though the default is to use the macros - this allows applications
4966to choose at app buildtime whether or not to use macros (previously
4967impossible because the functions weren't in the default build.)
4968
4969B.2 Changes to the configuration mechanism
4970
4971Prior to libpng-1.5.0 library builders who needed to configure libpng
4972had either to modify the exported pngconf.h header file to add system
4973specific configuration or had to write feature selection macros into
4974pngusr.h and cause this to be included into pngconf.h by defining
4975PNG_USER_CONFIG. The latter mechanism had the disadvantage that an
4976application built without PNG_USER_CONFIG defined would see the
4977unmodified, default, libpng API and thus would probably fail to link.
4978
4979These mechanisms still work in the configure build and in any makefile
4980build that builds pnglibconf.h although the feature selection macros
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06004981have changed somewhat as described above. In 1.5.0, however, pngusr.h is
4982processed only once, when the exported header file pnglibconf.h is built.
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06004983pngconf.h no longer includes pngusr.h, therefore it is ignored after the
4984build of pnglibconf.h and it is never included in an application build.
4985
4986The rarely used alternative of adding a list of feature macros to the
4987CFLAGS setting in the build also still works, however the macros will be
4988copied to pnglibconf.h and this may produce macro redefinition warnings
4989when the individual C files are compiled.
4990
4991All configuration now only works if pnglibconf.h is built from
4992scripts/pnglibconf.dfa. This requires the program awk. Brian Kernighan
4993(the original author of awk) maintains C source code of that awk and this
4994and all known later implementations (often called by subtly different
4995names - nawk and gawk for example) are adequate to build pnglibconf.h.
4996The Sun Microsystems (now Oracle) program 'awk' is an earlier version
4997and does not work, this may also apply to other systems that have a
4998functioning awk called 'nawk'.
4999
5000Configuration options are now documented in scripts/pnglibconf.dfa. This
5001file also includes dependency information that ensures a configuration is
5002consistent; that is, if a feature is switched off dependent features are
5003also removed. As a recommended alternative to using feature macros in
5004pngusr.h a system builder may also define equivalent options in pngusr.dfa
5005(or, indeed, any file) and add that to the configuration by setting
5006DFA_XTRA to the file name. The makefiles in contrib/pngminim illustrate
5007how to do this, and a case where pngusr.h is still required.
5008
Glenn Randers-Pehrson5b40b012010-11-25 07:16:29 -06005009.SH XI. Detecting libpng
Glenn Randers-Pehrson424c9852009-06-02 13:45:15 -05005010
5011The png_get_io_ptr() function has been present since libpng-0.88, has never
5012changed, and is unaffected by conditional compilation macros. It is the
5013best choice for use in configure scripts for detecting the presence of any
Glenn Randers-Pehrson99708d52009-06-29 17:30:00 -05005014libpng version since 0.88. In an autoconf "configure.in" you could use
5015
5016 AC_CHECK_LIB(png, png_get_io_ptr, ...
Glenn Randers-Pehrson424c9852009-06-02 13:45:15 -05005017
Glenn Randers-Pehrson5b40b012010-11-25 07:16:29 -06005018.SH XII. Source code repository
Glenn Randers-Pehrson76546822009-05-16 07:25:42 -05005019
5020Since about February 2009, version 1.2.34, libpng has been under "git" source
5021control. The git repository was built from old libpng-x.y.z.tar.gz files
5022going back to version 0.70. You can access the git repository (read only)
5023at
5024
5025 git://libpng.git.sourceforge.net/gitroot/libpng
5026
5027or you can browse it via "gitweb" at
5028
5029 http://libpng.git.sourceforge.net/git/gitweb.cgi?p=libpng
5030
5031Patches can be sent to glennrp at users.sourceforge.net or to
5032png-mng-implement at lists.sourceforge.net or you can upload them to
5033the libpng bug tracker at
5034
5035 http://libpng.sourceforge.net
5036
Glenn Randers-Pehrson7bc25012011-01-21 23:29:09 -06005037We also accept patches built from the tar or zip distributions, and
5038simple verbal discriptions of bug fixes, reported either to the
5039SourceForge bug tracker or to the png-mng-implement at lists.sf.net
5040mailing list.
5041
Glenn Randers-Pehrson5b40b012010-11-25 07:16:29 -06005042.SH XIII. Coding style
Glenn Randers-Pehrson76546822009-05-16 07:25:42 -05005043
5044Our coding style is similar to the "Allman" style, with curly
5045braces on separate lines:
5046
5047 if (condition)
5048 {
5049 action;
5050 }
5051
5052 else if (another condition)
5053 {
5054 another action;
5055 }
5056
5057The braces can be omitted from simple one-line actions:
5058
5059 if (condition)
5060 return (0);
5061
5062We use 3-space indentation, except for continued statements which
5063are usually indented the same as the first line of the statement
5064plus four more spaces.
5065
Glenn Randers-Pehrson5ade7ed2009-09-30 15:11:49 -05005066For macro definitions we use 2-space indentation, always leaving the "#"
5067in the first column.
5068
5069 #ifndef PNG_NO_FEATURE
5070 # ifndef PNG_FEATURE_SUPPORTED
5071 # define PNG_FEATURE_SUPPORTED
5072 # endif
5073 #endif
5074
Glenn Randers-Pehrson76546822009-05-16 07:25:42 -05005075Comments appear with the leading "/*" at the same indentation as
5076the statement that follows the comment:
5077
5078 /* Single-line comment */
5079 statement;
5080
Glenn Randers-Pehrsone4c706a2010-03-06 14:51:54 -06005081 /* This is a multiple-line
5082 * comment.
Glenn Randers-Pehrson76546822009-05-16 07:25:42 -05005083 */
5084 statement;
5085
Glenn Randers-Pehrsone4c706a2010-03-06 14:51:54 -06005086Very short comments can be placed after the end of the statement
Glenn Randers-Pehrson76546822009-05-16 07:25:42 -05005087to which they pertain:
5088
5089 statement; /* comment */
5090
5091We don't use C++ style ("//") comments. We have, however,
5092used them in the past in some now-abandoned MMX assembler
5093code.
5094
Glenn Randers-Pehrsonb5444a12009-06-08 08:36:19 -05005095Functions and their curly braces are not indented, and
Glenn Randers-Pehrson76546822009-05-16 07:25:42 -05005096exported functions are marked with PNGAPI:
5097
5098 /* This is a public function that is visible to
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06005099 * application programmers. It does thus-and-so.
Glenn Randers-Pehrson76546822009-05-16 07:25:42 -05005100 */
5101 void PNGAPI
5102 png_exported_function(png_ptr, png_info, foo)
5103 {
5104 body;
5105 }
5106
Glenn Randers-Pehrson416976f2009-07-27 22:16:09 -05005107The prototypes for all exported functions appear in png.h,
5108above the comment that says
5109
5110 /* Maintainer: Put new public prototypes here ... */
Glenn Randers-Pehrson76546822009-05-16 07:25:42 -05005111
5112We mark all non-exported functions with "/* PRIVATE */"":
5113
5114 void /* PRIVATE */
5115 png_non_exported_function(png_ptr, png_info, foo)
5116 {
5117 body;
5118 }
5119
Glenn Randers-Pehrson416976f2009-07-27 22:16:09 -05005120The prototypes for non-exported functions (except for those in
Glenn Randers-Pehrson5df7edb2009-10-29 23:32:44 -05005121pngtest) appear in
5122pngpriv.h
Glenn Randers-Pehrson416976f2009-07-27 22:16:09 -05005123above the comment that says
5124
5125 /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */
Glenn Randers-Pehrson76546822009-05-16 07:25:42 -05005126
Glenn Randers-Pehrsoncbbe9a52011-01-29 16:12:11 -06005127To avoid polluting the global namespace, the names of all exported
5128functions and variables begin with "png_", and all publicly visible C
5129preprocessor macros begin with "PNG_". We request that applications that
5130use libpng *not* begin any of their own symbols with either of these strings.
Glenn Randers-Pehrson76546822009-05-16 07:25:42 -05005131
5132We put a space after each comma and after each semicolon
Glenn Randers-Pehrson49a56e72010-12-06 20:06:01 -06005133in "for" statements, and we put spaces before and after each
Glenn Randers-Pehrsone4c706a2010-03-06 14:51:54 -06005134C binary operator and after "for" or "while", and before
5135"?". We don't put a space between a typecast and the expression
5136being cast, nor do we put one between a function name and the
Glenn Randers-Pehrson76546822009-05-16 07:25:42 -05005137left parenthesis that follows it:
5138
5139 for (i = 2; i > 0; --i)
Glenn Randers-Pehrson67f3b482009-09-23 11:36:28 -05005140 y[i] = a(x) + (int)b;
Glenn Randers-Pehrson76546822009-05-16 07:25:42 -05005141
Glenn Randers-Pehrsond60c8862009-06-15 21:56:14 -05005142We prefer #ifdef and #ifndef to #if defined() and if !defined()
5143when there is only one macro being tested.
5144
Glenn Randers-Pehrson67f3b482009-09-23 11:36:28 -05005145We do not use the TAB character for indentation in the C sources.
5146
Glenn Randers-Pehrson62ca98e2009-12-20 15:14:57 -06005147Lines do not exceed 80 characters.
5148
Glenn Randers-Pehrsonf210a052009-11-12 10:02:24 -06005149Other rules can be inferred by inspecting the libpng source.
Glenn Randers-Pehrson76546822009-05-16 07:25:42 -05005150
Glenn Randers-Pehrson5b40b012010-11-25 07:16:29 -06005151.SH XIV. Y2K Compliance in libpng
Glenn Randers-Pehrson76546822009-05-16 07:25:42 -05005152
John Bowlera9b34192011-05-08 19:46:51 -05005153May 9, 2011
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -06005154
5155Since the PNG Development group is an ad-hoc body, we can't make
5156an official declaration.
5157
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05005158This is your unofficial assurance that libpng from version 0.71 and
Glenn Randers-Pehrsond12c02f2011-05-07 22:06:24 -05005159upward through 1.5.3beta07 are Y2K compliant. It is my belief that earlier
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05005160versions were also Y2K compliant.
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -06005161
5162Libpng only has three year fields. One is a 2-byte unsigned integer that
5163will hold years up to 65535. The other two hold the date in text
5164format, and will hold years up to 9999.
5165
5166The integer is
5167 "png_uint_16 year" in png_time_struct.
5168
5169The strings are
5170 "png_charp time_buffer" in png_struct and
5171 "near_time_buffer", which is a local character string in png.c.
5172
5173There are seven time-related functions:
5174
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06005175 png_convert_to_rfc_1123() in png.c
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -06005176 (formerly png_convert_to_rfc_1152() in error)
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06005177 png_convert_from_struct_tm() in pngwrite.c, called
5178 in pngwrite.c
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -06005179 png_convert_from_time_t() in pngwrite.c
5180 png_get_tIME() in pngget.c
5181 png_handle_tIME() in pngrutil.c, called in pngread.c
5182 png_set_tIME() in pngset.c
5183 png_write_tIME() in pngwutil.c, called in pngwrite.c
5184
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06005185All appear to handle dates properly in a Y2K environment. The
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -06005186png_convert_from_time_t() function calls gmtime() to convert from system
5187clock time, which returns (year - 1900), which we properly convert to
5188the full 4-digit year. There is a possibility that applications using
5189libpng are not passing 4-digit years into the png_convert_to_rfc_1123()
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05005190function, or that they are incorrectly passing only a 2-digit year
5191instead of "year - 1900" into the png_convert_from_struct_tm() function,
5192but this is not under our control. The libpng documentation has always
5193stated that it works with 4-digit years, and the APIs have been
5194documented as such.
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -06005195
5196The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned
5197integer to hold the year, and can hold years as large as 65535.
5198
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05005199zlib, upon which libpng depends, is also Y2K compliant. It contains
5200no date-related code.
5201
Glenn Randers-Pehrson87544ac1999-01-13 22:06:39 -06005202
5203 Glenn Randers-Pehrson
5204 libpng maintainer
5205 PNG Development Group
5206
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06005207.SH NOTE
5208
5209Note about libpng version numbers:
5210
5211Due to various miscommunications, unforeseen code incompatibilities
5212and occasional factors outside the authors' control, version numbering
5213on the library has not always been consistent and straightforward.
5214The following table summarizes matters since version 0.89c, which was
5215the first widely used release:
5216
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06005217 source png.h png.h shared-lib
5218 version string int version
5219 ------- ------ ----- ----------
5220 0.89c ("beta 3") 0.89 89 1.0.89
5221 0.90 ("beta 4") 0.90 90 0.90
5222 0.95 ("beta 5") 0.95 95 0.95
5223 0.96 ("beta 6") 0.96 96 0.96
5224 0.97b ("beta 7") 1.00.97 97 1.0.1
5225 0.97c 0.97 97 2.0.97
5226 0.98 0.98 98 2.0.98
5227 0.99 0.99 98 2.0.99
5228 0.99a-m 0.99 99 2.0.99
5229 1.00 1.00 100 2.1.0
5230 1.0.0 1.0.0 100 2.1.0
5231 1.0.0 (from here on, the 100 2.1.0
5232 1.0.1 png.h string is 10001 2.1.0
5233 1.0.1a-e identical to the 10002 from here on, the
5234 1.0.2 source version) 10002 shared library is 2.V
5235 1.0.2a-b 10003 where V is the source
5236 1.0.1 10001 code version except as
5237 1.0.1a-e 10002 2.1.0.1a-e noted.
5238 1.0.2 10002 2.1.0.2
5239 1.0.2a-b 10003 2.1.0.2a-b
5240 1.0.3 10003 2.1.0.3
5241 1.0.3a-d 10004 2.1.0.3a-d
5242 1.0.4 10004 2.1.0.4
5243 1.0.4a-f 10005 2.1.0.4a-f
5244 1.0.5 (+ 2 patches) 10005 2.1.0.5
5245 1.0.5a-d 10006 2.1.0.5a-d
5246 1.0.5e-r 10100 2.1.0.5e-r
5247 1.0.5s-v 10006 2.1.0.5s-v
5248 1.0.6 (+ 3 patches) 10006 2.1.0.6
5249 1.0.6d-g 10007 2.1.0.6d-g
5250 1.0.6h 10007 10.6h
5251 1.0.6i 10007 10.6i
5252 1.0.6j 10007 2.1.0.6j
Glenn Randers-Pehrson25467032011-01-28 11:58:40 -06005253 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06005254 1.0.7beta15-18 1 10007 2.1.0.7beta15-18
5255 1.0.7rc1-2 1 10007 2.1.0.7rc1-2
5256 1.0.7 1 10007 2.1.0.7
5257 1.0.8beta1-4 1 10008 2.1.0.8beta1-4
5258 1.0.8rc1 1 10008 2.1.0.8rc1
5259 1.0.8 1 10008 2.1.0.8
5260 1.0.9beta1-6 1 10009 2.1.0.9beta1-6
5261 1.0.9rc1 1 10009 2.1.0.9rc1
5262 1.0.9beta7-10 1 10009 2.1.0.9beta7-10
5263 1.0.9rc2 1 10009 2.1.0.9rc2
5264 1.0.9 1 10009 2.1.0.9
Glenn Randers-Pehrsone1644472001-03-23 05:06:56 -06005265 1.0.10beta1 1 10010 2.1.0.10beta1
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06005266 1.0.10rc1 1 10010 2.1.0.10rc1
Glenn Randers-Pehrson13cfbac2001-03-30 06:42:28 -06005267 1.0.10 1 10010 2.1.0.10
Glenn Randers-Pehrsone1eff582001-04-14 20:15:41 -05005268 1.0.11beta1-3 1 10011 2.1.0.11beta1-3
Glenn Randers-Pehrson82ae3832001-04-20 10:32:10 -05005269 1.0.11rc1 1 10011 2.1.0.11rc1
Glenn Randers-Pehrson32835392001-04-27 08:29:32 -05005270 1.0.11 1 10011 2.1.0.11
Glenn Randers-Pehrsonb1828932001-06-23 08:03:17 -05005271 1.0.12beta1-2 2 10012 2.1.0.12beta1-2
5272 1.0.12rc1 2 10012 2.1.0.12rc1
5273 1.0.12 2 10012 2.1.0.12
5274 1.1.0a-f - 10100 2.1.1.0a-f abandoned
Glenn Randers-Pehrson8b6a8892001-05-18 04:54:50 -05005275 1.2.0beta1-2 2 10200 2.1.2.0beta1-2
Glenn Randers-Pehrson5a0be342001-10-18 20:55:13 -05005276 1.2.0beta3-5 3 10200 3.1.2.0beta3-5
5277 1.2.0rc1 3 10200 3.1.2.0rc1
5278 1.2.0 3 10200 3.1.2.0
Glenn Randers-Pehrson5cded0b2001-11-07 07:10:08 -06005279 1.2.1beta-4 3 10201 3.1.2.1beta1-4
Glenn Randers-Pehrsondb3b88d2001-12-04 06:30:43 -06005280 1.2.1rc1-2 3 10201 3.1.2.1rc1-2
5281 1.2.1 3 10201 3.1.2.1
Glenn Randers-Pehrson25228ab2002-03-31 07:33:55 -06005282 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6
Glenn Randers-Pehrsonfcbd7872002-04-07 16:35:38 -05005283 1.0.13beta1 10 10013 10.so.0.1.0.13beta1
5284 1.0.13rc1 10 10013 10.so.0.1.0.13rc1
5285 1.2.2rc1 12 10202 12.so.0.1.2.2rc1
Glenn Randers-Pehrson4fb046a2002-04-15 09:25:51 -05005286 1.0.13 10 10013 10.so.0.1.0.13
5287 1.2.2 12 10202 12.so.0.1.2.2
Glenn Randers-Pehrson22f28962002-05-13 18:17:09 -05005288 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6
5289 1.2.3 12 10203 12.so.0.1.2.3
Glenn Randers-Pehrsond020e9d2002-06-28 09:34:00 -05005290 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3
Glenn Randers-Pehrson2ae022d2002-07-01 22:23:46 -05005291 1.2.4rc1 13 10204 12.so.0.1.2.4rc1
Glenn Randers-Pehrson484a8a12002-07-07 19:15:20 -05005292 1.0.14 10 10014 10.so.0.1.0.14
5293 1.2.4 13 10204 12.so.0.1.2.4
Glenn Randers-Pehrson5b5dcf82004-07-17 22:45:44 -05005294 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2
5295 1.0.15rc1 10 10015 10.so.0.1.0.15rc1
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -05005296 1.0.15 10 10015 10.so.0.1.0.15
5297 1.2.5 13 10205 12.so.0.1.2.5
5298 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4
Glenn Randers-Pehrson37f116a2004-08-15 07:15:39 -05005299 1.2.6rc1-5 13 10206 12.so.0.1.2.6rc1-5
5300 1.0.16 10 10016 10.so.0.1.0.16
5301 1.2.6 13 10206 12.so.0.1.2.6
Glenn Randers-Pehrson67864af2004-08-28 23:30:07 -05005302 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2
Glenn Randers-Pehrson5b779162004-09-04 13:25:08 -05005303 1.0.17rc1 10 10017 12.so.0.1.0.17rc1
5304 1.2.7rc1 13 10207 12.so.0.1.2.7rc1
Glenn Randers-Pehrson250dfe12004-09-11 21:19:54 -05005305 1.0.17 10 10017 12.so.0.1.0.17
5306 1.2.7 13 10207 12.so.0.1.2.7
Glenn Randers-Pehrson40936072004-11-20 11:18:40 -06005307 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5
Glenn Randers-Pehrson584b96e2004-11-29 15:08:00 -06005308 1.0.18rc1-5 10 10018 12.so.0.1.0.18rc1-5
5309 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5
Glenn Randers-Pehrson917648e2004-12-02 18:14:51 -06005310 1.0.18 10 10018 12.so.0.1.0.18
5311 1.2.8 13 10208 12.so.0.1.2.8
Glenn Randers-Pehrsone6474622006-03-04 16:50:47 -06005312 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3
Glenn Randers-Pehrson4deeb792006-03-22 16:21:59 -06005313 1.2.9beta4-11 13 10209 12.so.0.9[.0]
Glenn Randers-Pehrson3a512032006-03-31 05:29:33 -06005314 1.2.9rc1 13 10209 12.so.0.9[.0]
Glenn Randers-Pehrsona7d0c942006-04-14 06:22:52 -05005315 1.2.9 13 10209 12.so.0.9[.0]
Glenn Randers-Pehrsond60b8fa2006-04-20 21:31:14 -05005316 1.2.10beta1-7 13 10210 12.so.0.10[.0]
Glenn Randers-Pehrson17218292006-04-20 07:20:46 -05005317 1.2.10rc1-2 13 10210 12.so.0.10[.0]
Glenn Randers-Pehrson86dc9812006-05-10 07:27:44 -05005318 1.2.10 13 10210 12.so.0.10[.0]
Glenn Randers-Pehrson6bc53be2006-06-16 07:52:03 -05005319 1.4.0beta1-6 14 10400 14.so.0.0[.0]
Glenn Randers-Pehrsond60c8862009-06-15 21:56:14 -05005320 1.2.11beta1-4 13 10210 12.so.0.11[.0]
Glenn Randers-Pehrson3424ee72006-07-12 13:33:47 -05005321 1.4.0beta7-8 14 10400 14.so.0.0[.0]
Glenn Randers-Pehrson701dbaa2006-11-17 09:36:54 -06005322 1.2.11 13 10211 12.so.0.11[.0]
5323 1.2.12 13 10212 12.so.0.12[.0]
5324 1.4.0beta9-14 14 10400 14.so.0.0[.0]
5325 1.2.13 13 10213 12.so.0.13[.0]
Glenn Randers-Pehrson97a9b482008-10-25 20:03:28 -05005326 1.4.0beta15-36 14 10400 14.so.0.0[.0]
Glenn Randers-Pehrsonfa028102009-10-10 06:15:21 -05005327 1.4.0beta37-87 14 10400 14.so.14.0[.0]
Glenn Randers-Pehrson733da8c2009-10-30 00:00:15 -05005328 1.4.0rc01 14 10400 14.so.14.0[.0]
Glenn Randers-Pehrson62ca98e2009-12-20 15:14:57 -06005329 1.4.0beta88-109 14 10400 14.so.14.0[.0]
Glenn Randers-Pehrson67a83db2010-01-01 18:26:18 -06005330 1.4.0rc02-08 14 10400 14.so.14.0[.0]
Glenn Randers-Pehrsondbcfb712009-12-25 14:24:18 -06005331 1.4.0 14 10400 14.so.14.0[.0]
Glenn Randers-Pehrsone3f3c4e2010-02-07 18:08:50 -06005332 1.4.1beta01-03 14 10401 14.so.14.1[.0]
5333 1.4.1rc01 14 10401 14.so.14.1[.0]
Glenn Randers-Pehrson7a5be532010-02-14 07:16:19 -06005334 1.4.1beta04-12 14 10401 14.so.14.1[.0]
Glenn Randers-Pehrsonaaf377c2010-03-08 11:20:30 -06005335 1.4.1 14 10401 14.so.14.1[.0]
Glenn Randers-Pehrson5b3d5542010-06-18 21:55:53 -05005336 1.4.2 14 10402 14.so.14.2[.0]
5337 1.4.3 14 10403 14.so.14.3[.0]
Glenn Randers-Pehrson2776d5e2010-11-21 15:18:02 -06005338 1.4.4 14 10404 14.so.14.4[.0]
Glenn Randers-Pehrsonfd20a5a2010-12-27 08:53:08 -06005339 1.5.0beta01-58 15 10500 15.so.15.0[.0]
Glenn Randers-Pehrson64b863c2011-01-04 09:57:06 -06005340 1.5.0rc01-07 15 10500 15.so.15.0[.0]
Glenn Randers-Pehrsonf5ea1b72011-01-06 06:42:51 -06005341 1.5.0 15 10500 15.so.15.0[.0]
Glenn Randers-Pehrsonef123cc2011-01-28 15:20:34 -06005342 1.5.1beta01-11 15 10501 15.so.15.1[.0]
Glenn Randers-Pehrson3d3aae12011-02-02 22:58:27 -06005343 1.5.1rc01-02 15 10501 15.so.15.1[.0]
5344 1.5.1 15 10501 15.so.15.1[.0]
Glenn Randers-Pehrsonf3dd1cc2011-03-18 22:02:20 -05005345 1.5.2beta01-03 15 10502 15.so.15.2[.0]
Glenn Randers-Pehrson77fd0832011-03-24 08:59:48 -05005346 1.5.2rc01-03 15 10502 15.so.15.2[.0]
Glenn Randers-Pehrsondcc35052011-03-31 11:23:49 -05005347 1.5.2 15 10502 15.so.15.2[.0]
Glenn Randers-Pehrsond12c02f2011-05-07 22:06:24 -05005348 1.5.3beta01-07 15 10503 15.so.15.3[.0]
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06005349
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06005350Henceforth the source version will match the shared-library minor
5351and patch numbers; the shared-library major version number will be
5352used for changes in backward compatibility, as it is intended. The
5353PNG_PNGLIB_VER macro, which is not used within libpng but is available
5354for applications, is an unsigned integer of the form xyyzz corresponding
5355to the source version x.y.z (leading zeros in y and z). Beta versions
Glenn Randers-Pehrsone1644472001-03-23 05:06:56 -06005356were given the previous public release number plus a letter, until
5357version 1.0.6j; from then on they were given the upcoming public
5358release number plus "betaNN" or "rcN".
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06005359
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06005360.SH "SEE ALSO"
Glenn Randers-Pehrson4e763f12010-03-03 10:45:50 -06005361.BR "png"(5), " libpngpf"(3), " zlib"(3), " deflate"(5), " " and " zlib"(5)
Glenn Randers-Pehrson7fb32a82010-03-03 09:47:49 -06005362
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06005363.LP
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06005364.IR libpng :
5365.IP
Glenn Randers-Pehrsona4981d42004-08-25 22:00:45 -05005366http://libpng.sourceforge.net (follow the [DOWNLOAD] link)
Glenn Randers-Pehrson5e5c1e12000-11-10 12:26:19 -06005367http://www.libpng.org/pub/png
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06005368
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06005369.LP
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06005370.IR zlib :
5371.IP
5372(generally) at the same location as
5373.I libpng
5374or at
5375.br
Glenn Randers-Pehrson5e5c1e12000-11-10 12:26:19 -06005376ftp://ftp.info-zip.org/pub/infozip/zlib
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06005377
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06005378.LP
5379.IR PNG specification: RFC 2083
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06005380.IP
5381(generally) at the same location as
5382.I libpng
5383or at
5384.br
5385ftp://ds.internic.net/rfc/rfc2083.txt
5386.br
5387or (as a W3C Recommendation) at
5388.br
5389http://www.w3.org/TR/REC-png.html
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06005390
Glenn Randers-Pehrsoncbe52d81998-02-28 07:00:24 -06005391.LP
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06005392In the case of any inconsistency between the PNG specification
5393and this library, the specification takes precedence.
5394
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06005395.SH AUTHORS
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06005396This man page: Glenn Randers-Pehrson
Glenn Randers-Pehrson5dd2b8e2004-11-24 07:50:16 -06005397<glennrp at users.sourceforge.net>
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06005398
5399The contributing authors would like to thank all those who helped
5400with testing, bug fixes, and patience. This wouldn't have been
5401possible without all of you.
5402
5403Thanks to Frank J. T. Wojcik for helping with the documentation.
Glenn Randers-Pehrson166c5a31999-12-10 09:43:02 -06005404
John Bowlera9b34192011-05-08 19:46:51 -05005405Libpng version 1.5.3beta07 - May 9, 2011:
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06005406Initially created in 1995 by Guy Eric Schalnat, then of Group 42, Inc.
Glenn Randers-Pehrson5dd2b8e2004-11-24 07:50:16 -06005407Currently maintained by Glenn Randers-Pehrson (glennrp at users.sourceforge.net).
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06005408
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06005409Supported by the PNG development group
5410.br
Glenn Randers-Pehrson9c3ab682006-02-20 22:09:05 -06005411png-mng-implement at lists.sf.net
5412(subscription required; visit
Glenn Randers-Pehrson7b34df32006-02-24 06:30:16 -06005413png-mng-implement at lists.sourceforge.net (subscription required; visit
Glenn Randers-Pehrson9c3ab682006-02-20 22:09:05 -06005414https://lists.sourceforge.net/lists/listinfo/png-mng-implement
5415to subscribe).
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06005416
Glenn Randers-Pehrson3d5a5202000-07-01 15:37:28 -05005417.SH COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06005418
Glenn Randers-Pehrson5e5c1e12000-11-10 12:26:19 -06005419(This copy of the libpng notices is provided for your convenience. In case of
5420any discrepancy between this copy and the notices in the file png.h that is
5421included in the libpng distribution, the latter shall prevail.)
5422
Glenn Randers-Pehrson3d5a5202000-07-01 15:37:28 -05005423If you modify libpng you may insert additional notices immediately following
5424this sentence.
5425
Glenn Randers-Pehrsonbfbf8652009-06-26 21:46:52 -05005426This code is released under the libpng license.
Glenn Randers-Pehrson037023b2009-06-24 10:27:36 -05005427
John Bowlera9b34192011-05-08 19:46:51 -05005428libpng versions 1.2.6, August 15, 2004, through 1.5.3beta07, May 9, 2011, are
Glenn Randers-Pehrsona7dbcba2007-05-15 16:16:34 -05005429Copyright (c) 2004,2006-2007 Glenn Randers-Pehrson, and are
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -05005430distributed according to the same disclaimer and license as libpng-1.2.5
Glenn Randers-Pehrsond029a752004-08-09 21:50:32 -05005431with the following individual added to the list of Contributing Authors
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -05005432
5433 Cosmin Truta
Glenn Randers-Pehrson5fea36f2004-07-28 08:20:44 -05005434
5435libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
Glenn Randers-Pehrsonc6de22d2002-02-23 18:55:25 -06005436Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
Glenn Randers-Pehrson32fc5ce2000-07-24 06:34:14 -05005437distributed according to the same disclaimer and license as libpng-1.0.6
Glenn Randers-Pehrson3d5a5202000-07-01 15:37:28 -05005438with the following individuals added to the list of Contributing Authors
5439
5440 Simon-Pierre Cadieux
5441 Eric S. Raymond
5442 Gilles Vollant
5443
5444and with the following additions to the disclaimer:
5445
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -06005446 There is no warranty against interference with your
5447 enjoyment of the library or against infringement.
5448 There is no warranty that our efforts or the library
5449 will fulfill any of your particular purposes or needs.
5450 This library is provided with all faults, and the entire
5451 risk of satisfactory quality, performance, accuracy, and
5452 effort is with the user.
Glenn Randers-Pehrson3d5a5202000-07-01 15:37:28 -05005453
5454libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
5455Copyright (c) 1998, 1999 Glenn Randers-Pehrson
5456Distributed according to the same disclaimer and license as libpng-0.96,
5457with the following individuals added to the list of Contributing Authors:
5458
5459 Tom Lane
5460 Glenn Randers-Pehrson
5461 Willem van Schaik
5462
5463libpng versions 0.89, June 1996, through 0.96, May 1997, are
Glenn Randers-Pehrson54a066a1999-09-19 06:04:18 -05005464Copyright (c) 1996, 1997 Andreas Dilger
Glenn Randers-Pehrson3d5a5202000-07-01 15:37:28 -05005465Distributed according to the same disclaimer and license as libpng-0.88,
5466with the following individuals added to the list of Contributing Authors:
Glenn Randers-Pehrsonbcfd15d1999-10-01 14:22:25 -05005467
5468 John Bowler
5469 Kevin Bracey
5470 Sam Bushell
Glenn Randers-Pehrsonbcfd15d1999-10-01 14:22:25 -05005471 Magnus Holmgren
Glenn Randers-Pehrsonbcfd15d1999-10-01 14:22:25 -05005472 Greg Roelofs
Glenn Randers-Pehrson3d5a5202000-07-01 15:37:28 -05005473 Tom Tanner
5474
5475libpng versions 0.5, May 1995, through 0.88, January 1996, are
5476Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
5477
5478For the purposes of this copyright and license, "Contributing Authors"
5479is defined as the following set of individuals:
5480
5481 Andreas Dilger
5482 Dave Martindale
Glenn Randers-Pehrsonbcfd15d1999-10-01 14:22:25 -05005483 Guy Eric Schalnat
5484 Paul Schmidt
Glenn Randers-Pehrsonbcfd15d1999-10-01 14:22:25 -05005485 Tim Wegner
Glenn Randers-Pehrsonc9442291999-01-06 21:50:16 -06005486
Glenn Randers-Pehrson3d5a5202000-07-01 15:37:28 -05005487The PNG Reference Library is supplied "AS IS". The Contributing Authors
5488and Group 42, Inc. disclaim all warranties, expressed or implied,
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06005489including, without limitation, the warranties of merchantability and of
5490fitness for any purpose. The Contributing Authors and Group 42, Inc.
5491assume no liability for direct, indirect, incidental, special, exemplary,
5492or consequential damages, which may result from the use of the PNG
5493Reference Library, even if advised of the possibility of such damage.
Glenn Randers-Pehrsona357b991998-02-08 20:56:40 -06005494
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06005495Permission is hereby granted to use, copy, modify, and distribute this
5496source code, or portions hereof, for any purpose, without fee, subject
5497to the following restrictions:
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06005498
Glenn Randers-Pehrson3d5a5202000-07-01 15:37:28 -050054991. The origin of this source code must not be misrepresented.
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06005500
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -060055012. Altered versions must be plainly marked as such and
5502 must not be misrepresented as being the original source.
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06005503
Glenn Randers-Pehrson19095602001-03-14 07:08:39 -060055043. This Copyright notice may not be removed or altered from
5505 any source or altered source distribution.
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06005506
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06005507The Contributing Authors and Group 42, Inc. specifically permit, without
5508fee, and encourage the use of this source code as a component to
5509supporting the PNG file format in commercial products. If you use this
5510source code in a product, acknowledgment is not required but would be
5511appreciated.
5512
Glenn Randers-Pehrson3d5a5202000-07-01 15:37:28 -05005513
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05005514A "png_get_copyright" function is available, for convenient use in "about"
5515boxes and the like:
5516
5517 printf("%s",png_get_copyright(NULL));
5518
5519Also, the PNG logo (in PNG format, of course) is supplied in the
Glenn Randers-Pehrsona4d54bd2000-07-14 08:15:12 -05005520files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
Glenn Randers-Pehrson4393a9a1999-09-17 12:27:26 -05005521
Glenn Randers-Pehrson3d5a5202000-07-01 15:37:28 -05005522Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
Glenn Randers-Pehrsonbcfd15d1999-10-01 14:22:25 -05005523certification mark of the Open Source Initiative.
5524
Glenn Randers-Pehrson3d5a5202000-07-01 15:37:28 -05005525Glenn Randers-Pehrson
Glenn Randers-Pehrson5dd2b8e2004-11-24 07:50:16 -06005526glennrp at users.sourceforge.net
John Bowlera9b34192011-05-08 19:46:51 -05005527May 9, 2011
Glenn Randers-Pehrson3d5a5202000-07-01 15:37:28 -05005528
Glenn Randers-Pehrson0f881d61998-02-07 10:20:57 -06005529.\" end of man page
5530