Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: third_party/libpng/pngwrite.c

Issue 140074: Updates the PNG library to 1.2.37, enables some functionality for O3D (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « third_party/libpng/pngwio.c ('k') | third_party/libpng/pngwtran.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* pngwrite.c - general routines to write a PNG file 2 /* pngwrite.c - general routines to write a PNG file
3 * 3 *
4 * Last changed in libpng 1.2.34 [December 18, 2008] 4 * Last changed in libpng 1.2.37 [June 4, 2009]
5 * For conditions of distribution and use, see copyright notice in png.h 5 * For conditions of distribution and use, see copyright notice in png.h
6 * Copyright (c) 1998-2008 Glenn Randers-Pehrson 6 * Copyright (c) 1998-2009 Glenn Randers-Pehrson
7 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 7 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
8 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 8 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
9 */ 9 */
10 10
11 /* get internal access to png.h */ 11 /* Get internal access to png.h */
12 #define PNG_INTERNAL 12 #define PNG_INTERNAL
13 #include "png.h" 13 #include "png.h"
14 #ifdef PNG_WRITE_SUPPORTED 14 #ifdef PNG_WRITE_SUPPORTED
15 15
16 /* Writes all the PNG information. This is the suggested way to use the 16 /* Writes all the PNG information. This is the suggested way to use the
17 * library. If you have a new chunk to add, make a function to write it, 17 * library. If you have a new chunk to add, make a function to write it,
18 * and put it in the correct location here. If you want the chunk written 18 * and put it in the correct location here. If you want the chunk written
19 * after the image data, put it in png_write_end(). I strongly encourage 19 * after the image data, put it in png_write_end(). I strongly encourage
20 * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing 20 * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing
21 * the chunk, as that will keep the code from breaking if you want to just 21 * the chunk, as that will keep the code from breaking if you want to just
22 * write a plain PNG file. If you have long comments, I suggest writing 22 * write a plain PNG file. If you have long comments, I suggest writing
23 * them in png_write_end(), and compressing them. 23 * them in png_write_end(), and compressing them.
24 */ 24 */
25 void PNGAPI 25 void PNGAPI
26 png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr) 26 png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr)
27 { 27 {
28 png_debug(1, "in png_write_info_before_PLTE"); 28 png_debug(1, "in png_write_info_before_PLTE");
29 if (png_ptr == NULL || info_ptr == NULL) 29 if (png_ptr == NULL || info_ptr == NULL)
30 return; 30 return;
31 if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) 31 if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE))
32 { 32 {
33 png_write_sig(png_ptr); /* write PNG signature */ 33 png_write_sig(png_ptr); /* Write PNG signature */
34 #if defined(PNG_MNG_FEATURES_SUPPORTED) 34 #if defined(PNG_MNG_FEATURES_SUPPORTED)
35 if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&(png_ptr->mng_features_permitted) ) 35 if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&(png_ptr->mng_features_permitted) )
36 { 36 {
37 png_warning(png_ptr, "MNG features are not allowed in a PNG datastream"); 37 png_warning(png_ptr, "MNG features are not allowed in a PNG datastream");
38 png_ptr->mng_features_permitted=0; 38 png_ptr->mng_features_permitted=0;
39 } 39 }
40 #endif 40 #endif
41 /* write IHDR information. */ 41 /* Write IHDR information. */
42 png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height, 42 png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height,
43 info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type, 43 info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type,
44 info_ptr->filter_type, 44 info_ptr->filter_type,
45 #if defined(PNG_WRITE_INTERLACING_SUPPORTED) 45 #if defined(PNG_WRITE_INTERLACING_SUPPORTED)
46 info_ptr->interlace_type); 46 info_ptr->interlace_type);
47 #else 47 #else
48 0); 48 0);
49 #endif 49 #endif
50 /* the rest of these check to see if the valid field has the appropriate 50 /* The rest of these check to see if the valid field has the appropriate
51 flag set, and if it does, writes the chunk. */ 51 * flag set, and if it does, writes the chunk.
52 */
52 #if defined(PNG_WRITE_gAMA_SUPPORTED) 53 #if defined(PNG_WRITE_gAMA_SUPPORTED)
53 if (info_ptr->valid & PNG_INFO_gAMA) 54 if (info_ptr->valid & PNG_INFO_gAMA)
54 { 55 {
55 # ifdef PNG_FLOATING_POINT_SUPPORTED 56 # ifdef PNG_FLOATING_POINT_SUPPORTED
56 png_write_gAMA(png_ptr, info_ptr->gamma); 57 png_write_gAMA(png_ptr, info_ptr->gamma);
57 #else 58 #else
58 #ifdef PNG_FIXED_POINT_SUPPORTED 59 #ifdef PNG_FIXED_POINT_SUPPORTED
59 png_write_gAMA_fixed(png_ptr, info_ptr->int_gamma); 60 png_write_gAMA_fixed(png_ptr, info_ptr->int_gamma);
60 # endif 61 # endif
61 #endif 62 #endif
(...skipping 28 matching lines...) Expand all
90 info_ptr->int_x_red, info_ptr->int_y_red, 91 info_ptr->int_x_red, info_ptr->int_y_red,
91 info_ptr->int_x_green, info_ptr->int_y_green, 92 info_ptr->int_x_green, info_ptr->int_y_green,
92 info_ptr->int_x_blue, info_ptr->int_y_blue); 93 info_ptr->int_x_blue, info_ptr->int_y_blue);
93 # endif 94 # endif
94 #endif 95 #endif
95 } 96 }
96 #endif 97 #endif
97 #if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) 98 #if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
98 if (info_ptr->unknown_chunks_num) 99 if (info_ptr->unknown_chunks_num)
99 { 100 {
100 png_unknown_chunk *up; 101 png_unknown_chunk *up;
101 102
102 png_debug(5, "writing extra chunks"); 103 png_debug(5, "writing extra chunks");
103 104
104 for (up = info_ptr->unknown_chunks; 105 for (up = info_ptr->unknown_chunks;
105 up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; 106 up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
106 up++) 107 up++)
107 { 108 {
108 int keep=png_handle_as_unknown(png_ptr, up->name); 109 int keep=png_handle_as_unknown(png_ptr, up->name);
109 if (keep != PNG_HANDLE_CHUNK_NEVER && 110 if (keep != PNG_HANDLE_CHUNK_NEVER &&
110 up->location && !(up->location & PNG_HAVE_PLTE) && 111 up->location && !(up->location & PNG_HAVE_PLTE) &&
111 !(up->location & PNG_HAVE_IDAT) && 112 !(up->location & PNG_HAVE_IDAT) &&
112 ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || 113 ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS ||
113 (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) 114 (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS)))
114 { 115 {
115 if (up->size == 0) 116 if (up->size == 0)
116 png_warning(png_ptr, "Writing zero-length unknown chunk"); 117 png_warning(png_ptr, "Writing zero-length unknown chunk");
117 png_write_chunk(png_ptr, up->name, up->data, up->size); 118 png_write_chunk(png_ptr, up->name, up->data, up->size);
118 } 119 }
119 } 120 }
120 } 121 }
121 #endif 122 #endif
122 png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE; 123 png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE;
123 } 124 }
124 } 125 }
125 126
126 void PNGAPI 127 void PNGAPI
127 png_write_info(png_structp png_ptr, png_infop info_ptr) 128 png_write_info(png_structp png_ptr, png_infop info_ptr)
128 { 129 {
129 #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) 130 #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
130 int i; 131 int i;
131 #endif 132 #endif
132 133
133 png_debug(1, "in png_write_info"); 134 png_debug(1, "in png_write_info");
134 135
135 if (png_ptr == NULL || info_ptr == NULL) 136 if (png_ptr == NULL || info_ptr == NULL)
136 return; 137 return;
137 138
138 png_write_info_before_PLTE(png_ptr, info_ptr); 139 png_write_info_before_PLTE(png_ptr, info_ptr);
139 140
140 if (info_ptr->valid & PNG_INFO_PLTE) 141 if (info_ptr->valid & PNG_INFO_PLTE)
141 png_write_PLTE(png_ptr, info_ptr->palette, 142 png_write_PLTE(png_ptr, info_ptr->palette,
142 (png_uint_32)info_ptr->num_palette); 143 (png_uint_32)info_ptr->num_palette);
143 else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) 144 else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
144 png_error(png_ptr, "Valid palette required for paletted images"); 145 png_error(png_ptr, "Valid palette required for paletted images");
145 146
146 #if defined(PNG_WRITE_tRNS_SUPPORTED) 147 #if defined(PNG_WRITE_tRNS_SUPPORTED)
147 if (info_ptr->valid & PNG_INFO_tRNS) 148 if (info_ptr->valid & PNG_INFO_tRNS)
149 {
150 #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
151 /* Invert the alpha channel (in tRNS) */
152 if ((png_ptr->transformations & PNG_INVERT_ALPHA) &&
153 info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
148 { 154 {
149 #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) 155 int j;
150 /* invert the alpha channel (in tRNS) */ 156 for (j=0; j<(int)info_ptr->num_trans; j++)
151 if ((png_ptr->transformations & PNG_INVERT_ALPHA) && 157 info_ptr->trans[j] = (png_byte)(255 - info_ptr->trans[j]);
152 info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) 158 }
153 {
154 int j;
155 for (j=0; j<(int)info_ptr->num_trans; j++)
156 info_ptr->trans[j] = (png_byte)(255 - info_ptr->trans[j]);
157 }
158 #endif 159 #endif
159 png_write_tRNS(png_ptr, info_ptr->trans, &(info_ptr->trans_values), 160 png_write_tRNS(png_ptr, info_ptr->trans, &(info_ptr->trans_values),
160 info_ptr->num_trans, info_ptr->color_type); 161 info_ptr->num_trans, info_ptr->color_type);
161 } 162 }
162 #endif 163 #endif
163 #if defined(PNG_WRITE_bKGD_SUPPORTED) 164 #if defined(PNG_WRITE_bKGD_SUPPORTED)
164 if (info_ptr->valid & PNG_INFO_bKGD) 165 if (info_ptr->valid & PNG_INFO_bKGD)
165 png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type); 166 png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type);
166 #endif 167 #endif
167 #if defined(PNG_WRITE_hIST_SUPPORTED) 168 #if defined(PNG_WRITE_hIST_SUPPORTED)
168 if (info_ptr->valid & PNG_INFO_hIST) 169 if (info_ptr->valid & PNG_INFO_hIST)
169 png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette); 170 png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette);
170 #endif 171 #endif
171 #if defined(PNG_WRITE_oFFs_SUPPORTED) 172 #if defined(PNG_WRITE_oFFs_SUPPORTED)
172 if (info_ptr->valid & PNG_INFO_oFFs) 173 if (info_ptr->valid & PNG_INFO_oFFs)
173 png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset, 174 png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset,
174 info_ptr->offset_unit_type); 175 info_ptr->offset_unit_type);
175 #endif 176 #endif
176 #if defined(PNG_WRITE_pCAL_SUPPORTED) 177 #if defined(PNG_WRITE_pCAL_SUPPORTED)
177 if (info_ptr->valid & PNG_INFO_pCAL) 178 if (info_ptr->valid & PNG_INFO_pCAL)
178 png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0, 179 png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0,
179 info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams, 180 info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams,
180 info_ptr->pcal_units, info_ptr->pcal_params); 181 info_ptr->pcal_units, info_ptr->pcal_params);
181 #endif 182 #endif
183
184 #if defined(PNG_sCAL_SUPPORTED)
185 if (info_ptr->valid & PNG_INFO_sCAL)
182 #if defined(PNG_WRITE_sCAL_SUPPORTED) 186 #if defined(PNG_WRITE_sCAL_SUPPORTED)
183 if (info_ptr->valid & PNG_INFO_sCAL)
184 #if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) 187 #if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO)
185 png_write_sCAL(png_ptr, (int)info_ptr->scal_unit, 188 png_write_sCAL(png_ptr, (int)info_ptr->scal_unit,
186 info_ptr->scal_pixel_width, info_ptr->scal_pixel_height); 189 info_ptr->scal_pixel_width, info_ptr->scal_pixel_height);
187 #else 190 #else /* !FLOATING_POINT */
188 #ifdef PNG_FIXED_POINT_SUPPORTED 191 #ifdef PNG_FIXED_POINT_SUPPORTED
189 png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit, 192 png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit,
190 info_ptr->scal_s_width, info_ptr->scal_s_height); 193 info_ptr->scal_s_width, info_ptr->scal_s_height);
191 #else 194 #endif /* FIXED_POINT */
195 #endif /* FLOATING_POINT */
196 #else /* !WRITE_sCAL */
192 png_warning(png_ptr, 197 png_warning(png_ptr,
193 "png_write_sCAL not supported; sCAL chunk not written."); 198 "png_write_sCAL not supported; sCAL chunk not written.");
194 #endif 199 #endif /* WRITE_sCAL */
195 #endif 200 #endif /* sCAL */
196 #endif 201
197 #if defined(PNG_WRITE_pHYs_SUPPORTED) 202 #if defined(PNG_WRITE_pHYs_SUPPORTED)
198 if (info_ptr->valid & PNG_INFO_pHYs) 203 if (info_ptr->valid & PNG_INFO_pHYs)
199 png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit, 204 png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit,
200 info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type); 205 info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type);
201 #endif 206 #endif /* pHYs */
207
202 #if defined(PNG_WRITE_tIME_SUPPORTED) 208 #if defined(PNG_WRITE_tIME_SUPPORTED)
203 if (info_ptr->valid & PNG_INFO_tIME) 209 if (info_ptr->valid & PNG_INFO_tIME)
204 { 210 {
205 png_write_tIME(png_ptr, &(info_ptr->mod_time)); 211 png_write_tIME(png_ptr, &(info_ptr->mod_time));
206 png_ptr->mode |= PNG_WROTE_tIME; 212 png_ptr->mode |= PNG_WROTE_tIME;
207 } 213 }
208 #endif 214 #endif /* tIME */
215
209 #if defined(PNG_WRITE_sPLT_SUPPORTED) 216 #if defined(PNG_WRITE_sPLT_SUPPORTED)
210 if (info_ptr->valid & PNG_INFO_sPLT) 217 if (info_ptr->valid & PNG_INFO_sPLT)
211 for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) 218 for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
212 png_write_sPLT(png_ptr, info_ptr->splt_palettes + i); 219 png_write_sPLT(png_ptr, info_ptr->splt_palettes + i);
213 #endif 220 #endif /* sPLT */
221
214 #if defined(PNG_WRITE_TEXT_SUPPORTED) 222 #if defined(PNG_WRITE_TEXT_SUPPORTED)
215 /* Check to see if we need to write text chunks */ 223 /* Check to see if we need to write text chunks */
216 for (i = 0; i < info_ptr->num_text; i++) 224 for (i = 0; i < info_ptr->num_text; i++)
217 { 225 {
218 png_debug2(2, "Writing header text chunk %d, type %d", i, 226 png_debug2(2, "Writing header text chunk %d, type %d", i,
219 info_ptr->text[i].compression); 227 info_ptr->text[i].compression);
220 /* an internationalized chunk? */ 228 /* An internationalized chunk? */
221 if (info_ptr->text[i].compression > 0) 229 if (info_ptr->text[i].compression > 0)
222 { 230 {
223 #if defined(PNG_WRITE_iTXt_SUPPORTED) 231 #if defined(PNG_WRITE_iTXt_SUPPORTED)
224 /* write international chunk */ 232 /* Write international chunk */
225 png_write_iTXt(png_ptr, 233 png_write_iTXt(png_ptr,
226 info_ptr->text[i].compression, 234 info_ptr->text[i].compression,
227 info_ptr->text[i].key, 235 info_ptr->text[i].key,
228 info_ptr->text[i].lang, 236 info_ptr->text[i].lang,
229 info_ptr->text[i].lang_key, 237 info_ptr->text[i].lang_key,
230 info_ptr->text[i].text); 238 info_ptr->text[i].text);
231 #else 239 #else
232 png_warning(png_ptr, "Unable to write international text"); 240 png_warning(png_ptr, "Unable to write international text");
233 #endif 241 #endif
234 /* Mark this chunk as written */ 242 /* Mark this chunk as written */
235 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; 243 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
236 } 244 }
237 /* If we want a compressed text chunk */ 245 /* If we want a compressed text chunk */
238 else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt) 246 else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt)
239 { 247 {
240 #if defined(PNG_WRITE_zTXt_SUPPORTED) 248 #if defined(PNG_WRITE_zTXt_SUPPORTED)
241 /* write compressed chunk */ 249 /* Write compressed chunk */
242 png_write_zTXt(png_ptr, info_ptr->text[i].key, 250 png_write_zTXt(png_ptr, info_ptr->text[i].key,
243 info_ptr->text[i].text, 0, 251 info_ptr->text[i].text, 0,
244 info_ptr->text[i].compression); 252 info_ptr->text[i].compression);
245 #else 253 #else
246 png_warning(png_ptr, "Unable to write compressed text"); 254 png_warning(png_ptr, "Unable to write compressed text");
247 #endif 255 #endif
248 /* Mark this chunk as written */ 256 /* Mark this chunk as written */
249 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; 257 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
250 } 258 }
251 else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) 259 else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
252 { 260 {
253 #if defined(PNG_WRITE_tEXt_SUPPORTED) 261 #if defined(PNG_WRITE_tEXt_SUPPORTED)
254 /* write uncompressed chunk */ 262 /* Write uncompressed chunk */
255 png_write_tEXt(png_ptr, info_ptr->text[i].key, 263 png_write_tEXt(png_ptr, info_ptr->text[i].key,
256 info_ptr->text[i].text, 264 info_ptr->text[i].text,
257 0); 265 0);
266 /* Mark this chunk as written */
267 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
258 #else 268 #else
269 /* Can't get here */
259 png_warning(png_ptr, "Unable to write uncompressed text"); 270 png_warning(png_ptr, "Unable to write uncompressed text");
260 #endif 271 #endif
261 /* Mark this chunk as written */
262 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
263 } 272 }
264 } 273 }
265 #endif 274 #endif /* tEXt */
275
266 #if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) 276 #if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
267 if (info_ptr->unknown_chunks_num) 277 if (info_ptr->unknown_chunks_num)
268 { 278 {
269 png_unknown_chunk *up; 279 png_unknown_chunk *up;
270 280
271 png_debug(5, "writing extra chunks"); 281 png_debug(5, "writing extra chunks");
272 282
273 for (up = info_ptr->unknown_chunks; 283 for (up = info_ptr->unknown_chunks;
274 up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; 284 up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
275 up++) 285 up++)
(...skipping 19 matching lines...) Expand all
295 */ 305 */
296 void PNGAPI 306 void PNGAPI
297 png_write_end(png_structp png_ptr, png_infop info_ptr) 307 png_write_end(png_structp png_ptr, png_infop info_ptr)
298 { 308 {
299 png_debug(1, "in png_write_end"); 309 png_debug(1, "in png_write_end");
300 if (png_ptr == NULL) 310 if (png_ptr == NULL)
301 return; 311 return;
302 if (!(png_ptr->mode & PNG_HAVE_IDAT)) 312 if (!(png_ptr->mode & PNG_HAVE_IDAT))
303 png_error(png_ptr, "No IDATs written into file"); 313 png_error(png_ptr, "No IDATs written into file");
304 314
305 /* see if user wants us to write information chunks */ 315 /* See if user wants us to write information chunks */
306 if (info_ptr != NULL) 316 if (info_ptr != NULL)
307 { 317 {
308 #if defined(PNG_WRITE_TEXT_SUPPORTED) 318 #if defined(PNG_WRITE_TEXT_SUPPORTED)
309 int i; /* local index variable */ 319 int i; /* Local index variable */
310 #endif 320 #endif
311 #if defined(PNG_WRITE_tIME_SUPPORTED) 321 #if defined(PNG_WRITE_tIME_SUPPORTED)
312 /* check to see if user has supplied a time chunk */ 322 /* Check to see if user has supplied a time chunk */
313 if ((info_ptr->valid & PNG_INFO_tIME) && 323 if ((info_ptr->valid & PNG_INFO_tIME) &&
314 !(png_ptr->mode & PNG_WROTE_tIME)) 324 !(png_ptr->mode & PNG_WROTE_tIME))
315 png_write_tIME(png_ptr, &(info_ptr->mod_time)); 325 png_write_tIME(png_ptr, &(info_ptr->mod_time));
316 #endif 326 #endif
317 #if defined(PNG_WRITE_TEXT_SUPPORTED) 327 #if defined(PNG_WRITE_TEXT_SUPPORTED)
318 /* loop through comment chunks */ 328 /* Loop through comment chunks */
319 for (i = 0; i < info_ptr->num_text; i++) 329 for (i = 0; i < info_ptr->num_text; i++)
320 { 330 {
321 png_debug2(2, "Writing trailer text chunk %d, type %d", i, 331 png_debug2(2, "Writing trailer text chunk %d, type %d", i,
322 info_ptr->text[i].compression); 332 info_ptr->text[i].compression);
323 /* an internationalized chunk? */ 333 /* An internationalized chunk? */
324 if (info_ptr->text[i].compression > 0) 334 if (info_ptr->text[i].compression > 0)
325 { 335 {
326 #if defined(PNG_WRITE_iTXt_SUPPORTED) 336 #if defined(PNG_WRITE_iTXt_SUPPORTED)
327 /* write international chunk */ 337 /* Write international chunk */
328 png_write_iTXt(png_ptr, 338 png_write_iTXt(png_ptr,
329 info_ptr->text[i].compression, 339 info_ptr->text[i].compression,
330 info_ptr->text[i].key, 340 info_ptr->text[i].key,
331 info_ptr->text[i].lang, 341 info_ptr->text[i].lang,
332 info_ptr->text[i].lang_key, 342 info_ptr->text[i].lang_key,
333 info_ptr->text[i].text); 343 info_ptr->text[i].text);
334 #else 344 #else
335 png_warning(png_ptr, "Unable to write international text"); 345 png_warning(png_ptr, "Unable to write international text");
336 #endif 346 #endif
337 /* Mark this chunk as written */ 347 /* Mark this chunk as written */
338 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; 348 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
339 } 349 }
340 else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt) 350 else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt)
341 { 351 {
342 #if defined(PNG_WRITE_zTXt_SUPPORTED) 352 #if defined(PNG_WRITE_zTXt_SUPPORTED)
343 /* write compressed chunk */ 353 /* Write compressed chunk */
344 png_write_zTXt(png_ptr, info_ptr->text[i].key, 354 png_write_zTXt(png_ptr, info_ptr->text[i].key,
345 info_ptr->text[i].text, 0, 355 info_ptr->text[i].text, 0,
346 info_ptr->text[i].compression); 356 info_ptr->text[i].compression);
347 #else 357 #else
348 png_warning(png_ptr, "Unable to write compressed text"); 358 png_warning(png_ptr, "Unable to write compressed text");
349 #endif 359 #endif
350 /* Mark this chunk as written */ 360 /* Mark this chunk as written */
351 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; 361 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
352 } 362 }
353 else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) 363 else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
354 { 364 {
355 #if defined(PNG_WRITE_tEXt_SUPPORTED) 365 #if defined(PNG_WRITE_tEXt_SUPPORTED)
356 /* write uncompressed chunk */ 366 /* Write uncompressed chunk */
357 png_write_tEXt(png_ptr, info_ptr->text[i].key, 367 png_write_tEXt(png_ptr, info_ptr->text[i].key,
358 info_ptr->text[i].text, 0); 368 info_ptr->text[i].text, 0);
359 #else 369 #else
360 png_warning(png_ptr, "Unable to write uncompressed text"); 370 png_warning(png_ptr, "Unable to write uncompressed text");
361 #endif 371 #endif
362 372
363 /* Mark this chunk as written */ 373 /* Mark this chunk as written */
364 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; 374 info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
365 } 375 }
366 } 376 }
(...skipping 17 matching lines...) Expand all
384 { 394 {
385 png_write_chunk(png_ptr, up->name, up->data, up->size); 395 png_write_chunk(png_ptr, up->name, up->data, up->size);
386 } 396 }
387 } 397 }
388 } 398 }
389 #endif 399 #endif
390 } 400 }
391 401
392 png_ptr->mode |= PNG_AFTER_IDAT; 402 png_ptr->mode |= PNG_AFTER_IDAT;
393 403
394 /* write end of PNG file */ 404 /* Write end of PNG file */
395 png_write_IEND(png_ptr); 405 png_write_IEND(png_ptr);
396 /* This flush, added in libpng-1.0.8, removed from libpng-1.0.9beta03, 406 /* This flush, added in libpng-1.0.8, removed from libpng-1.0.9beta03,
397 * and restored again in libpng-1.2.30, may cause some applications that 407 * and restored again in libpng-1.2.30, may cause some applications that
398 * do not set png_ptr->output_flush_fn to crash. If your application 408 * do not set png_ptr->output_flush_fn to crash. If your application
399 * experiences a problem, please try building libpng with 409 * experiences a problem, please try building libpng with
400 * PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED defined, and report the event to 410 * PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED defined, and report the event to
401 * png-mng-implement at lists.sf.net . This kludge will be removed 411 * png-mng-implement at lists.sf.net . This kludge will be removed
402 * from libpng-1.4.0. 412 * from libpng-1.4.0.
403 */ 413 */
404 #if defined(PNG_WRITE_FLUSH_SUPPORTED) && \ 414 #if defined(PNG_WRITE_FLUSH_SUPPORTED) && \
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
464 png_debug(1, "in png_create_write_struct"); 474 png_debug(1, "in png_create_write_struct");
465 #ifdef PNG_USER_MEM_SUPPORTED 475 #ifdef PNG_USER_MEM_SUPPORTED
466 png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, 476 png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,
467 (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); 477 (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr);
468 #else 478 #else
469 png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); 479 png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
470 #endif /* PNG_USER_MEM_SUPPORTED */ 480 #endif /* PNG_USER_MEM_SUPPORTED */
471 if (png_ptr == NULL) 481 if (png_ptr == NULL)
472 return (NULL); 482 return (NULL);
473 483
474 /* added at libpng-1.2.6 */ 484 /* Added at libpng-1.2.6 */
475 #ifdef PNG_SET_USER_LIMITS_SUPPORTED 485 #ifdef PNG_SET_USER_LIMITS_SUPPORTED
476 png_ptr->user_width_max=PNG_USER_WIDTH_MAX; 486 png_ptr->user_width_max=PNG_USER_WIDTH_MAX;
477 png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; 487 png_ptr->user_height_max=PNG_USER_HEIGHT_MAX;
478 #endif 488 #endif
479 489
480 #ifdef PNG_SETJMP_SUPPORTED 490 #ifdef PNG_SETJMP_SUPPORTED
481 #ifdef USE_FAR_KEYWORD 491 #ifdef USE_FAR_KEYWORD
482 if (setjmp(jmpbuf)) 492 if (setjmp(jmpbuf))
483 #else 493 #else
484 if (setjmp(png_ptr->jmpbuf)) 494 if (setjmp(png_ptr->jmpbuf))
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 png_warning(png_ptr, msg); 545 png_warning(png_ptr, msg);
536 #endif 546 #endif
537 #ifdef PNG_ERROR_NUMBERS_SUPPORTED 547 #ifdef PNG_ERROR_NUMBERS_SUPPORTED
538 png_ptr->flags=0; 548 png_ptr->flags=0;
539 #endif 549 #endif
540 png_error(png_ptr, 550 png_error(png_ptr,
541 "Incompatible libpng version in application and library"); 551 "Incompatible libpng version in application and library");
542 } 552 }
543 } 553 }
544 554
545 /* initialize zbuf - compression buffer */ 555 /* Initialize zbuf - compression buffer */
546 png_ptr->zbuf_size = PNG_ZBUF_SIZE; 556 png_ptr->zbuf_size = PNG_ZBUF_SIZE;
547 png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, 557 png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
548 (png_uint_32)png_ptr->zbuf_size); 558 (png_uint_32)png_ptr->zbuf_size);
549 559
550 png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, 560 png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL,
551 png_flush_ptr_NULL); 561 png_flush_ptr_NULL);
552 562
553 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) 563 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
554 png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, 564 png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT,
555 1, png_doublep_NULL, png_doublep_NULL); 565 1, png_doublep_NULL, png_doublep_NULL);
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 } 639 }
630 #endif /* PNG_1_0_X || PNG_1_2_X */ 640 #endif /* PNG_1_0_X || PNG_1_2_X */
631 641
632 642
633 void PNGAPI 643 void PNGAPI
634 png_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, 644 png_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,
635 png_size_t png_struct_size) 645 png_size_t png_struct_size)
636 { 646 {
637 png_structp png_ptr=*ptr_ptr; 647 png_structp png_ptr=*ptr_ptr;
638 #ifdef PNG_SETJMP_SUPPORTED 648 #ifdef PNG_SETJMP_SUPPORTED
639 jmp_buf tmp_jmp; /* to save current jump buffer */ 649 jmp_buf tmp_jmp; /* To save current jump buffer */
640 #endif 650 #endif
641 651
642 int i = 0; 652 int i = 0;
643 653
644 if (png_ptr == NULL) 654 if (png_ptr == NULL)
645 return; 655 return;
646 656
647 do 657 do
648 { 658 {
649 if (user_png_ver[i] != png_libpng_ver[i]) 659 if (user_png_ver[i] != png_libpng_ver[i])
650 { 660 {
651 #ifdef PNG_LEGACY_SUPPORTED 661 #ifdef PNG_LEGACY_SUPPORTED
652 png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; 662 png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
653 #else 663 #else
654 png_ptr->warning_fn=NULL; 664 png_ptr->warning_fn=NULL;
655 png_warning(png_ptr, 665 png_warning(png_ptr,
656 "Application uses deprecated png_write_init() and should be recompiled."); 666 "Application uses deprecated png_write_init() and should be recompiled.");
657 break; 667 break;
658 #endif 668 #endif
659 } 669 }
660 } while (png_libpng_ver[i++]); 670 } while (png_libpng_ver[i++]);
661 671
662 png_debug(1, "in png_write_init_3"); 672 png_debug(1, "in png_write_init_3");
663 673
664 #ifdef PNG_SETJMP_SUPPORTED 674 #ifdef PNG_SETJMP_SUPPORTED
665 /* save jump buffer and error functions */ 675 /* Save jump buffer and error functions */
666 png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); 676 png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));
667 #endif 677 #endif
668 678
669 if (png_sizeof(png_struct) > png_struct_size) 679 if (png_sizeof(png_struct) > png_struct_size)
670 { 680 {
671 png_destroy_struct(png_ptr); 681 png_destroy_struct(png_ptr);
672 png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); 682 png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
673 *ptr_ptr = png_ptr; 683 *ptr_ptr = png_ptr;
674 } 684 }
675 685
676 /* reset all variables to 0 */ 686 /* Reset all variables to 0 */
677 png_memset(png_ptr, 0, png_sizeof(png_struct)); 687 png_memset(png_ptr, 0, png_sizeof(png_struct));
678 688
679 /* added at libpng-1.2.6 */ 689 /* Added at libpng-1.2.6 */
680 #ifdef PNG_SET_USER_LIMITS_SUPPORTED 690 #ifdef PNG_SET_USER_LIMITS_SUPPORTED
681 png_ptr->user_width_max=PNG_USER_WIDTH_MAX; 691 png_ptr->user_width_max=PNG_USER_WIDTH_MAX;
682 png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; 692 png_ptr->user_height_max=PNG_USER_HEIGHT_MAX;
683 #endif 693 #endif
684 694
685 #ifdef PNG_SETJMP_SUPPORTED 695 #ifdef PNG_SETJMP_SUPPORTED
686 /* restore jump buffer */ 696 /* Restore jump buffer */
687 png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); 697 png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));
688 #endif 698 #endif
689 699
690 png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, 700 png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL,
691 png_flush_ptr_NULL); 701 png_flush_ptr_NULL);
692 702
693 /* initialize zbuf - compression buffer */ 703 /* Initialize zbuf - compression buffer */
694 png_ptr->zbuf_size = PNG_ZBUF_SIZE; 704 png_ptr->zbuf_size = PNG_ZBUF_SIZE;
695 png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, 705 png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
696 (png_uint_32)png_ptr->zbuf_size); 706 (png_uint_32)png_ptr->zbuf_size);
697 707
698 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) 708 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
699 png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, 709 png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT,
700 1, png_doublep_NULL, png_doublep_NULL); 710 1, png_doublep_NULL, png_doublep_NULL);
701 #endif 711 #endif
702 } 712 }
703 713
704 /* Write a few rows of image data. If the image is interlaced, 714 /* Write a few rows of image data. If the image is interlaced,
705 * either you will have to write the 7 sub images, or, if you 715 * either you will have to write the 7 sub images, or, if you
706 * have called png_set_interlace_handling(), you will have to 716 * have called png_set_interlace_handling(), you will have to
707 * "write" the image seven times. 717 * "write" the image seven times.
708 */ 718 */
709 void PNGAPI 719 void PNGAPI
710 png_write_rows(png_structp png_ptr, png_bytepp row, 720 png_write_rows(png_structp png_ptr, png_bytepp row,
711 png_uint_32 num_rows) 721 png_uint_32 num_rows)
712 { 722 {
713 png_uint_32 i; /* row counter */ 723 png_uint_32 i; /* Row counter */
714 png_bytepp rp; /* row pointer */ 724 png_bytepp rp; /* Row pointer */
715 725
716 png_debug(1, "in png_write_rows"); 726 png_debug(1, "in png_write_rows");
717 727
718 if (png_ptr == NULL) 728 if (png_ptr == NULL)
719 return; 729 return;
720 730
721 /* loop through the rows */ 731 /* Loop through the rows */
722 for (i = 0, rp = row; i < num_rows; i++, rp++) 732 for (i = 0, rp = row; i < num_rows; i++, rp++)
723 { 733 {
724 png_write_row(png_ptr, *rp); 734 png_write_row(png_ptr, *rp);
725 } 735 }
726 } 736 }
727 737
728 /* Write the image. You only need to call this function once, even 738 /* Write the image. You only need to call this function once, even
729 * if you are writing an interlaced image. 739 * if you are writing an interlaced image.
730 */ 740 */
731 void PNGAPI 741 void PNGAPI
732 png_write_image(png_structp png_ptr, png_bytepp image) 742 png_write_image(png_structp png_ptr, png_bytepp image)
733 { 743 {
734 png_uint_32 i; /* row index */ 744 png_uint_32 i; /* Row index */
735 int pass, num_pass; /* pass variables */ 745 int pass, num_pass; /* Pass variables */
736 png_bytepp rp; /* points to current row */ 746 png_bytepp rp; /* Points to current row */
737 747
738 if (png_ptr == NULL) 748 if (png_ptr == NULL)
739 return; 749 return;
740 750
741 png_debug(1, "in png_write_image"); 751 png_debug(1, "in png_write_image");
742 #if defined(PNG_WRITE_INTERLACING_SUPPORTED) 752 #if defined(PNG_WRITE_INTERLACING_SUPPORTED)
743 /* intialize interlace handling. If image is not interlaced, 753 /* Initialize interlace handling. If image is not interlaced,
744 this will set pass to 1 */ 754 * this will set pass to 1
755 */
745 num_pass = png_set_interlace_handling(png_ptr); 756 num_pass = png_set_interlace_handling(png_ptr);
746 #else 757 #else
747 num_pass = 1; 758 num_pass = 1;
748 #endif 759 #endif
749 /* loop through passes */ 760 /* Loop through passes */
750 for (pass = 0; pass < num_pass; pass++) 761 for (pass = 0; pass < num_pass; pass++)
751 { 762 {
752 /* loop through image */ 763 /* Loop through image */
753 for (i = 0, rp = image; i < png_ptr->height; i++, rp++) 764 for (i = 0, rp = image; i < png_ptr->height; i++, rp++)
754 { 765 {
755 png_write_row(png_ptr, *rp); 766 png_write_row(png_ptr, *rp);
756 } 767 }
757 } 768 }
758 } 769 }
759 770
760 /* called by user to write a row of image data */ 771 /* Called by user to write a row of image data */
761 void PNGAPI 772 void PNGAPI
762 png_write_row(png_structp png_ptr, png_bytep row) 773 png_write_row(png_structp png_ptr, png_bytep row)
763 { 774 {
764 if (png_ptr == NULL) 775 if (png_ptr == NULL)
765 return; 776 return;
766 png_debug2(1, "in png_write_row (row %ld, pass %d)", 777 png_debug2(1, "in png_write_row (row %ld, pass %d)",
767 png_ptr->row_number, png_ptr->pass); 778 png_ptr->row_number, png_ptr->pass);
768 779
769 /* initialize transformations and other stuff if first time */ 780 /* Initialize transformations and other stuff if first time */
770 if (png_ptr->row_number == 0 && png_ptr->pass == 0) 781 if (png_ptr->row_number == 0 && png_ptr->pass == 0)
771 { 782 {
772 /* make sure we wrote the header info */ 783 /* Make sure we wrote the header info */
773 if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) 784 if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE))
774 png_error(png_ptr, 785 png_error(png_ptr,
775 "png_write_info was never called before png_write_row."); 786 "png_write_info was never called before png_write_row.");
776 787
777 /* check for transforms that have been set but were defined out */ 788 /* Check for transforms that have been set but were defined out */
778 #if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED) 789 #if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED)
779 if (png_ptr->transformations & PNG_INVERT_MONO) 790 if (png_ptr->transformations & PNG_INVERT_MONO)
780 png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined."); 791 png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined.");
781 #endif 792 #endif
782 #if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED) 793 #if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED)
783 if (png_ptr->transformations & PNG_FILLER) 794 if (png_ptr->transformations & PNG_FILLER)
784 png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined."); 795 png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined.");
785 #endif 796 #endif
786 #if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && defined(PNG_READ_PACKSWAP_SUPPORTE D) 797 #if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && defined(PNG_READ_PACKSWAP_SUPPORTE D)
787 if (png_ptr->transformations & PNG_PACKSWAP) 798 if (png_ptr->transformations & PNG_PACKSWAP)
788 png_warning(png_ptr, "PNG_WRITE_PACKSWAP_SUPPORTED is not defined."); 799 png_warning(png_ptr, "PNG_WRITE_PACKSWAP_SUPPORTED is not defined.");
789 #endif 800 #endif
790 #if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED) 801 #if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED)
791 if (png_ptr->transformations & PNG_PACK) 802 if (png_ptr->transformations & PNG_PACK)
792 png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined."); 803 png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined.");
793 #endif 804 #endif
794 #if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED) 805 #if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED)
795 if (png_ptr->transformations & PNG_SHIFT) 806 if (png_ptr->transformations & PNG_SHIFT)
796 png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined."); 807 png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined.");
797 #endif 808 #endif
798 #if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED) 809 #if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED)
799 if (png_ptr->transformations & PNG_BGR) 810 if (png_ptr->transformations & PNG_BGR)
800 png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined."); 811 png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined.");
801 #endif 812 #endif
802 #if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED) 813 #if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED)
803 if (png_ptr->transformations & PNG_SWAP_BYTES) 814 if (png_ptr->transformations & PNG_SWAP_BYTES)
804 png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined."); 815 png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined.");
805 #endif 816 #endif
806 817
807 png_write_start_row(png_ptr); 818 png_write_start_row(png_ptr);
808 } 819 }
809 820
810 #if defined(PNG_WRITE_INTERLACING_SUPPORTED) 821 #if defined(PNG_WRITE_INTERLACING_SUPPORTED)
811 /* if interlaced and not interested in row, return */ 822 /* If interlaced and not interested in row, return */
812 if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) 823 if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
813 { 824 {
814 switch (png_ptr->pass) 825 switch (png_ptr->pass)
815 { 826 {
816 case 0: 827 case 0:
817 if (png_ptr->row_number & 0x07) 828 if (png_ptr->row_number & 0x07)
818 { 829 {
819 png_write_finish_row(png_ptr); 830 png_write_finish_row(png_ptr);
820 return; 831 return;
821 } 832 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
859 if (!(png_ptr->row_number & 0x01)) 870 if (!(png_ptr->row_number & 0x01))
860 { 871 {
861 png_write_finish_row(png_ptr); 872 png_write_finish_row(png_ptr);
862 return; 873 return;
863 } 874 }
864 break; 875 break;
865 } 876 }
866 } 877 }
867 #endif 878 #endif
868 879
869 /* set up row info for transformations */ 880 /* Set up row info for transformations */
870 png_ptr->row_info.color_type = png_ptr->color_type; 881 png_ptr->row_info.color_type = png_ptr->color_type;
871 png_ptr->row_info.width = png_ptr->usr_width; 882 png_ptr->row_info.width = png_ptr->usr_width;
872 png_ptr->row_info.channels = png_ptr->usr_channels; 883 png_ptr->row_info.channels = png_ptr->usr_channels;
873 png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth; 884 png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth;
874 png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * 885 png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth *
875 png_ptr->row_info.channels); 886 png_ptr->row_info.channels);
876 887
877 png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, 888 png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
878 png_ptr->row_info.width); 889 png_ptr->row_info.width);
879 890
880 png_debug1(3, "row_info->color_type = %d", png_ptr->row_info.color_type); 891 png_debug1(3, "row_info->color_type = %d", png_ptr->row_info.color_type);
881 png_debug1(3, "row_info->width = %lu", png_ptr->row_info.width); 892 png_debug1(3, "row_info->width = %lu", png_ptr->row_info.width);
882 png_debug1(3, "row_info->channels = %d", png_ptr->row_info.channels); 893 png_debug1(3, "row_info->channels = %d", png_ptr->row_info.channels);
883 png_debug1(3, "row_info->bit_depth = %d", png_ptr->row_info.bit_depth); 894 png_debug1(3, "row_info->bit_depth = %d", png_ptr->row_info.bit_depth);
884 png_debug1(3, "row_info->pixel_depth = %d", png_ptr->row_info.pixel_depth); 895 png_debug1(3, "row_info->pixel_depth = %d", png_ptr->row_info.pixel_depth);
885 png_debug1(3, "row_info->rowbytes = %lu", png_ptr->row_info.rowbytes); 896 png_debug1(3, "row_info->rowbytes = %lu", png_ptr->row_info.rowbytes);
886 897
887 /* Copy user's row into buffer, leaving room for filter byte. */ 898 /* Copy user's row into buffer, leaving room for filter byte. */
888 png_memcpy_check(png_ptr, png_ptr->row_buf + 1, row, 899 png_memcpy_check(png_ptr, png_ptr->row_buf + 1, row,
889 png_ptr->row_info.rowbytes); 900 png_ptr->row_info.rowbytes);
890 901
891 #if defined(PNG_WRITE_INTERLACING_SUPPORTED) 902 #if defined(PNG_WRITE_INTERLACING_SUPPORTED)
892 /* handle interlacing */ 903 /* Handle interlacing */
893 if (png_ptr->interlaced && png_ptr->pass < 6 && 904 if (png_ptr->interlaced && png_ptr->pass < 6 &&
894 (png_ptr->transformations & PNG_INTERLACE)) 905 (png_ptr->transformations & PNG_INTERLACE))
895 { 906 {
896 png_do_write_interlace(&(png_ptr->row_info), 907 png_do_write_interlace(&(png_ptr->row_info),
897 png_ptr->row_buf + 1, png_ptr->pass); 908 png_ptr->row_buf + 1, png_ptr->pass);
898 /* this should always get caught above, but still ... */ 909 /* This should always get caught above, but still ... */
899 if (!(png_ptr->row_info.width)) 910 if (!(png_ptr->row_info.width))
900 { 911 {
901 png_write_finish_row(png_ptr); 912 png_write_finish_row(png_ptr);
902 return; 913 return;
903 } 914 }
904 } 915 }
905 #endif 916 #endif
906 917
907 /* handle other transformations */ 918 /* Handle other transformations */
908 if (png_ptr->transformations) 919 if (png_ptr->transformations)
909 png_do_write_transformations(png_ptr); 920 png_do_write_transformations(png_ptr);
910 921
911 #if defined(PNG_MNG_FEATURES_SUPPORTED) 922 #if defined(PNG_MNG_FEATURES_SUPPORTED)
912 /* Write filter_method 64 (intrapixel differencing) only if 923 /* Write filter_method 64 (intrapixel differencing) only if
913 * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and 924 * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and
914 * 2. Libpng did not write a PNG signature (this filter_method is only 925 * 2. Libpng did not write a PNG signature (this filter_method is only
915 * used in PNG datastreams that are embedded in MNG datastreams) and 926 * used in PNG datastreams that are embedded in MNG datastreams) and
916 * 3. The application called png_permit_mng_features with a mask that 927 * 3. The application called png_permit_mng_features with a mask that
917 * included PNG_FLAG_MNG_FILTER_64 and 928 * included PNG_FLAG_MNG_FILTER_64 and
(...skipping 19 matching lines...) Expand all
937 /* Set the automatic flush interval or 0 to turn flushing off */ 948 /* Set the automatic flush interval or 0 to turn flushing off */
938 void PNGAPI 949 void PNGAPI
939 png_set_flush(png_structp png_ptr, int nrows) 950 png_set_flush(png_structp png_ptr, int nrows)
940 { 951 {
941 png_debug(1, "in png_set_flush"); 952 png_debug(1, "in png_set_flush");
942 if (png_ptr == NULL) 953 if (png_ptr == NULL)
943 return; 954 return;
944 png_ptr->flush_dist = (nrows < 0 ? 0 : nrows); 955 png_ptr->flush_dist = (nrows < 0 ? 0 : nrows);
945 } 956 }
946 957
947 /* flush the current output buffers now */ 958 /* Flush the current output buffers now */
948 void PNGAPI 959 void PNGAPI
949 png_write_flush(png_structp png_ptr) 960 png_write_flush(png_structp png_ptr)
950 { 961 {
951 int wrote_IDAT; 962 int wrote_IDAT;
952 963
953 png_debug(1, "in png_write_flush"); 964 png_debug(1, "in png_write_flush");
954 if (png_ptr == NULL) 965 if (png_ptr == NULL)
955 return; 966 return;
956 /* We have already written out all of the data */ 967 /* We have already written out all of the data */
957 if (png_ptr->row_number >= png_ptr->num_rows) 968 if (png_ptr->row_number >= png_ptr->num_rows)
958 return; 969 return;
959 970
960 do 971 do
961 { 972 {
962 int ret; 973 int ret;
963 974
964 /* compress the data */ 975 /* Compress the data */
965 ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH); 976 ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH);
966 wrote_IDAT = 0; 977 wrote_IDAT = 0;
967 978
968 /* check for compression errors */ 979 /* Check for compression errors */
969 if (ret != Z_OK) 980 if (ret != Z_OK)
970 { 981 {
971 if (png_ptr->zstream.msg != NULL) 982 if (png_ptr->zstream.msg != NULL)
972 png_error(png_ptr, png_ptr->zstream.msg); 983 png_error(png_ptr, png_ptr->zstream.msg);
973 else 984 else
974 png_error(png_ptr, "zlib error"); 985 png_error(png_ptr, "zlib error");
975 } 986 }
976 987
977 if (!(png_ptr->zstream.avail_out)) 988 if (!(png_ptr->zstream.avail_out))
978 { 989 {
979 /* write the IDAT and reset the zlib output buffer */ 990 /* Write the IDAT and reset the zlib output buffer */
980 png_write_IDAT(png_ptr, png_ptr->zbuf, 991 png_write_IDAT(png_ptr, png_ptr->zbuf,
981 png_ptr->zbuf_size); 992 png_ptr->zbuf_size);
982 png_ptr->zstream.next_out = png_ptr->zbuf; 993 png_ptr->zstream.next_out = png_ptr->zbuf;
983 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 994 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
984 wrote_IDAT = 1; 995 wrote_IDAT = 1;
985 } 996 }
986 } while(wrote_IDAT == 1); 997 } while(wrote_IDAT == 1);
987 998
988 /* If there is any data left to be output, write it into a new IDAT */ 999 /* If there is any data left to be output, write it into a new IDAT */
989 if (png_ptr->zbuf_size != png_ptr->zstream.avail_out) 1000 if (png_ptr->zbuf_size != png_ptr->zstream.avail_out)
990 { 1001 {
991 /* write the IDAT and reset the zlib output buffer */ 1002 /* Write the IDAT and reset the zlib output buffer */
992 png_write_IDAT(png_ptr, png_ptr->zbuf, 1003 png_write_IDAT(png_ptr, png_ptr->zbuf,
993 png_ptr->zbuf_size - png_ptr->zstream.avail_out); 1004 png_ptr->zbuf_size - png_ptr->zstream.avail_out);
994 png_ptr->zstream.next_out = png_ptr->zbuf; 1005 png_ptr->zstream.next_out = png_ptr->zbuf;
995 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 1006 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
996 } 1007 }
997 png_ptr->flush_rows = 0; 1008 png_ptr->flush_rows = 0;
998 png_flush(png_ptr); 1009 png_flush(png_ptr);
999 } 1010 }
1000 #endif /* PNG_WRITE_FLUSH_SUPPORTED */ 1011 #endif /* PNG_WRITE_FLUSH_SUPPORTED */
1001 1012
1002 /* free all memory used by the write */ 1013 /* Free all memory used by the write */
1003 void PNGAPI 1014 void PNGAPI
1004 png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr) 1015 png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)
1005 { 1016 {
1006 png_structp png_ptr = NULL; 1017 png_structp png_ptr = NULL;
1007 png_infop info_ptr = NULL; 1018 png_infop info_ptr = NULL;
1008 #ifdef PNG_USER_MEM_SUPPORTED 1019 #ifdef PNG_USER_MEM_SUPPORTED
1009 png_free_ptr free_fn = NULL; 1020 png_free_ptr free_fn = NULL;
1010 png_voidp mem_ptr = NULL; 1021 png_voidp mem_ptr = NULL;
1011 #endif 1022 #endif
1012 1023
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1068 *png_ptr_ptr = NULL; 1079 *png_ptr_ptr = NULL;
1069 } 1080 }
1070 } 1081 }
1071 1082
1072 1083
1073 /* Free any memory used in png_ptr struct (old method) */ 1084 /* Free any memory used in png_ptr struct (old method) */
1074 void /* PRIVATE */ 1085 void /* PRIVATE */
1075 png_write_destroy(png_structp png_ptr) 1086 png_write_destroy(png_structp png_ptr)
1076 { 1087 {
1077 #ifdef PNG_SETJMP_SUPPORTED 1088 #ifdef PNG_SETJMP_SUPPORTED
1078 jmp_buf tmp_jmp; /* save jump buffer */ 1089 jmp_buf tmp_jmp; /* Save jump buffer */
1079 #endif 1090 #endif
1080 png_error_ptr error_fn; 1091 png_error_ptr error_fn;
1081 png_error_ptr warning_fn; 1092 png_error_ptr warning_fn;
1082 png_voidp error_ptr; 1093 png_voidp error_ptr;
1083 #ifdef PNG_USER_MEM_SUPPORTED 1094 #ifdef PNG_USER_MEM_SUPPORTED
1084 png_free_ptr free_fn; 1095 png_free_ptr free_fn;
1085 #endif 1096 #endif
1086 1097
1087 png_debug(1, "in png_write_destroy"); 1098 png_debug(1, "in png_write_destroy");
1088 /* free any memory zlib uses */ 1099 /* Free any memory zlib uses */
1089 deflateEnd(&png_ptr->zstream); 1100 deflateEnd(&png_ptr->zstream);
1090 1101
1091 /* free our memory. png_free checks NULL for us. */ 1102 /* Free our memory. png_free checks NULL for us. */
1092 png_free(png_ptr, png_ptr->zbuf); 1103 png_free(png_ptr, png_ptr->zbuf);
1093 png_free(png_ptr, png_ptr->row_buf); 1104 png_free(png_ptr, png_ptr->row_buf);
1094 #ifndef PNG_NO_WRITE_FILTER 1105 #ifndef PNG_NO_WRITE_FILTER
1095 png_free(png_ptr, png_ptr->prev_row); 1106 png_free(png_ptr, png_ptr->prev_row);
1096 png_free(png_ptr, png_ptr->sub_row); 1107 png_free(png_ptr, png_ptr->sub_row);
1097 png_free(png_ptr, png_ptr->up_row); 1108 png_free(png_ptr, png_ptr->up_row);
1098 png_free(png_ptr, png_ptr->avg_row); 1109 png_free(png_ptr, png_ptr->avg_row);
1099 png_free(png_ptr, png_ptr->paeth_row); 1110 png_free(png_ptr, png_ptr->paeth_row);
1100 #endif 1111 #endif
1101 1112
1102 #if defined(PNG_TIME_RFC1123_SUPPORTED) 1113 #if defined(PNG_TIME_RFC1123_SUPPORTED)
1103 png_free(png_ptr, png_ptr->time_buffer); 1114 png_free(png_ptr, png_ptr->time_buffer);
1104 #endif 1115 #endif
1105 1116
1106 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) 1117 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
1107 png_free(png_ptr, png_ptr->prev_filters); 1118 png_free(png_ptr, png_ptr->prev_filters);
1108 png_free(png_ptr, png_ptr->filter_weights); 1119 png_free(png_ptr, png_ptr->filter_weights);
1109 png_free(png_ptr, png_ptr->inv_filter_weights); 1120 png_free(png_ptr, png_ptr->inv_filter_weights);
1110 png_free(png_ptr, png_ptr->filter_costs); 1121 png_free(png_ptr, png_ptr->filter_costs);
1111 png_free(png_ptr, png_ptr->inv_filter_costs); 1122 png_free(png_ptr, png_ptr->inv_filter_costs);
1112 #endif 1123 #endif
1113 1124
1114 #ifdef PNG_SETJMP_SUPPORTED 1125 #ifdef PNG_SETJMP_SUPPORTED
1115 /* reset structure */ 1126 /* Reset structure */
1116 png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); 1127 png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));
1117 #endif 1128 #endif
1118 1129
1119 error_fn = png_ptr->error_fn; 1130 error_fn = png_ptr->error_fn;
1120 warning_fn = png_ptr->warning_fn; 1131 warning_fn = png_ptr->warning_fn;
1121 error_ptr = png_ptr->error_ptr; 1132 error_ptr = png_ptr->error_ptr;
1122 #ifdef PNG_USER_MEM_SUPPORTED 1133 #ifdef PNG_USER_MEM_SUPPORTED
1123 free_fn = png_ptr->free_fn; 1134 free_fn = png_ptr->free_fn;
1124 #endif 1135 #endif
1125 1136
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
1408 void PNGAPI 1419 void PNGAPI
1409 png_set_compression_window_bits(png_structp png_ptr, int window_bits) 1420 png_set_compression_window_bits(png_structp png_ptr, int window_bits)
1410 { 1421 {
1411 if (png_ptr == NULL) 1422 if (png_ptr == NULL)
1412 return; 1423 return;
1413 if (window_bits > 15) 1424 if (window_bits > 15)
1414 png_warning(png_ptr, "Only compression windows <= 32k supported by PNG"); 1425 png_warning(png_ptr, "Only compression windows <= 32k supported by PNG");
1415 else if (window_bits < 8) 1426 else if (window_bits < 8)
1416 png_warning(png_ptr, "Only compression windows >= 256 supported by PNG"); 1427 png_warning(png_ptr, "Only compression windows >= 256 supported by PNG");
1417 #ifndef WBITS_8_OK 1428 #ifndef WBITS_8_OK
1418 /* avoid libpng bug with 256-byte windows */ 1429 /* Avoid libpng bug with 256-byte windows */
1419 if (window_bits == 8) 1430 if (window_bits == 8)
1420 { 1431 {
1421 png_warning(png_ptr, "Compression window is being reset to 512"); 1432 png_warning(png_ptr, "Compression window is being reset to 512");
1422 window_bits=9; 1433 window_bits=9;
1423 } 1434 }
1424 #endif 1435 #endif
1425 png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS; 1436 png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS;
1426 png_ptr->zlib_window_bits = window_bits; 1437 png_ptr->zlib_window_bits = window_bits;
1427 } 1438 }
1428 1439
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1461 1472
1462 1473
1463 #if defined(PNG_INFO_IMAGE_SUPPORTED) 1474 #if defined(PNG_INFO_IMAGE_SUPPORTED)
1464 void PNGAPI 1475 void PNGAPI
1465 png_write_png(png_structp png_ptr, png_infop info_ptr, 1476 png_write_png(png_structp png_ptr, png_infop info_ptr,
1466 int transforms, voidp params) 1477 int transforms, voidp params)
1467 { 1478 {
1468 if (png_ptr == NULL || info_ptr == NULL) 1479 if (png_ptr == NULL || info_ptr == NULL)
1469 return; 1480 return;
1470 #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) 1481 #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
1471 /* invert the alpha channel from opacity to transparency */ 1482 /* Invert the alpha channel from opacity to transparency */
1472 if (transforms & PNG_TRANSFORM_INVERT_ALPHA) 1483 if (transforms & PNG_TRANSFORM_INVERT_ALPHA)
1473 png_set_invert_alpha(png_ptr); 1484 png_set_invert_alpha(png_ptr);
1474 #endif 1485 #endif
1475 1486
1476 /* Write the file header information. */ 1487 /* Write the file header information. */
1477 png_write_info(png_ptr, info_ptr); 1488 png_write_info(png_ptr, info_ptr);
1478 1489
1479 /* ------ these transformations don't touch the info structure ------- */ 1490 /* ------ these transformations don't touch the info structure ------- */
1480 1491
1481 #if defined(PNG_WRITE_INVERT_SUPPORTED) 1492 #if defined(PNG_WRITE_INVERT_SUPPORTED)
1482 /* invert monochrome pixels */ 1493 /* Invert monochrome pixels */
1483 if (transforms & PNG_TRANSFORM_INVERT_MONO) 1494 if (transforms & PNG_TRANSFORM_INVERT_MONO)
1484 png_set_invert_mono(png_ptr); 1495 png_set_invert_mono(png_ptr);
1485 #endif 1496 #endif
1486 1497
1487 #if defined(PNG_WRITE_SHIFT_SUPPORTED) 1498 #if defined(PNG_WRITE_SHIFT_SUPPORTED)
1488 /* Shift the pixels up to a legal bit depth and fill in 1499 /* Shift the pixels up to a legal bit depth and fill in
1489 * as appropriate to correctly scale the image. 1500 * as appropriate to correctly scale the image.
1490 */ 1501 */
1491 if ((transforms & PNG_TRANSFORM_SHIFT) 1502 if ((transforms & PNG_TRANSFORM_SHIFT)
1492 && (info_ptr->valid & PNG_INFO_sBIT)) 1503 && (info_ptr->valid & PNG_INFO_sBIT))
1493 png_set_shift(png_ptr, &info_ptr->sig_bit); 1504 png_set_shift(png_ptr, &info_ptr->sig_bit);
1494 #endif 1505 #endif
1495 1506
1496 #if defined(PNG_WRITE_PACK_SUPPORTED) 1507 #if defined(PNG_WRITE_PACK_SUPPORTED)
1497 /* pack pixels into bytes */ 1508 /* Pack pixels into bytes */
1498 if (transforms & PNG_TRANSFORM_PACKING) 1509 if (transforms & PNG_TRANSFORM_PACKING)
1499 png_set_packing(png_ptr); 1510 png_set_packing(png_ptr);
1500 #endif 1511 #endif
1501 1512
1502 #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) 1513 #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
1503 /* swap location of alpha bytes from ARGB to RGBA */ 1514 /* Swap location of alpha bytes from ARGB to RGBA */
1504 if (transforms & PNG_TRANSFORM_SWAP_ALPHA) 1515 if (transforms & PNG_TRANSFORM_SWAP_ALPHA)
1505 png_set_swap_alpha(png_ptr); 1516 png_set_swap_alpha(png_ptr);
1506 #endif 1517 #endif
1507 1518
1508 #if defined(PNG_WRITE_FILLER_SUPPORTED) 1519 #if defined(PNG_WRITE_FILLER_SUPPORTED)
1509 /* Pack XRGB/RGBX/ARGB/RGBA into * RGB (4 channels -> 3 channels) */ 1520 /* Pack XRGB/RGBX/ARGB/RGBA into * RGB (4 channels -> 3 channels) */
1510 if (transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) 1521 if (transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER)
1511 png_set_filler(png_ptr, 0, PNG_FILLER_AFTER); 1522 png_set_filler(png_ptr, 0, PNG_FILLER_AFTER);
1512 else if (transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) 1523 else if (transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE)
1513 png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); 1524 png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
1514 #endif 1525 #endif
1515 1526
1516 #if defined(PNG_WRITE_BGR_SUPPORTED) 1527 #if defined(PNG_WRITE_BGR_SUPPORTED)
1517 /* flip BGR pixels to RGB */ 1528 /* Flip BGR pixels to RGB */
1518 if (transforms & PNG_TRANSFORM_BGR) 1529 if (transforms & PNG_TRANSFORM_BGR)
1519 png_set_bgr(png_ptr); 1530 png_set_bgr(png_ptr);
1520 #endif 1531 #endif
1521 1532
1522 #if defined(PNG_WRITE_SWAP_SUPPORTED) 1533 #if defined(PNG_WRITE_SWAP_SUPPORTED)
1523 /* swap bytes of 16-bit files to most significant byte first */ 1534 /* Swap bytes of 16-bit files to most significant byte first */
1524 if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) 1535 if (transforms & PNG_TRANSFORM_SWAP_ENDIAN)
1525 png_set_swap(png_ptr); 1536 png_set_swap(png_ptr);
1526 #endif 1537 #endif
1527 1538
1528 #if defined(PNG_WRITE_PACKSWAP_SUPPORTED) 1539 #if defined(PNG_WRITE_PACKSWAP_SUPPORTED)
1529 /* swap bits of 1, 2, 4 bit packed pixel formats */ 1540 /* Swap bits of 1, 2, 4 bit packed pixel formats */
1530 if (transforms & PNG_TRANSFORM_PACKSWAP) 1541 if (transforms & PNG_TRANSFORM_PACKSWAP)
1531 png_set_packswap(png_ptr); 1542 png_set_packswap(png_ptr);
1532 #endif 1543 #endif
1533 1544
1534 /* ----------------------- end of transformations ------------------- */ 1545 /* ----------------------- end of transformations ------------------- */
1535 1546
1536 /* write the bits */ 1547 /* Write the bits */
1537 if (info_ptr->valid & PNG_INFO_IDAT) 1548 if (info_ptr->valid & PNG_INFO_IDAT)
1538 png_write_image(png_ptr, info_ptr->row_pointers); 1549 png_write_image(png_ptr, info_ptr->row_pointers);
1539 1550
1540 /* It is REQUIRED to call this to finish writing the rest of the file */ 1551 /* It is REQUIRED to call this to finish writing the rest of the file */
1541 png_write_end(png_ptr, info_ptr); 1552 png_write_end(png_ptr, info_ptr);
1542 1553
1543 transforms = transforms; /* quiet compiler warnings */ 1554 transforms = transforms; /* Quiet compiler warnings */
1544 params = params; 1555 params = params;
1545 } 1556 }
1546 #endif 1557 #endif
1547 #endif /* PNG_WRITE_SUPPORTED */ 1558 #endif /* PNG_WRITE_SUPPORTED */
OLDNEW
« no previous file with comments | « third_party/libpng/pngwio.c ('k') | third_party/libpng/pngwtran.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698